Ночные Работники Службы | Интерфейс Client

Ночные Работники Службы | Интерфейс Client

[Exposed=ServiceWorker]
interface Client {
  readonly attribute USVString url;
  readonly attribute FrameType frameType;
  readonly attribute DOMString id;
  readonly attribute ClientType type;
  undefined postMessage(any message, sequence<object> transfer);
  undefined postMessage(any message, optional StructuredSerializeOptions options = {});
};

[Exposed=ServiceWorker]
interface WindowClient : Client {
  readonly attribute VisibilityState visibilityState;
  readonly attribute boolean focused;
  [SameObject] readonly attribute FrozenArray<USVString> ancestorOrigins;
  [NewObject] Promise<WindowClient> focus();
  [NewObject] Promise<WindowClient?> navigate(USVString url);
};

enum FrameType {
   "auxiliary",
   "top-level",
   "nested",
   "none"
};

 

С объектом Client связан клиент работника службы (service worker clientклиент работника службы).

С объектом Client связан тип кадра (frame type): «auxiliary«, «top-level«, «nested» и «none» («вспомогательный», «верхний уровень», «вложенный» и «нет»). Если не указано иное, это «none» («нет»).

Объект WindowClient имеет связанный контекст просмотра (browsing context), который является контекстом просмотра глобального объекта клиента работника службы.

Объект WindowClient имеет связанное состояние видимости (visibility state), которое является одним из значений атрибута visibilityState.

Объект WindowClient имеет связанное состояние фокуса (focus state), которое может быть истинным или ложным (изначально ложным).

Объект WindowClient имеет связанный массив источников-предков (ancestor origins array).

 

4.2.1. Геттер url

Шаги получения url должны вернуть сериализованный URL-адрес создания связанного клиента работника службы этого this.

 

4.2.2. Геттер frameType

Шаги получателя frameType должны вернуть тип кадра этого this.

 

4.2.3. Геттер id

Этапы получения идентификатора id должны вернуть идентификатор связанного клиента работника службы этого this.

 

4.2.4. Геттер type

Шаги геттера type:

1. Пусть client будет клиентом работника службы этого this.
2. Если client является объектом настроек среды, то:
   2.1 Если client является оконным клиентом, верните "window".
   2.2 В противном случае, если client является клиентом выделенного работника, верните "worker".
   2.3 В противном случае, если client является клиентом совместно используемого работника, верните "sharedworker".
3. Еще:
   3.1 Вернуть "window".

 

4.2.5. Метод postMessage(message, transfer)

Шаги метода postMessage(messagetransfer):

1. Пусть варианты options будут «["transfer" → transfer]».
2. Вызов postMessage(message, options) с сообщением message и параметрами options в качестве аргументов.

 

4.2.6. Метод postMessage(message, options)

Шаги метода postMessage(message, options):

1. Пусть contextObject будет этим this.
2. Пусть sourceSettings будет соответствующим объектом настроек contextObject.
3. Пусть serializeWithTransferResult будет StructuredSerializeWithTransfer (message, options["transfer"]). Восстановите все исключения.
4. Параллельно выполните следующие шаги:
  4.1 Пусть targetClient будет null.
  4.2 Для каждого client клиента работника службы:
    4.2.1 Если client является клиентом работника службы contextObject, установите targetClient на client и прервите работу.
  4.3 Если targetClient имеет значение null, верните.
  4.4 Пусть местом назначения destination будет объект ServiceWorkerContainer, чей связанный клиент работника службы является targetClient.
  4.5 Добавьте задачу, которая выполняет следующие шаги, в очередь сообщений клиента destination:
    4.5.1 Пусть origin будет сериализацией от источника sourceSettings.
    4.5.2 Пусть source будет результатом получения объекта работника службы, который представляет работника службы соответствующего глобального объекта contextObject в targetClient.
    4.5.3 Пусть deserializeRecord будет StructuredDeserializeWithTransfer (serializeWithTransferResult, соответствующая Область destination).
          Если это вызывает исключение, перехватите его, запустите событие с именем messageerror в пункте назначения destination, используя MessageEvent, с атрибутом origin, инициализированным как origin, и атрибутом source, инициализированным как source, а затем прервите эти шаги.
    4.5.4 Пусть messageClone будет deserializeRecord.[[Deserialized]].
    4.5.5 Пусть newPorts будет новым замороженным массивом, состоящим из всех объектов MessagePort в deserializeRecord.[[TransferredValues]], если они есть.
    4.5.6 Отправьте событие с именем message в место назначения destination, используя MessageEvent, с атрибутом origin, инициализированным значением origin, атрибутом source, инициализированным значением source, атрибутом data, инициализированным значением messageClone, и атрибутом ports, инициализированным значением newPorts.

 

4.2.7. Геттер visibilityState

Шаги получателя visibilityState должны вернуть состояние видимости этого this.

 

4.2.8. Геттер focused

Шаги получателя focused должны вернуть состояние фокуса этого this.

 

4.2.9. Геттер ancestorOrigins

Шаги получателя ancestorOrigins должны вернуть связанный массив происхождения предка этого this.

 

4.2.10. Метод focus()

Шаги метода focus():

1. Если этот алгоритм не запускается активацией пользователя, вернуть обещание, отклоненное с помощью исключения "InvalidAccessError" DOMException.
2. Пусть serviceWorkerEventLoop будет циклом событий окружающего агента.
3. Пусть обещание promise станет новым обещанием.
4. Поставьте задачу в очередь для выполнения следующих шагов в соответствующем ответственном цикле событий связанного клиента работника службы, используя источник задачи взаимодействия с пользователем:
  4.1 Выполните шаги фокусировки с контекстом просмотра этого this.
  4.2 Пусть frameType будет результатом выполнения "Получить Тип Кадра" (Get Frame Type) с контекстом просмотра этого this.
  4.3 Пусть visibilityState будет значением атрибута visibilityState активного документа контекста просмотра этого this.
  4.4 Пусть focusState будет результатом выполнения шагов получения фокуса с активным документом контекста просмотра этого this.
  4.5 Пусть ancestorOriginsList будет ассоциированным списком, списка происхождения предков , объекта Location, соответствующего глобального объекта, активного документа контекста просмотра этого this.
  4.6 Поставьте задачу в очередь для выполнения следующих шагов в serviceWorkerEventLoop, используя источник задачи манипулирования DOM:
    4.6.1 Пусть windowClient будет результатом запуска "Создания Клиента Окна" (Create Window Client) с связанными: клиентом работника службы, frameType, visibilityState, focusState и ancestorOriginsList этого this.
    4.6.2 Если состояние фокуса windowClient является true (истинно), разрешите обещание promise с помощью windowClient.
    4.6.3 В противном случае отклоните обещание promise с помощью TypeError.
5. Вернуть обещание promise.

 

4.2.11. Метод navigate(url)

Шаги метода navigate(url):

1. Пусть url будет результатом синтаксического анализа url с базовым URL-адресом API соответствующего объекта настроек этого this.
2. Если url является ошибочным, вернуть обещание, отклоненное с помощью TypeError.
3. Если url является about:blank, вернуть обещание, отклоненное с помощью TypeError.
4. Если активный работник службы связанного клиента работника службы этого this не является работником службы соответствующего глобального объекта этого this, вернуть обещание, отклоненное с помощью TypeError.
5. Пусть serviceWorkerEventLoop будет циклом событий текущего глобального объекта.
6. Пусть обещание promise станет новым обещанием.
7. Поставьте задачу в очередь для выполнения следующих шагов на этом this в соответствующем ответственном цикле событий связанного клиента работника службы, используя источник задачи взаимодействия с пользователем:
  7.1 Пусть browsingContext будет контекстом просмотра этого this.
  7.2 Если browsingContext отказался от своего документа Document, поставьте задачу в очередь для отклонения обещания promise с ошибкой TypeError в serviceWorkerEventLoop, используя источник задачи манипулирования DOM, и прервите эти шаги.
  7.3 HandleNavigate: перейдите в browsingContext к url с включенными исключениями. Исходный контекст просмотра должен быть browsingContext.
  7.4 Если шаги алгоритма, вызванные на шаге с меткой HandleNavigate, выбрасывают исключение, поставьте задачу в очередь для отклонения обещания promise с исключением в serviceWorkerEventLoop, используя источник задачи манипулирования DOM, и прервите эти шаги.
  7.5 Пусть frameType будет результатом выполнения "Получить Тип Кадра" (Get Frame Type) с browsingContext.
  7.6 Пусть visibilityState будет значением атрибута visibilityState активного документа browsingContext.
  7.7 Пусть focusState будет результатом выполнения шагов получения фокуса с активным документом browsingContext.
  7.8 Пусть ancestorOriginsList будет ассоциированным списком списка источников происхождения предков объекта Location, соответствующего глобального объекта, активного документа browsingContext.
  7.9 Поставьте задачу в очередь для выполнения следующих шагов в serviceWorkerEventLoop, используя источник задачи манипулирования DOM:
    7.9.1 Если источник создания URL объекта настроек среды объекта Window browsingContext не совпадает с тем же источником работника службы, разрешите обещание promise с помощью null и прервите эти шаги.
    7.9.2 Пусть windowClient будет результатом запуска "Создания Клиента Окна" (Create Window Client) этого this с клиентом работника службы , frameType, visibilityState, focusState и ancestorOriginsList.
    7.9.3 Выполните обещание promise с помощью windowClient.
8. Вернуть обещание promise.

 

Информационные ссылки

Стандарт Service Workers Nightlyhttps://w3c.github.io/ServiceWorker/#client-interface