1. 動機
◎非規範的伝統的に,~web~appは、 ~platformの至る所で~networkは到達-可能であると見做す。 伝統的に,~HTML文書は、 ~HTTP越しに読込まれ,その下位-資源すべてを後続な~HTTP要請を介して~fetchする。 ~web内容が他の技術~stackに比して不利な点は、 ここにある。 ◎ Web Applications traditionally assume that the network is reachable. This assumption pervades the platform. HTML documents are loaded over HTTP and traditionally fetch all of their sub-resources via subsequent HTTP requests. This places web content at a disadvantage versus other technology stacks.
`~sw$は,首に、[ ~naviが生じつつあるとき,稼働時に開始できる~web~worker文脈 ]を供することにより,この不利を塗り替えるべく設計されている。 この,~event駆動な~workerは、 生成元と~path(または~pattern)†を~~対象に登録される — すなわち、 ~~対象にされた所在への~naviが生じるときには,~workerに諮れることを意味する。 ~network要請に対応する~eventは,この~workerへ配送され、 この~workerにより生成された応答は,~network~stackの既定の挙動を上書きできる。 これは,概念的には、 ~networkと文書~具現化器の間に`~sw$を狭んで、 ~offlineにある間でも,`~sw$が文書~用の内容を供することを可能にする††。 ◎ The service worker is designed first to redress this balance by providing a Web Worker context, which can be started by a runtime when navigations are about to occur. This event-driven worker is registered against an origin and a path (or pattern), meaning it can be consulted when navigations occur to that location. Events that correspond to network requests are dispatched to the worker and the responses generated by the worker may override default network stack behavior. This puts the service worker, conceptually, between the network and a document renderer, allowing the service worker to provide content for documents, even while offline.
【† 生成元は、 処理~modelにおいては,`~storage~key$swr(の一部)として表現される。 ~patternとは、 ~pathが合致するための~patternを意味し, `~scope~URL$swrを通して表現される。 】【†† 言い換えれば、局所的に稼働する~proxy~serverのようなものである。 】
~offline問題を従来の試みにより解くことに馴染んでいた~web開発者たちは、 その種の解決策に柔軟性が~~足らないことを報告した。 その結果として、 最大な柔軟性を開発者に供するため,`~sw$は~~高度に~~手続き的になっている — 追加的な複階性と引き換えに。 この複階性の一部は、 単-~threadな実行~modelに面したときでも,`~sw$を即応的に保つ必要があることに起因する。 結果として,`~sw$により公開される~APIは、 他の~JS文脈において馴染みの~patternではあるが,ほぼすべて非同期的である — ここに~~強調されるように,[ 文書や資源の読込ngが阻まれる ]のは避ける必要があるので。 ◎ Web developers familiar with previous attempts to solve the offline problem have reported a deficit of flexibility in those solutions. As a result, the service worker is highly procedural, providing a maximum of flexibility at the price of additional complexity for developers. Part of this complexity arises from the need to keep service workers responsive in the face of a single-threaded execution model. As a result, APIs exposed by service workers are almost entirely asynchronous, a pattern familiar in other JavaScript contexts but accentuated here by the need to avoid blocking document and resource loading.
【今や廃された】~HTML`~app~cache@https://developer.mozilla.org/docs/Web/API/Window/applicationCache$の設計は, `回復-不能な~error@http://alistapart.com/article/application-cache-is-a-douchebag#section6$に寄与するような いくつかの属性を備えていることが、 開発者から`報告されている@http://alistapart.com/article/application-cache-is-a-douchebag$。 `~sw$は、[ ~errorは,`常に^em回復-可能である ]とする原則を~~重点に設計されている。 `~sw$の更新-処理nを成す詳細の多くは、 これらに付き物の~~障害を避けるよう設計されている。 ◎ Developers using the HTML5 Application Cache have also reported that several attributes of the design contribute to unrecoverable errors. A key design principle of the service worker is that errors should always be recoverable. Many details of the update process of service workers are designed to avoid these hazards.
`~sw$は、[ 文書ではなく,~event ]との関係性に基づいて,開始され, 生存し続ける。 この設計は、 `共用~worker@~WORKERS#shared-workers-and-the-sharedworker-interface$と `Chrome Background Pages@https://developer.chrome.com/extensions/background_pages$cite における 開発者や~vendorの経験を大きな糧にしている。 これらの~systemから得られた~~主要な学びは、 背景~処理~文脈の実行~時間を制限することの必要性である — 開発者に最も懸案される[ 資源を温存することと,背景~文脈の喪失と再始動 ]の両立を確保するために。 結果として,`~sw$は、[ `Background Pages^cite の後継である `Chrome Event Page@https://developer.chrome.com/extensions/event_pages$cite ]に~~同等以上のものになっている。 ~UAは、 `~sw$を,`文書が~~付随していなくとも^em開始してヨイし, ほぼいつでも~killしてヨイ。 `~sw$は、 概念的には,文書からの~messageを まったく取扱わずに[ 開始して, ~eventを処理して, 滅する ]ことが可能な共用~workerと捉えれる。 開発者は、[ `~sw$は,秒間に何度も開始され, ~killされ得る ]ことを頭に入れておくことを勧める。 ◎ Service workers are started and kept alive by their relationship to events, not documents. This design borrows heavily from developer and vendor experience with shared workers and Chrome Background Pages. A key lesson from these systems is the necessity to time-limit the execution of background processing contexts, both to conserve resources and to ensure that background context loss and restart is top-of-mind for developers. As a result, service workers bear more than a passing resemblance to Chrome Event Pages, the successor to Background Pages. Service workers may be started by user agents without an attached document and may be killed by the user agent at nearly any time. Conceptually, service workers can be thought of as Shared Workers that can start, process events, and die without ever handling messages from documents. Developers are advised to keep in mind that service workers may be started and killed many times a second.
`~sw$は、 生成元において[ ~event駆動な, 時間~制限付きで ]走るような,汎用な~script文脈である。 ~swは、 これらの特質により,[ 特定0の文書の文脈の外でも生きられる,広範な稼働時の~service ]用の自然な端点になる — 例えば、[ ~push通知を取扱う/ 背景~dataと同期する/ 他の生成元からの資源~要請に応答する/ 計算が高価な~dataによる集中型の更新を受信する ]など (例:~geolocationや~gyroscope)。 ◎ Service workers are generic, event-driven, time-limited script contexts that run at an origin. These properties make them natural endpoints for a range of runtime services that may outlive the context of a particular document, e.g. handling push notifications, background data synchronization, responding to resource requests from other origins, or receiving centralized updates to expensive-to-calculate data (e.g., geolocation or gyroscope).
【この訳に特有な表記規約】
◎表記記号原文の~IDLに利用されている `PAGE-VISIBILITY$r の[ `VisibilityState^I 列挙~型, `visibilityState^m 取得子 ]は、 `HTML$r の[ `DocumentVisibilityState$I, `visibilityState$m ]に置換するよう改めている — 前者の仕様は~HTMLに統合されたので ( `1616$issue )。
所与の`文書$ %文書 の `先祖~生成元~文字列~list@ は、 %文書 に`関連な大域~obj$に結付けられた `Location$I ~objの`先祖~生成元~list$に結付けられた(文字列たちが成す)~listを指すとする。
所与の`閲覧~文脈$ %閲覧~文脈 に `対応する~navigable@bc は、 %閲覧~文脈 にて`作動中な~window$bcに`対応する~navigable$を指すとする。
【 原文では、 各所で,[ 引数として`~navigable$を期待する~algo/ 文脈として`~navigable$を期待する用語 ]に`閲覧~文脈$を渡している — この用語は、 それに対処するために,この訳に導入した推定であり、 ~NULL にもなり得るが,[ この仕様において,そうなる場合があり得るのかどうか ]および[ そうなった場合にどう挙動するか ]は はっきりしない。 代替として、 例えば,[ %閲覧~文脈 にて`作動中な文書$bcの`~node~navigable$ ]あるいは[ `~navigable$のうち[ `作動中な閲覧~文脈$nav ~EQ %閲覧~文脈 ]を満たすもの ]として定義するべきかもしれない (これらの定義が一致するかどうかは、はっきりしない) (原文では,一部の箇所で後者の定義を利用しているが、 該当するものが無い場合や複数ある場合が,あり得るのか ]および[ そうなった場合にどう挙動するか ]は はっきりしない。 】
2. ~model
2.1. ~sw
`~sw@ は,`~web~worker$の一種であり、 それを登録している`~sw~client$の`生成元$cl【!`生成元$】において実行される。 ◎ A service worker is a type of web worker. A service worker executes in the registering service worker client's origin.
各`~sw$には、 以下に挙げるものが結付けられる: ◎ ↓
- `状態@sw ◎ A service worker has an associated state,\
- 次に挙げるいずれか 【括弧内は,この訳による補足】 ⇒# `parsed^l (構文解析-済み)/ `installing^l (~install中) / `installed^l (~install済み) / `activating^l (作動化-中) / `activated^l (作動化-済み)/ `redundant^l (冗長) ◎ which is one of "parsed", "installing", "installed", "activating", "activated", and "redundant".\
- 初期~時は `parsed^l とする。 ◎ It is initially "parsed".
- `~script~URL@sw ◎ A service worker has an associated script url\
- `~URL$。 ◎ (a URL).
- `種別@sw ◎ A service worker has an associated type\
- 次に挙げるいずれか ⇒# `classic^l / `module^l ◎ which is either "classic" or "module".\
- 他が言明されない限り, `classic^l とする ◎ Unless stated otherwise, it is "classic".
- `包含している~sw登録@sw ◎ A service worker has an associated containing service worker registration\
- この~swを包含している,`~sw登録$。 ◎ (a service worker registration), which contains itself.
- 【 これが具体的にどう[ 定義-/決定-/設定- ]されるかは、 この仕様には述べられていない。 この~swが,ある~sw登録の[ `~install中の~worker$swr/`待機-中な~worker$swr/`作動中な~worker$swr ]であるときの、 その~sw登録を指すように見受けられる (該当し得る記述は他に見当たらない)。 】
- `大域~obj@sw ◎ A service worker has an associated global object\
- `ServiceWorkerGlobalScope$I ~obj/ ~NULL ◎ (a ServiceWorkerGlobalScope object or null).
- 【 ~accessされる前に,(この`~swを走らす$ときに)非 ~NULL に設定される ( ~NULL をとるのは初期~時に限られるようだ)。 】
- `~script資源@sw ◎ A service worker has an associated script resource\
- `~script$/~NULL ◎ (a script),\
- この~swの自前の~script資源を表現する。 ◎ which represents its own script resource.\
- 初期~時は ~NULL とする。 ◎ It is initially set to null.
-
各`~script資源$swには、 次に挙げるものが結付けられる: ◎ ↓
- `これまでに評価されたか@sw ⇒ 真偽値 — 初期~時は ~F とする。 ◎ A script resource has an associated has ever been evaluated flag.\ It is initially unset.
- `施策~容器@sw ⇒ `施策~容器$ — 初期~時は新たな`施策~容器$とする。 ◎ A script resource has an associated policy container (a policy container).\ It is initially a new policy container.
- `~script資源~map@sw ◎ A service worker has an associated script resource map\
- `有順序~map$ — 各~entryは[ `~URL$ → `応答$ ]を与える。 ◎ which is an ordered map where the keys are URLs and the values are responses.
- `利用した~scriptの集合@sw ◎ A service worker has an associated set of used scripts\
- `集合$ — 各`~item$は`~URL$を与える。 ◎ (a set) whose item is a URL.\
- 初期~時は新たな`集合$とする。 ◎ It is initially a new set.
- 注記: `利用した~scriptの集合$swは、[ 更新~検査の間に旧~workerの~mapに基づいて拡充された,新たな~workerの~map ]から[ その~installation後に未利用な資源を刈り取る ]ために限り利用される。 ◎ Note: The set of used scripts is only used to prune unused resources from a new worker’s map after installation, that were populated based on the old worker’s map during the update check.
- `待機を飛ばすか@sw ◎ A service worker has an associated skip waiting\
- 真偽値 ◎ flag.\
- 他が言明されない限り ~F とする。 ◎ Unless stated otherwise it is unset.
- `古典~scriptは~import済みか@sw ◎ A service worker has an associated classic scripts imported\
- 真偽値 ◎ flag.\
- 初期~時は ~F とする。 ◎ It is initially unset.
- `取扱う~event型の集合@sw ◎ A service worker has an associated set of event types to handle\
- `集合$ — 各`~item$は、 `~event~listener$の~event型を与える。 ◎ (a set) whose item is an event listener’s event type.\
- 初期~時は新たな`集合$とする。 ◎ It is initially a new set.
- `延長-済み~event集合@sw ◎ A service worker has an associated set of extended events\
- `集合$ — 各`~item$は、 `ExtendableEvent$I を与える。 ◎ (a set) whose item is an ExtendableEvent.\
- 初期~時は新たな`集合$とする。 ◎ It is initially a new set.
- `開始~状態@sw ◎ A service worker has an associated start status\
- ~NULL / `Completion$ ◎ which can be null or a Completion.\
- 初期~時は ~NULL とする。 ◎ It is initially null.
- `すべての~fetch~listenerは空か@sw ◎ A service worker has an associated all fetch listeners are empty\
- 真偽値 ◎ flag.\
- 初期~時は ~F とする。 ◎ It is initially unset.
- `~router規則~list@ ◎ A service worker has an associated list of router rules\
- `RouterRule$I たちが成す`~list$ ◎ (a list of RouterRules).\
- 初期~時は新たな`~list$とする。 ◎ It is initially an empty list.
`~sw$は、 その`~event~loop$が走っているとき, `走っている@ という。 ◎ A service worker is said to be running if its event loop is running.
2.1.1. 存続期間
`~sw$の存続期間は、 ~eventたちの実行~存続期間に束ねられる — `~sw~client$が保持する `ServiceWorker$I ~objへの参照ではなく。 ◎ The lifetime of a service worker is tied to the execution lifetime of events and not references held by service worker clients to the ServiceWorker object.
~UAは、 次に該当するときは,いつでも`~sw$を`終了-$してヨイ: ◎ A user agent may terminate service workers at any time it:
- 取扱う~eventは無いとき。 ◎ Has no event to handle.
- 異常な演算を検出したとき — 例 ⇒# 無限~loopになったとき/ ~eventを取扱っている間に課された時間~制限sを超過した~taskがあるとき ◎ Detects abnormal operation: such as infinite loops and tasks exceeding imposed time limits (if any) while handling the events.
2.1.2. ~event
~sw仕様は、 `~sw~event@ として,次に挙げる`~event$を定義する (`一覧@#execution-context-events$を見よ): ◎ The Service Workers specification defines service worker events (each of which is an event) that include (see the list):
- `~lifecycle~event@ ⇒ `install$et, `activate$et ◎ Lifecycle events: install and activate.
- `機能的~event@ ⇒ `fetch$et, ~sw仕様を`拡張する@#extensibility$他の仕様により定義される`~event$ (`一覧@#execution-context-events$を見よ) ◎ Functional events: fetch and the events defined by other specifications that extend the Service Workers specification. (See the list.)
- `message$et【!etC】, `messageerror$et ◎ message and messageerror.
2.2. ~swの計時
各~swは、 ある種の時点を指す時刻を~markする — それらは、 `PerformanceNavigationTiming$I ~APIにより後で公開される。 ◎ Service workers mark certain points in time that are later exposed by the navigation timing API.
`~sw計時~報@ は、 次に挙げる`~item$sctからなる`構造体$である: ◎ A service worker timing info is a struct. It has the following items:
- `開始~時刻@swT ◎ start time
- `DOMHighResTimeStamp$I — 初期~時は 0 とする。 ◎ A DOMHighResTimeStamp, initially 0.
- `~fetch~event配送-時刻@swT ◎ fetch event dispatch time
- `DOMHighResTimeStamp$I — 初期~時は 0 とする。 ◎ A DOMHighResTimeStamp, initially 0.
2.3. ~sw登録
`~sw登録@ は、 `~scope~URL$swr, `~storage~key$, および一式の`~sw$ — `~install中の~worker$swr, `待機-中な~worker$swr, `作動中な~worker$swr — からなる~tupleである。 ◎ A service worker registration is a tuple of a scope url, a storage key, and a set of service workers, an installing worker, a waiting worker, and an active worker.\
~UAは、 同じ生成元の中で,`~sw登録$を何個でも可能化してヨイ — それらの`~scope~URL$swrが,互いに相違する限りにおいて。 `~sw登録$は、 その`~scope~URL$swrが~UA内に既存の`~sw登録$のそれと一致するときには,既存の`~sw登録$を置換することになる。 ◎ A user agent may enable many service worker registrations at a single origin so long as the scope url of the service worker registration differs. A service worker registration of an identical scope url when one already exists in the user agent causes the existing service worker registration to be replaced.
各`~sw登録$には、 以下に挙げるものが結付けられる: ◎ ↓
- `~storage~key@swr ◎ A service worker registration has an associated storage key\
- `~storage~key$。 ◎ (a storage key).
- `~scope~URL@swr ◎ A service worker registration has an associated scope url\
- `~URL$。 ◎ (a URL).
- `~install中の~worker@swr ◎ A service worker registration has an associated installing worker\
- ~NULL /次を満たす`~sw$ ⇒ `状態$sw ~EQ `installing^l ◎ (a service worker or null) whose state is "installing".\
- 初期~時は ~NULL とする。 ◎ It is initially set to null.
- `待機-中な~worker@swr ◎ A service worker registration has an associated waiting worker\
- ~NULL /次を満たす`~sw$ ⇒ `状態$sw ~EQ `installed^l ◎ (a service worker or null) whose state is "installed".\
- 初期~時は ~NULL とする。 ◎ It is initially set to null.
- `作動中な~worker@swr ◎ A service worker registration has an associated active worker\
- ~NULL/次を満たす`~sw$ ⇒ `状態$sw ~IN { `activating^l, `activated^l } ◎ (a service worker or null) whose state is either "activating" or "activated".\
- 初期~時は ~NULL とする。 ◎ It is initially set to null.
- `最後の更新~検査-時刻@swr ◎ A service worker registration has an associated last update check time.\
- 初期~時は ~NULL とする。 ◎ It is initially set to null.
- `~sw登録$が `非新鮮@ であるとは、 この句が評価される時点で,次が満たされることを意味する ⇒ [ `最後の更新~検査-時刻$swr ~NEQ ~NULL ]~AND[ 現在の時刻 ~GT `最後の更新~検査-時刻$swr ~PLUS 86400 秒 ] ◎ A service worker registration is said to be stale if the registration’s last update check time is non-null and the time difference in seconds calculated by the current time minus the registration’s last update check time is greater than 86400.
- `~cacheを介する更新~mode@swr ◎ A service worker registration has an associated update via cache mode,\
- 次に挙げるいずれか ⇒# `imports^l, `all^l, `none^l ◎ which is "imports", "all", or "none".\
- 初期~時は `imports^l とする。 ◎ It is initially set to "imports".
- `~back-up~task~list@swr ◎ A service worker registration has one or more task queues\
- [ この`~sw登録$にて`作動中な~worker$swrの`~event~loop$ ]に属する`~task~queue$からの`~task$たちを,~back-upする。 この~listが~back-upするのは、[ `~fetchを取扱う~task~source$/`機能的~eventを取扱う~task~source$ ]から~queueされた~taskに限られる。 ◎ that back up the tasks from its active worker’s event loop’s corresponding task queues. (The target task sources for this back up operation are the handle fetch task source and the handle functional event task source.)\
- 【 この用語は、 原文では “~task~sourceごとに仕分けられる,いくつかの~task~queue” として定義されているが、 この訳では,単独の~listに改めている — どの~taskも その`~source$tKが当の~task~sourceを保持するので,ここで仕分ける必要はないことに加え、 これは単なる~back-up用の~listであり,`~task~queue$ではないので。 (それに伴い,この用語が利用される箇所も 原文と等価になるよう変形している。) 】
- ~UAは、 `作動中な~worker$swrが`終了-$されたとき,~workerの`~task$たちを`~back-up~task~list$swrに~dumpした上で、 ~workerが再び立ち上がった( `spin-off^en した)ときには,~dumpされた~taskたちを[ %~worker の`~event~loop$に属する,各~taskの`~source$tKに対応している`~task~queue$ ]に~queueし直すことになる。 【! 不要 Unlike the task queues owned by event loops, ...】 ◎ The user agent dumps the active worker’s tasks to the service worker registration's task queues when the active worker is terminated and re-queues those tasks to the active worker’s event loop’s corresponding task queues when the active worker spins off. Unlike the task queues owned by event loops, the service worker registration's task queues are not processed by any event loops in and of itself.
- `~NavigationPreloadManager@swr ◎ A service worker registration has an associated\
- `NavigationPreloadManager$I ~obj。 【各 `~sw登録$と一対一に対応する。】 ◎ NavigationPreloadManager object.
- `~navi~preloadは可能化されるか@swr ◎ A service worker registration has an associated navigation preload enabled\
- 真偽値をとり,初期~時は ~F とする。 ◎ flag. It is initially unset.
- `~navi~preload~header値@swr ◎ A service worker registration has an associated navigation preload header value,\
- `~byte列$。 ◎ which is a byte sequence.\
- 初期~時は `true^bl とする。 ◎ It is initially set to `true`.
`~sw登録$ %登録 は、 次を満たすならば, `未登録にされて@ いるとされる ⇒ `登録~map$[ ( %登録 の`~storage~key$swr, `~URLを直列化する$( %登録【!this が`表現する~sw登録$】 の`~scope~URL$swr ) ) ] ~NEQ %登録 ◎ A service worker registration is said to be unregistered if registration map[this service worker registration's (storage key, serialized scope url)] is not this service worker registration.
2.3.1. 存続期間
~UAは、 `登録-$された`~sw登録$たちが成す~listを持続的に保つモノトスル — 明示的に`未登録にされて$いない限り。 それらは、 `登録~map$【!of the tuple of ....】に格納される。 `~sw登録$ %登録 の存続期間は、 %登録 を表現する `ServiceWorkerRegistration$I ~objの存続期間を超える — 後者の存続期間は、 %登録 に対応している`~sw~client$の存続期間に限られる。 ◎ A user agent must persistently keep a list of registered service worker registrations unless otherwise they are explicitly unregistered. A user agent has a registration map that stores the entries of the tuple of service worker registration's (storage key, serialized scope url) and the corresponding service worker registration. The lifetime of service worker registrations is beyond that of the ServiceWorkerRegistration objects which represent them within the lifetime of their corresponding service worker clients.
2.4. ~sw~client
`~sw~client@ は、 `環境$である。 ◎ A service worker client is an environment.
各`~sw~client$には、 真偽値をとる `破棄-済みか@ が結付けられる。 初期~時は ~F とする。 ◎ A service worker client has an associated discarded flag. It is initially unset.
`~sw~client$ %~client の`環境を破棄する手続き$は、 次を走らすとする: ◎ Each service worker client has the following environment discarding steps:
- %~client の`破棄-済みか$ ~SET ~T ◎ Set client’s discarded flag.
注記: 実装は、 `破棄-済みか$ ~EQ ~T になった~clientを破棄できる。 ◎ Note: Implementations can discard clients whose discarded flag is set.
`~sw~client$ %~client の `生成元@cl は、 %~client に応じて,次を返す ⇒# `環境~設定群~obj$であるならば %~client の`生成元$enV / ~ELSE_ %~client の`作成時の~URL$enVの`生成元$url ◎ A service worker client has an algorithm defined as the origin that returns the service worker client's origin if the service worker client is an environment settings object, and the service worker client's creation URL’s origin otherwise.
`~sw~client$は、 その`大域~obj$enVに応じて: ◎ ↓
- `Window$I ~objであるならば `~window~client@ と称される。 ◎ A window client is a service worker client whose global object is a Window object.
- `DedicatedWorkerGlobalScope$I ~objであるならば `専用~worker~client@ と称される。 ◎ A dedicated worker client is a service worker client whose global object is a DedicatedWorkerGlobalScope object.
- `SharedWorkerGlobalScope$I ~objであるならば `共用~worker~client@ と称される。 ◎ A shared worker client is a service worker client whose global object is a SharedWorkerGlobalScope object.
`~worker~client@ は、[ `専用~worker~client$, `共用~worker~client$ ]の総称である。 ◎ A worker client is either a dedicated worker client or a shared worker client.
`~storage~keyが登録と同等な~client群@ とは、 次を満たす`~sw~client$ %~client たちが成す集合である ⇒ 次の 2 つは`同等な~storage~key$である ⇒# `~storage~keyを得する$( %~client ) の結果, %~client の`~sw$SWG【%~client を`制御-$している`~sw$?】を`包含している~sw登録$swの`~storage~key$swr
【 この用語は、 以下を簡潔に記すために,この訳に導入している。 この集合を成す~clientたちは、 何箇所かで反復されるが,その順序は定義されていない。 】
2.5. 制御と利用
`~sw~client$ %~client にて`作動中な~sw$enVは、 自前の読込ng, およびその下位資源を~serveする。 %~client にて`作動中な~sw$enVが ~NULL でないとき、 %~client は `作動中な~sw$enVにより `制御-@ されているという。 %~client が,ある`~sw$により`制御-$されているとき、 %~client は`~sw$を`包含している~sw登録$swを `利用して@ いるという。 %~client にて`作動中な~sw$enVは、 以下の各~下位節にて説明されるように決定される。 ◎ A service worker client has an active service worker that serves its own loading and its subresources. When a service worker client has a non-null active service worker, it is said to be controlled by that active service worker. When a service worker client is controlled by a service worker, it is said that the service worker client is using the service worker’s containing service worker registration. A service worker client's active service worker is determined as explained in the following subsections.
【 すなわち,次の 3 つの句は、 同じことを,主語と目的語を入れ替えて表している 】 ⇒# “%~sw は %~client を制御している”, “%~client は %登録 を利用している”, “%登録 は %~sw を包含している”
`この節の残りは規範的でない^em。 ◎ The rest of the section is non-normative.
この節における挙動は、 まだ全部的に指定されておらず, `~HTML標準@https://html.spec.whatwg.org$ にて指定されることになる。 その作業は、 `765$issue, `pull request@https://github.com/whatwg/html/pull/2809$ にて追跡されている。 ◎ The behavior in this section is not fully specified yet and will be specified in HTML Standard. The work is tracked by the issue and the pull request.
2.5.1. ~window~client事例
`~window~client$は、 次のいずれかのとき,`作成-$wCされる: ◎ A window client is created when a browsing context is created and when it navigates.
-
新たな`閲覧~文脈が作成され$るとき — このときの[ `~window~client$にて`作動中な~sw$enV ]は、 次に従って設定される: ◎ When a window client is created in the process of a browsing context creation:
- `閲覧~文脈$の[ 初期~時にて`作動中な文書$bc ]の`生成元$docは`不透明な生成元$である場合 ⇒ ~NULL ◎ If the browsing context's initial active document's origin is an opaque origin, the window client's active service worker is set to null.\
- 他の場合 ⇒ 作成元`文書$【当の`閲覧~文脈が作成され$るとき渡された %作成元 】の`~sw~client$にて`作動中な~sw$enV ◎ Otherwise, it is set to the creator document's service worker client's active service worker.
-
`閲覧~文脈$に`対応する~navigable$bcが`~navigate$されるとき — このときの[ `~window~client$にて`作動中な~sw$enV ]は、 次に従って設定される: ◎ When a window client is created in the process of the browsing context's navigation:
- その`~fetch$が`~HTTP~fetch$を経由しているならば ⇒ `合致する~sw登録$【の`作動中な~worker$swrに設定されることになる~sw?】 ◎ If the fetch is routed through HTTP fetch, the window client's active service worker is set to the result of the service worker registration matching.\
- 他の場合,作成された`文書$の`生成元$docは`不透明な生成元$であるならば ⇒ ~NULL ◎ Otherwise, if the created document's origin is an opaque origin\
- 他の場合,[ ( 作成された`文書$の`生成元$doc, その作成元`文書$†の`生成元$doc ) は`同一-生成元$でない ]ならば ⇒ ~NULL ◎ or not the same as its creator document's origin, the window client's active service worker is set to null.\
- 他の場合 ⇒ その作成元`文書$†の`~sw~client$にて`作動中な~sw$enV ◎ Otherwise, it is set to the creator document's service worker client's active service worker.
【† すなわち、 `~navi~algo$に渡された %~source文書 】
注記: 初期~置換`~navi$用には、[ 当の`閲覧~文脈が作成され$たとき`作成-$wCされた初期`~window~client$ ]が再利用されるが,`作動中な~sw$enVは上と同じ挙動により決定される。 ◎ Note: For an initial replacement navigation, the initial window client that was created when the browsing context was created is reused, but the active service worker is determined by the same behavior as above.
注記: `~sandbox化$された `iframe$e が~sandbox法~指令[ `allow-same-origin^dir, `allow-scripts^dir ]を伴わない場合、 その`生成元$は`不透明な生成元$になるので,`作動中な~sw$enVは ~NULL になる。 ◎ Note: Sandboxed iframes without the sandboxing directives, allow-same-origin and allow-scripts, result in having the active service worker value of null as their origin is an opaque origin.
2.5.2. ~worker~client事例
`~worker~client$は、 ~UAが`~workerを走らす$ときに`作成-$wGされる。 ◎ A worker client is created when the user agent runs a worker.
`~worker~client$が作成されるときの,`作動中な~sw$enVは、 次に従って設定される: ◎ When the worker client is created:
- その`~fetch$が`~HTTP~fetch$を経由しているならば ⇒ `合致する~sw登録$【の`作動中な~worker$swrに設定されることになる~sw?】 ◎ When the fetch is routed through HTTP fetch, the worker client's active service worker is set to the result of the service worker registration matching.\
- 他の場合,`~worker~client$の`生成元$clは`不透明な生成元$であるならば ⇒ ~NULL ◎ Otherwise, if the worker client's origin is an opaque origin,\
- 他の場合,[ その`要請$の`~URL$rqは`~blob~URL$である ]~AND[ ( `~worker~client$の`生成元$cl, `~worker~client$の`大域~obj$の`所有者~集合$の最後の`~item$の`生成元$ ) は`同一-生成元$でない ]ならば ⇒ ~NULL ◎ or the request's URL is a blob URL and the worker client's origin is not the same as the origin of the last item in the worker client's global object's owner set, the worker client's active service worker is set to null.\
- 他の場合 ⇒ `~worker~client$の`大域~obj$の`所有者~集合$の最後の`~item$の`環境~設定群~obj$にて`作動中な~sw$enV ◎ Otherwise, it is set to the active service worker of the environment settings object of the last item in the worker client's global object's owner set.
注記: `data:^c ~URL を伴う[ `~window~client$/`~worker~client$ ]に対しては、 その`生成元$は`不透明な生成元$になるので,`作動中な~sw$enVは ~NULL になる。 `~blob~URL$を伴う[ `~window~client$/`~worker~client$ ]は,その[ 作成元`文書$/所有者 ]から`作動中な~sw$enVを継承し得るが、 `要請$の`生成元$rqが[ 作成元`文書$/所有者 ]の`生成元$と`同一-生成元$でない場合,`作動中な~sw$enVは ~NULL に設定される。 ◎ Note: Window clients and worker clients with a data: URL result in having the active service worker value of null as their origin is an opaque origin. Window clients and worker clients with a blob URL can inherit the active service worker of their creator document or owner, but if the request's origin is not the same as the origin of their creator document or owner, the active service worker is set to null.
2.6. ~task~source
`~sw$は、 次の`~task~source$も追加的に利用する: ◎ The following additional task sources are used by service workers.
- `~fetchを取扱う~task~source@ ◎ The handle fetch task source
- この`~task~source$は、 `~sw$に向けて `fetch$et ~eventを`配送-$するときに利用される。 ◎ This task source is used for dispatching fetch events to service workers.
- `機能的~eventを取扱う~task~source@ ◎ The handle functional event task source
- この`~task~source$は、 他の`機能的~event$を`配送-$する特能~用に利用される — 例: `~sw$向けの `push$et ~event。 ◎ This task source is used for features that dispatch other functional events, e.g. push events, to service workers.
- 注記: ~UAは、 各~機能的~event型ごとに,別々な~task~sourceを利用してもヨイ — ある種の機能的~eventに対する `head-of-line blocking^en 現象†を避けるためとして。 【†長い~taskにより後続の~taskが~~渋滞する現象】 ◎ Note: A user agent may use a separate task source for each functional event type in order to avoid a head-of-line blocking phenomenon for certain functional events.
2.7. ~UA~shutdown
~UAは、 複数回の再始動にまたがって,自身が格納している`~sw登録$たちの状態を,次の規則の下で保守するモノトスル: ◎ A user agent must maintain the state of its stored service worker registrations across restarts with the following rules:
- `~install中の~worker$swrは、 持続することなく破棄する。 それが`~sw登録$用の唯一の`~sw$であった場合、 その登録も破棄する。 ◎ An installing worker does not persist but is discarded. If the installing worker was the only service worker for the service worker registration, the service worker registration is discarded.
- `待機-中な~worker$swrは、 `作動中な~worker$swrに~~昇格する。 ◎ A waiting worker promotes to an active worker.
これを成就するため,~UAは、 自身が終了するときには,次を呼出すモノトスル ⇒ `~UA~shutdownを取扱う$() ◎ To attain this, the user agent must invoke Handle User Agent Shutdown when it terminates.
3. ~client文脈
~swで~bootstrapする例: ◎ Bootstrapping with a service worker:
/*
既定の~scopeは、
当の~scriptが座している~path
— この例では `/^l —
になる
◎
scope defaults to the path the script sits in "/" in this example
*/
navigator.`serviceWorker$n.`register$n("/serviceworker.js").then(%registration => {
console.log("success!");
if (%registration.`ServiceWorkerRegistration^I1`installing$m1) {
%registration.installing.`~postMessageSW$n("Howdy from your installing page.");
}
}, %err => {
console.error("Installing the worker failed!", %err);
});
3.1. `ServiceWorker^I
[`SecureContext$, `Exposed$=(Window,Worker)] interface `ServiceWorker@I : `EventTarget$I { readonly attribute `USVString$ `scriptURL$m; readonly attribute `ServiceWorkerState$I `state$m; `undefined$ `postMessage$m(`any$ %message, `sequence$<`object$> %transfer); `undefined$ `~postMessageSW$n(`any$ %message, optional `StructuredSerializeOptions$I %options = {}); // event attribute `EventHandler$I `onstatechange$m; }; `ServiceWorker$I includes `AbstractWorker$I; enum `ServiceWorkerState@I { "`parsed@m", "`installing@m", "`installed@m", "`activating@m", "`activated@m", "`redundant@m" };
`ServiceWorker$I ~objは、 ある`~sw$を表現する。 いくつかの文書や~workerにまたがって,同時に複数の `ServiceWorker$I ~objが同じ`~sw$を表現し得る。 ◎ A ServiceWorker object represents a service worker. Each ServiceWorker object is associated with a service worker. Multiple separate objects implementing the ServiceWorker interface across documents and workers can all be associated with the same service worker simultaneously.
`ServiceWorkerState$I 列挙は、 `~sw$がとり得る`状態$swを表現し,`~workerの状態を更新する$ときに利用される。 ◎ A ServiceWorker object has an associated ServiceWorkerState object which is itself associated with service worker's state.
`ServiceWorker^I03.1.1. `ServiceWorker^I ~instanceを取得する
各 `環境~設定群~obj$は、 `~sw~obj~map@enV を持つ — それは`有順序~map$であり,それを成す各`~entry$mapは[ `~sw$ → `ServiceWorker$I ~obj ]を与える。 ◎ An environment settings object has a service worker object map, a map where the keys are service workers and the values are ServiceWorker objects.
(ある環境~内で~swを表現している) `~sw~objを取得する@ ときは、 所与の ( `~sw$ %~sw, `環境~設定群~obj$ %環境 ) に対し,次を走らす: ◎ To get the service worker object representing serviceWorker (a service worker) in environment (an environment settings object), run these steps:
- %~obj~map ~LET %環境 の`~sw~obj~map$enV ◎ Let objectMap be environment’s service worker object map.
-
~IF[ %~obj~map[ %~sw ] ~EQ ε ]: ◎ If objectMap[serviceWorker] does not exist, then:
- %~sw~obj ~LET `新たな~obj$( `ServiceWorker$I, %環境 の`~realm$enV ) ◎ Let serviceWorkerObj be a new ServiceWorker in environment’s Realm,\
- %~sw~obj に %~sw を結付ける 【 %~sw~obj は %~sw を “表現する” 】 ◎ and associate it with serviceWorker.
- %~sw~obj の `state$m ~SET %~sw の`状態$sw ◎ Set serviceWorkerObj’s state to serviceWorker’s state.
- %~obj~map[ %~sw ] ~SET %~obj ◎ Set objectMap[serviceWorker] to serviceWorkerObj.
- ~RET %~obj~map[ %~sw ] ◎ Return objectMap[serviceWorker].
3.1.2. `scriptURL@m
取得子~手続きは ⇒ ~RET `~URLを直列化する$( コレが表現する`~sw$の`~script~URL$sw ) ◎ The scriptURL getter steps are to return the service worker's serialized script url.
例えば `https://example.com/app.html^c への~naviにより作成される文書を考える — それは、 以前に次の登録~callが実行されていて,`合致する~sw登録$があるとする: ◎ For example, consider a document created by a navigation to https://example.com/app.html which matches via the following registration call which has been previously executed:
/*
~page `https://example.com/app.html^c 上の~script
◎
Script on the page https://example.com/app.html
*/
navigator.`serviceWorker$n.`register$n("/service_worker.js");
`navigator.serviceWorker.controller.scriptURL^c の値は `https://example.com/service_worker.js^l になる。 ◎ The value of navigator.serviceWorker.controller.scriptURL will be "https://example.com/service_worker.js".
3.1.3. `state@m
取得子~手続きは ⇒ ~RET 最後に設定された( `ServiceWorkerState$I 列挙~型の)値 【この値は、コレが表現する`~sw$の`状態$swを反映する。】 ◎ The state attribute must return the value (in ServiceWorkerState enumeration) to which it was last set.
3.1.4. `postMessage(message, transfer)@m
~method手続きは: ◎ The postMessage(message, transfer) method steps are:
- %options ~LET «[ `transfer^l → %transfer ]» ◎ Let options be «[ "transfer" → transfer ]».
- コレ上で `~postMessageSW(message, options)$n ~method手続き(次節)を遂行する ◎ Invoke postMessage(message, options) with message and options as the arguments.
3.1.5. `~postMessageSW(message, options)@n
~method手続きは: ◎ The postMessage(message, options) method steps are:
- %~sw ~LET コレが表現している`~sw$ ◎ Let serviceWorker be the service worker represented by this.
- %現任な設定群 ~LET `現任な設定群~obj$ ◎ Let incumbentSettings be the incumbent settings object.
- %現任な大域~obj ~LET %現任な設定群 の`大域~obj$enV ◎ Let incumbentGlobal be incumbentSettings’s global object.
- %直列化した転送-結果 ~LET ~ABRUPT `StructuredSerializeWithTransfer$jA( %message, %options[ "`transfer$n" ] ) ◎ Let serializeWithTransferResult be StructuredSerializeWithTransfer(message, options["transfer"]). Rethrow any exceptions.
- ~IF[ `~eventを飛ばすべきか?$( `message^l, %~sw ) ~EQ ~T ] ⇒ ~RET ◎ If the result of running the Should Skip Event algorithm with "message" and serviceWorker is true, then return.
-
この段は`並列的$に走らす: ◎ Run these substeps in parallel:
- ~IF[ `~swを走らす$( %~sw ) ~EQ `失敗^i ] ⇒ ~RET ◎ If the result of running the Run Service Worker algorithm with serviceWorker is failure, then return.
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き ) ◎ Queue a task on the DOM manipulation task source to run the following steps:
手続きは:
-
%~source ~LET %現任な大域~obj の型に応じて,次で決定される~obj: ◎ Let source be determined by switching on the type of incumbentGlobal:
- `ServiceWorkerGlobalScope$I
- `~sw~objを取得する$( %現任な大域~obj の`~sw$SWG, %~sw の`大域~obj$swに`関連な設定群~obj$ ) ◎ The result of getting the service worker object that represents incumbentGlobal’s service worker in the relevant settings object of serviceWorker’s global object.
- `Window$I
- %現任な大域~obj に`関連な設定群~obj$を表現する新たな `WindowClient$I ~obj ◎ a new WindowClient object that represents incumbentGlobal’s relevant settings object.
- その他
- %現任な大域~obj に結付けられた~workerを表現する新たな `Client$I ~obj ◎ a new Client object that represents incumbentGlobal’s associated worker
- %生成元 ~LET `生成元を直列化する$( %現任な設定群 の`生成元$enV ) ◎ Let origin be the serialization of incumbentSettings’s origin.
- %行先 ~LET %~sw に結付けられた `ServiceWorkerGlobalScope$I 【 %~sw の`大域~obj$sw】 【!上で`~swを走らす$ときに作成され得る/ %行先 の`~sw$SWG ~EQ %~sw 】 ◎ Let destination be the ServiceWorkerGlobalScope object associated with serviceWorker.
- %~event ~LET `~eventを作成する$( `ExtendableMessageEvent$I ) ◎ ↓
-
%逆直列化-~record ~LET `StructuredDeserializeWithTransfer$jA( %直列化した転送-結果, %行先 に`関連な~realm$ ) ◎ Let deserializeRecord be StructuredDeserializeWithTransfer(serializeWithTransferResult, destination’s Realm).
~IF[ 例外が投出された ] ⇒ %~event の属性を次のように初期化する ⇒# `type$n 属性 ~SET `messageerror$et【!etC】, `ExtendableMessageEvent^I1`origin$m1 属性 ~SET %生成元, `source$m1 属性 ~SET %~source ◎ If this throws an exception, let e be the result of creating an event named messageerror, using ExtendableMessageEvent, with the origin attribute initialized to origin and the source attribute initialized to source.
~ELSE: ◎ Else:
- %新たな~portたち ~LET 【 %行先 に`関連な~realm$内で】 `凍結d配列を作成する$( %逆直列化-~record . `TransferredValues^sl 内のすべての `MessagePort$I ~objからなる同順の~list ) ◎ Let messageClone be deserializeRecord.[[Deserialized]]. ◎ Let newPorts be a new frozen array consisting of all MessagePort objects in deserializeRecord.[[TransferredValues]], if any, maintaining their relative order.
- %~event の属性を次のように初期化する ⇒# `type$n 属性 ~SET `message$et, `ExtendableMessageEvent^I1`origin$m1 属性 ~SET %生成元, `source$m1 属性 ~SET %~source, `data$m1 属性 ~SET %逆直列化-~record . `Deserialized^sl, `ports$m1 属性 ~SET %新たな~portたち ◎ Let e be the result of creating an event named message, using ExtendableMessageEvent, with the origin attribute initialized to origin, the source attribute initialized to source, the data attribute initialized to messageClone, and the ports attribute initialized to newPorts.
- `~eventを配送する$( %行先, %~event ) ◎ Dispatch e at destination.
- `~sw延長-済み~event集合を更新する$( %~sw, %~event ) ◎ Invoke Update Service Worker Extended Events Set with serviceWorker and e.
-
3.1.6. ~event~handler
どの `ServiceWorker$I ~objも、 次に挙げる`~event~handler$(および対応する`~event~handler~event型$)を,`~event~handler~IDL属性$として~supportするモノトスル: ◎ The following is the event handler (and its corresponding event handler event type) that must be supported, as event handler IDL attributes, by all objects implementing ServiceWorker interface:
`~event~handler$ | `~event~handler~event型$ |
---|---|
`onstatechange@m | `statechange$et |
3.2. `ServiceWorkerRegistration^I
[`SecureContext$, `Exposed$=(Window,Worker)] interface `ServiceWorkerRegistration@I : `EventTarget$I { readonly attribute `ServiceWorker$I? `installing$m; readonly attribute `ServiceWorker$I? `waiting$m; readonly attribute `ServiceWorker$I? `active$m; [`SameObject$] readonly attribute `NavigationPreloadManager$I `navigationPreload$m; readonly attribute `USVString$ `scope$m; readonly attribute `ServiceWorkerUpdateViaCache$I `updateViaCache$m; [`NewObject$] `Promise$<`undefined$> `update$m(); [`NewObject$] `Promise$<`boolean$> `unregister$m(); // event attribute `EventHandler$I `onupdatefound$m; }; enum `ServiceWorkerUpdateViaCache@I { "`imports@m", "`all@m", "`none@m" };
各 `ServiceWorkerRegistration$I ~objは、 ある`~sw登録$を表現する。 それを指して,~objが `表現する~sw登録@ という。 ◎ A ServiceWorkerRegistration has a service worker registration (a service worker registration).
【 所与の~sw登録を表現する `ServiceWorkerRegistration^I ~objは, 1 つに限られないが、 同じ`~realm$gL(環境~設定群~obj)内では 1 つに限られる。 】
`ServiceWorkerRegistration^I03.2.1. `ServiceWorkerRegistration^I ~instanceの取得-法
各 `環境~設定群~obj$は、 `~sw登録~obj~map@enV を持つ — それは`有順序~map$であり,それを成す各`~entry$mapは[ `~sw登録$ → `ServiceWorkerRegistration$I ~obj ]を与える。 ◎ An environment settings object has a service worker registration object map, a map where the keys are service worker registrations and the values are ServiceWorkerRegistration objects.
(ある環境~内で~sw登録を表現している) `~sw登録~objを取得する@ ときは、 所与の ( `~sw登録$ %登録, `環境~設定群~obj$ %環境 ) に対し,次を走らす: ◎ To get the service worker registration object representing registration (a service worker registration) in environment (an environment settings object), run these steps:
- %~obj~map ~LET %環境 の`~sw登録~obj~map$enV ◎ Let objectMap be environment’s service worker registration object map.
-
~IF[ %~obj~map[ %登録 ] ~EQ ε ]: ◎ If objectMap[registration] does not exist, then:
- %登録~obj ~LET `新たな~obj$( `ServiceWorkerRegistration$I, %環境 の`~realm$enV ) ◎ Let registrationObject be a new ServiceWorkerRegistration in environment’s Realm.
- %登録~obj が`表現する~sw登録$ ~SET %登録 ◎ Set registrationObject’s service worker registration to registration.
- %登録~obj の ⇒# `installing$m 属性 ~SET ~NULL, `waiting$m 属性 ~SET ~NULL, `active$m 属性 ~SET ~NULL ◎ Set registrationObject’s installing attribute to null. ◎ Set registrationObject’s waiting attribute to null. ◎ Set registrationObject’s active attribute to null.
- ~IF[ %登録 の`~install中の~worker$swr ~NEQ ~NULL ] ⇒ %登録~obj の `installing$m 属性 ~SET `~sw~objを取得する$( %登録 の`~install中の~worker$swr, %環境 ) ◎ If registration’s installing worker is not null, then set registrationObject’s installing attribute to the result of getting the service worker object that represents registration’s installing worker in environment.
- ~IF[ %登録 にて`待機-中な~worker$swr ~NEQ ~NULL ] ⇒ %登録~obj の `waiting$m 属性 ~SET `~sw~objを取得する$( %登録 にて`待機-中な~worker$swr, %環境 ) ◎ If registration’s waiting worker is not null, then set registrationObject’s waiting attribute to the result of getting the service worker object that represents registration’s waiting worker in environment.
- ~IF[ %登録 にて`作動中な~worker$swr ~NEQ ~NULL ] ⇒ %登録~obj の `active$m 属性 ~SET `~sw~objを取得する$( %登録 にて`作動中な~worker$swr, %環境 ) ◎ If registration’s active worker is not null, then set registrationObject’s active attribute to the result of getting the service worker object that represents registration’s active worker in environment.
- %~obj~map[ %登録 ] ~SET %登録~obj ◎ Set objectMap[registration] to registrationObject.
- ~RET %~obj~map[ %登録 ] ◎ Return objectMap[registration].
3.2.6. `scope@m
取得子~手続きは ⇒ ~RET `~URLを直列化する$( コレが`表現する~sw登録$の`~scope~URL$swr ) ◎ The scope getter steps are to return the service worker registration's serialized scope url.
例えば、 § `ServiceWorker^I1`scriptURL$m1 の例においては、
navigator.serviceWorker.ready.then(%registration => console.log(%registration.scope))
から得される `registration.scope^c の値は、 `https://example.com/^l になる。
◎ In the example in § 3.1.2 scriptURL, the value of registration.scope, obtained from navigator.serviceWorker.ready.then(registration => console.log(registration.scope)) for example, will be "https://example.com/".3.2.7. `updateViaCache@m
取得子~手続きは ⇒ ~RET コレが`表現する~sw登録$の`~cacheを介する更新~mode$swr ◎ The updateViaCache getter steps are to return the service worker registration's update via cache mode.
3.2.8. `update()@m
~method手続きは: ◎ The update() method steps are:
- %登録 ~LET コレが`表現する~sw登録$ ◎ Let registration be the service worker registration.
- %最新~worker ~LET `最新な~workerを取得する$( %登録 ) ◎ Let newestWorker be the result of running Get Newest Worker algorithm passing registration as its argument.
- ~IF[ %最新~worker ~EQ ~NULL ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E 例外 ) ◎ If newestWorker is null, return a promise rejected with an "InvalidStateError" DOMException and abort these steps.
- %大域~obj ~LET コレに`関連な大域~obj$ ◎ ↓
- ~IF[ %大域~obj は `ServiceWorkerGlobalScope$I ~objである ]~AND[ %大域~obj の`~sw$SWGの`状態$sw ~EQ `installing^l ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E 例外 ) ◎ If this's relevant global object globalObject is a ServiceWorkerGlobalScope object, and globalObject’s associated service worker's state is "installing", return a promise rejected with an "InvalidStateError" DOMException and abort these steps.
- %~promise ~LET `新たな~promise$ ◎ Let promise be a promise.
- %~job ~LET `~jobを作成する$( ↓ ) ⇒# `更新する^i, %登録 の`~storage~key$swr, %登録 の`~scope~URL$swr, %最新~worker の`~script~URL$sw, %~promise, コレに`関連な設定群~obj$ ◎ Let job be the result of running Create Job with update, registration’s storage key, registration’s scope url, newestWorker’s script url, promise, and this's relevant settings object.
- %~job の`~worker種別$job ~SET %最新~worker の`種別$sw ◎ Set job’s worker type to newestWorker’s type.
- `~jobを~scheduleする$( %~job ) ◎ Invoke Schedule Job with job.
- ~RET %~promise ◎ Return promise.
3.2.10. ~event~handler
どの `ServiceWorkerRegistration$I ~objも、 次に挙げる`~event~handler$(および対応する`~event~handler~event型$)を,`~event~handler~IDL属性$として~supportするモノトスル: ◎ The following is the event handler (and its corresponding event handler event type) that must be supported, as event handler IDL attributes, by all objects implementing ServiceWorkerRegistration interface:
`~event~handler$ | `~event~handler~event型$ |
---|---|
`onupdatefound@m | `updatefound$et |
3.4. `ServiceWorkerContainer^I
[`SecureContext$, `Exposed$=(Window,Worker)]
interface `ServiceWorkerContainer@I : `EventTarget$I {
readonly attribute `ServiceWorker$I? `controller$m;
readonly attribute `Promise$<`ServiceWorkerRegistration$I> `ready$m;
[`NewObject$] `Promise$<`ServiceWorkerRegistration$I> `register$m(`TrustedScriptURL$c %scriptURL, optional `RegistrationOptions$I %options = {});
[`NewObject$] `Promise$<(`ServiceWorkerRegistration$I or `undefined$)> `getRegistration$m(optional `USVString$ %clientURL = "");
[`NewObject$] `Promise$<`FrozenArray$<`ServiceWorkerRegistration$I>> `getRegistrations$m();
`undefined$ `startMessages$m();
// events
attribute `EventHandler$I `oncontrollerchange$m;
attribute `EventHandler$I `onmessage$m; /*
`message$etC ~eventの `source^m 属性は `ServiceWorker$I ~objになる
◎
event.source of message events is ServiceWorker object
*/
attribute `EventHandler$I `onmessageerror$m;
};
dictionary `RegistrationOptions@I { `USVString$ `scope@m; `WorkerType$I `type@m = `classic^l; `ServiceWorkerUpdateViaCache$I `updateViaCache@m = `imports^l; };
~UAは、[ `Navigator$I / `WorkerNavigator$I ]~objを作成したときには、 `ServiceWorkerContainer$I ~objを作成して,前者に後者を結付けるモノトスル。 ◎ The user agent must create a ServiceWorkerContainer object when a Navigator object or a WorkerNavigator object is created and associate it with that object.
`ServiceWorkerContainer$I は、 `~sw登録$ %登録 を[ 登録する, 未登録にする, 更新する ]能力,および[ %登録 の状態, および %登録 に結付けられた`~sw$たち ]への~accessを供する。 ◎ A ServiceWorkerContainer provides capabilities to register, unregister, and update the service worker registrations, and provides access to the state of the service worker registrations and their associated service workers.
各 `ServiceWorkerContainer$I ~obj %容器 には、 以下に挙げるものが結付けられる: ◎ ↓
- `~sw~client@SWC ◎ A ServiceWorkerContainer has an associated service worker client,\
- 次を満たす`~sw~client$ %~client を指す ⇒ [ %~client の`大域~obj$enVに結付けられた[ `Navigator$I / `WorkerNavigator$I ]~objに結付けられた `ServiceWorkerContainer$I ~obj ] ~EQ %容器 ◎ which is a service worker client whose global object is associated with the Navigator object or the WorkerNavigator object that the ServiceWorkerContainer is retrieved from.
- 【 すなわち, 大域~obj . `navigator^n . `serviceWorker$n ~EQ %容器 】
- `準備済み~promise@SWC ◎ A ServiceWorkerContainer object has an associated ready promise\
- `~promise$ / ~NULL ◎ (a promise or null).\
- 初期~時は ~NULL とする ◎ It is initially null.
- `~client~message~queue@SWC ◎ A ServiceWorkerContainer object has a task source called the client message queue,\
- `~task~source$ 【すなわち、`~task~queue$であると同時に,独立な~task~sourceを成す。】 ◎ ↑
- 初期~時は空とする。 ◎ initially empty.\
- この~queueは[ 可能化-/不能化- ]され得る — 初期~時は不能化されているとする。 可能化されたときは、 `~event~loop$は,それを自身の`~task~source$の一つとして利用するモノトスル。 【すなわち,可能化されている間に限り、~queueを成す~taskたちを~event~loopの中で走らす。】 ◎ A client message queue can be enabled or disabled, and is initially disabled. When a ServiceWorkerContainer object’s client message queue is enabled, the event loop must use it as one of its task sources.\
- [ %容器 に`関連な大域~obj$ %G が`~window$である ]ときは、 この~queueに`~queueされ$たすべての`~task$には, %G に`結付けられた文書$を結付けるモノトスル。 【すなわち、~taskの`文書$tK ~SET その文書】 ◎ When the ServiceWorkerContainer object’s relevant global object is a Window object, all tasks queued on its client message queue must be associated with its relevant settings object’s associated document.
3.4.7. ~event~handler
どの `ServiceWorkerContainer$I ~objも、 次に挙げる`~event~handler$(および対応する`~event~handler~event型$)を,`~event~handler~IDL属性$として~supportするモノトスル: ◎ The following are the event handlers (and their corresponding event handler event types) that must be supported, as event handler IDL attributes, by all objects implementing the ServiceWorkerContainer interface:
`~event~handler$ | `~event~handler~event型$ |
---|---|
`oncontrollerchange@m | `controllerchange$etC |
`onmessage@m | `message$etC |
`onmessageerror@m | `messageerror$etC |
コレの `onmessage$m 設定子~手続きが初回に遂行されたときは、 コレの`~client~message~queue$SWCを可能化するモノトスル。 ◎ The first time the onmessage setter steps are performed, enable this's client message queue.
3.5. ~event
次の表tの 1 列目に挙げる~eventが、 同じ行の 2 列目に挙げる~objに向けて配送される — いずれも, `Event$I を実装する:
~event名 | 配送-先 | 配送-時機 |
---|---|---|
`statechange@et | `ServiceWorker$I | `ServiceWorker$I1 ~objの `state$m1 属性が変化したとき。 |
`updatefound@et | `ServiceWorkerRegistration$I | ~objが`表現する~sw登録$にて`~install中の~worker$swrが変化したとき (`~installする$ ~algoを見よ)。 |
`controllerchange@etC | `ServiceWorkerContainer$I |
`~sw~client$SWCにて`作動中な~sw$enVが変化したとき (`作動化する$~algoを見よ)。
[
`~sw$の`待機を飛ばすか$sw ~EQ ~T
]の下では、
`~sw~client$たちが`~sw登録$を`利用して$いる間,`~sw登録$を`作動化する$
— `作動中な~worker$swrは,即時に,`~sw~client$を`制御-$している`~sw$として
|
`message@etC | `ServiceWorkerContainer$I | `~sw~client$SWCは、 `~sw$から~messageを受信したとき。 `~postMessageClient(message, options)$n を見よ。 |
`messageerror@etC | `ServiceWorkerContainer$I | `~sw~client$SWCは、 `~sw$から逆直列化できない~messageを送信したとき。 `~postMessageClient(message, options)$n を見よ。 |
4. 実行~文脈
~cacheされた資源たちの~serve法: ◎ Serving Cached Resources:
// caching.js self.addEventListener("install", %event => { %event.`waitUntil$n( /* 資源たちが成す~cacheを~openする。 ◎ Open a cache of resources. */ `caches$n.`CacheStorage^I1`open$m1("shell-v1").then(%cache => { /* それらを~fetchする処理nを始める。 成功するのは、 すべての資源が格納されたときに限られる — 一つでも失敗した資源があれば、 演算~全体は失敗する。 ◎ Begins the process of fetching them. Succeeds only once all resources have been stored. Even just one failing resource causes the entire operation to fail. */ return %cache.addAll([ "/app.html", "/assets/v1/base.css", "/assets/v1/app.js", "/assets/v1/logo.png", "/assets/v1/intro_video.webm" ]); }) ); }); self.addEventListener("fetch", %event => { /* 成功裡に~installされ, 作動化されるまでは、 ~swに向けて `fetch$et ~eventが配送されることはない。 ◎ No "fetch" events are dispatched to the service worker until it successfully installs and activates. */ /* 合致している~URLも含め,~cache上のすべての演算は非同期cなので、 ~promiseを多用する。 これを可能化するため, `respondWith()$n も~promiseを引数にとる: ◎ All operations on caches are async, including matching URLs, so we use promises heavily. e.respondWith() even takes promises to enable this: */ %event.respondWith( `caches$n.`Cache^I1`match$m1(%e.request).then(%response => { return %response || fetch(%e.request); }).catch(() => { return caches.match("/fallback.html"); }) ); });
4.1. `ServiceWorkerGlobalScope^I
[`Global$=(`Worker$I,`ServiceWorker$I), `Exposed$=ServiceWorker, `SecureContext$] interface `ServiceWorkerGlobalScope@I : `WorkerGlobalScope$I { [`SameObject$] readonly attribute `Clients$I `clients$m; [`SameObject$] readonly attribute `ServiceWorkerRegistration$I `registration$m; [`SameObject$] readonly attribute `ServiceWorker$I `serviceWorker$m; [`NewObject$] `Promise$<`undefined$> `skipWaiting$m(); attribute `EventHandler$I `oninstall$m; attribute `EventHandler$I `onactivate$m; attribute `EventHandler$I `onfetch$m; attribute `EventHandler$I `onmessage$m; attribute `EventHandler$I `onmessageerror$m; };
`ServiceWorkerGlobalScope$I ~objは、 `~sw$の大域~実行~文脈を表現する。 各 `ServiceWorkerGlobalScope$I ~objには、 次に挙げるものが結付けられる: ◎ A ServiceWorkerGlobalScope object represents the global execution context of a service worker.
- `~sw@SWG ⇒ ある`~sw$ ◎ A ServiceWorkerGlobalScope object has an associated service worker (a service worker).
- `~importする~script用には~cacheを迂回するよう強制するか@SWG ⇒ 真偽値をとり,初期~時は ~F とする。 ◎ A ServiceWorkerGlobalScope object has an associated force bypass cache for import scripts flag. It is initially unset.
- `競走~応答~map@SWG ⇒ `有順序~map$ — 各~entryは[ `要請$ → `競走~応答$ ]を与える。 ◎ A ServiceWorkerGlobalScope object has an associated race response map which is an ordered map where the keys are requests and the values are race response.
`競走~応答@ は、 次に挙げる~itemを伴う`構造体$であり,[ `race-network-and-fetch-handler$l を遂行するときに,当の~network応答を包含する ]ために利用される: ◎ A race response is a struct used to contain the network response when "race-network-and-fetch-handler" performs.\
- `値@rV ⇒ ある`応答$/ `pending^l / ~NULL ◎ It has a value, which is a response, "pending", or null.
注記: `ServiceWorkerGlobalScope$I ~objは、 生成元の下で走らす[ 汎用な, ~event駆動な, 時間~制限付きな ]~script実行~文脈を供する。 成功裡に`登録-$されたなら、 `~sw$は,[ `~sw~client$ではなく,~event ]との関係性に基づいて 開始され, 生存し続け, ~killされる。 `~sw$の内側においては、 いかなる型の同期的な要請も,起動されてはナラナイ。 ◎ Note: ServiceWorkerGlobalScope object provides generic, event-driven, time-limited script execution contexts that run at an origin. Once successfully registered, a service worker is started, kept alive and killed by their relationship to events, not service worker clients. Any type of synchronous requests must not be initiated inside of a service worker.
4.1.1. `clients@m
取得子~手続きは ⇒ ~RET コレに`結付けられた@#_serviceworkerglobalscope-client$ `Clients$I ~obj ◎ The clients getter steps are to return the Clients object that is associated with this.
4.1.2. `registration@m
取得子~手続きは ⇒ ~RET `~sw登録~objを取得する$( コレの`~sw$SWGを`包含している~sw登録$sw, コレに`関連な設定群~obj$ ) ◎ The registration getter steps are to return the result of getting the service worker registration object representing this's service worker's containing service worker registration in this's relevant settings object.
4.1.3. `serviceWorker@m
取得子~手続きは ⇒ ~RET `~sw~objを取得する$( コレの`~sw$SWG, コレに`関連な設定群~obj$ ) ◎ The serviceWorker getter steps are to return the result of getting the service worker object that represents this's service worker in this's relevant settings object.
4.1.4. `skipWaiting()@m
注記: この~methodは、コレの`~sw$SWG【!`~sw$】が,それを`包含している~sw登録$swにて`待機-中な~worker$swrから`作動中な~worker$swrになることを許容する — その登録を`利用して$いる`~sw~client$がある間でも。 ◎ Note: The skipWaiting() method allows this service worker to progress from the registration's waiting position to active even while service worker clients are using the registration.
~method手続きは、 `新たな~promise$ %~promise を返した上で,次の手続きを`並列的$に走らす: ◎ The skipWaiting() method steps are: • Let promise be a new promise. • Run the following substeps in parallel:
- コレの`~sw$SWGの`待機を飛ばすか$sw ~SET ~T ◎ Set service worker's skip waiting flag.
- `作動化しようと試行する$( コレの`~sw$SWGを`包含している~sw登録$sw ) ◎ Invoke Try Activate with service worker's containing service worker registration.
- `~promiseを解決する$( %~promise ) ◎ Resolve promise with undefined. ◎ ↑↑Return promise.
4.1.5. ~event~handler
どの `ServiceWorkerGlobalScope$I ~objも、 次に挙げる`~event~handler$(および対応する`~event~handler~event型$)を,`~event~handler~IDL属性$として~supportするモノトスル: ◎ The following are the event handlers (and their corresponding event handler event types) that must be supported, as event handler IDL attributes, by all objects implementing the ServiceWorkerGlobalScope interface:
`~event~handler$ | `~event~handler~event型$ |
---|---|
`oninstall@m | `install$et |
`onactivate@m | `activate$et |
`onfetch@m | `fetch$et |
`onmessage@m | `message$et【!etC】 |
`onmessageerror@m | `messageerror$et【!etC】 |
4.2. `Client^I
[`Exposed$=ServiceWorker] interface `Client@I { readonly attribute `USVString$ `url$m; readonly attribute `FrameType$I `frameType$m; readonly attribute `DOMString$ `id$m; readonly attribute `ClientType$I `type$m; `undefined$ `postMessage$m(`any$ %message, `sequence$<`object$> %transfer); `undefined$ `~postMessageClient$n(`any$ %message, optional `StructuredSerializeOptions$I %options = {}); }; [`Exposed$=ServiceWorker] interface `WindowClient@I : `Client$I { readonly attribute `DocumentVisibilityState$I `visibilityState$m; readonly attribute `boolean$ `focused$m; [`SameObject$] readonly attribute `FrozenArray$<`USVString$> `ancestorOrigins$m; [`NewObject$] `Promise$<`WindowClient$I> `focus$m(); [`NewObject$] `Promise$<`WindowClient$I?> `navigate$m(`USVString$ %url); }; enum `FrameType@I { "`auxiliary@m", "`top-level@m", "`nested@m", "`none@m" };
各 `Client$I ~objには、 以下に挙げるものが結付けられる: ◎ ↓
- `~sw~client@cl
- `~sw~client$。 ◎ A Client object has an associated service worker client (a service worker client).
- `~frame種別@cl
- `FrameType$I に挙げられたいずれかの文字列。 他が言明されない限り, `none^l とする。 【値の意味は、`~frame種別を取得する$を見よ。】 ◎ A Client object has an associated frame type, which is one of "auxiliary", "top-level", "nested", and "none". Unless stated otherwise it is "none".
各 `WindowClient$I ~objには、 以下に挙げるものも結付けられる: ◎ ↓
- `閲覧~文脈@cl
- 自身の`~sw~client$clの`大域~obj$enVの`閲覧~文脈$を指す。 【すなわち、大域~obj(それは,`~window$である)に`対応する閲覧~文脈$】 ◎ A WindowClient object has an associated browsing context, which is its service worker client's global object's browsing context.
- `可視性~状態@cl
- `visibilityState$n 属性がとり得る いずれかの値。 ◎ A WindowClient object has an associated visibility state, which is one of visibilityState attribute value.
- `~focus状態@cl
- ~T / ~F。 初期~時は ~F とする。 ◎ A WindowClient object has an associated focus state, which is either true or false (initially false).
- `先祖~生成元~配列@cl
- 【`先祖~生成元~list$に設定されることになる。】 ◎ A WindowClient object has an associated ancestor origins array.
4.2.1. `url@m
取得子~手続きは ⇒ ~RET `~URLを直列化する$( コレの`~sw~client$clの`作成時の~URL$enV ) ◎ The url getter steps are to return this's associated service worker client's serialized creation URL.
4.2.2. `frameType@m
取得子~手続きは ⇒ ~RET コレの`~frame種別$cl ◎ The frameType getter steps are to return this's frame type.
4.2.3. `id@m
取得子~手続きは ⇒ ~RET コレの`~sw~client$clの`~ID$enV ◎ The id getter steps are to return this's associated service worker client's id.
4.2.4. `type@m
取得子~手続きは ⇒ ~RET コレの`~sw~client$clに応じて ⇒# `環境~設定群~obj$でないならば `window$l / `~window~client$であるならば `window$l / `専用~worker~client$であるならば `worker$l / `共用~worker~client$であるならば `sharedworker$l ◎ The type getter steps are: ◎ Let client be this's service worker client. ◎ If client is an environment settings object, then: • If client is a window client, return "window". • Else if client is a dedicated worker client, return "worker". • Else if client is a shared worker client, return "sharedworker". ◎ Else: • Return "window".
4.2.5. `postMessage(message, transfer)@m
~method手続きは: ◎ The postMessage(message, transfer) method steps are:
- %options ~LET «[ `transfer^l → %transfer ]» ◎ Let options be «[ "transfer" → transfer ]».
- コレ上で `~postMessageClient(message, options)$n ~method手続き(次節)を遂行する ◎ Invoke postMessage(message, options) with message and options as the arguments.
4.2.6. `~postMessageClient(message, options)@n
~method手続きは: ◎ The postMessage(message, options) method steps are:
- %~source設定群 ~LET コレに`関連な設定群~obj$ ◎ Let contextObject be this. ◎ Let sourceSettings be the contextObject’s relevant settings object.
- %直列化した転送-結果 ~LET ~ABRUPT `StructuredSerializeWithTransfer$jA( %message, %options[ "`transfer$n" ] ) ◎ Let serializeWithTransferResult be StructuredSerializeWithTransfer(message, options["transfer"]). Rethrow any exceptions.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- %~target~client ~LET ~NULL ◎ Let targetClient be null.
- ~EACH( `~sw~client$ %~client ) に対し ⇒ ~IF[ %~client ~EQ コレの`~sw~client$cl ] ⇒ %~target~client ~SET コレの`~sw~client$cl ◎ For each service worker client client: • If client is the contextObject’s service worker client, set targetClient to client, and break.
-
~IF[ %~target~client ~EQ ~NULL ] ⇒ ~RET ◎ If targetClient is null, return.
【 定義により, コレの`~sw~client$clは`~sw~client$であるので、 この条件は,決して満たされないことになる。 この段までの処理nは、 実際には,次を行うのではないかと思われる: 】
- %~target~client ~LET コレの`~sw~client$cl
- ~IF[ %~target~client の`破棄-済みか$ ~EQ ~T ] ⇒ ~RET
- %行先 ~LET 次を満たす `ServiceWorkerContainer$I ~obj ⇒ その`~sw~client$SWC ~EQ %~target~client ◎ Let destination be the ServiceWorkerContainer object whose associated service worker client is targetClient.
-
%行先 の`~client~message~queue$SWCに 次の手続きを走らす`~task$を追加する: ◎ Add a task that runs the following steps to destination’s client message queue:
- %生成元 ~LET `生成元を直列化する$( %~source設定群 の`生成元$enV ) ◎ Let origin be the serialization of sourceSettings’s origin.
- %~source ~LET `~sw~objを取得する$( コレに`関連な大域~obj$の`~sw$SWG, %~target~client ) ◎ Let source be the result of getting the service worker object that represents contextObject’s relevant global object's service worker in targetClient.
-
%逆直列化-~record ~LET `StructuredDeserializeWithTransfer$jA( %直列化した転送-結果, %行先 に`関連な~realm$ ) ◎ Let deserializeRecord be StructuredDeserializeWithTransfer(serializeWithTransferResult, destination’s relevant Realm).
例外が投出されたときは、 ~catchして:
- `~eventを発火する$( %行先, `messageerror$etC【!messageerror$et】, `MessageEvent$I ) — 次のように初期化して ⇒# `origin$n 属性 ~SET %生成元, `source$n 属性 ~SET %~source
- ~RET
- %新たな~portたち ~LET 【%行先 に`関連な~realm$内で】 `凍結d配列を作成する$( %逆直列化-~record . `TransferredValues^sl 内のすべての `MessagePort$I ~objからなる同順の~list ) ◎ Let messageClone be deserializeRecord.[[Deserialized]]. ◎ Let newPorts be a new frozen array consisting of all MessagePort objects in deserializeRecord.[[TransferredValues]], if any.
- `~eventを発火する$【!`~eventを配送する$】( %行先, `message$etC【!~HTMLindex#event-message】, `MessageEvent$I ) — 次のように初期化して ⇒# `origin$n 属性 ~SET %生成元, `source$n 属性 ~SET %~source, `data$n 属性 ~SET %逆直列化-~record . `Deserialized^sl, `ports$n 属性 ~SET %新たな~portたち ◎ Dispatch an event named message at destination, using MessageEvent, with the origin attribute initialized to origin, the source attribute initialized to source, the data attribute initialized to messageClone, and the ports attribute initialized to newPorts.
4.2.7. `visibilityState@m
取得子~手続きは ⇒ ~RET コレの`可視性~状態$cl ◎ The visibilityState getter steps are to return this's visibility state.
4.2.8. `focused@m
取得子~手続きは ⇒ ~RET コレの`~focus状態$cl ◎ The focused getter steps are to return this's focus state.
4.2.9. `ancestorOrigins@m
取得子~手続きは ⇒ ~RET コレの`先祖~生成元~配列$cl ◎ The ancestorOrigins getter steps are to return this's associated ancestor origins array.
4.2.10. `focus()@m
~method手続きは: ◎ The focus() method steps are:
- ~IF[ この`生成元$【コレの`~sw~client$clの`生成元$cl】に属する`~window$のうち, `一過な作動化を有して$いるものは無い ] ⇒ ~RET `却下される~promise$( `InvalidAccessError$E 例外 ) ◎ If no Window in this origin has transient activation, return a promise rejected with an "InvalidAccessError" DOMException.
- %~sw~event~loop ~LET `~surrounding~agent$の`~event~loop$aG ◎ Let serviceWorkerEventLoop be the surrounding agent's event loop.
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
-
`~taskを~queueする$( `利用者~対話~task~source$, 次の手続き, コレの`~sw~client$clの`担当の~event~loop$enV ) ◎ Queue a task to run the following steps on this's associated service worker client's responsible event loop using the user interaction task source:
手続きは:
- %~navigable ~LET コレの`閲覧~文脈$clに`対応する~navigable$bc ◎ ↓
- `~objを~focusする$( %~navigable ) ◎ Run the focusing steps with this's browsing context.
- %~frame種別 ~LET `~frame種別を取得する$( %~navigable ) ◎ Let frameType be the result of running Get Frame Type with this's browsing context.
- %作動中な文書 ~LET %~navigable にて`作動中な文書$nav ◎ ↓
- %可視性~状態 ~LET %作動中な文書 の`visibilityState$n 属性~値 ◎ Let visibilityState be this's browsing context's active document's visibilityState attribute value.
- %~focus状態 ~SET `~focusを得ている$( %作動中な文書 ) ◎ Let focusState be the result of running the has focus steps with this's browsing context's active document.
- %先祖~生成元~list ~LET %作動中な文書 の`先祖~生成元~文字列~list$ ◎ Let ancestorOriginsList be this's browsing context's active document's relevant global object's Location object’s ancestor origins list's associated list.
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~sw~event~loop ) ◎ Queue a task to run the following steps on serviceWorkerEventLoop using the DOM manipulation task source:
手続きは:
- %~window~client ~LET `~window~clientを作成する$( ↓ ) ⇒# コレの`~sw~client$cl, %~frame種別, %可視性~状態, %~focus状態, %先祖~生成元~list ◎ Let windowClient be the result of running Create Window Client with this's associated service worker client, frameType, visibilityState, focusState, and ancestorOriginsList.
- ~IF[ %~window~client の`~focus状態$cl ~EQ ~T ] ⇒ `~promiseを解決する$( %~promise, %~window~client ) ◎ If windowClient’s focus state is true, resolve promise with windowClient.
- ~ELSE ⇒ `~promiseを却下する$( %~promise, `TypeError^E ) ◎ Else, reject promise with a TypeError.
- ~RET %~promise ◎ Return promise.
4.3. `Clients^I
[`Exposed$=ServiceWorker]
interface `Clients@I {
/*
返される~objは、
毎回~新たな~instanceになる
◎
The objects returned will be new instances every time
*/
[`NewObject$] `Promise$<(`Client$I or `undefined$)> `get$m(`DOMString$ %id);
[`NewObject$] `Promise$<`FrozenArray$<`Client$I>> `matchAll$m(optional `ClientQueryOptions$I %options = {});
[`NewObject$] `Promise$<`WindowClient$I?> `openWindow$m(`USVString$ %url);
[`NewObject$] `Promise$<`undefined$> `claim$m();
};
dictionary `ClientQueryOptions@I { `boolean$ `includeUncontrolled@m = false; `ClientType$I `type@m = "window"; };
enum `ClientType@I { "`window@m", "`worker@m", "`sharedworker@m", "`all@m" };
~UAは,`ServiceWorkerGlobalScope$I ~obj %G の作成-時には、 `Clients$I ~obj %~client群 を作成して, %G に %~client群 を結付けるモノトスル。 以下における %~client群 の `~sw@cl は、 %G の`~sw$SWGを指すとする。 【この用語`~sw$clは、以下の記述を明確化するために,この訳に導入している。】 ◎ The user agent must create a Clients object when a ServiceWorkerGlobalScope object is created and associate it with that object.
`Clients^I04.3.1. `get(id)@m
~method手続きは、 `新たな~promise$ %~promise を返した上で,次の手続きを`並列的$に走らす: ◎ The get(id) method steps are: • Let promise be a new promise. • Run these substeps in parallel:
- %~sw ~LET コレの`~sw$cl ◎ ↓
-
`~storage~keyが登録と同等な~client群$を成す ~EACH( %~client ) に対し: ◎ For each service worker client client where the result of running obtain a storage key given client equals the associated service worker's containing service worker registration's storage key:
- ~IF[ %~client の`~ID$enV~NEQ %id ] ⇒ ~CONTINUE ◎ If client’s id is not id, continue.
- 次が満たされるまで待機する ⇒ [ %~client の`実行は準備済みか$enV ~EQ ~T ]~OR[ %~client の`破棄-済みか$ ~EQ ~T ] ◎ Wait for either client’s execution ready flag to be set or for client’s discarded flag to be set.
- ~IF[ %~client の`実行は準備済みか$enV ~EQ ~T ] ⇒# `~clientを取得する~promiseを解決する$( %~client, %~promise ); ~RET ◎ If client’s execution ready flag is set, then invoke Resolve Get Client Promise with client and promise, and abort these steps.
- `~promiseを解決する$( %~promise ) ◎ Resolve promise with undefined. ◎ ↑↑Return promise.
4.3.2. `matchAll(options)@m
~method手続きは、 `新たな~promise$ %~promise を返した上で,次の手続きを`並列的$に走らす: ◎ The matchAll(options) method steps are: • Let promise be a new promise. • Run the following steps in parallel:
- %~target~client群 ~LET 新たな`~list$ ◎ Let targetClients be a new list.
-
`~storage~keyが登録と同等な~client群$を成す ~EACH( %~client ) に対し: ◎ For each service worker client client where the result of running obtain a storage key given client equals the associated service worker's containing service worker registration's storage key:
- ~IF[ %~client の`実行は準備済みか$enV ~EQ ~F ]~OR[ %~client の`破棄-済みか$ ~EQ ~T ]~OR[ %~client は`~secureな文脈$enVでない ] ⇒ ~CONTINUE ◎ If client’s execution ready flag is unset or client’s discarded flag is set, continue. ◎ If client is not a secure context, continue.
- ~IF[ %options[ "`ClientQueryOptions^I1`includeUncontrolled$m1" ] ~EQ ~T ]~OR[ %~client にて`作動中な~sw$enV ~EQ コレの`~sw$cl ] ⇒ %~target~client群 に %~client を追加する ◎ If options["includeUncontrolled"] is false, and if client’s active service worker is not the associated service worker, continue. ◎ Add client to targetClients.
- %合致した~window~data ~LET 新たな`~list$ ◎ Let matchedWindowData be a new list.
- %合致した~client群 ~LET 新たな`~list$ ◎ Let matchedClients be a new list.
-
%~target~client群 を成す ~EACH( `~sw~client$ %~client ) に対し: ◎ For each service worker client client in targetClients:
-
~IF[ %options [ "`ClientQueryOptions^I1`type$m1" ] ~IN { `window$l, `all$l } ]~AND[[ %~client は`環境~設定群~obj$でない ]~OR[ %~client は`~window~client$である ]]: ◎ If options["type"] is "window" or "all", and client is not an environment settings object or is a window client, then:
- %~window~data ~LET «[ `client^l → client, `ancestorOriginsList^l → 新たな`~list$ ]» ◎ Let windowData be «[ "client" → client, "ancestorOriginsList" → a new list ]».
- %~clientは列挙-可能か ~LET ~T ◎ Let browsingContext be null. ◎ Let isClientEnumerable be true.
- %閲覧~文脈 ~LET[ %~client は`環境~設定群~obj$であるならば %~client の`大域~obj$enVに`対応する閲覧~文脈$【!`閲覧~文脈$】 / ~ELSE_ %~client の`~target閲覧~文脈$enV ] ◎ If client is an environment settings object, set browsingContext to client’s global object's browsing context. ◎ Else, set browsingContext to client’s target browsing context.
-
%~task ~LET `~taskを~queueする$( `利用者~対話~task~source$, 次の手続き, %閲覧~文脈 の`~event~loop$ ) ◎ Queue a task task to run the following substeps on browsingContext’s event loop using the user interaction task source:
手続きは:
- ~IF[ %閲覧~文脈 は破棄された 【`参照@~HTMLds#a-browsing-context-is-discarded$】 【!https://wicg.github.io/page-lifecycle/#discarded】 ] ⇒# %~clientは列挙-可能か ~SET ~F; ~RET ◎ If browsingContext has been discarded, then set isClientEnumerable to false and abort these steps.
- %~navigable ~LET %閲覧~文脈 に`対応する~navigable$bc ◎ ↓
- %作動中な文書 ~LET %~navigable にて`作動中な文書$nav ◎ ↓
- ~IF[ %~client は`~window~client$である ]~AND[ %~client 【の`大域~obj$enV】に`結付けられた文書$ ~NEQ %作動中な文書 ] ⇒# %~clientは列挙-可能か ~SET ~F; ~RET ◎ If client is a window client and client’s associated document is not browsingContext’s active document, then set isClientEnumerable to false and abort these steps.
- %~window~data[ `frameType^l ] ~SET `~frame種別を取得する$( %~navigable ) ◎ Set windowData["frameType"] to the result of running Get Frame Type with browsingContext.
- %~window~data[ `visibilityState^l ] ~SET %作動中な文書 の`visibilityState$n 属性~値 ◎ Set windowData["visibilityState"] to browsingContext’s active document's visibilityState attribute value.
- %~window~data[ `focusState^l ] ~SET `~focusを得ている$( %作動中な文書 ) ◎ Set windowData["focusState"] to the result of running the has focus steps with browsingContext’s active document as the argument.
- ~IF[ %~client は`~window~client$である ] ⇒ %~window~data[ `ancestorOriginsList^l ] ~SET %作動中な文書 の`先祖~生成元~文字列~list$ ◎ If client is a window client, then set windowData["ancestorOriginsList"] to browsingContext’s active document's relevant global object's Location object’s ancestor origins list's associated list.
-
%~task が実行されるまで待機する ◎ Wait for task to have executed.
注記: これは他を阻むように待機するが、 実装者は,状態が壊れない限り各 反復を並列的に走らせてもよい。 ◎ Note: Wait is a blocking wait, but implementers may run the iterations in parallel as long as the state is not broken.
- ~IF[ %~clientは列挙-可能か ~EQ ~T ] ⇒ %合致した~window~data に %~window~data を追加する ◎ If isClientEnumerable is true, then: • Add windowData to matchedWindowData.
-
~ELIF[ ~OR↓ ]…
- [ %~client は`専用~worker~client$である ]~AND[ %options[ `ClientQueryOptions^I1"`type$m1" ] ~IN { `worker$l, `all$l } ]
- [ %~client は`共用~worker~client$である ]~AND[ %options[ "`type$m1" ] ~IN { `sharedworker$l, `all$l } ]
…ならば ⇒ %合致した~client群 に次の結果を追加する ⇒ `~clientを作成する$( %~client )
◎ Else if options["type"] is "worker" or "all" and client is a dedicated worker client, or options["type"] is "sharedworker" or "all" and client is a shared worker client, then: • Add client to matchedClients.
-
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %promise に`関連な設定群~obj$の`担当の~event~loop$enV ) ◎ Queue a task to run the following steps on promise’s relevant settings object's responsible event loop using the DOM manipulation task source:
手続きは:
- %~client~obj群 ~LET 新たな`~list$ ◎ Let clientObjects be a new list.
- %合致した~window~data を成す ~EACH( %~window~data ) に対し ⇒ %~client~obj群 に次の結果を`付加する$ ⇒ `~window~clientを作成する$( ↓ ) ⇒# %~window~data[ `client^l ], %~window~data[ `frameType^l ], %~window~data[ `visibilityState^l ], %~window~data[ `focusState^l ], %~window~data[ `ancestorOriginsList^l ] ◎ For each windowData in matchedWindowData: • Let windowClient be the result of running Create Window Client algorithm with windowData["client"], windowData["frameType"], windowData["visibilityState"], windowData["focusState"], and windowData["ancestorOriginsList"] as the arguments. • Append windowClient to clientObjects.
- %合致した~client群 を成す ~EACH( %~client ) に対し ⇒ %~client~obj群 に次の結果を`付加する$ ⇒ `~clientを作成する$( %~client ) ◎ For each client in matchedClients: • Let clientObject be the result of running Create Client algorithm with client as the argument. • Append clientObject to clientObjects.
-
%~client~obj群 を,次に与える順に~sortする: ◎ Sort clientObjects such that:
-
`WindowClient$I ~objたちのうち,それまでにその`閲覧~文脈$clが`~focusされ$たものたち — 最も近過去に`~focusされ$たものから順に。 ◎ WindowClient objects whose browsing context has been focused are placed first, sorted in the most recently focused order.
- 前項に該当しない `WindowClient$I ~objたち — それぞれの`~sw~client$clの作成~順に。 ◎ WindowClient objects whose browsing context has never been focused are placed next, sorted in their service worker client's creation order.
- `Client$I ~objのうち,`~sw~client$clは`~worker~client$であるものたち — それぞれの`~sw~client$clの作成~順に。 ◎ Client objects whose associated service worker client is a worker client are placed next, sorted in their service worker client's creation order.
注記: `~window~client$ は、 常に`~worker~client$より先に来る。 ◎ Note: Window clients are always placed before worker clients.
-
- `~promiseを解決する$( %~promise, 次の結果 ) ⇒ %promise に`関連な~realm$内で`凍結d配列を作成する$( %合致した~client群 ) ◎ Resolve promise with a new frozen array of clientObjects in promise’s relevant Realm.
◎ ↑↑Return promise.
4.3.3. `openWindow(url)@m
~method手続きは: ◎ The openWindow(url) method steps are:
- %~URL ~LET `~URL構文解析する$( %url, コレに`関連な設定群~obj$の`~API用~基底~URL$enV ) ◎ Let url be the result of parsing url with this's relevant settings object’s API base URL.
- ~IF[ %~URL ~EQ `失敗^i ]~OR[ %~URL ~EQ `about:blank^c ] ⇒ ~RET `却下される~promise$( `TypeError^E 例外 ) ◎ If url is failure, return a promise rejected with a TypeError. ◎ If url is about:blank, return a promise rejected with a TypeError.
- ~IF[ この`生成元$【コレの`~sw~client$clの`生成元$cl】に属する`~window$のうち, `一過な作動化を有して$いるものは無い ] ⇒ ~RET `却下される~promise$( `InvalidAccessError$E 例外 ) ◎ If no Window in this origin has transient activation, return a promise rejected with an "InvalidAccessError" DOMException.
- %~sw~event~loop ~LET `現在の大域~obj$の`~event~loop$ ◎ Let serviceWorkerEventLoop be the current global object's event loop.
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
-
この段は`並列的$に走らす: ◎ Run these substeps in parallel:
- %新-文脈 ~LET 新たな`~top-level閲覧~文脈$ 【( %新-文脈, — ) ~LET `新たな~top-level閲覧~文脈と文書を作成する$()】 ◎ Let newContext be a new top-level browsing context.
-
`~taskを~queueする$( `利用者~対話~task~source$, 次の手続き, %新-文脈 にて`作動中な~window$bcに`関連な設定群~obj$【!`Window$I ~objの`環境~設定群~obj$】の`担当の~event~loop$enV ) ◎ Queue a task to run the following steps on newContext’s Window object’s environment settings object's responsible event loop using the user interaction task source:
手続きは:
- %~navigable ~LET %新-文脈 に`対応する~navigable$bc ◎ ↓
- %作動中な文書 ~LET %~navigable にて`作動中な文書$nav ◎ ↓
- 【! HandleNavigate】 `~navigableを~URLへ~navigateする$( %~navigable, %~URL【, %作動中な文書?】 ) — 次も与える下で ⇒# `例外を可能化するか^i ~SET ~T, `履歴~取扱い^i ~SET `replace$hH ◎ HandleNavigate: Navigate newContext to url with exceptionsEnabled true, and historyHandling "replace".
-
~IF[ 前~段にて例外 %e が投出された ]:
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~sw~event~loop )
手続きは ⇒ `~promiseを却下する$( %~promise, %e ) - ~RET
-
- %~frame種別 ~LET `~frame種別を取得する$( %~navigable ) ◎ Let frameType be the result of running Get Frame Type with newContext.
- %可視性~状態 ~LET %作動中な文書 の`visibilityState$n 属性~値 ◎ Let visibilityState be newContext’s active document’s visibilityState attribute value.
- %~focus状態 ~LET `~focusを得ている$( %作動中な文書 ) ◎ Let focusState be the result of running the has focus steps with newContext’s active document as the argument.
- %先祖~生成元~list ~LET %作動中な文書 の`先祖~生成元~文字列~list$ ◎ Let ancestorOriginsList be newContext’s active document’s relevant global object’s Location object’s ancestor origins list's associated list.
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~sw~event~loop )
手続きは:
- %設定群 ~LET %新-文脈 にて`作動中な~window$bcに`関連な設定群~obj$【!`Window$I ~objの`環境~設定群~obj$】
- %~storage~key ~LET `~storage~keyを得する$( %設定群 )
- %~client ~LET ~NULL
- ~IF[ %~storage~key, コレの`~sw$clを`包含している~sw登録$swの`~storage~key$swr ]は`同等な~storage~key$である ] ⇒ %~client ~SET `~window~clientを作成する$( ↓ ) ⇒# %設定群, %~frame種別, %可視性~状態, %~focus状態, %先祖~生成元~list
- `~promiseを解決する$( %~promise, %~client )
- ~RET %~promise ◎ Return promise.
4.3.4. `claim()@m
~method手続きは: ◎ The claim() method steps are:
- %~sw ~LET コレの`~sw$cl ◎ ↓
- ~IF[ %~sw は`作動中な~worker$swrでない ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E 例外 ) ◎ If the service worker is not an active worker, return a promise rejected with an "InvalidStateError" DOMException.
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following substeps in parallel:
-
`~storage~keyが登録と同等な~client群$を成す ~EACH( %~client ) に対し: ◎ For each service worker client client where the result of running obtain a storage key given client equals the service worker's containing service worker registration's storage key:
- ~IF[ %~client の`実行は準備済みか$enV ~EQ ~F ]~OR[ %~client の`破棄-済みか$ ~EQ ~T ]~OR[ %~client は`~secureな文脈$enVでない ] ⇒ ~CONTINUE ◎ If client’s execution ready flag is unset or client’s discarded flag is set, continue. ◎ If client is not a secure context, continue.
- %~storage~key ~LET `~storage~keyを得する$( %~client ) ◎ Let storage key be the result of running obtain a storage key given client.
- %登録 ~LET `合致する~sw登録$( %~storage~key, %~client の`作成時の~URL$enV ) ◎ Let registration be the result of running Match Service Worker Registration given storage key and client’s creation URL.
-
~IF[ %登録 ~NEQ %~sw を`包含している~sw登録$sw ] ⇒ ~CONTINUE ◎ If registration is not the service worker's containing service worker registration, continue.
注記: %登録 は、 この`~sw$SWGを`包含している~sw登録$swが`未登録にされて$いる場合には, ~NULL になる。 ◎ Note: registration will be null if the service worker's containing service worker registration is unregistered.
- ~IF[ %~client にて`作動中な~sw$enV ~EQ %~sw ] ⇒ ~CONTINUE ◎ If client’s active service worker is not the service worker, then:
- `~sw~clientを~unloadする$( %~client ) ◎ Invoke Handle Service Worker Client Unload with client as the argument.
- %~client にて`作動中な~sw$enV ~SET %~sw ◎ Set client’s active service worker to service worker.
- `制御器の変化を通知する$( %~client ) ◎ Invoke Notify Controller Change algorithm with client as the argument.
- `~promiseを解決する$( %~promise ) ◎ Resolve promise with undefined.
-
- ~RET %~promise ◎ Return promise.
4.4. `ExtendableEvent^I
[`Exposed$=ServiceWorker] interface `ExtendableEvent@I : `Event$I { `constructor@mc(`DOMString$ %type, optional `ExtendableEventInit$I %eventInitDict = {}); `undefined$ `waitUntil$m(`Promise$<`any$> %f); };
dictionary `ExtendableEventInit@I : `EventInit$I {
/*
`ExtendableEvent^I から派生する~eventを前方-互換にするために定義される
◎
Defined for the forward compatibility across the derived events
*/
};
各 `ExtendableEvent$I0 ~objには、 以下に挙げるものが結付けられる: ◎ ↓
- `存続期間を延長する~promise群@
- `~promise$たちが成す配列。【!*】 ◎ An ExtendableEvent object has an associated extend lifetime promises (an array of promises).\
- 初期~時は空~配列とする。 ◎ It is initially an empty array.
- `処理待ち~promise数@
- `存続期間を延長する~promise群$内の処理待ち~promiseの個数を表す整数。 【実際の個数と正確には同期しないため、この定義が必要yである。】 ◎ An ExtendableEvent object has an associated pending promises count (the number of pending promises in the extend lifetime promises).\
- 初期~時は 0 とする。 ◎ It is initially set to zero.
- `時間切れか@
- 真偽値をとり,初期~時は ~F とする。 [ `処理待ち~promise数$ ~GT 0 ]の場合に,~UAが任意選択で課す遅延~後に ~T にされる。 ◎ An ExtendableEvent object has an associated timed out flag. It is initially unset, and is set after an optional user agent imposed delay if the pending promises count is greater than zero.
`ExtendableEvent$I ~objは、 次を満たしている間は `作動中@eX であるとされる ⇒ [ `時間切れか$ ~EQ ~F ]~AND[[ `処理待ち~promise数$ ~GT 0 ]~OR[ `配送-中か$ev ~EQ ~T ]] ◎ An ExtendableEvent object is said to be active when its timed out flag is unset and either its pending promises count is greater than zero or its dispatch flag is set.
`~sw$には、 2 種の`~lifecycle~event$ — `install$et, `activate$et — がある。 `~sw$は、 これらの~event用に `ExtendableEvent$I ~interfaceを利用する。 ◎ Service workers have two lifecycle events, install and activate. Service workers use the ExtendableEvent interface for activate event and install event.
`~event~handlerを定義-$する`拡張$も、 `ExtendableEvent$I ~interfaceを利用したり拡張してもヨイ。 ◎ Service worker extensions that define event handlers may also use or extend the ExtendableEvent interface.
4.4.1. `waitUntil(f)@m
注記: この~methodは、 ~eventの存続期間を延長する。 ◎ Note: waitUntil() method extends the lifetime of the event.
~method手続きは ⇒ `存続期間~promiseを追加する$( %f, コレ ) ◎ The waitUntil(f) method steps are to add lifetime promise f to this.
`存続期間~promiseを追加する@ ときは、 所与の ( `~promise$ %~promise, `ExtendableEvent$I %~event ) に対し,次を走らす: ◎ To add lifetime promise promise (a promise) to event (an ExtendableEvent), run these steps:
- ~IF[ %~event の `isTrusted$n ~EQ ~F ] ⇒ ~THROW `InvalidStateError$E ◎ If event’s isTrusted attribute is false, throw an "InvalidStateError" DOMException.
-
~IF[ %~event は`作動中$eXでない ] ⇒ ~THROW `InvalidStateError$E ◎ If event is not active, throw an "InvalidStateError" DOMException.
注記: ~event~handlerを~callした~task内で存続期間を延長~promiseが追加されなかった場合、 後続な非同期的な~task内で `waitUntil()$m を~callすると,投出することになる。 ◎ Note: If no lifetime extension promise has been added in the task that called the event handlers, calling waitUntil() in subsequent asynchronous tasks will throw.
- %~event の`存続期間を延長する~promise群$に %~promise を追加する ◎ Add promise to event’s extend lifetime promises.
-
%~event の`処理待ち~promise数$ ~INCBY 1 ◎ Increment event’s pending promises count by one.
注記: 所与の~promiseがすでに決着していた場合でも、 `処理待ち~promise数$は増分される。 対応する減分は、 その~promiseに対する反応(次の段)により~queueされる小task内で行われる。 ◎ Note: The pending promises count is incremented even if the given promise has already been settled. The corresponding count decrement is done in the microtask queued by the reaction to the promise.
-
%~promise の[ `充足-時$/`却下-時$ ]には ⇒ `小taskを~queueする$( 次の手続き ) : ◎ Upon fulfillment or rejection of promise, queue a microtask to run these substeps:
手続きは:
- %~event の`処理待ち~promise数$ ~DECBY 1 ◎ Decrement event’s pending promises count by one.
- ~IF[ %~event の`処理待ち~promise数$ ~EQ 0 ] ⇒ ~RET ◎ If event’s pending promises count is 0, then:
- %登録 ~LET `現在の大域~obj$の`~sw$SWGを`包含している~sw登録$sw ◎ Let registration be the current global object's associated service worker's containing service worker registration.
- ~IF[ %登録 は`未登録にされて$いる ] ⇒ `登録を~clearしようと試行する$( %登録 ) ◎ If registration is unregistered, invoke Try Clear Registration with registration.
- ~IF[ %登録 ~NEQ ~NULL ] ⇒ `作動化しようと試行する$( %登録 ) ◎ If registration is not null, invoke Try Activate with registration.
~UAは、 所与の`~sw$ %~sw に対し,[ `~swには処理待ち~eventは無いか?$( %~sw ) が ~F を返す間 ]は %~sw を`終了-$するベキでない。 ◎ The user agent should not terminate a service worker if Service Worker Has No Pending Events returns false for that service worker.
`~event~handlerを定義-$する[ `~sw$/ `拡張$ ]は、 次のような自前の挙動を定義してもヨイ:
- `存続期間を延長する~promise群$を許容することにより,演算の長さを示唆する。
- `存続期間を延長する~promise群$内の`~promise$に却下された状態を許容することにより,演算の失敗を示唆する。
注記: `~sw$は、 `install$et ~eventの`存続期間を延長する~promise群$内のすべての`~promise$が成功裡に解決されるまで,`~install中の~worker$swrが `installed^l として扱われるのを遅延する (`~installする~algoの関連な段@#install-settle-step$を見よ)。 いずれかの~promiseが却下された場合、 その~installationは失敗する。 これは首に、 `~sw$が依存する中核~cacheを成すすべてが拡充されるまで, `installed^l (すなわち, `待機-中な~worker$swrである) と見なされないことを確保するために利用される。 同様に,`~sw$は、 `activate$et ~event内の`存続期間を延長する~promise群$内のすべての`~promise$が決着されるまで,`作動中な~worker$swr が `activated^l として扱われるのを遅延する (`作動化する~algoの関連な段@#activate-settle-step$を見よ。) これは首に、 `~sw$が[ ~database~schemaを昇格して,期限切れの~cache~entryを削除する ]までは,[ `~sw$を表現する `ServiceWorkerGlobalScope$I ~objに向けて`機能的~event$は配送されない ]ことを確保するために利用される。 ◎ Note: Service workers delay treating the installing worker as "installed" until all the promises in the install event’s extend lifetime promises resolve successfully. (See the relevant Install algorithm step.) If any of the promises rejects, the installation fails. This is primarily used to ensure that a service worker is not considered "installed" until all of the core caches it depends on are populated. Likewise, service workers delay treating the active worker as "activated" until all the promises in the activate event’s extend lifetime promises settle. (See the relevant Activate algorithm step.) This is primarily used to ensure that any functional events are not dispatched to the service worker until it upgrades database schemas and deletes the outdated cache entries.
4.5. `InstallEvent^I
[`Exposed$=ServiceWorker] interface `InstallEvent@I : `ExtendableEvent$I { `constructor@mc(`DOMString$ %type, optional `ExtendableEventInit$I %eventInitDict = {}); `Promise$<`undefined$> `addRoutes$m((`RouterRule$I or `sequence$<`RouterRule$I>) %rules); }; dictionary `RouterRule@I { required `RouterCondition$I `condition@m; required `RouterSource$I `source@m; }; dictionary `RouterCondition@I { `URLPatternCompatible$I `urlPattern@m; `ByteString$ `requestMethod@m; `RequestMode$I `requestMode@m; `RequestDestination$I `requestDestination@m; `RunningStatus$I `runningStatus@m; `sequence$<`RouterCondition$I> _`or@m; `RouterCondition$I `not@m; }; typedef (`RouterSourceDict$I or `RouterSourceEnum$I) `RouterSource@I; dictionary `RouterSourceDict@I { `DOMString$ `cacheName@m; }; enum `RunningStatus@I { "`running@m", "`not-running@m" }; enum `RouterSourceEnum@I { "`cache@m", "`fetch-event@m", "`network@m", "`race-network-and-fetch-handler@m" };`InstallEvent^I0
4.5.1. `addRoutes(rules)@m
注記: この~methodは、[ 普通は~fetch~event~handlerが行う単純な~task ]を当の~sw用に負荷分散するための規則~群を登録する。 ◎ Note: addRoutes(rules) registers rules for this service worker to offload simple tasks that the fetch event handler ordinarily does.
~method手続きは: ◎ The addRoutes(rules) method steps are:
- %~sw ~LET `現在の大域~obj$の`~sw$SWG ◎ Let serviceWorker be the current global object's associated service worker.
- %~router規則~群 ~LET %~sw の`~router規則~list$の複製 ◎ Let routerRules be a copy of serviceWorker’s list of router rules.
- ~IF[ %rules は `RouterRule$I 辞書である ] ⇒ %rules ~SET « %rules » ◎ If rules is a RouterRule dictionary, set rules to « rules ».
-
%rules を成す ~EACH( %規則 ) に対し: ◎ For each rule of rules:
- ~IF[ `~router条件を検証yする$( %規則[ `RouterRule^I1"`condition$m1" ], %~sw ) ~EQ ~F ] ⇒ ~RET `却下される~promise$( `TypeError$E ) ◎ If running the Verify Router Condition algorithm with rule["condition"] and serviceWorker returns false, return a promise rejected with a TypeError.
- %~router規則~群 に %規則 を`付加する$ ◎ Append rule to routerRules.
- ~IF[ `fetch$et ~NIN %~sw の`取扱う~event型の集合$sw ] ⇒ %~router規則~群 を成す ~EACH( %規則 ) に対し ⇒ ~IF[ %規則 は `RouterRule$I である ]~AND[ %規則 の `RouterRule^I1`source$m1 ~EQ `fetch-event$l ] ⇒ ~RET `却下される~promise$( `TypeError$E ) ◎ If routerRules contains a RouterRule whose source is "fetch-event" and serviceWorker’s set of event types to handle does not contain fetch, return a promise rejected with a TypeError.
- %~sw の`~router規則~list$ ~SET %~router規則~群 ◎ Set serviceWorker’s list of router rules to routerRules.
- ~RET `解決される~promise$( `undefined^jv ) ◎ Return a promise resolved with undefined.
4.6. `FetchEvent^I
[`Exposed$=ServiceWorker] interface `FetchEvent@I : `ExtendableEvent$I { `constructor@mc(`DOMString$ %type, `FetchEventInit$I %eventInitDict); [`SameObject$] readonly attribute `Request$I `request$m; readonly attribute `Promise$<`any$> `preloadResponse$m; readonly attribute `DOMString$ `clientId$m; readonly attribute `DOMString$ `resultingClientId$m; readonly attribute `DOMString$ `replacesClientId$m; readonly attribute `Promise$<`undefined$> `handled$m; `undefined$ `respondWith$m(`Promise$<`Response$I> %r); };
dictionary `FetchEventInit@I : `ExtendableEventInit$I { required `Request$I `request@m; `Promise$<`any$> `preloadResponse@m; `DOMString$ `clientId@m = ""; `DOMString$ `resultingClientId@m = ""; `DOMString$ `replacesClientId@m = ""; `Promise$<`undefined$> `handled@m; };
`~sw$に~~不可欠な`機能的~event$には、 `fetch$et ~eventがある。 `~sw$は、 `FetchEvent$I ~interfaceを `fetch$et ~eventに利用する — それは、 `ExtendableEvent$I ~interfaceを拡張する。 ◎ Service workers have an essential functional event fetch. For fetch event, service workers use the FetchEvent interface which extends the ExtendableEvent interface.
`FetchEvent$I ~interfaceを利用する各~eventには、 次に挙げるものが結付けられる:
- `応答になり得る@FE ⇒ `応答$/ ~NULL — 初期~時は ~NULL とする。
- `応答するまで待機-中か@FE ⇒ 真偽値 — 初期~時は ~F とする。
- `~enteredで応答するか@FE ⇒ 真偽値 — 初期~時は ~F とする。
- `~errorで応答するか@FE ⇒ 真偽値 — 初期~時は ~F とする。
4.6.1. `request@m
取得子~手続きは、 初期化-時の値を返す。 ◎ request attribute must return the value it was initialized to.
4.6.2. `preloadResponse@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は、 `解決される~promise$( `undefined^jv ) に初期化するモノトスル。 ◎ preloadResponse attribute must return the value it was initialized to. When an event is created the attribute must be initialized to a promise resolved with undefined.
4.6.3. `clientId@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は 空~文字列に初期化するモノトスル。 ◎ clientId attribute must return the value it was initialized to. When an event is created the attribute must be initialized to the empty string.
4.6.4. `resultingClientId@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は 空~文字列に初期化するモノトスル。 ◎ resultingClientId attribute must return the value it was initialized to. When an event is created the attribute must be initialized to the empty string.
4.6.5. `replacesClientId@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は 空~文字列に初期化するモノトスル。 ◎ replacesClientId attribute must return the value it was initialized to. When an event is created the attribute must be initialized to the empty string.
4.6.6. `handled@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は 処理待ち`~promise$【すなわち、`新たな~promise$】に初期化するモノトスル。 【`~fetchが取扱われた@#handle-fetch$とき,解決される。】 ◎ handled attribute must return the value it was initialized to. When an event is created the attribute must be initialized to a pending promise.
4.6.7. `respondWith(r)@m
注記: 開発者は、 引数 %r を[ `Response$I ~objで解決される`~promise$ / `Response$I ~obj ]に設定できる (後者は自動的に~promiseに~castされる 【`~promiseとして解決される@~PROMISES#resolve-arguments$】 )。 他の場合、 `~fetch$に対し`~network~error$が返される。 [ 非同一-生成元に属する内容に対する,具現化器 側における~tainting ]についての~security検査は、 `~fetch$に定義される`絞込み応答$の種別に束ねられる。 ◎ Note: Developers can set the argument r with either a promise that resolves with a Response object or a Response object (which is automatically cast to a promise). Otherwise, a network error is returned to Fetch. Renderer-side security checks about tainting for cross-origin content are tied to the types of filtered responses defined in Fetch.
~method手続きは: ◎ respondWith(r) method steps are:
- ~IF[ コレの`配送-中か$ev ~EQ ~F ]~OR[ コレの`~enteredで応答するか$FE ~EQ ~T ] ⇒ ~THROW `InvalidStateError$E ◎ Let event be this. ◎ If event’s dispatch flag is unset, throw an "InvalidStateError" DOMException. ◎ If event’s respond-with entered flag is set, throw an "InvalidStateError" DOMException.
-
`存続期間~promiseを追加する$( %r, コレ ) ◎ Add lifetime promise r to event.
注記: コレ . `respondWith(r)$m は、 既定でコレの存続期間を延長する — コレ . `waitUntil(r)$n が~callされたかのように。 ◎ Note: event.respondWith(r) extends the lifetime of the event by default as if event.waitUntil(r) is called.
- コレの ⇒# `伝播を停止するか$ev ~SET ~T, `伝播を即時に停止するか$ev ~SET ~T, `~enteredで応答するか$FE ~SET ~T, `応答するまで待機-中か$FE ~SET ~T ◎ Set event’s stop propagation flag and stop immediate propagation flag. ◎ Set event’s respond-with entered flag. ◎ Set event’s wait to respond flag.
- %~target~realm ~LET コレに`関連な~realm$ ◎ Let targetRealm be event’s relevant Realm.
- 【~RET (以下は、 %r が決着したときの挙動を与える)】
-
%r の`却下-時$には: ◎ Upon rejection of r:
- コレの`~errorで応答するか$FE ~SET ~T ◎ Set event’s respond-with error flag.
- コレの`応答するまで待機-中か$FE ~SET ~F ◎ Unset event’s wait to respond flag.
-
%r の`充足-時$には、 所与の ( %応答 ) に対し: ◎ Upon fulfillment of r with response:
-
~IF[ %応答 は `Response$I ~objでない ] ⇒ コレの`~errorで応答するか$FE ~SET ~T ◎ If response is not a Response object, then set the respond-with error flag.
注記: `~fetch$に対しては、 `~errorで応答するか$FEに応じて[ ~T ならば`~network~error$ / ~F ならば %応答 ]が,`~fetchを取扱う$~algoを通して返される。 【!*step 22.1 】 ◎ Note: If the respond-with error flag is set, a network error is returned to Fetch through Handle Fetch algorithm. (See the step 21.1.) Otherwise, the value response is returned to Fetch through Handle Fetch algorithm. (See the step 22.1.)
-
~ELSE: ◎ Else:
- %~byte列 ~LET 空な~byte列 ◎ Let bytes be an empty byte sequence.
- %本体終端か ~LET ~F ◎ Let end-of-body be false. ◎ Let done be false.
- %応答になり得る ~LET %応答 に結付けられた`応答$Rsの複製 — ただし、 `本体$rsは複製しない ◎ Let potentialResponse be a copy of response’s associated response, except for its body.
-
~IF[ %応答 の`本体$rs ~NEQ ~NULL ]: ◎ If response’s body is non-null, run these substeps:
- %読取器 ~LET %応答 の`本体$rsの`~stream$から`読取器を取得する$RS() ◎ Let reader be the result of getting a reader from response’s body's stream.
-
%~pull~algo ~LET 次の手続きを走らす動作: ◎ Let pullAlgorithm be an action that runs these steps:
-
%読取n要請 ~LET 次に挙げる`~item$sctを伴う,`読取n要請$: ◎ Let readRequest be a new read request with the following items:
-
`~chunk手続き$rRは、 所与の ( %~chunk ) に対し: ◎ chunk steps, given chunk
- ~Assert: %~chunk は `Uint8Array$I である。 ◎ Assert: chunk is a Uint8Array.
- %~byte列 に[ %~chunk が表現している~byte列 ]を付加する ◎ Append the bytes represented by chunk to bytes.
- %応答になり得る の`本体~報$rsの`符号化された~size$fT ~INCBY %~byte列 の`長さ$byte【!~WEBIDL#buffersource-byte-length】 ◎ Increment potentialResponse’s body info's encoded size by bytes’s byte length.
- %応答になり得る の`本体~報$rsの`復号した~size$fT ~INCBY %~byte列 の`長さ$byte【!~WEBIDL#buffersource-byte-length】 ◎ Increment potentialResponse’s body info's decoded size by bytes’s byte length.
- ~NOABRUPT `DetachArrayBuffer$jA( %~chunk.`ViewedArrayBuffer^sl ) ◎ Perform ! DetachArrayBuffer(chunk.[[ViewedArrayBuffer]]).
- `~close手続き$rRは ⇒ %本体終端か ~SET ~T ◎ close steps • Set end-of-body to true.
- `~error手続き$rRは、 所与の ( %~error ) に対し ⇒ %新-~stream を`~errorにする$RS( `TypeError$E ) ◎ error steps • error newStream with a TypeError.
-
- %読取器 から`~chunkを読取る$RSR( %読取n要請 ) ◎ Read a chunk from reader given readRequest.
-
- %取消~algo ~LET 次を走らす動作 ⇒ %読取器 を`取消す$RSR ◎ Let cancelAlgorithm be an action that cancels reader.
- %限界水位 ~LET ~UAが選ぶ[ 有限かつ負でない~number, または `Infinity^jv ] ◎ Let highWaterMark be a non-negative, non-NaN number, chosen by the user agent.
- %~size~algo ~LET `~chunk$~objを受容し,~UAが選ぶ[ 有限かつ負でない~number ]を返す~algo ◎ Let sizeAlgorithm be an algorithm that accepts a chunk object and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent.
- %新-~stream ~LET `新たな~obj$( `ReadableStream$I, %~target~realm ) ◎ Let newStream be a new ReadableStream,\
- %新-~stream を`設定しておく$RS — 次を与える下で ⇒# `~pull~algo^i ~SET %~pull~algo, `取消~algo^i ~SET %取消~algo, `限界水位^i ~SET %限界水位, `~size~algo^i ~SET %~size~algo ◎ set up with the pullAlgorithm pullAlgorithm, the cancelAlgorithm cancelAlgorithm, the highWaterMark highWaterMark, and sizeAlgorithm sizeAlgorithm, in targetRealm.
- %応答になり得る の`本体$rs ~SET 新たな`本体$ — その ⇒ `~stream$ ~SET %新-~stream ◎ Set potentialResponse’s body to a new body whose stream is newStream.
-
この段は`並列的$に走らす: ◎ Run these subsubsteps repeatedly in parallel\
~WHILE 無条件: ◎ while done is false:
- ~IF[ %新-~stream は`~errorした$RS ] ⇒ ~BREAK ◎ If newStream is errored, then set done to true.
- 次が満たされるまで待機する ⇒ [ %~byte列 は空でない ]~OR[ %本体終端か ~EQ ~F ] ◎ ↓
- ~IF[ %~byte列 は空である( %本体終端か ~EQ ~T ) ] ⇒# %新-~stream を`~closeする$RS(); ~BREAK ◎ Otherwise, if bytes is empty and end-of-body is true, then close newStream and set done to true. ◎ Otherwise, if bytes is not empty, run these subsubsubsteps:
- %~chunk ~LET %~byte列 の頭部を成す~byte列 【どこまでかは述べられていない(単に~UAに委ねられる? %限界水位 / %~size~algo の結果に基づく?)】 ◎ Let chunk be a subsequence of bytes starting from the beginning of bytes.
- %~chunk を %~byte列 から除去する ◎ Remove chunk from bytes.
- %新-~stream に`~chunkを~enqueueする$RS( 次に与える~obj ) ⇒ %~chunk を包含している `ArrayBuffer$I ~objを包装している `Uint8Array$I ~obj — 両~objとも %~target~realm 内に作成するとする ◎ Let buffer be an ArrayBuffer object created in targetRealm and containing chunk. ◎ Enqueue a Uint8Array object created in targetRealm and wrapping buffer to newStream.
注記: この段は、[ %応答 の`本体$rsの`~stream$を %応答になり得る の中へ “~pipeすること” ]の,観測-可能な等価を生産することが意味されている。 ◎ Note: These substeps are meant to produce the observable equivalent of "piping" response’s body's stream into potentialResponse.
注記: ~swにより~chunk内に書込まれる~dataを受取る~clientが,元と一致する~chunkを読取ることは保証されない。 すなわち、 ~clientは書込まれたものと同じ~dataを読取ることになるが、 どう~chunk化されるかは,~browserに応じて異なり得る。 ◎ Note: The data written by the service worker in chunks are not guaranteed to read in identical chunks by the client that receives the data. That is, the client will read the same data that was written, but it may be chunked differently by the browser.
- ~IF[ %応答になり得る ~NEQ `~error^i ] ⇒ コレの`応答になり得る$FE ~SET %応答になり得る ◎ Set event’s potential response to potentialResponse.
- コレの`応答するまで待機-中か$FE ~SET ~F ◎ Unset event’s wait to respond flag.
-
4.7. `ExtendableMessageEvent^I
[`Exposed$=ServiceWorker] interface `ExtendableMessageEvent@I : `ExtendableEvent$I { `constructor@mc(`DOMString$ %type, optional `ExtendableMessageEventInit$I %eventInitDict = {}); readonly attribute `any$ `data$m; readonly attribute `USVString$ `origin$m; readonly attribute `DOMString$ `lastEventId$m; [`SameObject$] readonly attribute (`Client$I or `ServiceWorker$I or `MessagePort$I)? `source$m; readonly attribute `FrozenArray$<`MessagePort$I> `ports$m; };
dictionary `ExtendableMessageEventInit@I : `ExtendableEventInit$I { `any$ `data@m = null; `USVString$ `origin@m = ""; `DOMString$ `lastEventId@m = ""; (`Client$I or `ServiceWorker$I or `MessagePort$I)? `source@m = null; `sequence$<`MessagePort$I> `ports@m = []; };
`~sw$は、 `拡張-可能@#dom-extendableevent-waituntil$な `message$et ~eventを定義して, ~eventの存続期間を延長するのを許容する。 `~sw$は、 `message$et ~event用に `ExtendableMessageEvent$I ~interfaceを利用する — それは `ExtendableEvent$I ~interfaceを拡張する。 ◎ Service workers define the extendable message event to allow extending the lifetime of the event. For the message event, service workers use the ExtendableMessageEvent interface which extends the ExtendableEvent interface.
`ExtendableMessageEvent^I04.7.1. `data@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は ~NULL に初期化するモノトスル。 それは、 送信されている~messageを表現する。 ◎ The data attribute must return the value it was initialized to. When the object is created, this attribute must be initialized to null. It represents the message being sent.
4.7.2. `origin@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は,空~文字列に初期化するモノトスル。 それは、 ~messageを送信した`~sw~client$の`生成元$enVを表現する。 ◎ The origin attribute must return the value it was initialized to. When the object is created, this attribute must be initialized to the empty string. It represents the origin of the service worker client that sent the message.
4.7.3. `lastEventId@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は,空~文字列に初期化するモノトスル。 ◎ The lastEventId attribute must return the value it was initialized to. When the object is created, this attribute must be initialized to the empty string.
4.7.4. `source@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は, ~NULL に初期化するモノトスル。 それは、 ~messageの送信-元 `Client$I ~objを表現する。 ◎ The source attribute must return the value it was initialized to. When the object is created, this attribute must be initialized to null. It represents the Client object from which the message is sent.
4.7.5. `ports@m
取得子~手続きは、 初期化-時の値を返す。 コレの作成-時には、 この属性は,空~配列に初期化するモノトスル。 それは、 送信されている `MessagePort$I 配列を表現する。 ◎ The ports attribute must return the value it was initialized to. When the object is created, this attribute must be initialized to the empty array. It represents the MessagePort array being sent.
4.8. ~event
以下に挙げる~eventは、 `~sw~event$と呼ばれ, `ServiceWorkerGlobalScope$I ~objに向けて配送される — 以下に現れる %~sw は、 ~objの`~sw$SWGを表すとする: ◎ The following events, called service worker events, are dispatched on ServiceWorkerGlobalScope object:
~event名 | ~interface | 分類 | 配送-時機 |
---|---|---|---|
`install@et | `InstallEvent$I | `~lifecycle~event$ | %~sw を`包含している~sw登録$swにて`~install中の~worker$swrが変化したとき (`~installする$を見よ)。 【!* step 11.2 → 10.2 issues#1391】 ◎ The service worker's containing service worker registration’s installing worker changes. (See step 11.2 of the Install algorithm.) |
`activate@et | `ExtendableEvent$I | `~lifecycle~event$ | %~sw を`包含している~sw登録$swにて`作動中な~worker$swrの変化したとき (`作動化する$を見よ)。 【!*step 12.2 】 ◎ The service worker's containing service worker registration’s active worker changes. (See step 12.2 of the Activate algorithm.) |
`fetch@et | `FetchEvent$I | `機能的~event$ | `~HTTP~fetch$は、 `~fetchを取扱う$( `要請$, … ) を呼出す。 これを遂行した結果として、 %~sw は,`~HTTP~fetch$に`応答$を返す。 この応答は、 `Response$I ~objにより表現され,[ `Cache$I ~objから / `self.fetch()$n ~methodを利用して~networkから直に ]検索取得できる。 (別の選択肢として~custom `Response$I ~objもある。) ◎ The http fetch invokes Handle Fetch with request. As a result of performing Handle Fetch, the service worker returns a response to the http fetch. The response, represented by a Response object, can be retrieved from a Cache object or directly from network using self.fetch(input, init) method. (A custom Response object can be another option.) |
`push$et | `PushEvent$I | `機能的~event$ | ( `push^et ~eventの`発火-法@https://w3c.github.io/push-api/#dfn-fire-the-push-event$を見よ。) ◎ (See Firing a push event.) |
`notificationclick$et | `NotificationEvent$I | `機能的~event$ | (`通知の作動化-法@~NOTIFICATIONS#activating-a-notification$を見よ。) ◎ (See Activating a notification.) |
`notificationclose$et | `NotificationEvent$I | `機能的~event$ | (`通知の~close法@~NOTIFICATIONS#closing-a-notification$を見よ。) ◎ (See Closing a notification.) |
`sync$et | `SyncEvent$I | `機能的~event$ | ( `sync^et ~eventの`発火-法@https://wicg.github.io/BackgroundSync/spec/#fire-a-sync-event$ を見よ。) ◎ (See Firing a sync event.) |
`canmakepayment$et | `CanMakePaymentEvent$I | `機能的~event$ | ( `CanMakePaymentEvent^I の`取扱い@https://w3c.github.io/payment-handler/#dfn-handling-a-canmakepaymentevent$ を見よ。) ◎ (See Handling a CanMakePaymentEvent.) |
`paymentrequest$et | `PaymentRequestEvent$I | `機能的~event$ | ( `PaymentRequestEvent^I `の取扱い@https://w3c.github.io/payment-handler/#dfn-handling-a-paymentrequestevent$ を見よ。) ◎ (See Handling a PaymentRequestEvent.) |
`message@et | `ExtendableMessageEvent$I | 旧来の~event | ~messageを受信したとき。 ◎ When it receives a message. |
`messageerror@et | `MessageEvent$I | 旧来の~event | 逆直列化できない~messageが送信されてきたとき。 ◎ When it was sent a message that cannot be deserialized. |
5. ~cache
作者が~offline用に内容~cacheを全部的に管理できるようにするため、[ `Window$I / `WorkerGlobalScope$I ]は, `Cache$I ~objを~openして操作するための非同期的な~cache用~methodを供する。 同じ`生成元$enVは、 複数の有名 `Cache$I ~objを持ち得る — その内容は、 まるごと~scriptの制御~下に置かれる。 ~cacheは、 異なる`生成元$間で共有されることはなく,~browserの~HTTP~cacheからも完全に隔離される。 ◎ To allow authors to fully manage their content caches for offline use, the Window and the WorkerGlobalScope provide the asynchronous caching methods that open and manipulate Cache objects. An origin can have multiple, named Cache objects, whose contents are entirely under the control of scripts. Caches are not shared across origins, and they are completely isolated from the browser’s HTTP cache.
5.1. 構成子
`要請~応答~list@ は、 0 個~以上の[ ( `要請$, `応答$ ) が成す`~tuple$ ]たちが成す`~list$である。 ◎ A request response list is a list of tuples consisting of a request (a request) and a response (a response).
~obj %O に `関連な要請~応答~list@ は、 %O が表現する`要請~応答~list$を指す。 【 %O に該当するものは、この仕様においては `Cache$I ~objしかない。】 ◎ The relevant request response list is the instance that this represents.
`名前から~cacheへの~map@ は、 `有順序~map$であり,それを成す各`~entry$mapは[ `要請~応答~list$の名前を表現する文字列 → `要請~応答~list$ ]を与える。 ◎ A name to cache map is an ordered map whose entry consists of a key (a string that represents the name of a request response list) and a value (a request response list).
各`~storage~key$には、 ある`名前から~cacheへの~map$が結付けられる。 ◎ Each storage key has an associated name to cache map.
~obj %O に `関連な名前から~cacheへの~map@ は、 次の結果に結付けられた`名前から~cacheへの~map$を指す。 ⇒ `~storage~keyを得する$( %O に`関連な設定群~obj$【!%O に結付けられた`大域~obj$の`環境~設定群~obj$】 ) ◎ The relevant name to cache map is the name to cache map associated with the storage key obtained from this's associated global object's environment settings object.
【 %O に該当するものは、 この仕様においては `CacheStorage$I ~objしかない。 】
5.2. ~cacheの存続期間を理解する
`Cache$I ~instanceは、 ~browserの~HTTP~cacheの一部を成さない。 作者~自身が、 `Cache$I ~objを管理する必要がある: ◎ The Cache instances are not part of the browser’s HTTP cache. The Cache objects are exactly what authors have to manage themselves.\
- 作者が明示的に要請しない限り,更新されない。 ◎ The Cache objects do not get updated unless authors explicitly request them to be.\
- それを成す各~entryは、 作者が削除しない限り失効しない。 ◎ The Cache objects do not expire unless authors delete the entries.\
- `~sw$~scriptを更新するだけで消失することはない — すなわち、 ~cacheは自動的には更新されず,その更新-は手動で管理しなければナラナイ。 ◎ The Cache objects do not disappear just because the service worker script is updated. That is, caches are not updated automatically. Updates must be manually managed.\
したがって作者は、 自身の~cacheに名前†により~versionを付与した上で、 それを利用するのは,安全に運用できる~versionの`~sw$に限るようにするべきである。 ◎ This implies that authors should version their caches by name and make sure to use the caches only from the version of the service worker that can safely operate on.
【† `CacheStorage$I 上の各種~methodの %cacheName 引数 / `MultiCacheQueryOptions$I の `cacheName^m ~memberを指す。 】
5.3. `self.caches^m
partial interface mixin `WindowOrWorkerGlobalScope$I { [`SecureContext$, `SameObject$] readonly attribute `CacheStorage$I `caches$n; };
5.3.1. `caches@n
取得子~手続きは ⇒ ~RET コレに結付けられた `CacheStorage$I ~obj ◎ caches getter steps are to return this's associated CacheStorage object.
5.4. `Cache^I
[`SecureContext$, `Exposed$=(Window,Worker)] interface `Cache@I { [`NewObject$] `Promise$<(`Response$I or `undefined$)> `match$m(`RequestInfo$I %request, optional `CacheQueryOptions$I %options = {}); [`NewObject$] `Promise$<`FrozenArray$<`Response$I>> `matchAll$m(optional `RequestInfo$I %request, optional `CacheQueryOptions$I %options = {}); [`NewObject$] `Promise$<`undefined$> `add$m(`RequestInfo$I %request); [`NewObject$] `Promise$<`undefined$> `addAll$m(`sequence$<`RequestInfo$I> %requests); [`NewObject$] `Promise$<`undefined$> `put$m(`RequestInfo$I %request, `Response$I %response); [`NewObject$] `Promise$<`boolean$> `delete$m(`RequestInfo$I %request, optional `CacheQueryOptions$I %options = {}); [`NewObject$] `Promise$<`FrozenArray$<`Request$I>> `keys$m(optional `RequestInfo$I %request, optional `CacheQueryOptions$I %options = {}); };
dictionary `CacheQueryOptions@I { `boolean$ `ignoreSearch@m = false; `boolean$ `ignoreMethod@m = false; `boolean$ `ignoreVary@m = false; };
`Cache$I ~objは、 `要請~応答~list$を表現する。 いくつかの文書や~workerにまたがって、 同時に複数の `Cache$I ~objが 同じ`要請~応答~list$を表現し得る。 【同じ文書や~worker上でも,複数あり得る( `CacheStorage^I1 `open()$m1 を見よ)。】 ◎ A Cache object represents a request response list. Multiple separate objects implementing the Cache interface across documents and workers can all be associated with the same request response list simultaneously.
`~cache~batch演算@ は、 次に挙げるものからなる`構造体$である:
- `種別@cbo ⇒ `delete^l / `put^l
- `要請@cbo ⇒ `要請$
- `応答@cbo ⇒ `応答$
- `~option群@cbo ⇒ `CacheQueryOptions$I ~obj
5.4.1. `match(request, options)@m
~method手続きは、 `新たな~promise$ %~promise を返した上で,次の手続きを`並列的$に走らす: ◎ The match(request, options) method steps are: • Let promise be a new promise. • Run these substeps in parallel:
- %p ~LET コレ上で `matchAll(request, options)$m ~method手続きを遂行する ◎ Let p be the result of running the algorithm specified in matchAll(request, options) method with request and options.
-
%p が決着するまで待機する: ◎ Wait until p settles.
- %p は %例外 で却下されたときは ⇒ `~promiseを却下する$( %~promise, %例外 ) ◎ If p rejects with an exception, then: • Reject promise with that exception.
-
%p は配列 %応答~群 で充足されたときは:
- %結果 ~LET [ %応答~群 は空ならば `undefined^jv / ~ELSE_ %応答~群[ 0 ] ]
- `~promiseを解決する$( %~promise, %結果 )
◎ ↑↑Return promise.
5.4.2. `matchAll(request, options)@m
~method手続きは: ◎ The matchAll(request, options) method steps are:
- %r ~LET ε ◎ Let r be null.
-
~IF[ %request ~NEQ ε ]: ◎ If the optional argument request is not omitted, then:
-
~IF[ %request は `Request$I ~objである ]: ◎ If request is a Request object, then:
- %r ~SET %request の`要請$Rq ◎ Set r to request’s request.
- ~IF[ %r の`~method$rq ~NEQ `GET^bl ]~AND[ %options[ `CacheQueryOptions^I1"`ignoreMethod$m1" ] ~EQ ~F ] ⇒ ~RET `解決される~promise$( 空な配列 ) ◎ If r’s method is not `GET` and options.ignoreMethod is false, return a promise resolved with an empty array.
-
~ELSE( %request は文字列である):
- %R ~LET 新たな `Request$I
-
%R 上で `new Request(request)$n 構築子~手続きを遂行する 【! method = GET になる】
例外が投出されたときは、 ~catchして ⇒ ~RET `却下される~promise$( その例外 )
- %r ~SET %R の`要請$Rq
-
- %~realm ~LET コレに`関連な~realm$ ◎ Let realm be this's relevant realm.
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
-
この段は`並列的$に走らす: ◎ Run these substeps in parallel:
- %応答~list ~LET 新たな`~list$ ◎ Let responses be an empty list.
- %要請~応答~list ~LET コレに`関連な要請~応答~list$ ◎ ↓
- ~IF[ %r ~NEQ ε ] ⇒ %要請~応答~list ~SET `~cacheを~queryする$( %r, %要請~応答~list, %options ) ◎ If the optional argument request is omitted, then: • For each requestResponse of the relevant request response list: •• Add a copy of requestResponse’s response to responses. ◎ Else: • Let requestResponses be the result of running Query Cache with r and options. •• For each requestResponse of requestResponses: ••• Add a copy of requestResponse’s response to responses. ( copy は次の段で行う)
- %要請~応答~list を成す ~EACH( %要請~応答 ) に対し ⇒ %応答~list に[ %要請~応答 を成す応答 ]の複製を`付加する$ ◎ ↑
- %設定群 ~LET %~promise に`関連な設定群~obj$ ◎ ↓
-
%応答~list を成す ~EACH( %応答 ) に対し: ◎ For each response of responses:
- ~IF[ %応答 の`種別$rs ~NEQ `opaque^l ] ⇒ ~CONTINUE ◎ If response’s type is "opaque" and\
- %検査~結果 ~LET `非同一-生成元~資源~施策~検査$( ↓ ) ⇒# %設定群 の`生成元$enV, %設定群, 空~文字列, %応答 の`内部~応答$ ◎ cross-origin resource policy check with promise’s relevant settings object's origin, promise’s relevant settings object, "", and response’s internal response\
- ~IF[ %検査~結果 ~EQ `阻止される^i ] ⇒# `~promiseを却下する$( %~promise, `TypeError^E ); ~RET ◎ returns blocked, then reject promise with a TypeError and abort these steps.
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %設定群 の`担当の~event~loop$enV ) ◎ Queue a task, on promise’s relevant settings object's responsible event loop using the DOM manipulation task source, to perform the following steps:
手続きは:
- %応答~obj~list ~LET 新たな`~list$ ◎ Let responseList be a list.
- %応答~list を成す ~EACH( %応答 ) に対し ⇒ %応答~obj~list に次の結果を`付加する$ ⇒ `~Response~objを作成する$( %応答, `immutable^l, %~realm ) ◎ For each response of responses: • Add a new Response object associated with response and a new Headers object whose guard is "immutable" to responseList.
- `~promiseを解決する$( %~promise, 次の結果 ) ⇒ %~realm 内で`凍結d配列を作成する$( %応答~obj~list ) ◎ Resolve promise with a frozen array created from responseList, in realm.
- ~RET %~promise ◎ Return promise.
5.4.3. `add(request)@m
~method手続きは: ◎ The add(request) method steps are:
- %requests ~LET %request のみを包含している配列 ◎ Let requests be an array containing only request.
- %応答~配列~promise ~LET コレ上で `addAll(requests)$m ~method手続きを遂行する ◎ Let responseArrayPromise be the result of running the algorithm specified in addAll(requests) passing requests as the argument.
-
~RET `~promiseに反応する$( %応答~配列~promise ) — `充足~手続き^i として次を与える下で:
手続きは ⇒ ~RET `undefined^jv◎ Return the result of reacting to responseArrayPromise with a fulfillment handler that returns undefined.
5.4.4. `addAll(requests)@m
~method手続きは: ◎ The addAll(requests) method steps are:
- %応答~promiseたち ~LET 新たな`~list$ ◎ Let responsePromises be an empty list.
- %要請~list ~LET 新たな`~list$ ◎ Let requestList be an empty list.
-
%requests を成す ~EACH( %r ) に対し:
-
~IF[ %r は ~AND↓ を満たす ]…
- `Request$I ~objである
- %r の`要請$Rqは次を満たす ⇒ [ その`~URL$rqの`~scheme$url ~NIN { `http^l, `https^l } ]~OR[ その`~method$rq ~NEQ `GET^bl ]
-
- %~fetch制御器~群 ~LET 新たな`~list$【!of `~fetch制御器$】 ◎ Let fetchControllers be a list of fetch controllers.
-
%requests を成す ~EACH( %r ) に対し: ◎ For each request in requests:
- %R ~LET 新たな `Request$I ◎ ↓
-
%R 上で `new Request(r)$n 構築子~手続きを遂行する 【! method = GET になる】
例外が投出されたときは、 ~catchして ⇒ ~RET `却下される~promise$( その例外 )
◎ Let r be the associated request of the result of invoking the initial value of Request as constructor with request as its argument. If this throws an exception, return a promise rejected with that exception. - %要請 ~LET %R の`要請$Rq ◎ ↑
-
~IF[ %要請 の`~URL$rqの`~scheme$url ~NIN { `http^l, `https^l } ]: ◎ If r’s url's scheme is not one of "http" and "https", then:
- † %~fetch制御器~群 を成す ~EACH( %~fetch制御器 ) に対し ⇒ `~fetchを中止する$( %~fetch制御器 ) ◎ For each fetchController of fetchControllers, abort fetchController.
- ~RET `却下される~promise$( `TypeError^E 例外 ) ◎ Return a promise rejected with a TypeError.
【 最初の段 † は,[ これまでの反復にて、 下の並列的に走らす段の中で, %~fetch制御器~群 に付加された各`~fetch制御器$ ]に対する処理nを意図していると見受けられるが、 並列的に走らすので,この時点では %~fetch制御器 は空にしかなり得ない。 この段の検査は、 %r が `Request$I であるならば,この~loopより前にすでに遂行されている — 他の場合も,この~loopより前に遂行するべきであろう。 】
- ~IF[ %要請 の`~client$rqの`大域~obj$enV は `ServiceWorkerGlobalScope$I ~objである ] ⇒ %要請 の`~sw~mode$rq ~SET `none^l 【!*request】 ◎ If r’s client's global object is a ServiceWorkerGlobalScope object, set request’s service-workers mode to "none".
- %要請 の ⇒# `起動元$rq ~SET `fetch^l, `行先$rq ~SET `subresource^l ◎ Set r’s initiator to "fetch" and destination to "subresource".
- %要請~list に %要請 を`付加する$ ◎ Add r to requestList.
- %応答~promise ~LET `新たな~promise$ ◎ Let responsePromise be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following substeps in parallel:
-
【 %~fetch制御器~群 に】次の結果を`付加する$ ⇒ %要請 を`~fetchする$ — 次を与える下で: ◎ Append the result of fetching r.
-
`応答の処理n^i ~SET 所与の ( %応答 ) に対し,次を走らす手続き: ◎ To processResponse for response, run these substeps:
- ~IF[ %応答 の`種別$rs ~EQ `error^l ]~OR[ %応答 の`状態s$rsは`~ok状態s$でない ]~OR[ %応答 の`状態s$rs ~EQ `206^st ] ⇒# `~promiseを却下する$( %応答~promise, `TypeError^E ); ~RET ◎ If response’s type is "error", or response’s status is not an ok status or is 206, reject responsePromise with a TypeError.
- %Vary ~LET `~header~listから値を取得して復号して分割する$( %応答 の`~header~list$rs, `Vary$h ) ◎ ↓
-
~IF[ %Vary ~NEQ ~NULL ]~AND[ `*^l ~IN %Vary ]: ◎ Else if response’s header list contains a header named `Vary`, then: • Let fieldValues be the list containing the elements corresponding to the field-values of the Vary header. •• For each fieldValue of fieldValues: ••• If fieldValue matches "*", then:
- `~promiseを却下する$( %応答~promise, `TypeError^E ) ◎ Reject responsePromise with a TypeError.
- %~fetch制御器~群 を成す ~EACH( %~fetch制御器 ) に対し ⇒ `~fetchを中止する$( %~fetch制御器 ) ◎ For each fetchController of fetchControllers, abort fetchController. ◎ Abort these steps.
-
`応答の本体~終了~時の処理n^i ~SET 所与の ( %応答 ) に対し,次を走らす手続き: ◎ To processResponseEndOfBody for response, run these substeps:
- ~IF[ %応答 の`中止されたか$rs ~EQ ~T ] ⇒# `~promiseを却下する$( %応答~promise, `AbortError$E 例外 ); ◎ If response’s aborted flag is set, reject responsePromise with an "AbortError" DOMException and abort these steps.
- ~ELSE ⇒ `~promiseを解決する$( %応答~promise, %応答 ) ◎ Resolve responsePromise with response.
注記: 応答の本体が全部的に受信されたときは、 ~cache~commitは許容される。 ◎ Note: The cache commit is allowed when the response’s body is fully received.
-
-
- %応答~promiseたち に %応答~promise を`付加する$ ◎ Add responsePromise to responsePromises.
- %p ~LET `すべてを待機する~promiseを取得する$( %応答~promiseたち ) ◎ Let p be the result of getting a promise to wait for all of responsePromises.
-
~RET `~promiseに反応する$( %p ) — `充足~手続き^i として次を与える下で: ◎ Return the result of reacting to p with a fulfillment handler that,\
手続きは、 所与の ( %応答~obj~list ) に対し: ◎ when called with argument responses, performs the following substeps:
- %演算~群 ~LET 新たな`~list$ ◎ Let operations be an empty list.
- %~index ~LET 0 ◎ Let index be zero.
-
%応答~obj~list を成す ~EACH( %応答~obj ) に対し: ◎ For each response in responses:
- %演算 ~LET 新たな`~cache~batch演算$ — その ⇒# `種別$cbo ~SET `put^l, `要請$cbo ~SET %要請~list[ %~index ], `応答$cbo ~SET %応答~obj 【の`応答$Rs】 ◎ Let operation be a cache batch operation. ◎ Set operation’s type to "put". ◎ Set operation’s request to requestList[index]. ◎ Set operation’s response to response.
- %演算~群 に %演算 を`付加する$ ◎ Append operation to operations.
- %~index ~INCBY 1 ◎ Increment index by one.
- %~realm ~LET コレに`関連な~realm$ ◎ Let realm be this's relevant realm.
- %~cache~job~promise ~LET `新たな~promise$ ◎ Let cacheJobPromise be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following substeps in parallel:
- %~error~data ~LET ~NULL ◎ Let errorData be null.
-
`~cache演算を~batchする$( %演算~群, コレ ) ◎ Invoke Batch Cache Operations with operations.\
例外が投出されたときは、 ~catchして ⇒ %~error~data ~SET その例外 ◎ If this throws an exception, set errorData to the exception.
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~cache~job~promise に`関連な設定群~obj$の`担当の~event~loop$enV ) ◎ Queue a task, on cacheJobPromise’s relevant settings object's responsible event loop using the DOM manipulation task source, to perform the following substeps:
手続きは:
- ~IF[ %~error~data ~EQ ~NULL ] ⇒ `~promiseを解決する$( %~cache~job~promise ) ◎ If errorData is null, resolve cacheJobPromise with undefined.
- ~ELSE ⇒ `~promiseを却下する$( %~cache~job~promise, 次に与える例外 ) ⇒ %~realm 内に作成される`新たな例外$( %~error~data, ~UAにより定義される`~message^ ) ◎ Else, reject cacheJobPromise with a new exception with errorData and a user agent-defined message, in realm.
- ~RET %~cache~job~promise ◎ Return cacheJobPromise.
5.4.5. `put(request, response)@m
~method手続きは: ◎ The put(request, response) method steps are:
-
~IF[ %request は `Request$I ~objでない【文字列である】 ]:
- %R ~LET 新たな `Request$I
-
%R 上で `new Request(request)$n 構築子~手続きを遂行する 【! method = GET になる】
例外が投出されたときは、 ~catchして ⇒ ~RET `却下される~promise$( その例外 )
- %request ~SET %R
- %内縁~要請 ~LET %request の`要請$Rq ◎ ↑
- ~IF[ %内縁~要請 の`~URL$rqの`~scheme$url ~NIN { `http^l , `https^l } ]~OR[ %内縁~要請 の`~method$rq ~NEQ `GET^bl ] ⇒ ~RET `却下される~promise$( `TypeError^E 例外 ) ◎ If innerRequest’s url's scheme is not one of "http" and "https", or innerRequest’s method is not `GET`, return a promise rejected with a TypeError. ◎
- %内縁~応答 ~LET %response の`応答$Rs ◎ Let innerResponse be response’s response.
-
~IF[ ~OR↓ ]…
- %内縁~応答 の`状態s$rs ~EQ `206^st
- [ 次の結果 ~NEQ ~NULL ]~AND[ `*^l ~IN 次の結果 ] ⇒ `~header~listから値を取得して復号して分割する$( %内縁~応答 の`~header~list$rs, `Vary$h )
- %内縁~応答 の`本体$rsは[ `妨げられて$RSいる/`~lockされて$RSいる ]
…ならば ⇒ ~RET `却下される~promise$( `TypeError^E 例外 )
◎ If innerResponse’s status is 206, return a promise rejected with a TypeError. ◎ If innerResponse’s header list contains a header named `Vary`, then: • Let fieldValues be the list containing the items corresponding to the Vary header’s field-values. •• For each fieldValue in fieldValues: ••• If fieldValue matches "*", return a promise rejected with a TypeError. ◎ If innerResponse’s body is disturbed or locked, return a promise rejected with a TypeError. - %~cloneされた応答 ~LET `応答を~cloneする$( %内縁~応答 ) ◎ Let clonedResponse be a clone of innerResponse.
- %本体を読取る~promise ~LET `解決される~promise$( `undefined^jv ) ◎ Let bodyReadPromise be a promise resolved with undefined.
-
~IF[ %内縁~応答 の`本体$rs ~NEQ ~NULL ]: ◎ If innerResponse’s body is non-null, run these substeps:
- %~stream ~LET %内縁~応答 の`本体$rsの`~stream$ ◎ Let stream be innerResponse’s body's stream.
- %読取器 ~LET %~stream から`読取器を取得する$RS() ◎ Let reader be the result of getting a reader for stream.
- %本体を読取る~promise ~SET %読取器 から`すべての~byteを読取る$RSR() 【この段とそれに関係する処理nは、まだ `STREAMS$r による更新が反映されていない。】 ◎ Set bodyReadPromise to the result of reading all bytes from reader.
注記: これは、 %内縁~応答 の`本体$rsが`~lockされて$RSいることを確保して、 %~cloneされた応答 内の本体を全部的に~bufferした複製を得る。 実装は、 ~memoryではなく~diskへ直に~streamすることにより最適化することもできる。 ◎ Note: This ensures that innerResponse’s body is locked, and we have a full buffered copy of the body in clonedResponse. An implementation could optimize by streaming directly to disk rather than memory.
- %演算 ~LET 新たな`~cache~batch演算$ — その ⇒# `種別$cbo ~SET `put^l `要請$cbo ~SET %内縁~要請 `応答$cbo ~SET %~cloneされた応答 ◎ Let operations be an empty list. ◎ Let operation be a cache batch operation. ◎ Set operation’s type to "put". ◎ Set operation’s request to innerRequest. ◎ Set operation’s response to clonedResponse. ◎ ↓ Append operation to operations.
- %~realm ~LET コレに`関連な~realm$ ◎ Let realm be this's relevant realm.
-
~RET %本体を読取る~promise の`充足-時$には次を遂行するようにした結果: ◎ Return the result of the fulfillment of bodyReadPromise:
- %~cache~job~promise ~LET `新たな~promise$ ◎ Let cacheJobPromise be a new promise.
- ~RET %~cache~job~promise — ただし、 以下も`並列的$に走らす ◎ Return cacheJobPromise and run these steps in parallel:
- %~error~data ~LET ~NULL ◎ Let errorData be null.
-
`~cache演算を~batchする$( « %演算 », コレ )
例外が投出されたときは、 ~catchして ⇒ %~error~data ~SET その例外
◎ Invoke Batch Cache Operations with operations. If this throws an exception, set errorData to the exception. -
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~cache~job~promise に`関連な設定群~obj$の`担当の~event~loop$enV ) ◎ Queue a task, on cacheJobPromise’s relevant settings object's responsible event loop using the DOM manipulation task source, to perform the following substeps:
手続きは:
- ~IF[ %~error~data ~EQ ~NULL ] ⇒ `~promiseを解決する$( %~cache~job~promise ) ◎ If errorData is null, resolve cacheJobPromise with undefined.
- ~ELSE ⇒ `~promiseを却下する$( %~cache~job~promise, 次に与える例外 ) ⇒ %~realm 内に作成される`新たな例外$( %~error~data, ~UAにより定義される`~message^ ) ◎ Else, reject cacheJobPromise with a new exception with errorData and a user agent-defined message, in realm.
5.4.6. `delete(request, options)@m
~method手続きは: ◎ The delete(request, options) method steps are:
- %r ~LET ~NULL ◎ Let r be null.
-
~IF[ %request は `Request$I ~objである ]: ◎ If request is a Request object, then:
- %r ~SET %request の`要請$Rq ◎ Set r to request’s request.
- ~IF[ %r の`~method$rq ~NEQ `GET^bl ]~AND[ %~option群[ "`ignoreMethod$m1" ] ~EQ ~F ] ⇒ ~RET `解決される~promise$( ~F ) ◎ If r’s method is not `GET` and options.ignoreMethod is false, return a promise resolved with false.
-
~ELSE( %request は文字列である):
- %R ~LET 新たな `Request$I
-
%R 上で `new Request(request)$n 構築子~手続きを遂行する 【! method = GET になる】
例外が投出されたときは、 ~catchして ⇒ ~RET `却下される~promise$( その例外 )
- %r ~SET %R の`要請$Rq
- %演算 ~LET 新たな`~cache~batch演算$ — その ⇒# `種別$cbo ~SET `delete^l, `要請$cbo ~SET %r, `~option群$cbo ~SET %options ◎ Let operations be an empty list. ◎ Let operation be a cache batch operation. ◎ Set operation’s type to "delete". ◎ Set operation’s request to r. ◎ Set operation’s options to options. ◎ ↓ Append operation to operations.
- %~realm ~LET コレに`関連な~realm$ ◎ Let realm be this's relevant realm.
- %~cache~job~promise ~LET `新たな~promise$ ◎ Let cacheJobPromise be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following substeps in parallel:
- %~error~data ~LET ~NULL ◎ Let errorData be null.
-
%要請~応答~list ~LET `~cache演算を~batchする$( « %演算 », コレ )
例外が投出されたときは、 ~catchして ⇒ %~error~data ~SET その例外
◎ Let requestResponses be the result of running Batch Cache Operations with operations. If this throws an exception, set errorData to the exception. -
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~cache~job~promise に`関連な設定群~obj$の`担当の~event~loop$enV ) ◎ Queue a task, on cacheJobPromise’s relevant settings object's responsible event loop using the DOM manipulation task source, to perform the following substeps:
手続きは:
-
~IF[ %~error~data ~EQ ~NULL ] ⇒ `~promiseを解決する$( %~cache~job~promise, 次の結果 ) ⇒ ~IS[ %要請~応答~list は`空$でない ] ◎ If errorData is null, then: • If requestResponses is not empty, resolve cacheJobPromise with true. • Else, resolve cacheJobPromise with false.
- ~ELSE ⇒ `~promiseを却下する$( %~cache~job~promise, 次に与える例外 ) ⇒ %~realm 内に作成される`新たな例外$( %~error~data, ~UAにより定義される`~message^ ) ◎ Else, reject cacheJobPromise with a new exception with errorData and a user agent-defined message, in realm.
-
- ~RET %~cache~job~promise ◎ Return cacheJobPromise.
5.4.7. `keys(request, options)@m
~method手続きは: ◎ The keys(request, options) method steps are:
- %r ~LET ε ◎ Let r be null.
-
~IF[ %request ~NEQ ε ]: ◎ If the optional argument request is not omitted, then:
-
~IF[ %request は `Request$I ~objである ]: ◎ If request is a Request object, then:
- %r ~SET %request の`要請$Rq ◎ Set r to request’s request.
- ~IF[ %r の`~method$rq ~NEQ `GET^bl ]~AND[ %options[ "`ignoreMethod$m1" ] ~EQ ~F ] ⇒ ~RET `解決される~promise$( 空な配列 ) ◎ If r’s method is not `GET` and options.ignoreMethod is false, return a promise resolved with an empty array.
-
~ELSE( %request は文字列である):
- %R ~LET 新たな `Request$I
-
%R 上で `new Request(request)$n 構築子~手続きを遂行する 【! method = GET になる】
例外が投出されたときは、 ~catchして ⇒ ~RET `却下される~promise$( その例外 )
- %r ~SET %R の`要請$Rq
-
- %~realm ~LET コレに`関連な~realm$ ◎ Let realm be this's relevant realm.
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
-
この段は`並列的$に走らす: ◎ Run these substeps in parallel:
- %要請~list ~LET 新たな`~list$ ◎ Let requests be an empty list.
- %要請~応答~list ~LET コレに`関連な要請~応答~list$ ◎ ↓
- ~IF[ %r ~NEQ ε ] ⇒ %要請~応答~list ~SET `~cacheを~queryする$( %r, %要請~応答~list, %options ) ◎ ↓
- %要請~応答~list を成す ~EACH( %要請~応答 ) に対し ⇒ %要請~list に[ %要請~応答 を成す要請 ]を`付加する$ ◎ If the optional argument request is omitted, then: • For each requestResponse of the relevant request response list: •• Add requestResponse’s request to requests. ◎ Else: • Let requestResponses be the result of running Query Cache with r and options. •• For each requestResponse of requestResponses: ••• Add requestResponse’s request to requests.
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~promise に`関連な設定群~obj$の`担当の~event~loop$enV ) ◎ Queue a task, on promise’s relevant settings object's responsible event loop using the DOM manipulation task source, to perform the following steps:
手続きは:
- %要請~obj~list ~LET 新たな`~list$ ◎ Let requestList be a list.
- %要請~list を成す ~EACH( %要請 ) に対し ⇒ %要請~obj~list に次の結果を`付加する$ ⇒ `~Request~objを作成する$( %要請, `immutable^l, %~realm ) ◎ For each request of requests: • Add a new Request object associated with request and a new associated Headers object whose guard is "immutable" to requestList.
- `~promiseを解決する$( %~promise, 次の結果 ) ⇒ %~realm 内で`凍結d配列を作成する$( %要請~obj~list ) ◎ Resolve promise with a frozen array created from requestList, in realm.
- ~RET %~promise ◎ Return promise.
5.5. `CacheStorage^I
[`SecureContext$, `Exposed$=(Window,Worker)] interface `CacheStorage@I { [`NewObject$] `Promise$<(`Response$I or `undefined$)> `match$m(`RequestInfo$I %request, optional `MultiCacheQueryOptions$I %options = {}); [`NewObject$] `Promise$<`boolean$> `has$m(`DOMString$ %cacheName); [`NewObject$] `Promise$<`Cache$I> `open$m(`DOMString$ %cacheName); [`NewObject$] `Promise$<`boolean$> `delete$m(`DOMString$ %cacheName); [`NewObject$] `Promise$<`sequence$<`DOMString$>> `keys$m(); }; dictionary `MultiCacheQueryOptions@I : `CacheQueryOptions$I { DOMString `cacheName@m; };
注記: `CacheStorage$I ~interfaceは `ECMAScript 6 Map object@~TC39#sec-map-objects$ に幅広く適合するよう設計されているが、 全体的に非同期cであり,追加的な便利~methodも伴う。 [ `clear()^m / `forEach()^m / `entries()^m / `values()^m ]~methodは、 最初の~versionの視野からは,意図的に除外されている — TC39 による非同期cな反復についての進行中な論点に委ねられているので。 ◎ Note: CacheStorage interface is designed to largely conform to ECMAScript 6 Map objects but entirely async, and with additional convenience methods. The methods, clear, forEach, entries and values, are intentionally excluded from the scope of the first version resorting to the ongoing discussion about the async iteration by TC39.
~UAは,[ `Window$I / `WorkerGlobalScope$I ]大域~obj %G を作成したときは、 `CacheStorage$I ~obj %C を作成して,それに %G を結付けるモノトスル。 この %G を指して,単に %C の `大域~obj@ と称される。 ◎ The user agent must create a CacheStorage object when a Window object or a WorkerGlobalScope object is created and associate it with that global object.
`CacheStorage$I ~objは、 その`大域~obj$の`環境~設定群~obj$†の`生成元$enVに属する`名前から~cacheへの~map$††を表現する。 いくつかの文書や~workerにまたがって、 同時に複数の `CacheStorage$I ~objが 同じ`名前から~cacheへの~map$を表現し得る†††。 ◎ A CacheStorage object represents a name to cache map of its associated global object's environment settings object’s origin. Multiple separate objects implementing the CacheStorage interface across documents and workers can all be associated with the same name to cache map simultaneously.
【† すなわち、 `関連な設定群~obj$。 】【†† すなわち、 `関連な名前から~cacheへの~map$。 】【††† が、 各 `大域~obj$enVごとに, 1 個に限られる — この~objを返す `caches$n 属性は [SameObject] なので。 】
`CacheStorage^I05.5.1. `match(request, options)@m
~method手続きは: ◎ The match(request, options) method steps are:
- %~cache名 ~LET %options[ "`MultiCacheQueryOptions^I1`cacheName$m1" ] ◎ ↓
-
~IF[ %~cache名 ~NEQ ε ]: ◎ If options["cacheName"] exists, then:
- %~promise ~LET `新たな~promise$ ◎ ↓
- ~RET %~promise — ただし、 以降の手続きも`並列的$に走らす ◎ Return a new promise promise and run the following substeps in parallel:
- %結果 ~LET `undefined^jv ◎ ↓
- %~cache ~LET コレに`関連な名前から~cacheへの~map$[ %~cache名 ] ] ◎ ↓
- ~IF[ %~cache ~NEQ ε ] ⇒ %結果 ~LET %~cache 【を表現する(新たな?) `Cache$I ~obj】上で `Cache^I1`match(request, options)$m1 ~method手続きを遂行する ◎ For each cacheName → cache of the relevant name to cache map: • If options["cacheName"] matches cacheName, then: •• Resolve promise with the result of running the algorithm specified in match(request, options) method of Cache interface with request and options (providing cache as thisArgument to the [[Call]] internal method of match(request, options).) • Abort these steps.
- `~promiseを解決する$( %~promise, %結果 ) ◎ Resolve promise with undefined.
- %~promise ~LET `解決される~promise$( `undefined^jv ) ◎ Else: ◎ Let promise be a promise resolved with undefined.
-
コレに`関連な名前から~cacheへの~map$を成す ~EACH( %~cache名 → %~cache ) に対し ⇒ %~promise ~SET `~promiseに反応する$( %~promise ) — `充足~手続き^i として次を与える下で: ◎ For each cacheName → cache of the relevant name to cache map: • Set promise to the result of reacting to itself with a fulfillment handler that,\
手続きは、 所与の ( %応答 ) に対し: ◎ when called with argument response, performs the following substeps:
- ~IF[ %応答 ~NEQ `undefined^jv ] ⇒ ~RET %応答 ◎ If response is not undefined, return response.
- ~RET %~cache 上で `Cache^I1`match(request, options)$m1 ~method手続きを遂行する ◎ Return the result of running the algorithm specified in match(request, options) method of Cache interface with request and options as the arguments (providing cache as thisArgument to the [[Call]] internal method of match(request, options).)
- ~RET %~promise ◎ Return promise.
5.5.2. `has(cacheName)@m
~method手続きは、 `新たな~promise$ %~promise を返した上で,次の手続きを`並列的$に走らす: ◎ The has(cacheName) method steps are: • Let promise be a new promise. • Run the following substeps in parallel:
- `~promiseを解決する$( %~promise, 次の結果 ) ⇒ ~IS[ コレに`関連な名前から~cacheへの~map$[ %cacheName ] ~NEQ ε ] ◎ For each key → value of the relevant name to cache map: • If cacheName matches key, resolve promise with true and abort these steps. ◎ Resolve promise with false. ◎ ↑↑Return promise.
5.5.3. `open(cacheName)@m
~method手続きは、 `新たな~promise$ %~promise を返した上で,次の手続きを`並列的$に走らす: ◎ The open(cacheName) method steps are: • Let promise be a new promise. • Run the following substeps in parallel:
- %~cache ~LET コレに`関連な名前から~cacheへの~map$[ %cacheName ]
-
~IF[ %~cache ~EQ ε ]:
- %~cache ~SET 新たな`要請~応答~list$
- コレに`関連な名前から~cacheへの~map$[ %cacheName ] ~SET %~cache ⇒ ~IF[ この~cache書込n演算は、 是認されている~quota上限を超過することにより失敗した ] ⇒# `~promiseを却下する$( %~promise, `QuotaExceededError$E 例外 ); ~RET
- `~promiseを解決する$( %~promise, %~cache を表現する新たな `Cache$I ~obj )
5.5.4. `delete(cacheName)@m
~method手続きは: ◎ The delete(cacheName) method steps are:
- %~promise ~LET コレ上で `has(cacheName)$m ~method手続きを遂行する ◎ Let promise be the result of running the algorithm specified in has(cacheName) method with cacheName.
-
~RET `~promiseに反応する$( %~promise ) — `充足~手続き^i として次を与える下で: ◎ Return the result of reacting to promise with a fulfillment handler that,\
手続きは、 所与の ( %~cacheは存在するか ) に対し: ◎ when called with argument cacheExists, performs the following substeps:
- ~IF[ %~cacheは存在するか ~EQ ~F ] ⇒ ~RET ~F ◎ If cacheExists is false, then: • Return false.
- %~cache~job~promise ~LET `新たな~promise$ ◎ Let cacheJobPromise be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following substeps in parallel:
- コレに`関連な名前から~cacheへの~map$[ %cacheName ] ~SET ε ◎ Remove the relevant name to cache map[cacheName].
- `~promiseを解決する$( %~cache~job~promise, ~T ) ◎ Resolve cacheJobPromise with true.
注記: この段~以降も、 既存の~DOM~obj (すなわち,現在~参照されている `Cache^I / `Request^I / `Response^I ~obj) は機能し続けるべきである。 ◎ Note: After this step, the existing DOM objects (i.e. the currently referenced Cache, Request, and Response objects) should remain functional.
- ~RET %~cache~job~promise ◎ Return cacheJobPromise.
5.5.5. `keys()@m
~method手続きは、 `新たな~promise$ %~promise を返した上で,次の手続きを`並列的$に走らす: ◎ The keys() method steps are: • Let promise be a new promise. • Run the following substeps in parallel:
-
%~cache~key群 ~LET コレに`関連な名前から~cacheへの~map$の`~key群$map ◎ Let cacheKeys be the result of getting the keys of the relevant name to cache map.
注記: 結果の`有順序~集合$における`~item$たちの順序は、 それらに対応する~entryが`名前から~cacheへの~map$に追加された順になる。 ◎ Note: The items in the result ordered set are in the order that their corresponding entry was added to the name to cache map.
- `~promiseを解決する$( %~promise, %~cache~key群 ) ◎ Resolve promise with cacheKeys. ◎ ↑↑Return promise.
6. ~securityの考慮点
6.1. ~secureな文脈
`~sw$の実行, および `~sw~client$による次に挙げる行いは、 `~secureな文脈$enV内に限るモノトスル:
- `~sw登録$を登録する
- `~sw登録$への~accessを取得する
- `~sw$への~accessを取得する
- 他の`~sw$と~messageをやりとりする
- `~sw$により操作されるようになること
注記: これは実質的に、 `~sw$とその`~sw~client$は,~HTTPS越しに~hostする必要があることを意味する。 ~UAは、 開発~目的に[ `localhost^c ( `要件@~SECURE-CONTEXT#localhost$を見よ), `127.0.0.0/8^c / `::1/128^c ]を許容できる。 この制約の首な理由は、 `~secureでない文脈に結付けられる~risk@~SECURE-CONTEXT#threat-risks$から利用者を保護することである。 ◎ Note: This effectively means that service workers and their service worker clients need to be hosted over HTTPS. A user agent can allow localhost (see the requirements), 127.0.0.0/8, and ::1/128 for development purposes. The primary reason for this restriction is to protect users from the risks associated with insecure contexts.
6.2. ~CSP
~UAは、 `~swを走らす$とき,当の~swに送達されてきた`~script資源$swに次に挙げる~HTTP ~headerが伴われている場合は: ◎ Whenever a user agent invokes the Run Service Worker algorithm with a service worker serviceWorker:
- `Content-Security-Policy$h ⇒ その値が与える施策を`施行-@~CSP3#enforced$するモノトスル。 【!https://wicg.github.io/csp-next/scripting-policy.html#scripting-policy-pair-enforced】 ◎ If serviceWorker’s script resource was delivered with a Content-Security-Policy HTTP header containing the value policy, the user agent must enforce policy for serviceWorker.
- `Content-Security-Policy-Report-Only$h ⇒ その値が与える施策を`監視-@~CSP3#monitored$するモノトスル。 【!https://w3c.github.io/mediacapture-screen-share/#dfn-monitor$】 ◎ If serviceWorker’s script resource was delivered with a Content-Security-Policy-Report-Only HTTP header containing the value policy, the user agent must monitor policy for serviceWorker.
この制約の首な理由は、 ~XSSなどの[ 内容~注入に対する脆弱性が成す~~広範な~class ]を軽減するためである。 ◎ The primary reason for this restriction is to mitigate a broad class of content injection vulnerabilities, such as cross-site scripting (XSS).
6.3. 生成元との相対性
6.3.1. 生成元~制約
◎非規範的`~sw$は、 それを登録している`~sw~client$の`生成元$cl【!`生成元$enV】内で実行される。 その応用の大多数が遭遇することになる高度な懸念として、 それが~CDNから~hostし得るかどうかがある。 ~CDNは、 定義により,他所にある~serverであり、 他の`生成元$に属することが多い。 したがって、 `~sw$を~CDN上で~hostすることはできない。 が、 `importScripts()$c を介して資源を含ませることはできる。 この制約がある理由は、 `~sw$が,不良な動作者にも~~攻撃を永遠に引き伸ばす機会を与えるからである。 ◎ A service worker executes in the registering service worker client's origin. One of the advanced concerns that major applications would encounter is whether they can be hosted from a CDN. By definition, these are servers in other places, often on other origins. Therefore, service workers cannot be hosted on CDNs. But they can include resources via importScripts(). The reason for this restriction is that service workers create the opportunity for a bad actor to turn a bad day into a bad eternity.
6.3.2. `importScripts(urls)^n
`ServiceWorkerGlobalScope$I ~objの `importScripts(urls)$n ~method手続きは ⇒ `~scriptを~worker大域~scopeの中に~importする$( ↓ ) ⇒# コレ, %urls, 次に定義される(`~fetch~hookを遂行する~algo$を成す)手続き ◎ When the importScripts(urls) method is called on a ServiceWorkerGlobalScope object, the user agent must import scripts into worker global scope, given this ServiceWorkerGlobalScope object and urls, and with the followingperform the fetch hook steps,\
手続きは、 所与の ( `要請$ %要請, %~top-levelか ) に対し,次を走らす: ◎ given the request request:
- %~sw ~LET %要請 の`~client$rqの`大域~obj$enVの`~sw$SWG ◎ Let serviceWorker be request’s client's global object's service worker.
- %~map ~LET %~sw の`~script資源~map$sw ◎ Let map be serviceWorker’s script resource map.
- %~URL ~LET %要請 の`~URL$rq ◎ Let url be request’s url.
- %応答 ~LET %~map[ %~URL ] ◎ ↓
- ~IF[ %~sw の`状態$sw ~NIN { `parsed^l, `installing^l } ] ⇒ ~RET [ %応答 ~NEQ ε ならば %応答 / ~ELSE_ `~network~error$ ] ◎ If serviceWorker’s state is not "parsed" or "installing": • Return map[url] if it exists and a network error otherwise.
-
~IF[ %応答 ~NEQ ε ]: ◎ If map[url] exists:
- %~sw の`利用した~scriptの集合$swに %~URL を`付加する$set ◎ Append url to serviceWorker’s set of used scripts.
- ~RET %応答 ◎ Return map[url].
- %登録 ~LET %~sw を`包含している~sw登録$sw ◎ Let registration be serviceWorker’s containing service worker registration.
- %要請 の`~sw~mode$rq ~SET `none^l ◎ Set request’s service-workers mode to "none".
-
~IF[ ~OR↓ ]… ◎ Set request’s cache mode to "no-cache" if any of the following are true:
- %登録 の`~cacheを介する更新~mode$swr ~EQ `none^l ◎ registration’s update via cache mode is "none".
- `現在の大域~obj$の`~importする~script用には~cacheを迂回するよう強制するか$SWG ~EQ ~T ◎ The current global object's force bypass cache for import scripts flag is set.
- %登録 は`非新鮮$である ◎ registration is stale.
…ならば ⇒ %要請 の`~cache~mode$rq ~SET `no-cache^l ◎ ↑
- %応答 ~SET %要請 を`~fetch$した結果 ◎ Let response be the result of fetching request.
- ~IF[ %応答 の`~cache状態$ ~NEQ `local^l ] ⇒ %登録 の`最後の更新~検査-時刻$swr ~SET 現在の時刻 ◎ If response’s cache state is not "local", set registration’s last update check time to the current time.
- ~IF[ %応答 の`安全でない応答$は`不良な~import~script応答$である ] ⇒ ~RET `~network~error$ ◎ If response’s unsafe response is a bad import script response, then return a network error.
- %~map[ %~URL ] ~SET %応答 ◎ Set map[url] to response.
- %~sw の`利用した~scriptの集合$swに %~URL を`付加する$set ◎ Append url to serviceWorker’s set of used scripts.
- %~sw の`古典~scriptは~import済みか$sw ~SET ~T ◎ Set serviceWorker’s classic scripts imported flag.
- ~RET %応答 ◎ Return response.
6.4. 非同一-生成元に属する資源と~CORS
◎非規範的~appは、 ~CDNや他の`生成元$enVから来た~itemを~cacheする傾向にある。 それらの多くは、[ `script^e / `img^e / `video^e / `link^e ]要素を利用して,直に要請する可能性もある。 この類の稼働時における協同は、 ~offline時に壊れた場合,著しく制限されることになる。 同様に,適切な~CORS~headerが設定されているときは、 `生成元$enV外にある【すなわち同一-生成元でない】多様な資源を`~fetch$する可能性もある。 `~sw$は、[ `Cache$I が,生成元~外にある~itemを`~fetch$して~cacheできる ]ようにすることで,これを可能化する。 しかしながら,いくつかの制約も適用される: ◎ Applications tend to cache items that come from a CDN or other origin. It is possible to request many of them directly using <script>, <img>, <video> and <link> elements. It would be hugely limiting if this sort of runtime collaboration broke when offline. Similarly, it is possible to fetch many sorts of off-origin resources when appropriate CORS headers are set. Service workers enable this by allowing Caches to fetch and cache off-origin items. Some restrictions apply, however.\
- 先ず,[ 所与の資源~用に `Cache$I 内で管理され, 格納される `Response$I ~obj ]に対応する`応答$Rsは、 同一-生成元に属する資源に対しては`基本~絞込み応答$になる一方で,生成元~外にある資源に対しては[ `~CORS絞込み応答$ / `不透明な絞込み応答$ ]になる。 ◎ First, unlike same-origin resources which are managed in the Cache as Response objects whose corresponding responses are basic filtered response, the objects stored are Response objects whose corresponding responses are either CORS filtered responses or opaque filtered responses.\
- 次に,生成元~外にある資源~用の `Response$I ~objは、 同一-生成元に属する資源~用のそれと同じ方式で %event . `respondWith()$n ~methodに渡せるが,そのような~objを~program的に作成することはできない。 ◎ They can be passed to event.respondWith(r) method in the same manner as the Response objects whose corresponding responses are basic filtered responses, but cannot be meaningfully created programmatically.\
これらの制限は、 ~platformの~security不変則を保全するために必要yである。 `Cache$I にそれらを格納できるようにすることにより、 ほとんどの事例では,~appを改築し直さずに済むようになる。 ◎ These limitations are necessary to preserve the security invariants of the platform. Allowing Caches to store them allows applications to avoid re-architecting in most cases.
6.5. ~path制約
◎非規範的`生成元~制約@#origin-restriction$に加えて、 ~swは,~sw~scriptの`~path$urlにより制約される。 例えば, `https://~example-bob/sw.js^c にある~sw~scriptは、 `~scope~URL$swr `https://~example-bob/^c 用には登録できるが,~scope[ `https://www.example.com/^c / `https://~example-alice/^c ]用には登録できない。 これは、 同じ生成元に属するが互いに別々な~directory内に複数~利用者の内容を~hostする~site用に,いくぶんの保護を供する。 しかしながら,この~path制約は、 硬い~security境界とは見なされない — それを成すのは生成元に限られる。 ~siteは、 適切になるならば,[ ~siteを成す各区分に、 異なる生成元を利用して,~secureに隔離する ]ことが奨励される。 ◎ In addition to the origin restriction, service workers are restricted by the path of the service worker script. For example, a service worker script at https://www.example.com/~bob/sw.js can be registered for the scope url https://www.example.com/~bob/ but not for the scope https://www.example.com/ or https://www.example.com/~alice/. This provides some protection for sites that host multiple-user content in separated directories on the same origin. However, the path restriction is not considered a hard security boundary, as only origins are. Sites are encouraged to use different origins to securely isolate segments of the site if appropriate.
~serverは、 ~sw~scriptに対し `Service-Worker-Allowed$h ~headerを設定することにより,この~path制約を除去できる。 ◎ Servers can remove the path restriction by setting a Service-Worker-Allowed header on the service worker script.
6.6. ~sw~script要請
◎非規範的~site上の~swの悪意的な登録に抗して,更に防御するため、 この仕様は次を要求する: ◎ To further defend against malicious registration of a service worker on a site, this specification requires that:
- ~sw~script要請には、 `Service-Worker$h ~headerを伴わせること。 ◎ The Service-Worker header is present on service worker script requests, and
- ~sw~scriptを~serveするときは、 `~JS~MIME型$を伴わせること。 ◎ Service worker scripts are served with a JavaScript MIME type.
6.7. 実装者~向けの懸念点
◎非規範的実装者は、 次に留意しておくことが奨励される: ◎ The implementers are encouraged to note:
- `~sw$を介して~pluginを読込むベキでない。 ~pluginは,自前の~URLから~security生成元を取得することもあり、 埋込んでいる`~sw$はそれを取扱えないので。 この理由から,`~fetchを取扱う$~algoは、[ `embed^e / `object^e ]による要請に対しては,[ `fetch$et ~eventを配送することなく,即時に~networkへ~fallbackする ]ようにする。 ◎ Plug-ins should not load via service workers. As plug-ins may get their security origins from their own urls, the embedding service worker cannot handle it. For this reason, the Handle Fetch algorithm makes <embed> and <object> requests immediately fallback to the network without dispatching fetch event.
- 旧来の~network用~stack~codeの一部は、 `~sw$との相互作用における細分化を解するため,注意深く聴取する必要があるかもしれない。 ◎ Some of the legacy networking stack code may need to be carefully audited to understand the ramifications of interactions with service workers.
6.8. ~privacy
`~sw$は、 次を含む新たな持続的~storage特能を導入する ⇒# (`~sw登録$とその`~sw$用の)`登録~map$, (~cache用の)`要請~応答~list$と`名前から~cacheへの~map$, (~script資源~用の)`~script資源~map$sw ◎ Service workers introduce new persistent storage features including registration map (for service worker registrations and their service workers), request response list and name to cache map (for caches), and script resource map (for script resources).\
`追跡し放題になり得る脅威@#biblio-unsanctioned-tracking$から利用者を保護するため、 これらの持続的~storageは,利用者が~clearするよう意図したときは~clearされるベキであり、 また,既存の利用者-制御 — 既存の持続的~storageをすべて一掃するなど — と相互運用できるよう保守されるベキである。 ◎ In order to protect users from any potential unsanctioned tracking threat, these persistent storages should be cleared when users intend to clear them and should maintain and interoperate with existing user controls e.g. purging all existing persistent storages.
7. 拡張能
他の仕様は、 ~sw仕様を拡張できる。 ◎ Service Workers specification is extensible from other specifications.
7.1. ~sw登録に束縛される~APIを定義する
仕様は、 `ServiceWorkerRegistration$I ~interfaceの`部分的~interface$定義を利用して,そこに仕様に特有な属性や~methodを定義して,`~sw登録$に束ねられる~APIを定義してもヨイ: ◎ Specifications may define an API tied to a service worker registration by using partial interface definition to the ServiceWorkerRegistration interface where it may define the specification specific attributes and methods:
partial interface ServiceWorkerRegistration { /* ~API名前空間を定義する例: ◎ e.g. define an API namespace */ readonly attribute APISpaceType APISpace; /* ~methodを定義する例: ◎ e.g. define a method */ Promise<T> methodName(/* 引数~list */); };
7.2. 機能的~eventを定義する
各~仕様は、 `ExtendableEvent$I ~interfaceを拡張することにより,`機能的~event$を定義してもヨイ。 ◎ Specifications may define a functional event by extending ExtendableEvent interface:
/* `FunctionalEvent^I ~interfaceを定義する例: ◎ e.g. define FunctionalEvent interface */ interface FunctionalEvent : ExtendableEvent { /* 機能的~eventの自前の属性や~methodを追加する ◎ add a functional event’s own attributes and methods */ };
7.3. ~event~handlerを定義する
各~仕様は、 `ServiceWorkerGlobalScope$I ~interface用の`部分的~interface$定義を利用して,対応している`機能的~event$用に~event~handler属性を定義してもヨイ: ◎ Specifications may define an event handler attribute for the corresponding functional event using partial interface definition to the ServiceWorkerGlobalScope interface:
partial interface ServiceWorkerGlobalScope { attribute EventHandler onfunctionalevent; };
7.4. 機能的~eventの発火-法
各~仕様は、 `~sw登録$にて`作動中な~worker$swrに向けて `機能的~event$を配送するよう要請するときは,`機能的~eventを発火する$べきである。 ◎ To request a functional event dispatch to the active worker of a service worker registration, specifications should invoke Fire Functional Event.
各種~algo
以下の定義は、 この仕様~全体を通して利用される,~UAの内部~data構造である。 ◎ The following definitions are the user agent’s internal data structures used throughout the specification.
`登録~map@ は、 `有順序~map$である — それを成す各`~entry$mapの:
- ~keyは、 ( `~storage~key$, ~URL ) が成す`~tuple$であり,~URLは次の結果として与えられる ⇒ `~URLを直列化する$( ある`~sw登録$の`~scope~URL$swr ) )
- 値は、 ある`~sw登録$を与える。
`~job@ は、 `~sw登録$を[ 登録- / 更新- / 未登録に ]する要請の抽象-化である。 ◎ A job is an abstraction of one of register, update, and unregister request for a service worker registration.
各`~job$には、 次に挙げるものが結付けられる: ◎ ↓
- `~job種別@job ⇒ `登録する^i / `更新する^i / `未登録にする^i ◎ A job has a job type, which is one of register, update, and unregister.
- `~storage~key@job ⇒ `~storage~key$ ◎ A job has a storage key (a storage key).
- `~scope~URL@job ⇒ `~URL$ ◎ A job has a scope url (a URL).
- `~script~URL@job ⇒ `~URL$ ◎ A job has a script url (a URL).
- `~worker種別@job ⇒ `classic^l / `module^l ◎ A job has a worker type ("classic" or "module").
- `~cacheを介する更新~mode@job ⇒ `imports^l / `all^l / `none^l ◎ A job has an update via cache mode, which is "imports", "all", or "none".
- `~client@job ⇒ `~sw~client$ — 初期~時は ~NULL とする。 ◎ A job has a client (a service worker client). It is initially null.
- `~referrer@job ⇒ `~URL$ / ~NULL ◎ A job has a referrer (a URL or null).
- `~job~promise@job ⇒ `~promise$ — 初期~時は ~NULL とする。 ◎ A job has a job promise (a promise). It is initially null.
- `包含している~job~queue@job ⇒ `~job~queue$ / ~NULL — 初期~時は ~NULL とする。 ◎ A job has a containing job queue (a job queue or null). It is initially null.
- `等価~job~list@job ⇒ `~job$たちが成す~list — 初期~時は新たな~listとする。 ◎ A job has a list of equivalent jobs (a list of jobs). It is initially the empty list.
- `~cacheを迂回するよう強制するか@job ⇒ 真偽値 — 初期~時は ~F とする。 ◎ A job has a force bypass cache flag. It is initially unset.
2 つの `~job$が `等価である@job とは、 ~AND↓ が満たされることをいう: ◎ Two jobs are equivalent when\
- 互いの`~job種別$jobは同じ ◎ their job type is the same and:
-
`~job種別$jobに応じて,次が満たされる:
- `登録する^i
- `更新する^i
- 互いの[ 次に挙げるもの ]は,いずれも同じ ⇒# `~scope~URL$job, `~script~URL$job, `~worker種別$job, `~cacheを介する更新~mode$job
- `未登録にする^i
- 互いの`~scope~URL$jobは同じ
`~job~queue@ は,~thread安全な`~queue$であり、 複数の同時並行な`~job$を互いに同期するために利用される。 `~job~queue$は,初期~時は空であり、 それを成す各`~item$は,ある`~job$を与える。 ◎ A job queue is a thread safe queue used to synchronize the set of concurrent jobs. The job queue contains jobs as its items. A job queue is initially empty.
`~scopeから~job~queueへの~map@ は、 `有順序~map$であり,それを成す各`~entry$mapは[ `~URLを直列化する$( `~scope~URL$swr ) → `~job~queue$ ]を与える。 ◎ A scope to job queue map is an ordered map where the keys are scope urls, serialized, and the values are job queues.
`不良な~import~script応答@ とは、 ~OR↓ を満たす`応答$である: ◎ A bad import script response is a response for which any of the following conditions are met:
- 応答の`種別$rs ~EQ `error^l ◎ response’s type is "error"
- 応答の`状態s$rsは`~ok状態s$でない ◎ response’s status is not an ok status
-
次の結果は`~JS~MIME型$でない ⇒ `~header~listから~MIME型を抽出する$( 応答の`~header~list$rs ) ◎ The result of extracting a MIME type from response’s header list is not a JavaScript MIME type
注記: この定義と[ `~workerが~importした古典~scriptを~fetchする$ ]とが同期cするよう保つ。 ◎ Note: Keep this definition in sync with fetch a classic worker-imported script.
`~jobを作成する@
- 入力 ⇒# %~job種別 — `~job種別$job, %~storage~key — `~storage~key$, %~scope~URL — `~URL$, %~script~URL — `~URL$, %~promise — `~promise$, %~client — `~sw~client$ ◎ Input • jobType, a job type • storage key, a storage key • scopeURL, a URL • scriptURL, a URL • promise, a promise • client, a service worker client
- 出力 ⇒# %~job — `~job$ ◎ Output • job, a job
- %~job ~LET 新たな`~job$ ◎ Let job be a new job.
- %~job の ⇒# `~job種別$job ~SET %~job種別, `~storage~key$job ~SET %~storage~key, `~scope~URL$job ~SET %~scope~URL, `~script~URL$job ~SET %~script~URL, `~job~promise$job ~SET %~promise, `~client$job ~SET %~client ◎ Set job’s job type to jobType. ◎ Set job’s storage key to storage key. ◎ Set job’s scope url to scopeURL. ◎ Set job’s script url to scriptURL. ◎ Set job’s job promise to promise. ◎ Set job’s client to client.
- ~IF[ %~client ~NEQ ~NULL ] ⇒ %~job の`~referrer$job ~SET %~client の`作成時の~URL$enV ◎ If client is not null, set job’s referrer to client’s creation URL.
- ~RET %~job ◎ Return job.
`~jobを~scheduleする@
- 入力 ⇒# %~job — `~job$ ◎ Input • job, a job
- 出力 ⇒# ~none ◎ Output • none
- %~job~queue ~LET ~NULL ◎ Let jobQueue be null.
- %~job~scope ~LET `~URLを直列化する$( %~job の`~scope~URL$job ) ◎ Let jobScope be job’s scope url, serialized.
- ~IF[ `~scopeから~job~queueへの~map$[ %~job~scope ] ~EQ ε ] ⇒ `~scopeから~job~queueへの~map$[ %~job~scope ] ~SET 新たな`~job~queue$ ◎ If scope to job queue map[jobScope] does not exist, set scope to job queue map[jobScope] to a new job queue.
- %~job~queue ~SET `~scopeから~job~queueへの~map$[ %~job~scope ] ◎ Set jobQueue to scope to job queue map[jobScope].
-
~IF[ %~job~queue は`空$である ]: ◎ If jobQueue is empty, then:
- %~job を`包含している~job~queue$job ~SET %~job~queue ◎ Set job’s containing job queue to jobQueue, and\
- %~job~queue に %~job を`~enqueueする$ ◎ enqueue job to jobQueue.
- `~jobを走らす$( %~job~queue ) ◎ Invoke Run Job with jobQueue.
-
~ELSE: ◎ Else:
- %最後の~job ~LET %~job~queue の最後の`~item$ 【!*the element at the back of】 ◎ Let lastJob be the element at the back of jobQueue.
- ~IF[ `等価である$job( %~job, %最後の~job ) ]~AND[ %最後の~job の`~job~promise$jobはまだ決着してない ] ⇒ %最後の~job の`等価~job~list$jobに %~job を付加する ◎ If job is equivalent to lastJob and lastJob’s job promise has not settled, append job to lastJob’s list of equivalent jobs.
- ~ELSE ⇒# %~job を`包含している~job~queue$job ~SET %~job~queue; %~job~queue に %~job を`~enqueueする$ ◎ Else, set job’s containing job queue to jobQueue, and enqueue job to jobQueue.
`~jobを走らす@
- 入力 ⇒# %~job~queue — `~job~queue$ ◎ Input • jobQueue, a job queue
- 出力 ⇒# ~none ◎ Output • none
- ~Assert: %~job~queue は`空$でない ◎ Assert: jobQueue is not empty.
-
`~taskを~queueする$(【どの~task~sourceか指定されていない】, 次の手続き ) ◎ Queue a task to run these steps:
手続きは:
- %~job ~LET %~job~queue の最初の`~item$ ◎ Let job be the first item in jobQueue.
- %~job種別 ~LET %~job の`~job種別$job ◎ ↓
-
この段は`並列的$に走らす ⇒ %~job種別 に応じて:
- `登録する^i ⇒ `登録する$( %~job )
- `更新する^i ⇒ `更新する$( %~job )
- `未登録にする^i ⇒ `未登録にする$( %~job )
注記: %~job の[ 登録-/更新- ]に対しては、 ~UAは,[ %~job を走らす~task ]を~queueするのを[[ %~job を起動した文書 ]に向けて, `DOMContentLoaded$I ~eventを配送した後 ]まで遅延する。
◎ If job’s job type is register, run Register with job in parallel. ◎ Else if job’s job type is update, run Update with job in parallel. ◎ Note: For a register job and an update job, the user agent delays queuing a task for running the job until after a DOMContentLoaded event has been dispatched to the document that initiated the job. ◎ Else if job’s job type is unregister, run Unregister with job in parallel.
`~jobを完遂する@
- 入力 ⇒# %~job — `~job$ ◎ Input • job, a job
- 出力 ⇒# ~none ◎ Output • none
- %~job~queue ~LET %~job を`包含している~job~queue$job ◎ Let jobQueue be job’s containing job queue.
- ~Assert: %~job~queue の最初の`~item$ ~EQ %~job ◎ Assert: the first item in jobQueue is job.
- %~job~queue から`~dequeueする$ ◎ Dequeue from jobQueue.
- ~IF[ %~job~queue は`空$でない ] ⇒ `~jobを走らす$( %~job~queue ) ◎ If jobQueue is not empty, invoke Run Job with jobQueue.
`~job~promiseを解決する@
- 入力 ⇒# %~job — `~job$, %値 — 任意の値 ◎ Input • job, a job • value, any
- 出力 ⇒# ~none ◎ Output • none
-
%~job~promiseを内部的に解決する ~LET 所与の ( %入力~job ) に対し,次を走らす手続き:
- %~client ~LET %入力~job の`~client$job
- ~IF[ %~client ~EQ ~NULL ] ⇒ ~RET
- %O ~LET ε
-
~IF[ %入力~job の`~job種別$job ~IN { `登録する^i, `更新する^i } ]:
- ~Assert: %値 は`~sw登録$である
- %O ~SET `~sw登録~objを取得する$( %値, %~client )
- ~ELSE ⇒ %O ~SET %~client の`~realm$enV 内で %値 を表現する値
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~client の`担当の~event~loop$enV )
手続きは ⇒ %O で %入力~job の`~job~promise$jobを解決する
- %~job~promiseを内部的に解決する( %~job ) ◎ If job’s client is not null, queue a task, on job’s client's responsible event loop using the DOM manipulation task source, to run the following substeps: • Let convertedValue be null. • If job’s job type is either register or update, set convertedValue to the result of getting the service worker registration object that represents value in job’s client. • Else, set convertedValue to value, in job’s client's Realm. • Resolve job’s job promise with convertedValue.
- %~job の`等価~job~list$jobを成す ~EACH( %等価な~job ) に対し ⇒ %~job~promiseを内部的に解決する( %等価な~job ) ◎ For each equivalentJob in job’s list of equivalent jobs: • If equivalentJob’s client is null, continue to the next iteration of the loop. • Queue a task, on equivalentJob’s client's responsible event loop using the DOM manipulation task source, to run the following substeps: •• Let convertedValue be null. •• If equivalentJob’s job type is either register or update, set convertedValue to the result of getting the service worker registration object that represents value in equivalentJob’s client. •• Else, set convertedValue to value, in equivalentJob’s client's Realm. •• Resolve equivalentJob’s job promise with convertedValue.
`~job~promiseを却下する@
- 入力 ⇒# %~job — `~job$, %~error~data — `新たな例外$を作成するために必要yな情報 ◎ Input • job, a job • errorData, the information necessary to create an exception
- 出力 ⇒# ~none ◎ Output • none
-
%~job~promiseを内部的に却下する ~LET 所与の ( %入力~job ) に対し,次を走らす手続き:
- %~client ~LET %入力~job の`~client$job
- ~IF[ %~client ~EQ ~NULL ] ⇒ ~RET
- %例外 ~LET %~client の`~realm$enV内に作成される`新たな例外$( %~error~data, ~UAにより定義される`~message^ )
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~client の`担当の~event~loop$enV )
手続きは ⇒ `~promiseを却下する$( %入力~job の`~job~promise$job, %例外 )
- %~job~promiseを内部的に却下する( %~job ) ◎ If job’s client is not null, queue a task, on job’s client's responsible event loop using the DOM manipulation task source, to reject job’s job promise with a new exception with errorData and a user agent-defined message, in job’s client's Realm.
- %~job の`等価~job~list$jobを成す ~EACH( %等価な~job ) に対し ⇒ %~job~promiseを内部的に却下する( %等価な~job ) ◎ For each equivalentJob in job’s list of equivalent jobs: • If equivalentJob’s client is null, continue. • Queue a task, on equivalentJob’s client's responsible event loop using the DOM manipulation task source, to reject equivalentJob’s job promise with a new exception with errorData and a user agent-defined message, in equivalentJob’s client's Realm.
`登録を開始する@
- 入力 ⇒# %~scope~URL — `~URL$ / `失敗^i / ~NULL, %~script~URL — `~URL$ / `失敗^i, %~promise — `~promise$, %~client — `~sw~client$, %~referrer — `~URL$, %~worker種別 — `~worker種別$job, %~cacheを介する更新 — `~cacheを介する更新~mode$swr ◎ Input • scopeURL, a URL or failure or null • scriptURL, a URL or failure • promise, a promise • client, a service worker client • referrer, a URL • workerType, a worker type • updateViaCache, an update via cache mode
- 出力 ⇒# ~none ◎ Output • none
- ~IF[ %~script~URL ~EQ `失敗^i ] ⇒# `~promiseを却下する$( %~promise, `TypeError^E ); ~RET ◎ If scriptURL is failure, reject promise with a TypeError and abort these steps.
-
%~script~URL の`素片$url ~SET ~NULL ◎ Set scriptURL’s fragment to null.
注記: ~UAは~scriptの~URLの`素片$urlは格納しない。 これは、 `素片$urlにより`~sw$を識別する効果は無いことを意味する。 ◎ Note: The user agent does not store the fragment of the script’s url. This means that the fragment does not have an effect on identifying service workers.
-
~IF[ ~OR↓ ]…
- %~script~URL の`~scheme$url ~NIN { `http^l , `https^l }
- %~script~URL の`~path$url内のある文字列は、 `~ASCII大小無視$で[ `%2f^l か `%5c^l ]を包含する
…ならば ⇒# `~promiseを却下する$( %~promise, `TypeError^E ); ~RET
◎ If scriptURL’s scheme is not one of "http" and "https", reject promise with a TypeError and abort these steps. ◎ If any of the strings in scriptURL’s path contains either ASCII case-insensitive "%2f" or ASCII case-insensitive "%5c", reject promise with a TypeError and abort these steps. -
~IF[ %~scope~URL ~EQ ~NULL ] ⇒ %~scope~URL ~SET `~URL構文解析する$( 文字列 `./^l , %~script~URL ) ◎ If scopeURL is null, set scopeURL to the result of parsing the string "./" with scriptURL.
注記: すなわち,既定では、 登録~用の~scope~URLは ~sw~scriptの所在に設定される。 ◎ Note: The scope url for the registration is set to the location of the service worker script by default.
- ~IF[ %~scope~URL ~EQ `失敗^i ] ⇒# `~promiseを却下する$( %~promise, `TypeError^E ); ~RET ◎ If scopeURL is failure, reject promise with a TypeError and abort these steps.
-
%~scope~URL の`素片$url ~SET ~NULL ◎ Set scopeURL’s fragment to null.
注記: ~UAは %~scope~URL の`素片$urlは格納しない。 これは、 `素片$urlにより`~sw登録$を識別する効果は無いことを意味する。 ◎ Note: The user agent does not store the fragment of the scope url. This means that the fragment does not have an effect on identifying service worker registrations.
-
~IF[ ~OR↓ ]…
- %~scope~URL の`~scheme$url ~NIN { `http^l , `https^l }
- %~scope~URL の`~path$url内のある文字列は、 `~ASCII大小無視$で[ `%2f^l か `%5c^l ]を包含する
…ならば ⇒# `~promiseを却下する$( %~promise, `TypeError^E ); ~RET
◎ If scopeURL’s scheme is not one of "http" and "https", reject promise with a TypeError and abort these steps. ◎ If any of the strings in scopeURL’s path contains either ASCII case-insensitive "%2f" or ASCII case-insensitive "%5c", reject promise with a TypeError and abort these steps. - %~storage~key ~LET `~storage~keyを得する$( %~client ) ◎ Let storage key be the result of running obtain a storage key given client.
- %~job ~LET `~jobを作成する$( ↓ ) ⇒# `登録する^i, %~storage~key, %~scope~URL, %~script~URL, %~promise, %~client ◎ Let job be the result of running Create Job with register, storage key, scopeURL, scriptURL, promise, and client.
- %~job の ⇒# `~worker種別$job ~SET %~worker種別, `~cacheを介する更新~mode$job ~SET %~cacheを介する更新, `~referrer$job ~SET %~referrer ◎ Set job’s worker type to workerType. ◎ Set job’s update via cache mode to updateViaCache. ◎ Set job’s referrer to referrer.
- `~jobを~scheduleする$( %~job ) ◎ Invoke Schedule Job with job.
`登録する@
- 入力 ⇒# %~job — `~job$ ◎ Input • job, a job
- 出力 ⇒# ~none ◎ Output • none
-
~IF[ ~OR↓ ]…
- `信用に価し得る生成元か?$( %~job の`~script~URL$jobの`生成元$url【!`生成元$enV】 ) ~EQ `価しない^i
- %~job の`~script~URL$jobの`生成元$url ~NEQ`生成元$sub %~job の`~referrer$jobの`生成元$url
- %~job の`~scope~URL$jobの`生成元$url ~NEQ`生成元$sub %~job の`~referrer$jobの`生成元$url
…ならば:
- `~job~promiseを却下する$( %~job, `SecurityError$E 例外 )
- `~jobを完遂する$( %~job )
- ~RET
- %登録 ~LET `登録を取得する$( %~job の`~storage~key$job, %~job の`~scope~URL$job ) ◎ Let registration be the result of running Get Registration given job’s storage key and job’s scope url.
-
~IF[ %登録 ~NEQ ~NULL ]: ◎ If registration is not null, then:
- %最新~worker ~LET `最新な~workerを取得する$( %登録 ) ◎ Let newestWorker be the result of running the Get Newest Worker algorithm passing registration as the argument.
-
~IF[ %最新~worker ~NEQ ~NULL ]~AND[ ( %~job の`~script~URL$job, %最新~worker の`~script~URL$sw ) は`同等な~URL$である ]~AND[ %~job の`~worker種別$job ~EQ %最新~worker の`種別$sw ]~AND[ %~job の`~cacheを介する更新~mode$job ~EQ %登録 の`~cacheを介する更新~mode$swr ]: ◎ If newestWorker is not null, job’s script url equals newestWorker’s script url, job’s worker type equals newestWorker’s type, and job’s update via cache mode's value equals registration’s update via cache mode, then:
- `~job~promiseを解決する$( %~job, %登録 ) ◎ Invoke Resolve Job Promise with job and registration.
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job and\
- ~RET ◎ abort these steps.
-
~ELSE ⇒ `登録を設定する$( %~job の`~storage~key$job, %~job の`~scope~URL$job, %~job の`~cacheを介する更新~mode$job ) ◎ Else: • Invoke Set Registration algorithm with job’s storage key, job’s scope url, and job’s update via cache mode.
- `更新する$( %~job ) ◎ Invoke Update algorithm passing job as the argument.
`更新する@
- 入力 ⇒# %~job — `~job$ ◎ Input • job, a job
- 出力 ⇒# ~none ◎ Output • none
- %登録 ~LET `登録を取得する$( %~job の`~storage~key$job, %~job の`~scope~URL$job ) ◎ Let registration be the result of running Get Registration given job’s storage key and job’s scope url.
-
~IF[ %登録 ~EQ ~NULL ]: ◎ If registration is null, then:
- `~job~promiseを却下する$( %~job, `TypeError^E ) ◎ Invoke Reject Job Promise with job and TypeError.
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job and\
- ~RET ◎ abort these steps.
- %最新~worker ~LET `最新な~workerを取得する$( %登録 ) ◎ Let newestWorker be the result of running Get Newest Worker algorithm passing registration as the argument.
-
~IF[ %~job の`~job種別$job ~EQ `更新する^i ]~AND[ %最新~worker ~NEQ ~NULL ]~AND[ ( %最新~worker の`~script~URL$sw, %~job の`~script~URL$job ) は`同等な~URL$でない ]: ◎ If job’s job type is update, and newestWorker is not null and its script url does not equal job’s script url, then:
- `~job~promiseを却下する$( %~job, `TypeError^E ) ◎ Invoke Reject Job Promise with job and TypeError.
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job and\
- ~RET ◎ abort these steps.
- %~URL ~LET `~URLを直列化する$( %~job の`~script~URL$job ) ◎ ↓
- %資源を更新したか ~LET ~F ◎ Let hasUpdatedResources be false.
- %更新-済み資源~map ~LET 新たな`有順序~map$ (この~mapは、 `~script資源~map$swを与えることになる) ◎ Let updatedResourceMap be an ordered map where the keys are URLs and the values are responses.
-
【 この訳では、 `HTML$r の更新に整合させるため, 原文における この段の中の一部の記述を改めている — それは、 `この仕様に期待される更新@https://github.com/w3c/ServiceWorker/pull/1658$に基づく (処理~modelに対する本質的な変更は無い) (特に、[ %完了-時の手続き, %~fetchを遂行する ]を導入するとともに, 原文にて `Asynchronously complete^en ( “非同期に完了する” )と記された箇所を %~custom~fetch応答の処理n(および ~RET)に置換している)。 】
%~job の`~worker種別$jobに応じて: ◎ Switching on job’s worker type, run these substeps with the following options:
- `classic^l
- `~worker用~古典~scriptを~fetchする$( ↓ ) ⇒# %~URL, %~job の`~client$job, `serviceworker^l, 設定群† %完了-時の手続き(以下に定義される), %~fetchを遂行する(以下に定義される) ◎ Fetch a classic worker script given job’s serialized script url, job’s client, "serviceworker", and the to-be-created environment settings object for this service worker.
- `module^l
- `~module~worker~script~graphを~fetchする$( ↓ ) ⇒# %~URL, %~job の`~client$job, `serviceworker^l, `omit^l, 設定群† %完了-時の手続き(以下に定義される), %~fetchを遂行する(以下に定義される)【この引数は不要?】 ◎ Fetch a module worker script graph given job’s serialized script url, job’s client, "serviceworker", "omit", and the to-be-created environment settings object for this service worker.
† 上に与えた設定群は、 この~sw用に【必要になった時点で】`作成されることになる^em`環境~設定群~obj$を与える。 【例えば~fetchに失敗した場合、作成されないであろう。】 ◎ ↑
具象的な`環境~設定群~obj$ではなく,作成されることになる`環境~設定群~obj$を利用しているのは、 ~swの処理~modelが,他の`~web~worker$の処理~modelに比較して,独特であることに因る。 ~HTML標準の~scriptを~fetchする~algoは、 元々は他の`~web~worker$用に設計されており,実行~環境の`環境~設定群~obj$を要求するが、 ~swは,~scriptを — 後で,`~swを走らす$~algoを通して複数回~走らす前に — `更新する$~algo内で別々に~fetchするので。 ◎ Using the to-be-created environment settings object rather than a concrete environment settings object. This is used due to the unique processing model of service workers compared to the processing model of other web workers. The script fetching algorithms of HTML standard originally designed for other web workers require an environment settings object of the execution environment, but service workers fetch a script separately in the Update algorithm before the script later runs multiple times through the Run Service Worker algorithm.
~HTMLにおける[ `~worker用~古典~scriptを~fetchする$/ `~module~worker~script~graphを~fetchする$ ]~algoは、 %~job の`~client$jobを引数にとる。 %~job の`~client$jobは、 `~soft更新する$~algoから渡されるときは ~NULL になる。 ◎ The fetch a classic worker script algorithm and the fetch a module worker script graph algorithm in HTML take job’s client as an argument. job’s client is null when passed from the Soft Update algorithm.
%~fetchを遂行する は、 `~fetch~hookを遂行する~algo$であり, 所与の ( %要請, %~top-levelか, %~custom~fetch応答の処理n ) に対し,次を走らす: 【!In both cases, let performFetch be the following asynchronous perform the fetch hook given request, isTopLevel and processCustomFetchResponse:】 ◎ To perform the fetch given request, run the following steps:
-
%要請 の`~header~list$rq に`~headerを付加する$( ( `Service-Worker^h, `script^bl ) ) ◎ Append `Service-Worker`/`script` to request’s header list.
注記: `§ 拡張された~HTTP~header@#extended-http-headers$ における `Service-Worker^h ~headerの定義を見よ。 ◎ Note: See the definition of the Service-Worker header in Appendix B: Extended HTTP headers.
-
~IF[ ~OR↓ ]… ◎ Set request’s cache mode to "no-cache" if any of the following are true:
- %登録 の`~cacheを介する更新~mode$swr ~NEQ `all^l ◎ registration’s update via cache mode is not "all".
- %~job の`~cacheを迂回するよう強制するか$job ~EQ ~T ◎ job’s force bypass cache flag is set.
- [ %最新~worker ~NEQ ~NULL ]~AND[ %登録 は`非新鮮$である ] ◎ newestWorker is not null and registration is stale.
…ならば ⇒ %要請 の`~cache~mode$rq ~SET `no-cache^l ◎ ↑
注記: [ ~cache~mode ~NEQ `no-cache^l ]の場合でも、 ~UAは,[ ~browser~cacheを迂回するべきかどうか ]を決定するため[ ~network層における `Cache-Control$h ~headerの `max-age^dir 値 ]を順守する。 ◎ Note: Even if the cache mode is not set to "no-cache", the user agent obeys Cache-Control header’s max-age value in the network layer to determine if it should bypass the browser cache.
- %要請 の`~sw~mode$rq ~SET `none^l ◎ Set request’s service-workers mode to "none".
-
~IF[ %~top-levelか ~EQ ~F ]:
- ~RET %要請 を`~fetchする$ — 次を与える下で ⇒ `応答の本体を消費する処理n^i ~SET %~custom~fetch応答の処理n
- ; ~RET
- %要請 の`~redirect~mode$rq ~SET `error^l ◎ Set request’s redirect mode to "error".
-
%要請 を`~fetchする$ — 次を与える下で ⇒ `応答の処理n^i ~SET 次に定義する手続き ◎ Fetch request, and asynchronously wait to run the remaining steps as part of fetch’s processResponse for the response response.
手続きは,所与の ( `応答$ %応答 ) に対し,次を走らす: ◎ ↑
- %~MIME型 ~LET `~header~listから~MIME型を抽出する$( %応答 の`~header~list$rs ) ◎ Extract a MIME type from the response’s header list.\
-
~IF[ %~MIME型 は`~JS~MIME型$でない【!不要:(ignoring parameters)】 ]: ◎ If this MIME type (ignoring parameters) is not a JavaScript MIME type, then:
- `~job~promiseを却下する$( %~job, `SecurityError$E 例外 ) ◎ Invoke Reject Job Promise with job and "SecurityError" DOMException.
- %~custom~fetch応答の処理n( `~network~error$ ) 【!Invoke processCustomFetchResponse with a network error and abort these steps.】 ◎ Asynchronously complete these steps with a network error.
- ~RET
-
%許容される~sw ~LET `~header~listから値を抽出する$( %応答 の`~header~list$rs, `Service-Worker-Allowed^h ) ◎ Let serviceWorkerAllowed be the result of extracting header list values given `Service-Worker-Allowed` and response’s header list.
注記: `§ 拡張された~HTTP~header@#extended-http-headers$ における `Service-Worker-Allowed$h ~headerの定義を見よ。 ◎ Note: See the definition of the Service-Worker-Allowed header in Appendix B: Extended HTTP headers.
- %施策~容器 ~SET `~fetch応答から施策~容器を作成する$( %応答 ) ◎ Set policyContainer to the result of creating a policy container from a fetch response given response.
- ~IF[ %許容される~sw ~EQ `失敗^i ] ⇒# %~custom~fetch応答の処理n( `~network~error$ ); ~RET【!If serviceWorkerAllowed is failure, then: Invoke processCustomFetchResponse with a network error and abort these steps.】 ◎ If serviceWorkerAllowed is failure, then: • Asynchronously complete these steps with a network error.
-
%合致したか ~LET 次の手続きを走らせた結果 ◎ ↓↓
- %最大-~scope ~LET ε ◎ ↓↓ Let scopeURL be registration’s scope url. ◎ ↓↓ Let maxScopeString be null.
-
~IF[ %許容される~sw ~EQ ~NULL ] ⇒ %最大-~scope ~LET `~URL構文解析する$( `./^l, %~job の`~script~URL$job ) ◎ If serviceWorkerAllowed is null, then: • Let resolvedScope be the result of parsing "./" using job’s script url as the base URL. • Set maxScopeString to "/", followed by the strings in resolvedScope’s path (including empty strings), separated from each other by "/".
注記: %最大-~scope の`~path$urlの最後の~itemは,常に空~文字列になるので、 下の %最大-~scope文字列 の末尾は `/^l になる。 ◎ Note: The final item in resolvedScope’s path will always be an empty string, so maxScopeString will have a trailing "/".
-
~ELSE: ◎ Else:
- %最大-~scope ~LET `~URL構文解析する$( %許容される~sw, %~job の`~script~URL$job ) ◎ Let maxScope be the result of parsing serviceWorkerAllowed using job’s script url as the base URL.
- ~IF[ %最大-~scope の`生成元$url ~NEQ`生成元$sub %~job の`~script~URL$jobの`生成元$url ] ⇒ ~RET ~F ◎ If maxScope’s origin is job’s script url's origin, then: • Set maxScopeString to "/", followed by the strings in maxScope’s path (including empty strings), separated from each other by "/".
- %最大-~scope文字列 ~LET 次の結果を `/^l で`連結する$ ⇒ « 空~文字列 » を %最大-~scope の`~path$urlで`拡張する$ ◎ ↑
- %~scope文字列 ~LET 次の結果を `/^l で`連結する$ ⇒ « 空~文字列 » を[ %登録 の`~scope~URL$swrの`~path$url ]で`拡張する$ ◎ Let scopeString be "/", followed by the strings in scopeURL’s path (including empty strings), separated from each other by "/".
- ~IF[ %最大-~scope文字列 は %~scope文字列 の`符号単位~接頭辞$でない【!not start with】 ] ⇒ ~RET ~F ◎ ↓
- ~RET ~T ◎ ↓
-
~IF[ %合致したか ~EQ ~F ]: ◎ If maxScopeString is null or scopeString does not start with maxScopeString, then:
- `~job~promiseを却下する$( %~job, `SecurityError$E 例外 ) ◎ Invoke Reject Job Promise with job and "SecurityError" DOMException.
- %~custom~fetch応答の処理n( `~network~error$ ) 【!】 ◎ Asynchronously complete these steps with a network error.
- ~RET
- %~URL ~LET %要請 の`~URL$rq ◎ Let url be request’s url.
- %更新-済み資源~map[ %~URL ] ~SET %応答 ◎ Set updatedResourceMap[url] to response.
- ~IF[ %応答 の`~cache状態$ ~NEQ `local^l ] ⇒ %登録 の`最後の更新~検査-時刻$swr ~SET 現在の時刻 ◎ If response’s cache state is not "local", set registration’s last update check time to the current time.
-
~IF[ ~OR↓ ]…
- %最新~worker ~EQ ~NULL
- [ %最新~worker の`~script~URL$sw ~NEQ %~URL【!*】 ]~OR[ %最新~worker の`種別$sw ~NEQ %~job の`~worker種別$job ]
- [ %最新~worker の`~script資源~map$sw[ %~URL ] の`本体$rs, %応答 の`本体$rs ]は、 ~byte列として一致しない
…ならば ⇒ %資源を更新したか ~SET ~T
◎ Set hasUpdatedResources to true if any of the following are true: • newestWorker is null. • newestWorker’s script url is not url or newestWorker’s type is not job’s worker type. • newestWorker’s script resource map[url]'s body is not byte-for-byte identical with response’s body. -
~IF[ %資源を更新したか ~EQ ~F ]~AND[ %最新~worker の`古典~scriptは~import済みか$sw ~EQ ~T ]: ◎ If hasUpdatedResources is false and newestWorker’s classic scripts imported flag is set, then:
注記: この段は、 ~importした~scriptが更新されたかどうかを検査する — ~main~scriptは変化しなかった【ことが前~段から判明した】ので。 ◎ Note: The following checks to see if an imported script has been updated, since the main script has not changed.
-
%最新~worker の`~script資源~map$swを成す ~EACH( %~import~URL → %格納-済み応答 ) に対し: ◎ For each importUrl → storedResponse of newestWorker’s script resource map:
- ~IF[ %~import~URL ~EQ %~URL【!*】 ] ⇒ ~CONTINUE ◎ If importUrl is url, then continue.
- %~import要請 ~LET 新たな`要請$ — その ⇒# `~URL$rq~SET %~import~URL, `~client$rq~SET %~job の`~client$job, `行先$rq~SET `script^l, `構文解析器~metadata$rq~SET `not parser-inserted^l, 同期~flag【廃された】 ~SET ~T, `~URL資格証を利用するか$rq~SET ~T ◎ Let importRequest be a new request whose url is importUrl, client is job’s client, destination is "script", parser metadata is "not parser-inserted", synchronous flag is set, and whose use-URL-credentials flag is set.
-
~IF[ ~OR↓ ]… ◎ Set importRequest’s cache mode to "no-cache" if any of the following are true:
- %登録 の`~cacheを介する更新~mode$swr ~EQ `none^l ◎ registration’s update via cache mode is "none".
- %~job の`~cacheを迂回するよう強制するか$job ~EQ ~T ◎ job’s force bypass cache flag is set.
- %登録 は`非新鮮$である ◎ registration is stale.
…ならば ⇒ %~import要請 の`~cache~mode$rq ~SET `no-cache^l ◎ ↑
- %~fetchした応答 ~LET %~import要請 を`~fetchする$ ◎ Let fetchedResponse be the result of fetching importRequest.
- %更新-済み資源~map[ %~import要請 の`~URL$rq ] ~SET %~fetchした応答 ◎ Set updatedResourceMap[importRequest’s url] to fetchedResponse.
- %~fetchした応答 ~SET %~fetchした応答 の`安全でない応答$ ◎ Set fetchedResponse to fetchedResponse’s unsafe response.
- ~IF[ %~fetchした応答 の`~cache状態$ ~NEQ `local^l ] ⇒ %登録 の`最後の更新~検査-時刻$swr ~SET 現在の時刻 ◎ If fetchedResponse’s cache state is not "local", set registration’s last update check time to the current time.
-
~IF[ %~fetchした応答 は`不良な~import~script応答$である ] ⇒ ~CONTINUE ◎ If fetchedResponse is a bad import script response, continue.
注記: `importScripts()$c に対する不良な応答は、 ~byte列として検査する目的(次の段)においては無視される。 [ 現任な~worker / 更新~workerになり得るもの【!potential*】 ]に対する不良でない応答に限り考慮される。 その根拠のいくつかは, `1374$issue を見よ。 ◎ Note: Bad responses for importScripts() are ignored for the purpose of the byte-to-byte check. Only good responses for the incumbent worker and good responses for the potential update worker are considered. See issue #1374 for some rationale.
-
~IF[[ %~fetchした応答 の`本体$rs ]と[ %格納-済み応答 の`安全でない応答$の`本体$rs ]は、 ~byte列として一致しない ] ⇒ %資源を更新したか ~SET ~T ◎ If fetchedResponse’s body is not byte-for-byte identical with storedResponse’s unsafe response's body, set hasUpdatedResources to true.
注記: ~importしたすべての~scriptで~cacheを拡充するため、 ~loopはこの段で ~BREAK することなく ~CONTINUE する。 【!The control】 ◎ Note: The control does not break the loop in this step to continue with all the imported scripts to populate the cache.
-
- %~custom~fetch応答の処理n( %応答 ) 【!Invoke processCustomFetchResponse with response.】 ◎ Asynchronously complete these steps with response.
%完了-時の手続き は、 所与の( %~script ) に対し: 【!In both cases, let onComplete given script the following algorithm:】 ◎ When the algorithm asynchronously completes, continue the rest of these steps, with script being the asynchronous completion value.
-
~IF[ %~script ~EQ ~NULL ]~OR[ `非同期c~moduleか?$( %~script の`~record$sC, 【引数が足らない】, %~script の`基底~URL$sC, « » ) ~EQ ~T ]: ◎ If script is null or Is Async Module with script’s record, script’s base URL, and « » is true, then:
-
`~job~promiseを却下する$( %~job, `TypeError^E ) ◎ Invoke Reject Job Promise with job and TypeError.
注記: これは、 以前に `~job~promiseを却下する$( `SecurityError$E 例外 ) が呼出されていた場合は何もしない。 ◎ Note: This will do nothing if Reject Job Promise was previously invoked with "SecurityError" DOMException.
- ~IF[ %最新~worker ~EQ ~NULL ] ⇒ `登録~map$[ ( %登録 の`~storage~key$swr, `~URLを直列化する$( %登録 の`~scope~URL$swr ) ) ] ~SET ε 【!原文の %scopeURL は定義されていない】 ◎ If newestWorker is null, then remove registration map[(registration’s storage key, serialized scopeURL)].
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job and\
- ~RET ◎ abort these steps.
-
-
~IF[ %資源を更新したか ~EQ ~F ]: ◎ If hasUpdatedResources is false, then:
- %登録 の`~cacheを介する更新~mode$swr ~SET %~job の`~cacheを介する更新~mode$job ◎ Set registration’s update via cache mode to job’s update via cache mode.
- `~job~promiseを解決する$( %~job, %登録 ) ◎ Invoke Resolve Job Promise with job and registration.
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job and\
- ~RET ◎ abort these steps.
- %~worker ~LET 新たな`~sw$ — その ⇒# `~script~URL$sw ~SET %~job の`~script~URL$job, `種別$sw ~SET %~job の`~worker種別$job, `~script資源$sw ~SET %~script, `~script資源~map$sw ~SET %更新-済み資源~map ◎ Let worker be a new service worker. ◎ Set worker’s script url to job’s script url, worker’s script resource to script, worker’s type to job’s worker type, and worker’s script resource map to updatedResourceMap.
- %~worker の`利用した~scriptの集合$swに %~URL を付加する ◎ Append url to worker’s set of used scripts.
- %~worker の`~script資源$swの`施策~容器$sw ~SET %施策~容器 ◎ Set worker’s script resource’s policy container to policyContainer.
- %走らせた結果 ~LET `~swを走らす$( %~worker, %~job の`~cacheを迂回するよう強制するか$job ) ◎ Let forceBypassCache be true if job’s force bypass cache flag is set, and false otherwise. ◎ Let runResult be the result of running the Run Service Worker algorithm with worker and forceBypassCache.
-
~IF[ %走らせた結果 ~EQ `失敗^i ]~OR[ %走らせた結果 は`中途完了$である ]: ◎ If runResult is failure or an abrupt completion, then:
- `~job~promiseを却下する$( %~job, `TypeError^E ) ◎ Invoke Reject Job Promise with job and TypeError.
- ~IF[ %最新~worker ~EQ ~NULL ] ⇒ `登録~map$[ ( %登録 の`~storage~key$swr, `~URLを直列化する$( %登録 の`~scope~URL$swr ) ) ] ~SET ε ◎ If newestWorker is null, then remove registration map[(registration’s storage key, serialized scopeURL)].
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job.
- ~ELSE ⇒ `~installする$( %~job, %~worker, %登録 ) ◎ Else, invoke Install algorithm with job, worker, and registration as its arguments.
`~soft更新する@
~UAは、 これを何度でも~callして,更新-を検査してヨイ。 ◎ The user agent may call this as often as it likes to check for updates.
-
入力 ⇒# %登録 — `~sw登録$, %~cacheを迂回するよう強制するか — 真偽値(省略時は ~F ) ◎ Input • registration, a service worker registration • forceBypassCache, an optional boolean, false by default
注記: 実装者は、 ~debugし易くなるよう %~cacheを迂回するよう強制するか を利用してもヨイ(例:開発者~toolから呼出すなど)。 また、 ~swを拡張する他の仕様も,自前の必要に応じてこの~flagを利用してもヨイ。 ◎ Note: Implementers may use forceBypassCache to aid debugging (e.g. invocations from developer tools), and other specifications that extend service workers may also use the flag on their own needs.
- 出力 ⇒# ~none ◎ Output • None
- %最新~worker ~LET `最新な~workerを取得する$( %登録 ) ◎ Let newestWorker be the result of running Get Newest Worker algorithm passing registration as its argument.
- ~IF[ %最新~worker ~EQ ~NULL ] ⇒ ~RET ◎ If newestWorker is null, abort these steps.
- %~job ~LET `~jobを作成する$( ↓ ) ⇒# `更新する^i, %登録 の`~storage~key$swr, %登録 の`~scope~URL$swr, %最新~worker の`~script~URL$sw, ~NULL, ~NULL ◎ Let job be the result of running Create Job with update, registration’s storage key, registration’s scope url, newestWorker’s script url, null, and null.
- %~job の`~worker種別$job ~SET %最新~worker の`種別$sw ◎ Set job’s worker type to newestWorker’s type.
- %~job の`~cacheを迂回するよう強制するか$job ~SET %~cacheを迂回するよう強制するか ◎ Set job’s force bypass cache flag if forceBypassCache is true.
- `~jobを~scheduleする$( %~job ) ◎ Invoke Schedule Job with job.
`~installする@
- 入力 ⇒# %~job — `~job$, %~worker — `~sw$, %登録 — `~sw登録$ ◎ Input • job, a job • worker, a service worker • registration, a service worker registration
- 出力 ⇒# ~none ◎ Output • none
- %~installに失敗したか ~LET ~F ◎ Let installFailed be false.
- %最新~worker ~LET `最新な~workerを取得する$( %登録 ) ◎ Let newestWorker be the result of running Get Newest Worker algorithm passing registration as its argument.
- %登録 の`~cacheを介する更新~mode$swr ~SET %~job の`~cacheを介する更新~mode$job ◎ Set registration’s update via cache mode to job’s update via cache mode.
- `登録の状態を更新する$( %登録, `installing^l, %~worker ) ◎ Run the Update Registration State algorithm passing registration, "installing" and worker as the arguments.
- `~workerの状態を更新する$( %登録 にて`~install中の~worker$swr, `installing^l ) ◎ Run the Update Worker State algorithm passing registration’s installing worker and "installing" as the arguments.
- ~Assert: %~job の`~job~promise$job ~NEQ ~NULL ◎ Assert: job’s job promise is not null.
- `~job~promiseを解決する$( %~job, %登録 ) ◎ Invoke Resolve Job Promise with job and registration.
- %設定群~obj群 ~LET 次を満たす`環境~設定群~obj$すべてからなる集合 ⇒ `生成元$enV ~EQ`生成元$sub %登録 の`~scope~URL$swrの`生成元$url ◎ Let settingsObjects be all environment settings objects whose origin is registration’s scope url's origin.
-
%設定群~obj群 を成す ~EACH( %設定群~obj ) に対し ⇒ `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %設定群~obj の`担当の~event~loop$enV ) ◎ For each settingsObject of settingsObjects, queue a task on settingsObject’s responsible event loop in the DOM manipulation task source to run the following steps:
手続きは:
- %登録~obj群 ~LET %設定群~obj の`~realm$enV内の `ServiceWorkerRegistration$I ~objのうち[ `表現する~sw登録$ ~EQ %登録 ]を満たすもの ◎ Let registrationObjects be every ServiceWorkerRegistration object in settingsObject’s realm, whose service worker registration is registration.
- %登録~obj群 を成す ~EACH( %登録~obj ) に対し ⇒ `~eventを発火する$( %登録~obj, `updatefound$et ) ◎ For each registrationObject of registrationObjects, fire an event on registrationObject named updatefound.
- %~install中の~worker ~LET %登録 にて`~install中の~worker$swr ◎ Let installingWorker be registration’s installing worker.
-
~IF[ `~eventを飛ばすべきか?$( `install^l, %~install中の~worker ) ~EQ ~F ]: ◎ If the result of running the Should Skip Event algorithm with installingWorker and "install" is false, then:
- %~cacheを迂回するよう強制するか ~LET %~job の`~cacheを迂回するよう強制するか$job ◎ Let forceBypassCache be true if job’s force bypass cache flag is set, and false otherwise.
- ~IF[ `~swを走らす$( %~install中の~worker, %~cacheを迂回するよう強制するか ) ~EQ `失敗^i ] ⇒ %~installに失敗したか ~SET ~T ◎ If the result of running the Run Service Worker algorithm with installingWorker and forceBypassCache is failure, then: • Set installFailed to true.
-
~ELSE: ◎ Else:
-
%~task ~LET `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~install中の~worker の`~event~loop$ ) ◎ Queue a task task on installingWorker’s event loop using the DOM manipulation task source to run the following steps:
手続きは:
- %~event ~LET `~eventを作成する$( `InstallEvent$I ) ◎ Let e be the result of creating an event with InstallEvent.
- %~event の`type$n 属性 ~SET `install$et に初期化する ◎ Initialize e’s type attribute to install.
- `~eventを配送する$( %~install中の~worker の`大域~obj$sw, %~event ) ◎ Dispatch e at installingWorker’s global object.
-
`非同期~拡張を待機する^i — この段は`並列的$に走らす: ◎ WaitForAsynchronousExtensions: Run the following substeps in parallel:
- 次が満たされるまで待機する ⇒ %~event は`作動中$eXでない ◎ Wait until e is not active.
- ~IF[ %~event の`時間切れか$ ~EQ ~T ] ⇒ %~installに失敗したか ~SET ~T ◎ If e’s timed out flag is set, set installFailed to true.
- %~promise ~LET `すべてを待機する~promiseを取得する$( %~event の`存続期間を延長する~promise群$ ) ◎ Let p be the result of getting a promise to wait for all of e’s extend lifetime promises.
%~promise の`却下-時$には ⇒ %~installに失敗したか ~SET ~T ◎ Upon rejection of p, set installFailed to true.
%~task が破棄されたときは ⇒ %~installに失敗したか ~SET ~T ◎ If task is discarded, set installFailed to true.
- %~task が実行されるか破棄されるまで待機する ◎ Wait for task to have executed or been discarded.
- `非同期~拡張を待機する^i 段が完了するまで待機する ◎ Wait for the step labeled WaitForAsynchronousExtensions to complete.
-
-
~IF[ %~installに失敗したか ~EQ ~T ]: ◎ If installFailed is true, then:
- `~workerの状態を更新する$( %登録 にて`~install中の~worker$swr, `redundant^l ) ◎ Run the Update Worker State algorithm passing registration’s installing worker and "redundant" as the arguments.
- `登録の状態を更新する$( %登録, `installing^l, ~NULL ) ◎ Run the Update Registration State algorithm passing registration, "installing" and null as the arguments.
- ~IF[ %最新~worker ~EQ ~NULL ] ⇒ `登録~map$[ ( %登録 の`~storage~key$swr, `~URLを直列化する$( %登録 の`~scope~URL$swr ) ) ] ~SET ε ◎ If newestWorker is null, then remove registration map[(registration’s storage key, serialized registration’s scope url)].
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job and\
- ~RET ◎ abort these steps.
- %~map ~LET %登録 にて`~install中の~worker$swrの`~script資源~map$sw ◎ Let map be registration’s installing worker's script resource map.
- %利用した~script群 ~LET %登録 にて`~install中の~worker$swrの`利用した~scriptの集合$sw ◎ Let usedSet be registration’s installing worker's set of used scripts.
- %~map を成す ~EACH( %~URL ) に対し ⇒ ~IF[ %~URL ~NIN %利用した~script群 ] ⇒ %~map[ %~URL ] ~SET ε ◎ For each url of map: • If usedSet does not contain url, then remove map[url].
-
~IF[ %登録 にて`待機-中な~worker$swr ~NEQ ~NULL ]: ◎ If registration’s waiting worker is not null, then:
- `~swを終了する$( %登録 にて`待機-中な~worker$swr ) ◎ Terminate registration’s waiting worker.
- `~workerの状態を更新する$( %登録 にて`待機-中な~worker$swr, `redundant^l ) ◎ Run the Update Worker State algorithm passing registration’s waiting worker and "redundant" as the arguments.
- `登録の状態を更新する$( %登録, `waiting^l, %登録 にて`~install中の~worker$swr ) ◎ Run the Update Registration State algorithm passing registration, "waiting" and registration’s installing worker as the arguments.
- `登録の状態を更新する$( %登録, `installing^l, ~NULL ) ◎ Run the Update Registration State algorithm passing registration, "installing" and null as the arguments.
- `~workerの状態を更新する$( %登録 にて`待機-中な~worker$swr, `installed^l ) ◎ Run the Update Worker State algorithm passing registration’s waiting worker and "installed" as the arguments.
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job.
- [ この~algoにより呼出された`~workerの状態を更新する$ ]により`~queueされ$たすべての`~task$ が実行されるまで待機する ◎ Wait for all the tasks queued by Update Worker State invoked in this algorithm to have executed.
-
`作動化しようと試行する$( %登録 ) ◎ Invoke Try Activate with registration.
注記: ここで`作動化しようと試行する$() が`作動化する$() を誘発しない場合、 `作動化する$() は,次のとき再度~試行される:
- 既存の`作動中な~worker$swrにより制御されている最後の~clientが,`~unload$されたとき。
- `ServiceWorkerGlobalScope^I1`skipWaiting()$m1 が非同期的に~callされたとき。
- 既存の`作動中な~worker$swr用の`存続期間を延長する~promise群$が決着したとき。
`作動化する@
- 入力 ⇒# %登録 — `~sw登録$ ◎ Input • registration, a service worker registration
- 出力 ⇒# ~none ◎ Output • None
- ~IF[ %登録 にて`待機-中な~worker$swr ~EQ ~NULL ] ⇒ ~RET ◎ If registration’s waiting worker is null, abort these steps.
-
~IF[ %登録 にて`作動中な~worker$swr ~NEQ ~NULL ]: ◎ If registration’s active worker is not null, then:
- `~swを終了する$( %登録 にて`作動中な~worker$swr ) ◎ Terminate registration’s active worker.
- `~workerの状態を更新する$( %登録 にて`作動中な~worker$swr, `redundant^l ) ◎ Run the Update Worker State algorithm passing registration’s active worker and "redundant" as the arguments.
- `登録の状態を更新する$( %登録, `active^l, %登録 にて`待機-中な~worker$swr ) ◎ Run the Update Registration State algorithm passing registration, "active" and registration’s waiting worker as the arguments.
- `登録の状態を更新する$( %登録, `waiting^l, ~NULL ) ◎ Run the Update Registration State algorithm passing registration, "waiting" and null as the arguments.
-
`~workerの状態を更新する$( %登録 にて`作動中な~worker$swr, `activating^l ) ◎ Run the Update Worker State algorithm passing registration’s active worker and "activating" as the arguments.
注記: 作動中な~workerが作動化-中( `activating^l )になって以降は、[ 稼働時の~script~error, 作動中な~workerの強制-終了n ]のいずれも,作動中な~workerが作動化されるのを防止しない。 ◎ Note: Once an active worker is activating, neither a runtime script error nor a force termination of the active worker prevents the active worker from getting activated.
注記: 作動化~handlerは、 (片付け~などの様な)本質的でない作業を行うよう設計すること。 作動化~handlerは — とりわけ,作動化の間に~browserが終了する事例では — 完了まで走らないこともあるので。 ~swは、 作動化~handlerが成功裡に完了しないものがあっても,適正に機能するよう設計されるベキである。 ◎ Note: Make sure to design activation handlers to do non-essential work (like cleanup). This is because activation handlers may not all run to completion, especially in the case of browser termination during activation. A Service Worker should be designed to function properly, even if the activation handlers do not all complete successfully.
- %合致した~client群 ~LET 次を満たす`~sw~client$ %~client すべてからなる~list 【順序は述べられていない】 ⇒ `合致する~sw登録$( %登録 の`~storage~key$swr, %~client の`作成時の~URL$enV ) ~EQ %登録 【!の`~scope~URL$swr】 ◎ Let matchedClients be a list of service worker clients whose creation URL matches registration’s storage key and registration’s scope url.
-
%合致した~client群 を成す ~EACH( %~client ) に対し ⇒ `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~client に`関連な設定群~obj$の`担当の~event~loop$enV ) ◎ For each client of matchedClients, queue a task on client’s responsible event loop, using the DOM manipulation task source, to run the following substeps:
手続きは:
- %準備済み~promise ~LET %~client の`大域~obj$enVの `ServiceWorkerContainer$I の`準備済み~promise$SWC ◎ Let readyPromise be client’s global object's ServiceWorkerContainer object’s ready promise.
- ~IF[ %準備済み~promise ~EQ ~NULL ] ⇒ ~CONTINUE ◎ If readyPromise is null, then continue.
- ~IF[ %準備済み~promise は決着していない ] ⇒ 次の結果で %準備済み~promise を解決する ⇒ `~sw登録~objを取得する$( %登録, %準備済み~promise に`関連な設定群~obj$ ) ◎ If readyPromise is pending, resolve readyPromise with the the result of getting the service worker registration object that represents registration in readyPromise’s relevant settings object.
-
%登録 を`利用して$いる ~EACH( `~sw~client$ %~client ) に対し: ◎ For each service worker client client who is using registration:
- %~client にて`作動中な~sw$enV【!`作動中な~worker$swrは誤記】 ~SET %登録 にて`作動中な~worker$swr ◎ Set client’s active worker to registration’s active worker.
- `制御器の変化を通知する$( %~client ) ◎ Invoke Notify Controller Change algorithm with client as the argument.
- %作動中な~worker ~LET %登録 にて`作動中な~worker$swr ◎ Let activeWorker be registration’s active worker.
-
~IF[ `~eventを飛ばすべきか?$( `activate^l, %作動中な~worker ) ~EQ ~F ]: ◎ If the result of running the Should Skip Event algorithm with activeWorker and "activate" is false, then:
-
~IF[ `~swを走らす$( %作動中な~worker ) ~NEQ `失敗^i ]: ◎ If the result of running the Run Service Worker algorithm with activeWorker is not failure, then:
-
%~task ~LET `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %作動中な~worker の`~event~loop$ ) ◎ Queue a task task on activeWorker’s event loop using the DOM manipulation task source to run the following steps:
手続きは:
- %~event ~LET `~eventを作成する$( `ExtendableEvent$I ) ◎ Let e be the result of creating an event with ExtendableEvent.
- %~event の `type$n 属性 ~SET "`activate$et" に初期化する ◎ Initialize e’s type attribute to activate.
- `~eventを配送する$( %作動中な~worker の`大域~obj$sw, %~event ) ◎ Dispatch e at activeWorker’s global object.
- `非同期~拡張を待機する^i ⇒ %~event が`作動中$eXでなくなるまで`並列的$に待機する ◎ WaitForAsynchronousExtensions: Wait, in parallel, until e is not active.
- %~task が実行されるか破棄されるまで待機する ◎ Wait for task to have executed or been discarded.
- `非同期~拡張を待機する^i 段が完了するまで待機する ◎ Wait for the step labeled WaitForAsynchronousExtensions to complete.
-
-
- `~workerの状態を更新する$( %登録 にて`作動中な~worker$swr, `activated^l ) ◎ Run the Update Worker State algorithm passing registration’s active worker and "activated" as the arguments.
`作動化しようと試行する@
- 入力 ⇒# %登録 — `~sw登録$ ◎ Input • registration, a service worker registration
- 出力 ⇒# ~none ◎ Output • None
- ~IF[ %登録 にて`待機-中な~worker$swr ~EQ ~NULL ] ⇒ ~RET ◎ If registration’s waiting worker is null, return.
-
~IF[ %登録 にて`作動中な~worker$swr ~NEQ ~NULL ]~AND[ %登録 にて`作動中な~worker$swrの`状態$sw ~EQ `activating^l ] ⇒ ~RET ◎ If registration’s active worker is not null and registration’s active worker's state is "activating", return.
注記: 既存の作動中な~workerの状態が依然として作動化-中( `activating^l )にある場合、 待機-中な~workerの作動化は遅延される。 ◎ Note: If the existing active worker is still in activating state, the activation of the waiting worker is delayed.
-
~IF[ %登録 にて`作動中な~worker$swr ~EQ ~NULL ]~OR[ ~AND↓ ]… ◎ Invoke Activate with registration if either of the following is true: • registration’s active worker is null.
- `~swには処理待ち~eventは無いか?$( %登録 にて`作動中な~worker$swr ) ~EQ ~T ◎ The result of running Service Worker Has No Pending Events with registration’s active worker is true, and\
- [ %登録 を`利用して$いる`~sw~client$はない ]~OR[ %登録 にて`待機-中な~worker$swrの`待機を飛ばすか$sw ~EQ ~T ] ◎ no service worker client is using registration or registration’s waiting worker's skip waiting flag is set.
…ならば ⇒ `作動化する$( %登録 ) ◎ ↑
`~ServiceWorkerGlobalScopeを設定しておく@
- 入力 ⇒# %~sw — `~sw$ ◎ Input • serviceWorker, a service worker
- 出力 ⇒ `ServiceWorkerGlobalScope$I ~obj / ~NULL ◎ Output • a ServiceWorkerGlobalScope object or null
注記: この~algoは、[ ~NULL/ ~CSP検査-用に利用-可能な `ServiceWorkerGlobalScope$I ]を返す。 %~sw は作動中な `ServiceWorkerGlobalScope$I を有する場合、 それが返される — 他の場合 当の~objが新たに作成されることになる。 ◎ Note: This algorithm returns a ServiceWorkerGlobalScope usable for a CSP check, or null. If serviceWorker has an active ServiceWorkerGlobalScope, then it is returned. Otherwise, the object will be newly created.
注記: この~algoは、 当の~sw用に[ ~CSPや~COEPの様な~security検査-用に利用-可能な何かを作成する ]ために必要yな最小限な設定upを行う。 この仕様は、[ そのような検査が遂行される前に,この~algoが~callされる ]ことを確保する。 ◎ This algorithm does the minimal setup for the service worker that is necessary to create something usable for security checks like CSP and COEP. This specification ensures that this algorithm is called before any such checks are performed.
各~仕様においては、 そのような~security検査には,[ `ServiceWorkerGlobalScope$I, `関連な設定群~obj$, `~realm$gL, `~agent$ ]を作成することが要求される。 各~実装においては、 要求される作業は,ずっと少ないかもしれず — 観測される結果が等価になる限り(特に,すべての~security検査は結果が同じになる限り) — この~algoが行う作業を~~減らす一方で, `~swを走らす$ときの作業を~~増やすこともできる。 ◎ In specifications, such security checks require creating a ServiceWorkerGlobalScope, a relevant settings object, a realm, and an agent. In implementations, the amount of work required might be much less. Therefore, implementations could do less work in their equivalent of this algorithm, and more work in Run Service Worker, as long as the results are observably equivalent. (And in particular, as long as all security checks have the same result.)
- %安全でない作成~時刻 ~LET `安全でない共有される現在の時刻$ ◎ Let unsafeCreationTime be the unsafe shared current time.
- ~IF[ %~sw は`走っている$ ] ⇒ ~RET %~sw の`大域~obj$sw ◎ If serviceWorker is running, then return serviceWorker’s global object.
- ~IF[ %~sw の`状態$sw ~EQ `redundant^l ] ⇒ ~RET ~NULL ◎ If serviceWorker’s state is "redundant", then return null.
- ~IF[ %~sw の`大域~obj$sw ~NEQ ~NULL ] ⇒ ~RET %~sw の`大域~obj$sw ◎ If serviceWorker’s global object is not null, then return serviceWorker’s global object.
- ~Assert: %~sw の`開始~状態$sw ~EQ ~NULL ◎ Assert: serviceWorker’s start status is null.
- %設定upに失敗したか ~LET ~F ◎ Let setupFailed be false.
- %大域~obj ~LET ~NULL ◎ Let globalObject be null.
- %~agent ~LET `~sw~agentを得する$() ◎ Let agent be the result of obtaining a service worker agent,\
-
%~agent の文脈~内で次の手続きを走らす: ◎ and run the following steps in that context:
- %~worker大域~scope ~LET 新たな `ServiceWorkerGlobalScope$I ~obj ◎ ↓
- %~realm実行~文脈 ~LET 次のように~custom化する下で、 %~agent 内で`新たな~realmを作成する$ ⇒ 大域~obj用には %~worker大域~scope を利用する ◎ Let realmExecutionContext be the result of creating a new realm given agent and the following customizations: • For the global object, create a new ServiceWorkerGlobalScope object. Let workerGlobalScope be the created object.
-
%設定群~obj ~LET 新たな`環境~設定群~obj$ — その各種~algoは、 次に従って定義される: ◎ Let settingsObject be a new environment settings object whose algorithms are defined as follows:
- `~realm実行~文脈$enV ⇒ ~RET %~realm実行~文脈 ◎ The realm execution context • Return realmExecutionContext.
- `~module~map$enV ⇒ ~RET %~worker大域~scope の`~module~map$wG ◎ The module map • Return workerGlobalScope’s module map.
- `~API用~基底~URL$enV ⇒ ~RET %~sw の`~script~URL$sw ◎ The API base URL • Return serviceWorker’s script url.
- `生成元$enV ⇒ ~RET %~sw を登録している`~sw~client$【!*】の`生成元$cl【!`生成元$enV】 ◎ The origin • Return its registering service worker client's origin.
- `施策~容器$enV ⇒ ~RET %~worker大域~scope の`施策~容器$wG ◎ The policy container • Return workerGlobalScope’s policy container.
- `時刻~起点$enV ⇒ ~RET `時刻を粗化する$( %安全でない作成~時刻, %~worker大域~scope の`非同一-生成元~能力は隔離されるか$wG ) ◎ The time origin • Return the result of coarsening unsafeCreationTime given workerGlobalScope’s cross-origin isolated capability.
- %設定群~obj の ⇒# `~ID$enV ~SET 新たな一意かつ不透明な文字列, `作成時の~URL$enV ~SET %~sw の`~script~URL$sw, `~top-level作成時の~URL$enV ~SET ~NULL, `~top-level生成元$enV ~SET `実装定義$な値, `~target閲覧~文脈$enV ~SET ~NULL, `作動中な~sw$enV ~SET ~NULL ◎ Set settingsObject’s id to a new unique opaque string, creation URL to serviceWorker’s script url, top-level creation URL to null, top-level origin to an implementation-defined value, target browsing context to null, and active service worker to null.
- %~worker大域~scope の ⇒# `~URL$wG ~SET %~sw の`~script~URL$sw, `施策~容器$wG ~SET %~sw の`~script資源$swの`施策~容器$sw, `種別$wG ~SET %~sw の`種別$sw ◎ Set workerGlobalScope’s url to serviceWorker’s script url. ◎ Set workerGlobalScope’s policy container to serviceWorker’s script resource’s policy container. ◎ Set workerGlobalScope’s type to serviceWorker’s type.
- %~worker大域~scope に新たな `WorkerLocation$I ~objを結付ける ◎ Create a new WorkerLocation object and associate it with workerGlobalScope.
- ~IF[ `大域~obj用に~CSP初期化を走らす$( %~worker大域~scope ) ~EQ `阻止される^i ] ⇒# %設定upに失敗したか ~SET ~T; ~RET ◎ If the run CSP initialization for a global object algorithm returns "Blocked" when executed upon workerGlobalScope, set setupFailed to true and abort these steps.
- %大域~obj ~SET %~worker大域~scope ◎ Set globalObject to workerGlobalScope.
- 次が満たされるまで待機する ⇒ [ %大域~obj ~NEQ ~NULL ]~OR[ %設定upに失敗したか ~EQ ~T ] ◎ Wait for globalObject is not null, or for setupFailed to be true.
- ~IF[ %設定upに失敗したか ~EQ ~T ] ⇒ ~RET ~NULL ◎ If setupFailed is true, then return null.
- ~RET %大域~obj ◎ Return globalObject.
`~swを走らす@
- 入力 ⇒# %~sw — `~sw$, %~cacheを迂回するよう強制するか — 真偽値(省略時は ~F ) ◎ Input • serviceWorker, a service worker • forceBypassCache, an optional boolean, false by default
- 出力 ⇒# `Completion$ / `失敗^i ◎ Output • a Completion or failure
注記: この~algoは、[ 当の~swが`走っている$ようになるか,開始に失敗する ]まで他を阻む。 ◎ Note: This algorithm blocks until the service worker is running or fails to start.
- ~IF[ %~sw は`走っている$ ] ⇒ ~RET %~sw の`開始~状態$sw ◎ If serviceWorker is running, then return serviceWorker’s start status.
- ~IF[ %~sw の`状態$sw ~EQ `redundant^l ] ⇒ ~RET `失敗^i ◎ If serviceWorker’s state is "redundant", then return failure.
- ~Assert: %~sw の`開始~状態$sw ~EQ ~NULL ◎ Assert: serviceWorker’s start status is null.
- %~script ~LET %~sw の`~script資源$sw ◎ Let script be serviceWorker’s script resource.
- ~Assert: %~script ~NEQ ~NULL ◎ Assert: script is not null.
- %開始に失敗したか ~LET ~F ◎ Let startFailed be false.
- %~worker大域~scope ~LET %~sw の`大域~obj$sw ◎ Let workerGlobalScope be serviceWorker’s global object.
-
~IF[ %~worker大域~scope ~EQ ~NULL ]: ◎ If workerGlobalScope is null:
- %~worker大域~scope ~SET `~ServiceWorkerGlobalScopeを設定しておく$( %~sw ) ◎ Set workerGlobalScope to be the result of running the Setup ServiceWorkerGlobalScope algorithm with serviceWorker.
- ~IF[ %~worker大域~scope ~EQ ~NULL ] ⇒ ~RET `失敗^i ◎ If workerGlobalScope is null, then return failure.
- %~sw の`大域~obj$sw ~SET %~worker大域~scope ◎ Set serviceWorker’s global object to workerGlobalScope.
- %~agent ~LET %~worker大域~scope の`~realm実行~文脈$enV用の~agentを得する ◎ Obtain agent for workerGlobalScope’s realm execution context,\
-
%~agent の文脈~内で次の手続きを走らす: ◎ and run the following steps in that context:
- ~IF[ %~cacheを迂回するよう強制するか ~EQ ~T ] ⇒ %~worker大域~scope の`~importする~script用には~cacheを迂回するよう強制するか$SWG ~SET %~cacheを迂回するよう強制するか ◎ Set workerGlobalScope’s force bypass cache for import scripts flag if forceBypassCache is true.
-
~IF[ %~sw は`作動中な~worker$swrである ]:
- [ %~sw を`包含している~sw登録$swの`~back-up~task~list$swr ]を成す ~EACH( `~task$ %~task ) に対し,順に ⇒ `~taskを~queueする$( %~task の`~source$tK, %~task の`手続き$tK, %~sw の`~event~loop$ )
-
`~back-up~task~list$swrを空にする
【 この段は、 この訳による補完 — さもなければ,この~listは肥大する一方になり、 ここ以外に,~listから除去し得る~~機会はないので。 】
- %評価~状態s ~LET ~NULL ◎ Let evaluationStatus be null.
-
~IF[ %~script は`古典~script$である ]: ◎ If script is a classic script, then:
- %評価~状態s ~SET `古典~scriptを走らす$( %~script ) ◎ Set evaluationStatus to the result of running the classic script script.
- ~IF[ %評価~状態s .`Value^sl は空である (すなわち、 ~scriptは,まだ評価されていない) ] ⇒# %開始に失敗したか ~SET ~T; ~RET ◎ If evaluationStatus.[[Value]] is empty, this means the script was not evaluated. Set startFailed to true and abort these steps.
-
~ELIF[ %~script は`~module~script$である ]: ◎ Otherwise, if script is a module script, then:
- %評価~promise ~LET `~module~scriptを走らす$( %~script 【!, with report errors set to false】) ◎ Let evaluationPromise be the result of running the module script script, with report errors set to false.
- ~Assert: %評価~promise . `PromiseState^sl ~NEQ `pending^l ◎ Assert: evaluationPromise.[[PromiseState]] is not "pending".
- ~IF[ %評価~promise . `PromiseState^sl ~EQ `rejected^l ] ⇒ %評価~状態s ~SET `ThrowCompletion$jA( %評価~promise . `PromiseResult^sl ) ◎ If evaluationPromise.[[PromiseState]] is "rejected": • Set evaluationStatus to ThrowCompletion(evaluationPromise.[[PromiseResult]]).
- ~ELSE ⇒ %評価~状態s ~SET `NormalCompletion$jA( `undefined^jv ) ◎ Otherwise: • Set evaluationStatus to NormalCompletion(undefined).
- ~IF[ 当の~scriptは`~swを終了する$~algoにより中止された ] ⇒# %開始に失敗したか ~SET ~T; ~RET ◎ If the script was aborted by the Terminate Service Worker algorithm, set startFailed to true and abort these steps.
- %~sw の`開始~状態$sw ~SET %評価~状態s ◎ Set serviceWorker’s start status to evaluationStatus.
-
~IF[ %~script の`これまでに評価されたか$sw ~EQ ~F ]: ◎ If script’s has ever been evaluated flag is unset, then:
-
%設定群~obj の`大域~obj$enVに結付けられた【!*?】 ~EACH( `~event~listener$ %~listener ) に対し ⇒ %~worker大域~scope の`~sw$SWGが`取扱う~event型の集合$swに %~listener の~event型 を`付加する$set ◎ For each eventType of settingsObject’s global object's associated list of event listeners' event types: • Append eventType to workerGlobalScope’s associated service worker's set of event types to handle.
注記: この時点に[ 大域~objに結付けられた~event~listener ]が追加されてない場合、 当の`~sw$SWGが`取扱う~event型の集合$swは,空~集合であり続ける。 ◎ Note: If the global object’s associated list of event listeners does not have any event listener added at this moment, the service worker’s set of event types to handle remains an empty set.
- %~script の`これまでに評価されたか$sw ~SET ~T ◎ Set script’s has ever been evaluated flag.
- %~sw の`すべての~fetch~listenerは空か$sw ~SET ~F ◎ Unset the serviceWorker’s all fetch listeners are empty flag.
- 任意選択で ⇒ ~IF[ `すべての~fetch~listenerは空か?$( %~worker大域~scope ) ~EQ ~T ] ⇒ %~sw の`すべての~fetch~listenerは空か$sw ~SET ~T ◎ The user agent may, if the All Fetch Listeners Are Empty algorithm with workerGlobalScope returns true, set serviceWorker’s all fetch listeners are empty flag.
-
- %設定群~obj により指定される`担当の~event~loop$enVを,破壊されるまで走らす ◎ Run the responsible event loop specified by settingsObject until it is destroyed.
- %~worker大域~scope の`作動中な~timer群が成す~map$を`~clearする$map ◎ Clear workerGlobalScope’s map of active timers.
- 次が満たされるまで待機する ⇒ [ %~sw は`走っている$ ]~OR[ %開始に失敗したか ~EQ ~T ] ◎ Wait for serviceWorker to be running, or for startFailed to be true.
- ~IF[ %開始に失敗したか ~EQ ~T ] ⇒ ~RET `失敗^i ◎ If startFailed is true, then return failure.
- ~RET %~sw の`開始~状態$sw ◎ Return serviceWorker’s start status.
`すべての~fetch~listenerは空か?@
- 入力 ⇒# %~worker大域~scope — `大域~obj$sw ◎ Input • workerGlobalScope, a global object.
- 出力 ⇒ 真偽値 ◎ Output • a boolean
- ~IF[ `fetch^l ~NIN %~worker大域~scope が`取扱う~event型の集合$sw ] ⇒ ~RET ~T ◎ If workerGlobalScope’s set of event types to handle does not contain fetch, then return true.
- %~event~handler ~LET %~worker大域~scope の`~event~handler~map$[ `onfetch^l ] ◎ Let eventHandler be workerGlobalScope’s event handler map["onfetch"]'s value.
- %~event~listener~callback群 ~LET `~sw~fetch~event~listener~callback群を得する旧来の手続き$( %~worker大域~scope ) ◎ Let eventListenerCallbacks be the result of calling legacy-obtain service worker fetch event listener callbacks given workerGlobalScope.
-
%~event~listener~callback群 を成す ~EACH( %~event~listener~callback ) に対し: ◎ For each eventListenerCallback of eventListenerCallbacks:
- %~callback ~LET ~NULL ◎ Let callback be null.
- ~IF[ %~event~handler ~NEQ ~NULL ]~AND[ %~event~listener~callback ~EQ %~event~handler の`~listener$eHの`~callback$evL ] ⇒ %~callback ~SET `~JS値に変換する$( %~event~handler の`値$eH ) ◎ If eventHandler is not null and eventListenerCallback equals eventHandler’s listener's callback, then set callback to the result of converting to an ECMAScript value eventHandler’s value.
- ~ELSE ⇒ %~callback ~SET `~JS値に変換する$( %~event~listener~callback ) ◎ Otherwise, set callback to the result of converting to an ECMAScript value eventListenerCallback.
-
~IF[ `IsCallable$jA( %~callback ) ~EQ ~F ] ⇒ ~RET ~F ◎ If IsCallable(callback) is false, then return false.
注記: `Callback^c ~obj 【`~callback~interface$を実装する~obj】 のうち, `handleEvent^c を利用するものは、 【次の段と同じく】空でないものと見做される。 この段は、 `handleEvent^c 取得子 (それは、 この検査の間に当の~event~listenerを改変し得る) が~callされるのを避ける。 ◎ Note: Callback objects that use handleEvent are assumed to be non-empty. This avoids calling the handleEvent getters, which could modify the event listeners during this check.
-
~IF[ %~callback の`関数~本体$は空でない (すなわち[ `statement, declaration@~TC39#sec-ecmascript-language-statements-and-declarations$en ]いずれかは存在する) ] ⇒ ~RET ~F ◎ If callback’s function body is not empty (i.e. either a statement or declaration exist), then return false.
注記: これは、 `() => {}^c の様な `fetch^l ~listenerを検出する。 一部の~siteは、 自身が[ Chromium から PWA( `progressive web application^en )として認識される ]よう,本体が空な~fetch~event~listenerを有する。 ◎ Note: This detects "fetch" listeners like () => {}. Some sites have a fetch event listener with empty body to make them recognized by Chromium as a progressive web application (PWA).
- ~RET ~T ◎ Return true.
注記: ~UAには、 次を指示する警告を示すことが奨励される ⇒ 空な `fetch^l ~listenerは不必要であり、 処理能に負な影響iを及ぼし得る。 ◎ Note: User agents are encouraged to show a warning indicating that empty "fetch" listeners are unnecessary, and may have a negative performance impact.
`~swを終了する@
- 入力 ⇒# %~sw — `~sw$ ◎ Input • serviceWorker, a service worker
- 出力 ⇒# ~none ◎ Output • None
以下は、 %~sw の~main~loopとは`並列的$に走らす: ◎ Run the following steps in parallel with serviceWorker’s main loop:
- %~sw大域~scope ~LET %~sw の`大域~obj$sw ◎ Let serviceWorkerGlobalScope be serviceWorker’s global object.
- %~sw大域~scope の`~close中か$wG ~SET ~T ◎ Set serviceWorkerGlobalScope’s closing flag to true.
- %~sw の`延長-済み~event集合$swを`空にする$ ◎ Remove all the items from serviceWorker’s set of extended events.
- %~back-up ~LET %~sw を`包含している~sw登録$swの`~back-up~task~list$swr ◎ ↓
- ~EACH( %~task~source ~IN { `~fetchを取扱う~task~source$, `機能的~eventを取扱う~task~source$ } ) に対し ⇒ %~sw大域~scope の`~event~loop$に属する[ %~task~source に結付けられた`~task~queue$ ]を成す ~EACH( %~task ) に対し ⇒ %~back-up に %~task を`付加する$set ◎ If there are any tasks, whose task source is either the handle fetch task source or the handle functional event task source, queued in serviceWorkerGlobalScope’s event loop’s task queues, queue them to serviceWorker’s containing service worker registration’s corresponding task queues in the same order using their original task sources, and\
-
%~sw大域~scope の`~event~loop$に属する ~EACH( `~task~queue$ %~queue ) に対し ⇒ %~queue を`空にする$ ◎ discard all the tasks (including tasks whose task source is neither the handle fetch task source nor the handle functional event task source) from serviceWorkerGlobalScope’s event loop’s task queues without processing them.
注記: これは実質的に, `fetch$et やその他の`機能的~event$( `push$et ~eventなど)に限り~back-upされ、 他の~task( `message$et ~eventなど)は処理することなく破棄されることを意味する。 ◎ Note: This effectively means that the fetch events and the other functional events such as push events are backed up by the registration’s task queues while the other tasks including message events are discarded.
- %~sw 内で現在`走っている~scriptを中止する$ ◎ Abort the script currently running in serviceWorker.
- %~sw の`開始~状態$sw ~SET ~NULL ◎ Set serviceWorker’s start status to null.
`~fetchを取扱う@
この~algoは、[ `~sw$文脈に手渡される,`~fetch$の取扱い ]用の入口である。 【`~HTTP~fetch$から利用される。】 ◎ The Handle Fetch algorithm is the entry point for the fetch handling handed to the service worker context.
- 入力 ⇒# %要請 — `要請$, %~fetch制御器 — `~fetch制御器$, %高分解能な処理能~timerを利用するか — 真偽値 ◎ Input • request, a request • fetchController, a fetch controller • useHighResPerformanceTimers, a boolean
- 出力 ⇒# %応答 — `応答$ 【または ~NULL 】 ◎ Output • a response
- %登録 ~LET ~NULL ◎ Let registration be null.
- %~client ~LET %要請 の`~client$rq ◎ Let client be request’s client.
- %予約-済み~client ~LET %要請 の`予約-済み~client$rq ◎ Let reservedClient be request’s reserved client.
- %~preload応答~promise ~LET `新たな~promise$ ◎ Let preloadResponse be a new promise.
- %~worker~realm ~LET ~NULL ◎ Let workerRealm be null.
- %計時~報 ~LET 新たな`~sw計時~報$ ◎ Let timingInfo be a new service worker timing info.
- ~Assert: %要請 の`行先$rq ~NEQ `serviceworker^l ◎ Assert: request’s destination is not "serviceworker".
- ~IF[ %要請 の`行先$rq ~IN { `embed^l, `object^l } ] ⇒ ~RET ~NULL ◎ If request’s destination is either "embed" or "object", then: • Return null.
-
~IF[ %要請 は`非~下位資源~要請$である ]: ◎ Else if request is a non-subresource request, then:
-
~IF[ ~OR↓ ]…
- [ %予約-済み~client は`環境~設定群~obj$である ]~AND[ %予約-済み~client は`~secureな文脈$enVでない ]
- [ %予約-済み~client は`環境~設定群~obj$でない ]~AND[ %要請 の`~URL$rq は`信用に価し得る~URL$でない ]
- [ %要請 は`~navi要請$である ]~AND[ それを誘発している`~navi$は、 shift+reload 等により起動された 【実際には何を意味する? `952$issue】 ]
…ならば ⇒ ~RET ~NULL
◎ If reservedClient is not null and is an environment settings object, then: • If reservedClient is not a secure context, return null. ◎ Else: • If request’s url is not a potentially trustworthy URL, return null. ◎ If request is a navigation request and the navigation triggering it was initiated with a shift+reload or equivalent, return null. - ~Assert: %予約-済み~client ~NEQ ~NULL ◎ Assert reservedClient is not null.
- %~storage~key ~LET `~storage~keyを得する$( %予約-済み~client ) ◎ Let storage key be the result of running obtain a storage key given reservedClient.
- %登録 ~SET `合致する~sw登録$( %~storage~key, %要請 の`~URL$rq ) ◎ Set registration to the result of running Match Service Worker Registration given storage key and request’s url.
- ~IF[ %登録 ~EQ ~NULL ]~OR[ %登録 にて`作動中な~worker$swr ~EQ ~NULL ] ⇒ ~RET ~NULL ◎ If registration is null or registration’s active worker is null, return null.
- ~IF[ %要請 の`行先$rq ~NEQ `report$l ] ⇒ %予約-済み~client にて`作動中な~sw$enV ~SET %登録 にて`作動中な~worker$swr ◎ If request’s destination is not "report", set reservedClient’s active service worker to registration’s active worker.
注記: この時点から、 `~sw~client$は,[ その`作動中な~sw$enVを`包含している~sw登録$sw ]の`利用@#dfn-use$を開始する。 ◎ Note: From this point, the service worker client starts to use its active service worker’s containing service worker registration.
-
-
~ELIF[ %要請 は`下位資源~要請$である ]:
- ~IF[ %~client にて`作動中な~sw$enV ~EQ ~NULL ] ⇒ ~RET ~NULL
- %登録 ~SET %~client にて`作動中な~sw$enV を`包含している~sw登録$sw
- %作動中な~worker ~LET %登録 にて`作動中な~worker$swr ◎ Let activeWorker be registration’s active worker.
- %~soft更新すべきか ~LET ~IS[ %要請 は`非~下位資源~要請$である ]~OR[[ %要請 は`下位資源~要請$である ]~AND[ %登録 は`非新鮮$である ]] ◎ Let shouldSoftUpdate be true if any of the following are true, and false otherwise: • request is a non-subresource request. • request is a subresource request and registration is stale.
-
~IF[ %作動中な~worker の`~router規則~list$は`空$である ]: ◎ If activeWorker’s list of router rules is not empty:
- %~source ~LET `~router~sourceを取得する$( %登録 にて`作動中な~worker$swr, %要請 ) ◎ Let source be the result of running the Get Router Source algorithm with registration’s active worker and request.
-
~IF[ %~source ~EQ `network$l ]: ◎ If source is "network":
-
~IF[ %~soft更新すべきか ~EQ ~T ] ⇒ 次の手続きを`並列的$に走らす ◎ If shouldSoftUpdate is true, then in parallel run\
手続きは ⇒ `~soft更新する$( %登録 ) ◎ the Soft Update algorithm with registration. - ~RET ~NULL ◎ Return null.
-
-
~ELIF[ %~source ~EQ `cache$l ]~OR[ %~source[ `RouterSourceDict^I1"`cacheName$m1" ] ~NEQ ε ]: ◎ Else if source is "cache", or source["cacheName"] exists, then:
-
~IF[ %~soft更新すべきか ~EQ ~T ] ⇒ 次の手続きを`並列的$に走らす ◎ If shouldSoftUpdate is true, then in parallel run\
手続きは ⇒ `~soft更新する$( %登録 ) ◎ the Soft Update algorithm with registration. -
%登録 の`~storage~key$swrの`名前から~cacheへの~map$を成す ~EACH( %~cache名 → %~cache ) に対し: ◎ For each cacheName → cache of the registration’s storage key's name to cache map.
- ~IF[ %~source[ `RouterSourceDict^I1"`cacheName$m1" ] ~NIN { ε, %~cache名 } ] ⇒ ~CONTINUE ◎ If source["cacheName"] exists and source["cacheName"] is not cacheName, continue.
- %要請~応答~list ~LET `~cacheを~queryする$( %要請, 新たな `CacheQueryOptions$I, %~cache ) ◎ Let requestResponses be the result of running Query Cache with request, a new CacheQueryOptions, and cache.
- ~IF[ %要請~応答~list は`空$である ] ⇒ ~RET ~NULL ◎ If requestResponses is an empty list, return null.
-
~ELSE: ◎ Else:
- %要請~応答 ~LET %要請~応答~list[ 0 ] ◎ Let requestResponse be the first element of requestResponses.
- %応答 ~LET %要請~応答 を成す応答 ◎ Let response be requestResponse’s response.
- %大域~obj ~LET %作動中な~worker の`大域~obj$sw ◎ Let globalObject be activeWorker’s global object.
- ~IF[ %大域~obj ~EQ ~NULL ] ⇒ %大域~obj ~SET `~ServiceWorkerGlobalScopeを設定しておく$( %作動中な~worker ) ◎ If globalObject is null: • Set globalObject to the result of running Setup ServiceWorkerGlobalScope with activeWorker.
- ~IF[ %大域~obj ~EQ ~NULL ] ⇒ ~RET ~NULL ◎ If globalObject is null, return null.
注記: ここで `ServiceWorkerGlobalScope$I を作成される `ServiceWorkerGlobalScope$I は、 ~CORS検査にしか要求されない — 実装は、 実際に それを作成することは期待されない。 ◎ Note: This only creates a ServiceWorkerGlobalScope because CORS checks require that. It is not expected that implementations will actually create a ServiceWorkerGlobalScope here.
-
~IF[ %応答 の`種別$rs ~EQ `opaque^l ]: ◎ If response’s type is "opaque",\
- %検査~結果 ~LET `非同一-生成元~資源~施策~検査$( ↓ ) ⇒# %大域~obj の`生成元$enV, %大域~obj, 空~文字列, %応答 の`内部~応答$ ◎ and cross-origin resource policy check with globalObject’s origin, globalObject, "", and response’s internal response returns\
- ~IF[ %検査~結果 ~EQ `阻止される^i ] ⇒ ~RET ~NULL ◎ blocked, then return null.
- ~RET %応答 ◎ Return response.
- ~RET ~NULL ◎ Return null.
-
-
~ELIF[ %~source ~EQ `race-network-and-fetch-handler$l ]~AND[ %要請 の`~method$rq ~EQ `GET^bl ]: ◎ Else if source is "race-network-and-fetch-handler", and request’s method is `GET` then:
-
~IF[ %~soft更新すべきか ~EQ ~T ] ⇒ 次の手続きを`並列的$に走らす ◎ If shouldSoftUpdate is true, then in parallel run\
手続きは ⇒ `~soft更新する$( %登録 ) ◎ the Soft Update algorithm with registration. - %~queue ~LET 新たな`~queue$ ◎ Let queue be an empty queue of response.
- %競走~fetch制御器 ~LET ~NULL ◎ Let raceFetchController be null.
- %競走~応答 ~LET 新たな`競走~応答$ — その ⇒# `値$rV ~SET `pending^l ◎ Let raceResponse be a race response whose value is "pending".
-
この段は`並列的$に走らすが、[ %~fetch制御器 の`状態$fC ~IN { `terminated^l, `aborted^l } ]になった`ときは中止する$ ⇒ %競走~fetch制御器 ~SET %要請 を`~fetchする$ — 次を与える下で: ◎ Run the following substeps in parallel, but abort when fetchController’s state is "terminated" or "aborted": • Set raceFetchController to the result of calling fetch given request, with\
-
`応答の処理n^i ~SET 所与の ( `応答$ %競走~network要請に対する応答 ) に対し,次を走らす手続き: ◎ processResponse set to the following steps given a response raceNetworkRequestResponse:
-
~IF[ %競走~network要請に対する応答 の`状態s$rsは`~ok状態s$である ]: ◎ If raceNetworkRequestResponse’s status is ok status, then:
- %競走~応答 の`値$rV ~SET %競走~network要請に対する応答 ◎ Set raceResponse’s value to raceNetworkRequestResponse.
- %~queue に %競走~network要請に対する応答 を`~enqueueする$ ◎ Enqueue raceNetworkRequestResponse to queue.
- ~ELSE ⇒ %競走~応答 の`値$rV ~SET `~network~error$ ◎ Otherwise, set raceResponse’s value to a network error.
-
`中止されたときは$: ◎ If aborted\
-
~IF[ %競走~fetch制御器 ~NEQ ~NULL ]: ◎ and raceFetchController is not null, then:
- `~fetchを中止する$( %競走~fetch制御器 ) ◎ Abort raceFetchController.
- %競走~応答 ~SET 新たな`競走~応答$ — その ⇒# `値$rV ~SET ~NULL ◎ Set raceResponse to a race response whose value is null.
-
- `~promiseを解決する$( %~preload応答~promise ) ◎ Resolve preloadResponse with undefined.
-
この段は`並列的$に走らす: ◎ Run the following substeps in parallel:
- %~fetch~handler応答 ~LET `~fetch~eventを作成して配送する$( ↓ ) ⇒# %要請, %登録, %高分解能な処理能~timerを利用するか, %計時~報, %~worker~realm, %予約-済み~client, %~preload応答~promise, %競走~応答 ◎ Let fetchHandlerResponse be the result of Create Fetch Event and Dispatch with request, registration, useHighResPerformanceTimers, timingInfo, workerRealm, reservedClient, preloadResponse, and raceResponse.
-
~IF[ ~AND↓ ]…
- %~fetch~handler応答 ~NEQ ~NULL
- %~fetch~handler応答 は`~network~error$でない
- %競走~fetch制御器 ~NEQ ~NULL
…ならば ⇒ `~fetchを中止する$( %競走~fetch制御器 )
◎ If fetchHandlerResponse is not null and not a network error, and raceFetchController is not null, abort raceFetchController. - %~queue に %~fetch~handler応答 を`~enqueueする$ ◎ Enqueue fetchHandlerResponse to queue.
- 次が満たされるまで待機する ⇒ %~queue は`空$でない ◎ Wait until queue is not empty.
- ~RET %~queue から`~dequeueする$ ◎ Return the result of dequeue queue.
-
- ~Assert: %~source ~EQ `fetch-event$l ◎ Assert: source is "fetch-event"
-
~IF[ ~AND↓ ]… ◎ If\
- %要請 は`~navi要請$である ◎ request is a navigation request,\
- %登録 の`~navi~preloadは可能化されるか$swr ~EQ ~T ◎ registration’s navigation preload enabled flag is set,\
- %要請 の`~method$rq ~EQ `GET^bl ◎ request’s method is `GET`,\
- `fetch$et ~IN %登録 にて`作動中な~worker$swrが`取扱う~event型の集合$sw ※ ◎ registration’s active worker's set of event types to handle contains fetch,\
- %登録 にて`作動中な~worker$swrの`すべての~fetch~listenerは空か$sw ~EQ ~F ◎ and registration’s active worker's all fetch listeners are empty flag is not set then:
注記: これらの条件が, ※ を除いて満たされる場合、 開発者の意図は明瞭でないので,~UAは~consoleに警告を示したいと望むかもしれない。 ◎ Note: If the above is true except registration’s active worker's set of event types to handle does not contain fetch, then the user agent may wish to show a console warning, as the developer’s intent isn’t clear.
…ならば:
- %~preload要請 ~LET `要請を~cloneする$( %要請 ) ◎ Let preloadRequest be the result of cloning the request request.
- %~preload要請~header群 ~LET %~preload要請 の`~header~list$rq ◎ Let preloadRequestHeaders be preloadRequest’s header list.
-
%~preload応答~obj ~LET `~Response~objを作成する$( 新たな`応答$†, `immutable^l, %~worker~realm )
【† 入力に渡す応答は、 形式上必要なものでしかなく,以下で置換されることになる。 】
◎ Let preloadResponseObject be a new Response object associated with a new Headers object whose guard is "immutable". - %~preload要請~header群 に`~headerを付加する$( ( `Service-Worker-Navigation-Preload^h, %登録 の`~navi~preload~header値$swr ) ) ◎ Append to preloadRequestHeaders a new header whose name is `Service-Worker-Navigation-Preload` and value is registration’s navigation preload header value.
- %~preload要請 の`~sw~mode$rq ~SET `none^l ◎ Set preloadRequest’s service-workers mode to "none".
- %~preload~fetch制御器 ~LET ~NULL ◎ Let preloadFetchController be null.
-
この段は`並列的$に走らすが、[ %~fetch制御器 の`状態$fC ~IN { `terminated^l, `aborted^l } ]になった`ときは中止する$ ⇒ %~preload~fetch制御器 ~SET %~preload要請 を`~fetchする$ — 次を与える下で: ◎ Run the following substeps in parallel, but abort when fetchController’s state is "terminated" or "aborted": • Set preloadFetchController to the result of fetching preloadRequest.
-
`応答の処理n^i ~SET 所与の ( `応答$ %~navi~preload応答 ) に対し,次を走らす手続き: ◎ To processResponse for navigationPreloadResponse, run these substeps:
- ~IF[ %~navi~preload応答 の`種別$rs ~EQ `error^l ] ⇒ `~promiseを却下する$( %~preload応答~promise, `TypeError^E ) ◎ If navigationPreloadResponse’s type is "error", reject preloadResponse with a TypeError\
-
~ELSE: ◎ and terminate these substeps.
- %~preload応答~obj の`応答$Rs ~SET %~navi~preload応答 ◎ Associate preloadResponseObject with navigationPreloadResponse.
- `~promiseを解決する$( %~preload応答~promise, %~preload応答~obj ) ◎ Resolve preloadResponse with preloadResponseObject.
`中止されたときは$: ◎ If aborted, then:
- %逆直列化された~error ~LET `直列化された中止-事由を逆直列化する$( ~NULL, %~worker~realm ) ◎ Let deserializedError be the result of deserialize a serialized abort reason given null and workerRealm.
- `~fetchを中止する$( %~preload~fetch制御器, %逆直列化された~error ) ◎ Abort preloadFetchController with deserializedError.
-
- ~ELSE ⇒ `~promiseを解決する$( %~preload応答~promise ) ◎ Else, resolve preloadResponse with undefined.
- `~fetch~eventを作成して配送する$( ↓ ) ⇒# %要請, %登録, %高分解能な処理能~timerを利用するか, %計時~報, %~worker~realm, %予約-済み~client, %~preload応答~promise, ~NULL ◎ Return the result of Create Fetch Event and Dispatch with request, registration, useHighResPerformanceTimers, timingInfo, workerRealm, reservedClient, preloadResponse, and null.
`~fetch~eventを作成して配送する@
- 入力 ⇒# %要請 — `要請$, %登録 — `~sw登録$, %高分解能な処理能~timerを利用するか — 真偽値, %計時~報 — `~sw計時~報$, %~worker~realm — ある`大域~obj$swに`関連な~realm$, %予約-済み~client — `予約-済み~client$rq, %~preload応答~promise — `~promise$, %競走~応答 — `競走~応答$/~NULL ◎ Input • request, a request • registration, a service worker registration • useHighResPerformanceTimers, a boolean • timingInfo, a service worker timing info • workerRealm, a relevant realm of the global object • reservedClient, a reserved client • preloadResponse, a promise • raceResponse, a race response or null
- 出力 ⇒ `応答$ ◎ Output • a response
- %応答 ~LET ~NULL ◎ Let response be null.
- %~eventは取消されたか ~LET ~F ◎ Let eventCanceled be false.
- %~client ~LET %要請 の`~client$rq ◎ Let client be request’s client.
- %作動中な~worker ~LET %登録 にて`作動中な~worker$swr ◎ Let activeWorker be registration’s active worker.
- %取扱った~event ~LET ~NULL ◎ Let eventHandled be null.
- %~fetchを取扱うのに失敗したか ~LET ~F ◎ Let handleFetchFailed be false.
- %~enteredで応答するか ~LET ~F ◎ Let respondWithEntered be false.
- %~soft更新すべきか ~LET ~IS[ %要請 は`非~下位資源~要請$である ]~OR[[ %要請 は`下位資源~要請$である ]~AND[ %登録 は`非新鮮$である ]] ◎ Let shouldSoftUpdate be true if any of the following are true, and false otherwise: • request is a non-subresource request. • request is a subresource request and registration is stale.
-
~IF[ `~eventを飛ばすべきか?$( `fetch^l, %作動中な~worker ) ~EQ ~T ]: ◎ If the result of running the Should Skip Event algorithm with "fetch" and activeWorker is true, then:
-
~IF[ %~soft更新すべきか ~EQ ~T ] ⇒ 次の手続きを`並列的$に走らす ◎ If shouldSoftUpdate is true, then in parallel run\
手続きは ⇒ `~soft更新する$( %登録 ) ◎ the Soft Update algorithm with registration. - ~RET ~NULL ◎ Return null.
-
-
~IF[ %作動中な~worker の`すべての~fetch~listenerは空か$sw ~EQ ~T ]: ◎ If activeWorker’s all fetch listeners are empty flag is set:
-
この段は`並列的$に走らす: ◎ In parallel:
- ~IF[ %作動中な~worker の`状態$sw ~EQ `activating^l ] ⇒ 次が満たされるまで待機する ⇒ %作動中な~worker の`状態$sw ~EQ `activated^l ◎ If activeWorker’s state is "activating", then wait for activeWorker’s state to become "activated".
- `~swを走らす$( %作動中な~worker ) ◎ Run the Run Service Worker algorithm with activeWorker.
- ~IF[ %~soft更新すべきか ~EQ ~T ] ⇒ `~soft更新する$( %登録 ) ◎ If shouldSoftUpdate is true, then run the Soft Update algorithm with registration.
- ~RET ~NULL ◎ Return null.
-
- ~IF[ %高分解能な処理能~timerを利用するか ~EQ ~T ] ⇒ %高分解能な処理能~timerを利用するか ~SET %作動中な~worker の`大域~obj$swの`非同一-生成元~能力は隔離されるか$wG ◎ If useHighResPerformanceTimers is true, then set useHighResPerformanceTimers to activeWorker’s global object's cross-origin isolated capability.
- %計時~報 の`開始~時刻$swT ~LET `粗化した共有される現在の時刻$( %高分解能な処理能~timerを利用するか ) ◎ Let timingInfo’s start time be the coarsened shared current time given useHighResPerformanceTimers.
- ~IF[ %作動中な~worker の`状態$sw ~EQ `activating^l ] ⇒ %作動中な~worker の`状態$sw ~EQ `activated^l になるまで待機する ◎ If activeWorker’s state is "activating", wait for activeWorker’s state to become "activated".
- ~IF[ `~swを走らす$( %作動中な~worker ) ~EQ `失敗^i ] ⇒ %~fetchを取扱うのに失敗したか ~SET ~T ◎ If the result of running the Run Service Worker algorithm with activeWorker is failure, then set handleFetchFailed to true.
-
~ELSE: ◎ Else:
- %~worker~realm ~SET %作動中な~worker の`大域~obj$swに`関連な~realm$ ◎ Set workerRealm to the relevant realm of the activeWorker’s global object.
- %取扱った~event ~SET %~worker~realm 内の`新たな~promise$ ◎ Set eventHandled to a new promise in workerRealm.
- ~IF[ %競走~応答 ~NEQ ~NULL ] ⇒ %作動中な~worker の`大域~obj$swの`競走~応答~map$SWG[ %要請 ] ~SET %競走~応答 ◎ If raceResponse is not null, set activeWorker’s global object's race response map[request] to raceResponse.
-
%~task ~LET `~taskを~queueする$( `~fetchを取扱う~task~source$, 次の手続き, %作動中な~worker の`~event~loop$ ) ◎ Queue a task task to run the following substeps:
手続きは:
- %~event ~LET `~eventを作成する$( `FetchEvent$I ) ◎ Let e be the result of creating an event with FetchEvent.
- %中止-制御器 ~LET `新たな~obj$( `AbortController$I, %~worker~realm ) ◎ Let abortController be a new AbortController object with workerRealm.
- %要請~obj ~LET `~Request~objを作成する$( %要請, `immutable^l, %中止-制御器 の`通達$aC, %~worker~realm ) ◎ Let requestObject be the result of creating a Request object, given request, a new Headers object’s guard which is "immutable", abortController’s signal, and workerRealm.
- %~event の各種~属性を次のように初期化する ⇒# `type$n 属性 ~SET `fetch$et, `cancelable$n 属性 ~SET ~T, `FetchEvent^I1`request$m1 属性 ~SET %要請~obj, `preloadResponse$m1 ~SET %~preload応答~promise, `clientId$m1 属性 ~SET %~client の`~ID$enV, `resultingClientId$m1 属性 ~SET 空~文字列, `replacesClientId$m1 属性 ~SET 空~文字列, `handled$m1 属性 ~SET %取扱った~event ◎ Initialize e’s type attribute to fetch. ◎ Initialize e’s cancelable attribute to true. ◎ Initialize e’s request attribute to requestObject. ◎ Initialize e’s preloadResponse to preloadResponse. ◎ Initialize e’s clientId attribute to client’s id. ◎ ↓
- ~IF[ %要請 は`非~下位資源~要請$である ]~AND[ %要請 の`行先$rq ~NEQ `report^l【!TODO `report$l】 ] ⇒ %~event の `resultingClientId$m1 属性 ~SET %予約-済み~client の`~ID$enV ◎ If request is a non-subresource request and request’s destination is not "report", initialize e’s resultingClientId attribute to reservedClient’s id,\ ↑ and to the empty string otherwise.
- ~IF[ %要請 は`~navi要請$である ] ⇒ %~event の `replacesClientId$m1 属性 ~SET %要請 の`置換する~client~ID$rq ◎ If request is a navigation request, initialize e’s replacesClientId attribute to request’s replaces client id,\ ↑ and to the empty string otherwise. ◎ ↑ Initialize e’s handled to eventHandled.
- %計時~報 の`~fetch~event配送-時刻$swT ~LET `粗化した共有される現在の時刻$( %高分解能な処理能~timerを利用するか ) ◎ Let timingInfo’s fetch event dispatch time to the coarsened shared current time given useHighResPerformanceTimers.
- `~eventを配送する$( %作動中な~worker の`大域~obj$sw, %~event ) ◎ Dispatch e at activeWorker’s global object.
- `~sw延長-済み~event集合を更新する$( %作動中な~worker, %~event ) ◎ Invoke Update Service Worker Extended Events Set with activeWorker and e.
- ~IF[ %~event の`~enteredで応答するか$FE ~EQ ~T ] ⇒ %~enteredで応答するか ~SET ~T ◎ If e’s respond-with entered flag is set, set respondWithEntered to true.
-
~IF[ %~event の`応答するまで待機-中か$FE ~EQ ~T ]: ◎ If e’s wait to respond flag is set, then:
- 次が満たされるまで待機する ⇒ %~event の`応答するまで待機-中か$FE ~EQ ~F ◎ Wait until e’s wait to respond flag is unset.
- ~IF[ %~event の`~errorで応答するか$FE ~EQ ~T ] ⇒ %~fetchを取扱うのに失敗したか ~SET ~T ◎ If e’s respond-with error flag is set, set handleFetchFailed to true.
- ~ELSE ⇒ %応答 ~SET %~event の`応答になり得る$FE ◎ Else, set response to e’s potential response.
-
~IF[ %応答 ~EQ ~NULL ]~AND[ %要請 の`本体$rq ~NEQ ~NULL ]~AND[ %要請 の`本体$rqの`~source$bd ~EQ ~NULL ]: ◎ If response is null, request’s body is not null, and request’s body's source is null, then:
- ~IF[ %要請 の`本体$rqは`利用-不能$Bdである ] ⇒ %~fetchを取扱うのに失敗したか ~SET ~T ◎ If request’s body is unusable, set handleFetchFailed to true.
- ~ELSE ⇒ %要請 の`本体$rqを`取消す$RS( `undefined^jv ) ◎ Else, cancel request’s body with undefined.
- ~IF[ %応答 ~NEQ ~NULL ] ⇒ %応答 の`~sw計時~報$rs ~SET %計時~報 ◎ If response is not null, then set response’s service worker timing info to timingInfo.
- ~IF[ %~event の`取消されたか$ev ~EQ ~T ] ⇒ %~eventは取消されたか ~SET ~T ◎ If e’s canceled flag is set, set eventCanceled to true.
-
~IF[ %~fetch制御器【 %中止-制御器 ?】 の`状態$fC ~IN { `terminated^l, `aborted^l } ]: ◎ If fetchController state is "terminated" or "aborted", then:
- %逆直列化された~error ~LET `直列化された中止-事由を逆直列化する$( %~fetch制御器【 %中止-制御器 ?】 の`直列化された中止-事由$, %~worker~realm ) ◎ Let deserializedError be the result of deserialize a serialized abort reason given fetchController’s serialized abort reason and workerRealm.
-
`~taskを~queueする$( `~fetchを取扱う~task~source$, 次の手続き, %作動中な~worker の`~event~loop$ )
手続きは ⇒ `中止-を通達する$aC( %中止-制御器, %逆直列化された~error )◎ Queue a task to signal abort on abortController with deserializedError.
%~task が破棄されたときは ⇒ %~fetchを取扱うのに失敗したか ~SET ~T ◎ If task is discarded, set handleFetchFailed to true. ◎ ↑↑ The task must use activeWorker’s event loop and the handle fetch task source.
- %~task が実行されるか次が満たされるまで待機する ⇒ %~fetchを取扱うのに失敗したか ~EQ ~T ◎ Wait for task to have executed or for handleFetchFailed to be true.
-
~IF[ %~soft更新すべきか ~EQ ~T ] ⇒ 次の手続きを`並列的$に走らす ◎ If shouldSoftUpdate is true, then in parallel run\
手続きは ⇒ `~soft更新する$( %登録 ) ◎ the Soft Update algorithm with registration. - %作動中な~worker の`大域~obj$swの`競走~応答~map$SWG[ %要請 ] ~SET ε ◎ If activeWorker’s global object's race response map[request] exists, remove activeWorker’s global object's race response map[request].
-
~IF[ %~enteredで応答するか ~EQ ~F ]: ◎ If respondWithEntered is false, then:
-
~IF[ %~eventは取消されたか ~EQ ~T ]: ◎ If eventCanceled is true, then:
- ~IF[ %取扱った~event ~NEQ ~NULL ] ⇒ `~promiseを却下する$( %取扱った~event, %~worker~realm 内の `NetworkError$E 例外 ) ◎ If eventHandled is not null, then reject eventHandled with a "NetworkError" DOMException in workerRealm.
- ~RET `~network~error$ ◎ Return a network error.
- ~IF[ %取扱った~event ~NEQ ~NULL ] ⇒ `~promiseを解決する$( %取扱った~event ) ◎ If eventHandled is not null, then resolve eventHandled.
-
~IF[ %競走~応答 の`値$rV ~NEQ ~NULL ]: ◎ If raceResponse’s value is not null, then:
- 次が満たされるまで待機する ⇒ %競走~応答 の`値$rV ~NEQ `pending^l ◎ Wait until raceResponse’s value is not "pending".
- ~IF[ %競走~応答 の`値$rVは`応答$である ] ⇒ ~RET %競走~応答 の`値$rV ◎ If raceResponse’s value is a response, return raceResponse’s value.
- ~RET ~NULL ◎ Return null.
-
-
~IF[ %~fetchを取扱うのに失敗したか ~EQ ~T ]: ◎ If handleFetchFailed is true, then:
- ~IF[ %取扱った~event ~NEQ ~NULL ] ⇒ `~promiseを却下する$( %取扱った~event, %~worker~realm 内の `NetworkError$E 例外 ) ◎ If eventHandled is not null, then reject eventHandled with a "NetworkError" DOMException in workerRealm.
- ~RET `~network~error$ ◎ Return a network error.
- ~IF[ %取扱った~event ~NEQ ~NULL ] ⇒ `~promiseを解決する$( %取扱った~event ) ◎ If eventHandled is not null, then resolve eventHandled.
- ~RET %応答 ◎ Return response.
`~URL~patternを構文解析する@
- 入力 ⇒# %ナマ~pattern — `URLPatternCompatible$I %~sw — `~sw$ ◎ Input • rawPattern, a URLPatternCompatible • serviceWorker, a service worker
- 出力 ⇒ `~URL~pattern$ ◎ Output • A URL pattern
- %基底~URL ~LET %~sw の`~script~URL$sw ◎ Let baseURL be serviceWorker’s script url.
- ~RET `~Web~IDL値から~URL~patternを築く$( %ナマ~pattern, %基底~URL ) ◎ Return the result of building a URL pattern from a Web IDL value rawPattern given baseURL.
`~router条件を検証yする@
- 入力 ⇒# %条件 — `RouterCondition$I %~sw `~sw$ ◎ Input • condition, a RouterCondition • serviceWorker, a service worker
- 出力 ⇒ 真偽値 ◎ Output • a boolean
- %条件は在るか ~LET ~F ◎ Let hasCondition be false.
- %ナマ~pattern ~LET %条件[ "`urlPattern$m1" ] ◎ ↓
-
~IF[ %ナマ~pattern ~NEQ ε ]: ◎ If condition["urlPattern"] exists, then: • Let rawPattern be condition["urlPattern"].
-
%~pattern ~LET `~URL~patternを構文解析する$( %ナマ~pattern, %~sw )
例外が投出されたときは、 ~catchして ⇒ ~RET ~F
◎ Let pattern be the result of running the Parse URL Pattern algorithm passing rawPattern and serviceWorker. If this throws an exception, catch it and return false. -
~IF[ %~pattern は`正規表現-~groupを有して$いる ] ⇒ ~RET ~F ◎ If pattern has regexp groups, then return false.
注記: 利用者~定義な正規表現は、 禁制される — それを走らすことには、 ~securityの懸念があるので。 ◎ Note: Since running a user-defined regular expression has a security concern, it is prohibited.
- %条件は在るか ~SET ~T ◎ Set hasCondition to true.
-
-
~IF[ ~OR↓ ]…
- %条件[ "`requestMethod$m1" ] ~NEQ ε
- %条件[ "`requestMode$m1" ] ~NEQ ε
- %条件[ "`requestDestination$m1" ] ~NEQ ε
- %条件[ "`runningStatus$m1" ] ~NEQ ε
…ならば ⇒ %条件は在るか ~SET ~T
◎ If condition["requestMethod"] exists, set hasCondition to true. ◎ If condition["requestMode"] exists, set hasCondition to true. ◎ If condition["requestDestination"] exists, set hasCondition to true. ◎ If condition["runningStatus"] exists, set hasCondition to true. - %~or条件~群 ~LET %条件[ "`or$m1" ] ◎ ↓
-
~IF[ %~or条件~群 ~NEQ ε ]: ◎ If condition["_or"] exists, then:
-
~IF[ %条件は在るか ~EQ ~T ] ⇒ ~RET ~F ◎ If hasCondition is true, return false.
注記: ~router規則を理解し易くするため、 %~or条件~群 と他の条件は,互いに排他的である。 【言い換えれば、両者が在る場合,当の規則は無視される。】 ◎ Note: For ease of understanding the router rule, the "or" condition is mutually exclusive with other conditions.
- %~or条件~群 を成す ~EACH( %~or条件 ) に対し ⇒ ~IF[ `~router条件を検証yする$( %~or条件, %~sw ) ~EQ ~F ] ⇒ ~RET ~F ◎ Let orConditions be condition["_or"]. ◎ For each orCondition of orConditions: • If running the Verify Router Condition algorithm with orCondition and serviceWorker returns false, return false.
- %条件は在るか ~SET ~T ◎ Set hasCondition to true.
-
- %~not条件 ~LET %条件[ "`not$m1" ] ◎ ↓
-
~IF[ %~not条件 ~NEQ ε ]: ◎ If condition["not"] exists, then:
-
~IF[ %条件は在るか ~EQ ~T ] ⇒ ~RET ~F ◎ If hasCondition is true, return false.
注記: ~router規則を理解し易くするため、 %~not条件 と他の条件は,互いに排他的である。 【言い換えれば、両者が在る場合,当の規則は無視される。】 ◎ Note: For ease of understanding the router rule, the "not" condition is mutually exclusive with other conditions.
- ~IF[ `~router条件を検証yする$( %~not条件, %~sw ) ~EQ ~F ] ⇒ ~RET ~F ◎ If running the Verify Router Condition algorithm with condition["not"] and serviceWorker returns false, return false.
- %条件は在るか ~SET ~T ◎ Set hasCondition to true.
-
- ~RET %条件は在るか ◎ Return hasCondition.
`~router条件を照合する@
- 入力 ⇒# %条件 — `RouterCondition$I, %~sw — `~sw$, %要請 — `要請$ ◎ Input • condition, a RouterCondition • serviceWorker, a service worker • request, a request
- 出力 ⇒ 真偽値 ◎ Output • a boolean
注記: 複数の条件が在る場合 (例: `urlPattern$m1, `runningStatus$m1, `requestMethod$m1 が設定された)、 照合されるすべての条件が ~T を返す必要がある。 ◎ Note: if there are multiple conditions (e.g. urlPattern, runningStatus, and requestMethod are set), all conditions need to match for true to be returned.
- %~or条件~群 ~LET %条件[ "`or$m1" ] ◎ ↓
-
~IF[ %~or条件~群 ~NEQ ε ]: ◎ If condition["or"] exists, then: • Let orConditions be condition["or"].
- %~or条件~群 を成す ~EACH( %~or条件 ) に対し ⇒ ~IF[ `~router条件を照合する$( %~or条件, %~sw, %要請 ) ~EQ ~T ] ⇒ ~RET ~T ◎ For each orCondition of orConditions: • If running the Match Router Condition algorithm with orCondition, serviceWorker and request returns true, then return true.
- ~RET ~F ◎ Return false.
- %~not条件 ~LET %条件[ "`not$m1" ] ◎ ↓
-
~IF[ %~not条件 ~NEQ ε ] ⇒ ~RET ~IS[ `~router条件を照合する$( %~not条件, %~sw, %要請 ) ~EQ ~F ] ◎ If condition["not"] exists, then: • If running the Match Router Condition algorithm with condition["not"], serviceWorker and request returns true, then return false. • Return true.
-
~ELSE: ◎ Else:
注記: `~router条件を検証yする$ ~algoにより,[ `or$m1【, `not$m1】, 他の条件 ]は、 【この~algoを呼出すに先立って】 互いに排他的になることが保証される。 ◎ Note: The Verify Router Condition algorithm guarantees that or and other conditions are mutual exclusive.
- %ナマ~pattern ~LET %条件[ "`urlPattern$m1" ] ◎ ↓
-
~IF[ %ナマ~pattern ~NEQ ε ]: ◎ If condition["urlPattern"] exists, then: • Let rawPattern be condition["urlPattern"].
- %~pattern ~LET `~URL~patternを構文解析する$( %ナマ~pattern, %~sw ) ◎ Let pattern be the result of running the Parse URL Pattern algorithm passing rawPattern and serviceWorker.
- ~IF[ `~patternを照合する$( %~pattern, %要請 の`~URL$rq ) ~EQ ~NULL ] ⇒ ~RET ~F ◎ If running match with pattern and request’s URL returns null, return false.
- %~method ~LET %条件[ "`requestMethod$m1" ] ◎ ↓
- ~IF[ %~method ~NEQ ε ]~AND[ %要請 の`~method$rq ~NEQ %~method ] ⇒ ~RET ~F ◎ If condition["requestMethod"] exists, then: • Let method be condition["requestMethod"]. • If request’s method is not method, return false.
- %~mode ~LET %条件[ "`requestMode$m1" ] ◎ ↓
- ~IF[ %~mode ~NEQ ε ]~AND[ %要請 の`~mode$rq ~NEQ %~mode ] ⇒ ~RET ~F ◎ If condition["requestMode"] exists, then: • Let mode be condition["requestMode"]. • If request’s mode is not mode, return false.
- %行先 ~LET %条件[ "`requestDestination$m1" ] ◎ ↓
- ~IF[ %行先 ~NEQ ε ]~AND[ %要請 の`行先$rq ~NEQ %行先 ] ⇒ ~RET ~F ◎ If condition["requestDestination"] exists, then: • Let destination be condition["requestDestination"]. • If request’s destination is not destination, return false.
- %走っているか否か ~LET %条件[ "`runningStatus$m1" ] ◎ ↓
-
~IF[ %走っているか否か ~NEQ ε ]:
- ~IF[ %走っているか否か ~EQ `running$l ]~AND[ ~NOT %~sw は`走っている$ ] ⇒ ~RET ~F
- ~IF[ %走っているか否か ~EQ `not-running$l ]~AND[ %~sw は`走っている$ ] ⇒ ~RET ~F
- ~RET ~T ◎ Return true.
`~router~sourceを取得する@
- 入力 ⇒# %~sw — `~sw$, %要請 — `要請$ ◎ Input • serviceWorker, a service worker • request, a request
- 出力 ⇒ `RouterSource$I / ~NULL ◎ Output • RouterSource or null
- %~sw の`~router規則~list$を成す ~EACH( %規則 ) に対し ⇒ ~IF[ `~router条件を照合する$( %規則[ "`condition$m1" ], %~sw, %要請 ) ~EQ ~T ] ⇒ ~RET %規則[ "`source$m1" ] ◎ For each rule of serviceWorker’s list of router rules: • If running the Match Router Condition algorithm with rule["condition"], serviceWorker and request returns true, then return rule["source"].
- ~RET ~NULL ◎ Return null.
`~eventを飛ばすべきか?@
- 入力 ⇒# %~event名 — 文字列, %~sw — `~sw$ ◎ Input • eventName, a string • serviceWorker, a service worker
- 出力 ⇒# 真偽値 ◎ Output • a boolean
注記: 不必要な遅延を避けるため、 この仕様は,次を許可する ⇒ 次が決定可能ならば,[ %~event名 用の~event配送- ]を飛ばす ⇒ ~script実行の最初期の間に, %~sw の大域~objに追加された[ %~event名 用の~event~listener ]は無い ◎ Note: To avoid unnecessary delays, this specification permits skipping event dispatch when no event listeners for the event have been deterministically added in the service worker’s global during the very first script execution.
- ~IF[ %~event名 ~IN %~sw が`取扱う~event型の集合$sw ] ⇒ ~RET ~F ◎ ↓
- ~UAは次をしても`ヨイ^em ⇒ ~RET ~T ◎ If serviceWorker’s set of event types to handle does not contain eventName, then the user agent may return true.
- ~RET ~F ◎ Return false.
`機能的~eventを発火する@
- 入力 ⇒# %登録 — `~sw登録$, %~event名 — 文字列, %~event構築子 — `ExtendableEvent$I を拡張する~event構築子, %初期化 — %~event構築子 で構築される~event用の~propを初期化する~~指示書き(省略時は ε ), %配送-後~手続き — 構築された~eventを引数に`作動中な~worker$swrの~event~loopを走らす手続き ◎ Input • eventName, a string • eventConstructor, an event constructor that extends ExtendableEvent • registration, a service worker registration • initialization, optional property initialization for event, constructed from eventConstructor • postDispatchSteps, optional steps to run on the active worker's event loop, with dispatchedEvent set to the instance of eventConstructor that was dispatched.
- 出力 ⇒# ~none ◎ Output • None
- ~Assert: %登録 にて`作動中な~worker$swr ~NEQ ~NULL ◎ Assert: registration’s active worker is not null.
- %作動中な~worker ~LET %登録 にて`作動中な~worker$swr ◎ Let activeWorker be registration’s active worker.
-
`(A)^i:
- ~IF[ `~eventを飛ばすべきか?$( %~event名, %作動中な~worker ) ~EQ ~T ] ⇒ ~BREAK `(A)^i ◎ If the result of running Should Skip Event with eventName and activeWorker is true, then: • If registration is stale, then in parallel run the Soft Update algorithm with registration. • Return.
- ~IF[ %作動中な~worker の`状態$sw ~EQ `activating^l ] ⇒ 次が満たされるまで待機する ⇒ %作動中な~worker の`状態$sw ~EQ `activated^l ◎ If activeWorker’s state is "activating", wait for activeWorker’s state to become "activated".
-
~IF[ `~swを走らす$( %作動中な~worker ) ~EQ `失敗^i ] ⇒ ~BREAK `(A)^i ◎ If the result of running the Run Service Worker algorithm with activeWorker is failure, then: • If registration is stale, then in parallel run the Soft Update algorithm with registration. • Return.
-
%~task ~LET `~taskを~queueする$( `機能的~eventを取扱う~task~source$, 次の手続き, %作動中な~worker の`~event~loop$ ) ◎ Queue a task task to run these substeps:
手続きは:
- %~event ~LET `~eventを作成する$( %~event構築子, %作動中な~worker の`大域~obj$swに`関連な~realm$ ) ◎ Let event be the result of creating an event with eventConstructor and the relevant realm of activeWorker’s global object.
- ~IF[ %初期化 ~NEQ ε ] ⇒ %初期化 に従って %~event を初期化する ◎ If initialization is not null, then initialize event with initialization.
- `~eventを配送する$( %作動中な~worker の`大域~obj$sw, %~event ) ◎ Dispatch event on activeWorker’s global object.
- `~sw延長-済み~event集合を更新する$( %作動中な~worker, %~event ) ◎ Invoke Update Service Worker Extended Events Set with activeWorker and event.
- ~IF[ %配送-後~手続き ~NEQ ε ] ⇒ %~event を渡して, %配送-後~手続き を走らす ◎ If postDispatchSteps is not null, then run postDispatchSteps passing event as dispatchedEvent.
- %~task が実行されるか破棄されるまで待機する ◎ ↑The task must use activeWorker’s event loop and the handle functional event task source. ◎ Wait for task to have executed or been discarded.
-
~IF[ %登録 は`非新鮮$である ] ⇒ 次の手続きを`並列的$に走らす
手続きは ⇒ `~soft更新する$( %登録 )◎ If registration is stale, then in parallel run the Soft Update algorithm with registration.
特定0の %~sw登録 に向けて,( `AmazingThingEvent^I 型の) `amazingthing^et ~eventを — その各種~propを初期化した上で — 発火するときの注釈文は、 次のようになる: ◎ To fire an "amazingthing" event (which is of type AmazingThingEvent) on a particular serviceWorkerRegistration, and initialize the event object’s properties, the prose would be:
- `機能的~eventを発火する$( %~sw登録, `amazingthing^et, `AmazingThingEvent^I ) — 次のように初期化して ⇒# `ある~prop名^i ~SET 何らかの値, `別の~prop名^i ~SET 別の値 ◎ Fire Functional Event "amazingthing" using AmazingThingEvent on serviceWorkerRegistration with the following properties: ◎ propertyName • value ◎ anotherPropertyName • anotherValue
- %配送した~event ~LET 前~段にて配送した~event ◎ Then run the following steps with dispatchedEvent:
- %配送した~event を用いて,当の~swの~event~loop上で行う必要がある何かをする ◎ Do whatever you need to with dispatchedEvent on the service worker’s event loop.
初期化~手続き, 配送-後の手続きは任意選択~であることに注意。 必要なければ、 注釈文は次のようになる: ◎ Note that the initialization steps and post-dispatch steps are optional. If they aren’t needed, the prose would be:
- `機能的~eventを発火する$( %~sw登録, `whatever^et, `ExtendableEvent$I ) ◎ Fire Functional Event "whatever" using ExtendableEvent on serviceWorkerRegistration.
`~sw~clientを~unloadする@
~UAは、[ `文書~unload時の片付け手続き$/~swの`終了n$ ]を介して`~sw~client$を~unloadするときは、 この手続きを走らすモノトスル。 ◎ The user agent must run these steps as part of when a service worker client unloads via unloading document cleanup steps or termination.
- 入力 ⇒# %~client — `~sw~client$ ◎ Input • client, a service worker client
- 出力 ⇒# ~none ◎ Output • None
この手続きは不可分に走らすとする: ◎ Run the following steps atomically.
- %登録 ~LET %~client が`利用して$いる`~sw登録$ ◎ Let registration be the service worker registration used by client.
- ~IF[ %登録 ~EQ ~NULL ] ⇒ ~RET ◎ If registration is null, abort these steps.
- ~IF[ %~client 以外に, %登録 を`利用して$いる`~sw~client$はある ] ⇒ ~RET ◎ If any other service worker client is using registration, abort these steps.
- ~IF[ %登録 は`未登録にされて$いる ] ⇒ `登録を~clearしようと試行する$( %登録 ) ◎ If registration is unregistered, invoke Try Clear Registration with registration.
- `作動化しようと試行する$( %登録 ) ◎ Invoke Try Activate with registration.
`~UA~shutdownを取扱う@
- 入力 ⇒# ~none ◎ Input • None
- 出力 ⇒# ~none ◎ Output • None
- %登録~list ~LET `登録~map$の`値~群$map ◎ ↓
-
%登録~list を成す ~EACH( %登録 ) に対し: ◎ For each registration of registration map's values:
-
~IF[ %登録 にて`~install中の~worker$swr ~NEQ ~NULL ]: ◎ If registration’s installing worker is not null, then:
- ~IF[ %登録 にて`待機-中な~worker$swr ~EQ ~NULL ]~AND[ %登録 にて`作動中な~worker$swr ~EQ ~NULL ] ⇒ `登録を~clearする$( %登録 ) ◎ If registration’s waiting worker is null and registration’s active worker is null, invoke Clear Registration with registration and continue to the next iteration of the loop.
- ~ELSE ⇒ %登録 にて`~install中の~worker$swr ~SET ~NULL ◎ Else, set registration’s installing worker to null.
-
~IF[ %登録 にて`待機-中な~worker$swr ~NEQ ~NULL ] ⇒ 次の手続きを`並列的$に走らす
手続きは ⇒ `作動化する$( %登録 )◎ If registration’s waiting worker is not null, then in parallel: • Invoke Activate with registration.
-
`~sw延長-済み~event集合を更新する@
- 入力 ⇒# %~worker — `~sw$, %~event — `~event$ ◎ Input • worker, a service worker • event, an event
- 出力 ⇒# ~none ◎ Output • None
- ~Assert: %~event の`配送-中か$ev ~EQ ~F ◎ Assert: event’s dispatch flag is unset.
-
%~worker の`延長-済み~event集合$swを成す ~EACH( %~item ) に対し ⇒ ~IF[ %~item は`作動中$eXでない ] ⇒ %~worker の`延長-済み~event集合$swから %~item を`除去する$ ◎ For each item of worker’s set of extended events: • If item is not active, remove item from worker’s set of extended events.
- ~IF[ %~event は`作動中$eXである ] ⇒ %~worker の`延長-済み~event集合$swに %~event を`付加する$set ◎ If event is active, append event to worker’s set of extended events.
`未登録にする@
- 入力 ⇒# %~job — `~job$ ◎ Input • job, a job
- 出力 ⇒# ~none ◎ Output • None
-
~IF[ %~job の`~scope~URL$jobの`生成元$url ~NEQ`生成元$sub %~job の`~client$jobの`生成元$cl【!`生成元$enV】 ]: ◎ If the origin of job’s scope url is not job’s client's origin, then:
- `~job~promiseを却下する$( %~job, `SecurityError$E 例外 ) ◎ Invoke Reject Job Promise with job and "SecurityError" DOMException.
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job and\
- ~RET ◎ abort these steps.
- %登録 ~LET `登録を取得する$( %~job の`~storage~key$job, %~job の`~scope~URL$job ) ◎ Let registration be the result of running Get Registration given job’s storage key and job’s scope url.
-
~IF[ %登録 ~EQ ~NULL ]: ◎ If registration is null, then:
- `~job~promiseを解決する$( %~job, ~F ) ◎ Invoke Resolve Job Promise with job and false.
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job and\
- ~RET ◎ abort these steps.
- `登録~map$[ ( %登録 の`~storage~key$swr, %~job の`~scope~URL$job ) ] ~SET ε ◎ Remove registration map[(registration’s storage key, job’s scope url)].
- `~job~promiseを解決する$( %~job, ~T ) ◎ Invoke Resolve Job Promise with job and true.
-
`登録を~clearしようと試行する$( %登録 ) ◎ Invoke Try Clear Registration with registration.
注記: この`登録を~clearしようと試行する$() が,`登録を~clearする$() を誘発しなかった場合、 次に該当するときに再度,誘発するよう試行することになる ⇒# %登録 を`利用して$いる最後の~clientが`~unload$されたとき / %登録 の~sw用の`存続期間を延長する~promise群$が決着したとき ◎ Note: If Try Clear Registration does not trigger Clear Registration here, Clear Registration is tried again when the last client using the registration is unloaded or the extend lifetime promises for the registration’s service workers settle.
- `~jobを完遂する$( %~job ) ◎ Invoke Finish Job with job.
`登録を設定する@
- 入力 ⇒# %~storage~key — `~storage~key$, %~scope — `~URL$, %~cacheを介する更新 — `~cacheを介する更新~mode$swr ◎ Input • storage key, a storage key • scope, a URL • updateViaCache, an update via cache mode
- 出力 ⇒# %登録 — `~sw登録$ ◎ Output • registration, a service worker registration
この手続きは不可分に走らすとする: ◎ Run the following steps atomically.
- %~scope文字列 ~LET `~URLを直列化する$( %~scope, `素片は除外する^i ) ◎ Let scopeString be serialized scope with the exclude fragment flag set.
- %登録 ~LET 新たな`~sw登録$ — その ⇒# `~storage~key$swr ~SET %~storage~key, `~scope~URL$swr ~SET %~scope, `~cacheを介する更新~mode$swr ~SET %~cacheを介する更新 ◎ Let registration be a new service worker registration whose storage key is set to storage key, scope url is set to scope, and update via cache mode is set to updateViaCache.
- `登録~map$[ ( %~storage~key, %~scope文字列 ) ] ~SET %登録 ◎ Set registration map[(storage key, scopeString)] to registration.
- ~RET %登録 ◎ Return registration.
`登録を~clearする@
- 入力 ⇒# %登録 — `~sw登録$ ◎ Input • registration, a service worker registration
- 出力 ⇒# ~none ◎ Output • None
この手続きは不可分に走らすとする: ◎ Run the following steps atomically.
-
次の表tを成す ~EACH( 行 ) に対し,順に:
%登録 にて`~install中の~worker$swr `installing^l %登録 にて`待機-中な~worker$swr `waiting^l %登録 にて`作動中な~worker$swr `active^l - ( %~worker, %~target ) ~LET 行の ( 1 列目, 2 列目 ) に挙げる値
- ~IF[ %~worker ~EQ ~NULL ] ⇒ ~CONTINUE
- `~swを終了する$( %~worker )
- `~workerの状態を更新する$( %~worker, `redundant^l )
- `登録の状態を更新する$( %登録, %~target, ~NULL )
`登録を~clearしようと試行する@
- 入力 ⇒# %登録 — `~sw登録$ ◎ Input • registration, a service worker registration
- 出力 ⇒# ~none ◎ Output • None
-
~IF[ ~AND↓ ]…
- %登録 を`利用して$いる`~sw~client$はない
- `~swには処理待ち~eventは無いか?$( %登録 にて`~install中の~worker$swr ) ~EQ ~T
- `~swには処理待ち~eventは無いか?$( %登録 にて`待機-中な~worker$swr ) ~EQ ~T
- `~swには処理待ち~eventは無いか?$( %登録 にて`作動中な~worker$swr ) ~EQ ~T
…ならば ⇒ `登録を~clearする$( %登録 )
◎ Invoke Clear Registration with registration if no service worker client is using registration and all of the following conditions are true: • registration’s installing worker is null or the result of running Service Worker Has No Pending Events with registration’s installing worker is true. • registration’s waiting worker is null or the result of running Service Worker Has No Pending Events with registration’s waiting worker is true. • registration’s active worker is null or the result of running Service Worker Has No Pending Events with registration’s active worker is true.
`登録の状態を更新する@
`ServiceWorkerRegistration^I0- 入力 ⇒# %登録 — `~sw登録$, %~target ~IN { `installing^l , `waiting^l , `active^l } %~source — `~sw$ / ~NULL ◎ Input • registration, a service worker registration • target, a string (one of "installing", "waiting", and "active") • source, a service worker or null
- 出力 ⇒# ~none ◎ Output • None
- %登録~obj群 ~LET %登録 を表現している すべての `ServiceWorkerRegistration$I ~objからなる集合 【順序は指定されていない】 ◎ Let registrationObjects be an array containing all the ServiceWorkerRegistration objects associated with registration.
-
%~target に応じて:
- `installing^l ◎ If target is "installing", then:
-
- %登録 にて`~install中の~worker$swr ~SET %~source ◎ Set registration’s installing worker to source.
-
%登録~obj群 を成す ~EACH( %登録~obj ) に対し ⇒ `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %登録~obj に`関連な設定群~obj$の`担当の~event~loop$enV )
手続きは ⇒ %登録~obj の `installing$m 属性 ~SET %登録 の`~install中の~worker$swrに応じて ⇒# ~NULL ならば ~NULL / ~ELSE_ `~sw~objを取得する$( %登録 の`~install中の~worker$swr, %登録~obj に`関連な設定群~obj$ )◎ For each registrationObject in registrationObjects: • Queue a task to set the installing attribute of registrationObject to null if registration’s installing worker is null, or the result of getting the service worker object that represents registration’s installing worker in registrationObject’s relevant settings object.
- `waiting^l ◎ Else if target is "waiting", then:
-
- %登録 にて`待機-中な~worker$swr ~SET %~source ◎ Set registration’s waiting worker to source.
-
%登録~obj群 を成す ~EACH( %登録~obj ) に対し ⇒ `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %登録~obj に`関連な設定群~obj$の`担当の~event~loop$enV )
手続きは ⇒ %登録~obj の `waiting$m 属性 ~SET %登録 の`待機-中な~worker$swrに応じて ⇒# ~NULL ならば ~NULL / ~ELSE_ `~sw~objを取得する$( %登録 の`待機-中な~worker$swr, %登録~obj に`関連な設定群~obj$ )◎ For each registrationObject in registrationObjects: • Queue a task to set the waiting attribute of registrationObject to null if registration’s waiting worker is null, or the result of getting the service worker object that represents registration’s waiting worker in registrationObject’s relevant settings object.
- `active^l ◎ Else if target is "active", then:
-
- %登録 にて`作動中な~worker$swr ~SET %~source ◎ Set registration’s active worker to source.
-
%登録~obj群 を成す ~EACH( %登録~obj ) に対し ⇒ `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %登録~obj に`関連な設定群~obj$の`担当の~event~loop$enV )
手続きは ⇒ %登録~obj の `active$m 属性 ~SET [ %登録 の`作動中な~worker$swr ~EQ ~NULL ならば ~NULL / ~ELSE_ `~sw~objを取得する$( %登録 の`作動中な~worker$swr, %登録~obj に`関連な設定群~obj$ ) ]◎ For each registrationObject in registrationObjects: • Queue a task to set the active attribute of registrationObject to null if registration’s active worker is null, or the result of getting the service worker object that represents registration’s active worker in registrationObject’s relevant settings object.
◎ ↑ The task must use registrationObject’s relevant settings object's responsible event loop and the DOM manipulation task source.
`~workerの状態を更新する@
- 入力 ⇒# %~worker — `~sw$, %状態 — `~sw$の`状態$sw ◎ Input • worker, a service worker • state, a service worker state
- 出力 ⇒# ~none ◎ Output • None
-
~Assert: %状態 ~NEQ `parsed^l ◎ Assert: state is not "parsed".
注記: `parsed^l は初期~状態である。 この状態にある`~sw$が更新されることは、 決してない。 ◎ Note: "parsed" is the initial state. A service worker is never updated to this state.
- %~worker の`状態$sw ~SET %状態 ◎ Set worker’s state to state.
- %設定群~obj群 ~LET 次を満たす`環境~設定群~obj$すべてからなる集合 ⇒ `生成元$enV ~EQ`生成元$sub %~worker の`~script~URL$swの`生成元$url ◎ Let settingsObjects be all environment settings objects whose origin is worker’s script url's origin.
-
%設定群~obj群 を成す ~EACH( %設定群~obj ) に対し ⇒ `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %設定群~obj の`担当の~event~loop$enV ) ◎ For each settingsObject of settingsObjects, queue a task on settingsObject’s responsible event loop in the DOM manipulation task source\
手続きは、 次を走らす: ◎ to run the following steps:
- %~obj~map ~LET %設定群~obj の`~sw~obj~map$enV ◎ Let objectMap be settingsObject’s service worker object map.
- %~worker~obj ~LET %~obj~map[ %~worker ] ◎ ↓
- ~IF[ %~worker~obj ~EQ ε ] ⇒ ~RET ◎ If objectMap[worker] does not exist, then abort these steps. ◎ Let workerObj be objectMap[worker].
- %~worker~obj の `ServiceWorker^I1`state$m1 ~SET %状態 ◎ Set workerObj’s state to state.
- `~eventを発火する$( %~worker~obj, `statechange$et ) ◎ Fire an event named statechange at workerObj.
`制御器の変化を通知する@
- 入力 ⇒# %~client — `~sw~client$ ◎ Input • client, a service worker client
- 出力 ⇒# ~none ◎ Output • None
- ~Assert: %~client ~NEQ ~NULL ◎ Assert: client is not null.
-
~IF[ %~client は`環境~設定群~obj$である ] ⇒ `~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~client の`担当の~event~loop$enV )
手続きは:
- %O ~LET 次を満たす `ServiceWorkerContainer$I ~obj ⇒ その`~sw~client$SWC ~EQ %~client
- `~eventを発火する$( %O, `controllerchange$etC )
`合致する~sw登録@
- 入力 ⇒# %~storage~key — `~storage~key$, %~client~URL — `~URL$ ◎ Input • storage key, a storage key • clientURL, a URL
- 出力 ⇒# `~sw登録$【または ~NULL】 ◎ Output • A service worker registration
この手続きは不可分に走らすとする: ◎ Run the following steps atomically.
- %~client~URL文字列 ~LET `~URLを直列化する$( %~client~URL ) ◎ Let clientURLString be serialized clientURL. ◎ ↓Let matchingScopeString be the empty string.
- %~scope文字列~集合 ~LET 新たな`~list$ ◎ Let scopeStringSet be an empty list.
- `登録~map$の`~key群$mapを成す ~EACH( %~key ) に対し ⇒ ~IF[[ %~storage~key, %~key[ 0 ] ]は`同等な~storage~key$である ] ⇒ %~scope文字列~集合 に %~key[ 1 ] を`付加する$ ◎ For each (entry storage key, entry scope) of registration map's keys: • If storage key equals entry storage key, then append entry scope to the end of scopeStringSet.
-
%合致している~scope文字列 ~LET %~scope文字列~集合 内に次を満たすものが[ 在るならば,それらのうち最長の文字列 / 無いならば,空~文字列 ] ⇒ %~client~URL文字列 の`符号単位~接頭辞$である【!starts with】 ◎ Set matchingScopeString to the longest value in scopeStringSet which the value of clientURLString starts with, if it exists.
注記: この段で合致している~URL文字列は、 接頭辞に基づき,~path構造は~~加味されない。 例えば~client~URL文字列 `https://example.com/prefix-of/resource.html^l は、 `https://example.com/prefix^l を伴う~scope用の登録に合致することになる。 このような~URL文字列の比較は、 同一-生成元~security用には安全である — [ ~HTTP/~HTTPS ]`~URLを直列化する$ときには、 生成元~~成分は,常に末尾に~slashを伴うように直列化されるので。 ◎ Note: The URL string matching in this step is prefix-based rather than path-structural. E.g. a client URL string with "https://example.com/prefix-of/resource.html" will match a registration for a scope with "https://example.com/prefix". The URL string comparison is safe for the same-origin security as HTTP(S) URLs are always serialized with a trailing slash at the end of the origin part of the URLs.
- %合致している~scope ~LET ~NULL ◎ Let matchingScope be null.
-
~IF[ %合致している~scope文字列 ~NEQ 空~文字列 ]: ◎ If matchingScopeString is not the empty string, then:
- %合致している~scope ~SET `~URL構文解析する$( %合致している~scope文字列 ) ◎ Set matchingScope to the result of parsing matchingScopeString.
- ~Assert: %合致している~scope の`生成元$url ~EQ`生成元$sub %~client~URL の`生成元$url ◎ Assert: matchingScope’s origin and clientURL’s origin are same origin.
- ~RET `登録を取得する$( %~storage~key, %合致している~scope ) ◎ Return the result of running Get Registration given storage key and matchingScope.
`登録を取得する@
- 入力 ⇒# %~storage~key — `~storage~key$, %~scope — `~URL$【または ~NULL】 ◎ Input • storage key, a storage key • scope, a URL
- 出力 ⇒# `~sw登録$【または ~NULL】 ◎ Output • A service worker registration
この手続きは不可分に走らすとする: ◎ Run the following steps atomically.
- %~scope文字列 ~LET 空~文字列 ◎ Let scopeString be the empty string.
- ~IF[ %~scope ~NEQ ~NULL ] ⇒ %~scope文字列 ~SET `~URLを直列化する$( %~scope, `素片は除外する^i ) ◎ If scope is not null, set scopeString to serialized scope with the exclude fragment flag set.
- `登録~map$を成す ~EACH( %~key → %登録 ) に対し ⇒ ~IF[[ %~storage~key, %~key[ 0 ] ]は`同等な~storage~key$である ]~AND[ %~scope文字列 ~EQ【!match】 %~key[ 1 ] ] ⇒ ~RET %登録 ◎ For each (entry storage key, entry scope) → registration of registration map: • If storage key equals entry storage key and scopeString matches entry scope, then return registration.
- ~RET ~NULL ◎ Return null.
`最新な~workerを取得する@
- 入力 ⇒# %登録 — `~sw登録$ ◎ Input • registration, a service worker registration
- 出力 ⇒# `~sw$【または ~NULL】 ◎ Output • newestWorker, a service worker
この手続きは不可分に走らすとする: ◎ Run the following steps atomically. • Let newestWorker be null.
- ~IF[ %登録 にて`~install中の~worker$swr ~NEQ ~NULL ] ⇒ ~RET %登録 にて`~install中の~worker$swr ◎ If registration’s installing worker is not null, set newestWorker to registration’s installing worker.
- ~IF[ %登録 にて`待機-中な~worker$swr ~NEQ ~NULL ] ⇒ ~RET %登録 にて`待機-中な~worker$swr ◎ Else if registration’s waiting worker is not null, set newestWorker to registration’s waiting worker.
- ~IF[ %登録 にて`作動中な~worker$swr ~NEQ ~NULL ] ⇒ ~RET %登録 にて`作動中な~worker$swr ◎ Else if registration’s active worker is not null, set newestWorker to registration’s active worker.
- ~RET ~NULL ◎ Return newestWorker.
`~swには処理待ち~eventは無いか?@
- 入力 ⇒# %~worker — `~sw$/~NULL 【この ~NULL と~algoの最初の段は、他所の記述を簡潔にするための,この訳による追加。】 ◎ Input • worker, a service worker
- 出力 ⇒# 真偽値 ◎ Output • True or false, a boolean
- ~IF[ %~worker ~EQ ~NULL ] ⇒ ~RET ~T ◎ ↑
-
%~worker の`延長-済み~event集合$swを成す ~EACH( %~event ) に対し ⇒ ~IF[ %~event は`作動中$eXである ] ⇒ ~RET ~F ◎ For each event of worker’s set of extended events: • If event is active, return false.
- ~RET ~T ◎ Return true.
`~clientを作成する@
- 入力 ⇒# %~client — `~sw~client$ ◎ Input • client, a service worker client
- 出力 ⇒# `Client$I ~obj ◎ Output • clientObject, a Client object
- ~RET 新たな `Client$I ~obj — その ⇒# `~sw~client$cl ~SET %~client ◎ Let clientObject be a new Client object. ◎ Set clientObject’s service worker client to client. ◎ Return clientObject.
`~window~clientを作成する@
- 入力 ⇒# %~client — `~sw~client$, %~frame種別 — 文字列【 `FrameType$I 値】, %可視性~状態 — 文字列 【 `DocumentVisibilityState$I 値】, %~focus状態 — 真偽値, %先祖~生成元~list — 【文字列の】~list ◎ Input • client, a service worker client • frameType, a string • visibilityState, a string • focusState, a boolean • ancestorOriginsList, a list
- 出力 ⇒# `WindowClient$I ~obj ◎ Output • windowClient, a WindowClient object
- ~RET 新たな `WindowClient$I ~obj — その ⇒# `~sw~client$cl ~SET %~client, `~frame種別$cl ~SET %~frame種別, `可視性~状態$cl ~SET %可視性~状態, `~focus状態$cl ~SET %~focus状態, `先祖~生成元~配列$cl ~SET `凍結d配列を作成する$( %先祖~生成元~list ) 【 %~client に`関連な~realm$内で?】 ◎ Let windowClient be a new WindowClient object. • Set windowClient’s service worker client to client. • Set windowClient’s frame type to frameType. • Set windowClient’s visibility state to visibilityState. • Set windowClient’s focus state to focusState. • Set windowClient’s ancestor origins array to a frozen array created from ancestorOriginsList. ◎ Return windowClient.
`~frame種別を取得する@
- 入力 ⇒# %~navigable — `~navigable$ ◎ Input • navigable, a navigable
- 出力 ⇒# %~frame種別 — 文字列 ◎ Output • frameType, a string
- ~IF[ %~navigable の`親$nav ~NEQ ~NULL ] ⇒ ~RET `nested^l ◎ If navigable’s parent is not null, then return "nested".
- ~IF[ %~navigable にて`作動中な閲覧~文脈$navは`補助~閲覧~文脈$である ] ⇒ ~RET `auxiliary^l ◎ If navigable’s active browsing context is an auxiliary browsing context, then return "auxiliary".
- ~RET `top-level^l ◎ Return "top-level".
`~clientを取得する~promiseを解決する@
- 入力 ⇒# %~client — `~sw~client$, %~promise — `~promise$ ◎ Input • client, a service worker client • promise, a promise
- 出力 ⇒# ~none ◎ Output • None
-
~IF[ ~OR↓ ]…
- [ %~client は`環境~設定群~obj$である ]~AND[ %~client は`~secureな文脈$enVでない ]
- [ %~client は`環境~設定群~obj$でない ]~AND[ %~client の`作成時の~URL$enV は`信用に価し得る~URL$でない ]
…ならば:
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~promise に`関連な設定群~obj$の`担当の~event~loop$enV )
手続きは ⇒ `~promiseを却下する$( %~promise, `SecurityError$E 例外 ) - ~RET
-
~IF[ %~client は`環境~設定群~obj$である ]~AND[ %~client は`~window~client$でない ]: ◎ If client is an environment settings object and is not a window client, then:
- %~client~obj ~LET `~clientを作成する$( %~client ) ◎ Let clientObject be the result of running Create Client algorithm with client as the argument.
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %~promise に`関連な設定群~obj$の`担当の~event~loop$enV )
手続きは ⇒ `~promiseを解決する$( %~promise, %~client~obj )◎ Queue a task to resolve promise with clientObject, on promise’s relevant settings object's responsible event loop using the DOM manipulation task source,\ - ~RET ◎ and abort these steps.
- %閲覧~文脈 ~LET[ %~client は`環境~設定群~obj$であるならば %~client の`大域~obj$enVに`対応する閲覧~文脈$【!`閲覧~文脈$】 / ~ELSE_ %~client の`~target閲覧~文脈$enV ] ◎ Else: ◎ Let browsingContext be null. ◎ If client is an environment settings object, set browsingContext to client’s global object's browsing context. ◎ Else, set browsingContext to client’s target browsing context.
- %~navigable ~LET %閲覧~文脈 に`対応する~navigable$bc 【!`作動中な閲覧~文脈$navに %閲覧~文脈 を伴う`~navigable$】 ◎ Let navigable be the navigable with a active browsing context of browsingContext.
-
`~taskを~queueする$( `利用者~対話~task~source$, 次の手続き, %閲覧~文脈 の`~event~loop$ ) ◎ Queue a task to run the following steps on browsingContext’s event loop using the user interaction task source:
手続きは:
- %~frame種別 ~LET `~frame種別を取得する$( %~navigable ) ◎ Let frameType be the result of running Get Frame Type with navigable.
- %作動中な文書 ~LET %~navigable にて`作動中な文書$nav ◎ ↓
- %可視性~状態 ~LET %作動中な文書 の`visibilityState$n 属性~値 ◎ Let visibilityState be browsingContext’s active document's visibilityState attribute value.
- %~focus状態 ~SET `~focusを得ている$( %作動中な文書 ) ◎ Let focusState be the result of running the has focus steps with browsingContext’s active document as the argument.
- %先祖~生成元~list ~LET 空~list ◎ Let ancestorOriginsList be the empty list.
- ~IF[ %~client は`~window~client$である ] ⇒ %先祖~生成元~list ~SET %作動中な文書 の`先祖~生成元~文字列~list$ ◎ If client is a window client, set ancestorOriginsList to browsingContext’s active document's relevant global object's Location object’s ancestor origins list's associated list.
-
`~taskを~queueする$( `~DOM操作~task~source$, 次の手続き, %promise に`関連な設定群~obj$の`担当の~event~loop$enV ) ◎ Queue a task to run the following steps on promise’s relevant settings object's responsible event loop using the DOM manipulation task source:
手続きは:
- %結果 ~LET `undefined^jv ◎ ↓
- ~IF[ %~client の`破棄-済みか$ ~EQ ~F ] ⇒ %結果 ~SET `~window~clientを作成する$( ↓ ) ⇒# %~client, %~frame種別, %可視性~状態, %~focus状態, %先祖~生成元~list ◎ If client’s discarded flag is set, resolve promise with undefined and abort these steps. ◎ Let windowClient be the result of running Create Window Client with client, frameType, visibilityState, focusState, and ancestorOriginsList.
- `~promiseを解決する$( %~promise, %結果 ) ◎ Resolve promise with windowClient.
`~cacheを~queryする@
- 入力 ⇒# %要請~query — `要請$, %~storage — `要請~応答~list$†, %~option群 — `CacheQueryOptions$I ~obj(省略時は ε ), ◎ Input • requestQuery, a request • options, a CacheQueryOptions object, optional • targetStorage, a request response list, optional
- 出力 ⇒# %結果~list — `要請~応答~list$ ◎ Output • resultList, a request response list
【† %~storage は、 原文では省略可能とされているが、 この訳では,常に明示的に与えて呼出すよう改めている。 原文では,省略時には `関連な要請~応答~list$ になるものとされているが、 どの~objに関連なそれなのか明らかでなく,呼出す箇所で与える方が明確になるので。 それに伴い、 引数の順序も改めている。 】
- %結果~list ~LET 新たな`~list$ ◎ Let resultList be an empty list.
-
%~storage を成す ~EACH( %要請~応答 ) に対し: ◎ Let storage be null. ◎ If the optional argument targetStorage is omitted, set storage to the relevant request response list. ◎ Else, set storage to targetStorage. ◎ For each requestResponse of storage:
- %要請 ~LET %要請~応答 を成す要請 ◎ Let cachedRequest be requestResponse’s request.
- %応答 ~LET %要請~応答 を成す応答 ◎ Let cachedResponse be requestResponse’s response.
- ~IF[ `要請は~cache済み~itemに合致するか?$( %要請~query, %要請, %応答, %~option群 ) ~EQ ~T ] ⇒ %結果~list に ( %要請 の複製, %応答 の複製 ) を`付加する$ ◎ If Request Matches Cached Item with requestQuery, cachedRequest, cachedResponse, and options returns true, then: • Let requestCopy be a copy of cachedRequest. • Let responseCopy be a copy of cachedResponse. • Add requestCopy/responseCopy to resultList.
- ~RET %結果~list ◎ Return resultList.
`要請は~cache済み~itemに合致するか?@
- 入力 ⇒# %要請~query — `要請$ %要請 — `要請$ %応答 — `応答$または ~NULL (省略時は ~NULL ) %~option群 — `CacheQueryOptions$I ~obj(省略時は ε ) ◎ Input • requestQuery, a request • request, a request • response, a response or null, optional, defaulting to null • options, a CacheQueryOptions object, optional
- 出力 ⇒# 真偽値 ◎ Output • a boolean
- ~IF[ %~option群 ~EQ ε ] ⇒ %~option群 ~SET 新たな `CacheQueryOptions$I 辞書 【この段は、この訳による補完】
- ~IF[ %~option群[ `CacheQueryOptions^I1"`ignoreMethod$m1" ] ~EQ ~F ]~AND[ %要請~query の`~method$rq ~NEQ `GET^bl ] ⇒ ~RET ~F ◎ If options["ignoreMethod"] is false and request’s method is not `GET`, return false.
- %~query~URL ~LET %要請~query の`~URL$rq ◎ Let queryURL be requestQuery’s url.
- %~cache済み~URL ~LET %要請 の`~URL$rq ◎ Let cachedURL be request’s url.
-
~IF[ %~option群[ "`ignoreSearch$m1" ] ~EQ ~T ]: ◎ If options["ignoreSearch"] is true, then:
- %~cache済み~URL の`~query$url ~SET 空~文字列 ◎ Set cachedURL’s query to the empty string.
- %~query~URL の`~query$url ~SET 空~文字列 ◎ Set queryURL’s query to the empty string.
- ~IF[ ( %~query~URL, %~cache済み~URL ) は `素片は除外する^i 下で`同等な~URL$でない ] ⇒ ~RET ~F ◎ If queryURL does not equal cachedURL with the exclude fragment flag set, then return false.
- ~IF[ %応答 ~EQ ~NULL ]~OR[ %~option群[ "`ignoreVary$m1" ] ~EQ ~T ] ⇒ ~RET ~T ◎ If response is null, options["ignoreVary"] is true, or\ ↓response’s header list does not contain `Vary`,\ then return true.
- %Vary ~SET `~header~listから値を取得して復号して分割する$( %応答 の`~header~list$rs, `Vary$h ) ◎ Let fieldValues be the list containing the elements corresponding to the field-values of the Vary header for the value of the header with name `Vary`.
- ~IF[ %Vary ~EQ ~NULL ] ⇒ ~RET ~T ◎ ↑
-
%Vary を成す ~EACH( %~field値 ) に対し: ◎ For each fieldValue in fieldValues:
- %~field値 ~SET `同型に符号化する$( %~field値 ) ◎ ↓
- ~IF[ %~field値 ~EQ `*^bl ] ⇒ ~RET ~F ◎ If fieldValue matches "*", or\
- ~IF[ `~header~listから値を取得する$( %要請 の`~header~list$rq, %~field値 ) ~NEQ `~header~listから値を取得する$( %要請~query の`~header~list$rq, %~field値 ) 【!原文 “combined value” ~FETCH#concept-header-list-combine は、~header~listを改変するので不適切】 ] ⇒ ~RET ~F ◎ the combined value given fieldValue and request’s header list does not match the combined value given fieldValue and requestQuery’s header list, then return false.
- ~RET ~T ◎ Return true.
`~cache演算を~batchする@
- 入力 ⇒# %演算~群 — `~cache~batch演算$ ~objの`~list$, %O — `要請~応答~list$を表現する~obj【この訳による補完】 ◎ Input • operations, a list of cache batch operation objects
- 出力 ⇒# %結果~list — `要請~応答~list$ ◎ Output • resultList, a request response list
- %~cache ~LET %O に`関連な要請~応答~list$ ◎ Let cache be the relevant request response list.
- %予備~cache ~LET %~cache を`~cloneする$ ◎ Let backupCache be a new request response list that is a copy of cache.
- %追加される~item群 ~LET 新たな`~list$ ◎ Let addedItems be an empty list.
-
この段は不可分に走らす — ただし、 手続きの中で例外が投出されたときは,この段の次の段へ進む: ◎ Try running the following substeps atomically:
- %結果~list ~LET 空~list ◎ Let resultList be an empty list.
-
%演算~群 を成す ~EACH( %演算 ) に対し: ◎ For each operation in operations:
- ( %要請, %応答, %種別, %~option群 ) ~LET %演算 の ( `要請$cbo, `応答$cbo, `種別$cbo, `~option群$cbo ) ◎ ↓
- ~IF[ %種別 ~NIN { `delete^l, `put^l } ] ⇒ ~THROW `TypeError^E ◎ If operation’s type matches neither "delete" nor "put", throw a TypeError.
- ~IF[ %種別 ~NEQ `delete^l ]~AND[ %応答 ~NEQ ~NULL ] ⇒ ~THROW `TypeError^E ◎ If operation’s type matches "delete" and operation’s response is not null, throw a TypeError.
- ~IF[ `~cacheを~queryする$( %要請, %追加される~item群, %~option群 ) の結果は`空$でない ] ⇒ ~THROW `InvalidStateError$E ◎ If the result of running Query Cache with operation’s request, operation’s options, and addedItems is not empty, throw an "InvalidStateError" DOMException.
- %要請~応答~list ~LET 新たな`~list$ ◎ Let requestResponses be an empty list.
-
~IF[ %種別 ~EQ `delete^l ]: ◎ If operation’s type matches "delete", then:
- %要請~応答~list ~SET `~cacheを~queryする$( %要請, %~cache, %~option群 ) ◎ Set requestResponses to the result of running Query Cache with operation’s request and operation’s options.
- %~cache から次を満たす`~item$たちを`除去する$ ⇒ `~item$ ~IN %要請~応答~list ◎ For each requestResponse in requestResponses: • Remove the item whose value matches requestResponse from cache.
-
~ELIF[ %種別 ~EQ `put^l ]: ◎ Else if operation’s type matches "put", then:
- ~IF[ %応答 ~EQ ~NULL ] ⇒ ~THROW `TypeError^E ◎ If operation’s response is null, throw a TypeError.
- 【! 's associated `要請$Rq 】 ~IF[ %要請 の`~URL$rqの`~scheme$url ~NIN { `http^l , `https^l } ] ⇒ ~THROW `TypeError^E ◎ ↑↑Let r be operation’s request's associated request. ('s associated request は余計) ◎ If r’s url's scheme is not one of "http" and "https", throw a TypeError.
- ~IF[ %要請 の`~method$rq ~NEQ `GET^bl ] ⇒ ~THROW `TypeError^E ◎ If r’s method is not `GET`, throw a TypeError.
- ~IF[ %演算 の`~option群$cbo ~NEQ ~NULL ] ⇒ ~THROW `TypeError^E ◎ If operation’s options is not null, throw a TypeError.
- %要請~応答~list ~SET `~cacheを~queryする$( %要請, %~cache ) ◎ Set requestResponses to the result of running Query Cache with operation’s request.
- %~cache から次を満たす`~item$たちを`除去する$ ⇒ `~item$ ~IN %要請~応答~list ◎ For each requestResponse of requestResponses: • Remove the item whose value matches requestResponse from cache.
- %cache に ( %要請, %応答 ) を`付加する$ ◎ Append operation’s request/operation’s response to cache.
- ~IF[ 【!previous two steps?】 前~段の~cache書込n演算は、 是認されている~quota上限を超過することにより失敗した ] ⇒ ~THROW `QuotaExceededError$E ◎ If the cache write operation in the previous two steps failed due to exceeding the granted quota limit, throw a "QuotaExceededError" DOMException.
- %追加される~item群 に ( %要請, %応答 ) を`付加する$ ◎ Append operation’s request/operation’s response to addedItems.
- %結果~list に ( %要請, %応答 ) を`付加する$ ◎ Append operation’s request/operation’s response to resultList.
- ~RET %結果~list ◎ Return resultList.
-
前~段にて %例外 が投出されたときは: ◎ And then, if an exception was thrown, then:
- %~cache を`空にする$ ◎ Remove all the items from the relevant request response list.
- %予備~cache を成す ~EACH( %要請~応答 ) に対し ⇒ %~cache に %要請~応答 を`付加する$ ◎ For each requestResponse of backupCache: • Append requestResponse to the relevant request response list.
- ~THROW %例外 ◎ Throw the exception.
注記: 例外が投出されたときには、 実装は,[ ~batch演算~jobの間に~cache~storageに加えられた変更 ]を巻戻すことになる。 ◎ Note: When an exception is thrown, the implementation does undo (roll back) any changes made to the cache storage during the batch operation job.
`非同期c~moduleか?@
- 入力 ⇒# %~record — `~module~record$, %~module~map — `~module~map$, %基底 — `~URL$, %seen — `~URL$の`有順序~集合$【 ~URLの比較は、`同等な~URL$に基づくことになろう】 ◎ Input • record, a Module Record • moduleMap, a module map • base, a URL • seen, a set of URLs
- 出力 ⇒ 真偽値 ◎ Output • a boolean
- ~IF[ %~record は`循環な~module~record$でない ] ⇒ ~RET ~F ◎ If record is not a Cyclic Module Record, then: • Return false.
- ~IF[ %~record . `Async^sl ~EQ ~T ] ⇒ ~RET ~T ◎ If record.[[Async]] is true, then: • Return true.
-
%~record . `RequestedModules^sl を成す ~EACH( 文字列 %要請された~module ) に対し: ◎ For each string requested of record.[[RequestedModules]]:
- %~URL ~LET `~module指定子を解決する$( %基底, %要請された~module ) ◎ Let url be the result of resolving a module specifier given base and requested.
- ~Assert: %~URL ~NEQ `失敗^i — 前~段は、 同じ 2 個の引数で以前に成功したはずなので ◎ Assert: url is never failure, because resolving a module specifier must have been previously successful with these same two arguments.
-
~IF[ %~URL ~NIN %seen ]: ◎ If seen does not contain url, then:
- %seen に %~URL を`付加する$set ◎ Append url to seen.
- ~IF[ %~module~map[ %~URL ] の`~record$sC ~EQ ~NULL【!does not have】 ] ⇒ ~RET ~F ◎ If moduleMap[url] does not have a record, then: • Return false.
- ~IF[ `非同期c~moduleか?$( %~module~map[ %~URL ] の`~record$sC, %~module~map, %基底, %seen ) ~EQ ~T ] ⇒ ~RET ~T ◎ If Is Async Module for moduleMap[url]'s record, moduleMap, base, and seen is true, then: • Return true.
- ~RET ~F ◎ Return false.
`競走~応答を検索する@
- 入力 ⇒# %要請 — `要請$ ◎ Input • request, a request
- 出力 ⇒ `応答$/~NULL ◎ Output • a response or null
- %登録 ~LET ~NULL ◎ Let registration be null.
-
~IF[ %要請 は`非~下位資源~要請$である ]: ◎ If request is a non-subresource request, then:
- ~IF[ %要請 の`予約-済み~client$rq ~EQ ~NULL ] ⇒ ~RET ~NULL ◎ If request’s reserved client is null, return null.
- %~storage~key ~LET `~storage~keyを得する$( %要請 の`予約-済み~client$rq ) ◎ Let storage key be the result of running obtain a storage key given request’s reserved client.
- %登録 ~SET `合致する~sw登録$( %~storage~key, %要請 の`~URL$rq ) ◎ Set registration to the result of running Match Service Worker Registration given storage key and request’s url.
-
~ELIF[ %要請 は`下位資源~要請$である ]: ◎ Else if request is a subresource request, then:
- %~client ~LET %要請 の`~client$rq ◎ Let client be request’s client.
- ~IF[ %~client にて`作動中な~sw$enV ~EQ ~NULL ] ⇒ ~RET ~NULL ◎ If client’s active service worker is null, return null.
- %登録 ~SET %~client にて`作動中な~sw$enVを`包含している~sw登録$sw ◎ Set registration to client’s active service worker's containing service worker registration.
- ~ELSE ⇒ ~RET ~NULL ◎ Otherwise, return null.
- %作動中な~worker ~LET %登録 にて`作動中な~worker$swr ◎ Let activeWorker be registration’s active worker.
- %~map ~LET %作動中な~worker の`大域~obj$swの`競走~応答~map$SWG ◎ Let map be activeWorker’s global object's race response map.
-
~IF[ %~map[ %要請 ] ~NEQ ε ]: ◎ If map[request] exists, then:
- %競走~応答 ~LET %~map[ %要請 ] ◎ Let entry be map[request].
- %~map[ %要請 ] ~SET ε ◎ Remove map[request].
- 次が満たされるまで待機する ⇒ %競走~応答 の`値$rV ~NEQ `pending^l ◎ Wait until entry’s value is not "pending"
- ~IF[ %競走~応答 の`値$rVは`応答$である ] ⇒ ~RET %競走~応答 の`値$rV ◎ If entry’s value is response, return entry’s value.
- ~RET ~NULL ◎ Return null.
付録 B. 拡張された~HTTP~header
~sw~script要請
`~sw$の`~script資源$swを`~fetch$する~HTTP要請は、 次の`~header$を含めることになる: ◎ An HTTP request to fetch a service worker's script resource will include the following header:
- `Service-Worker@h
- この要請は`~sw$の`~script資源$sw要請であることを指示する。 ◎ Indicates this request is a service worker's script resource request.
- 注記: この~headerは、 ~administratorが要請を~logして,脅威を検出するのを助ける。 ◎ Note: This header helps administrators log the requests and detect threats.
~sw~script応答
`~sw$の`~script資源$sw要請に対する~HTTP応答は、 次に挙げる`~header$を含ませれる: ◎ An HTTP response to a service worker's script resource request can include the following header:
- `Service-Worker-Allowed@h
- ~path制約を上書きするよう~UAに指示する — これは、 ~scriptに`制御-$することが許容される最大な`~scope~URL$swrを,所与の値に制限する。 ◎ Indicates the user agent will override the path restriction, which limits the maximum allowed scope url that the script can control, to the given value.
- 注記: この値は~URLである。 相対的~URLが与えられた場合、 それは~scriptの~URLに基づいて構文解析される。 ◎ Note: The value is a URL. If a relative URL is given, it is parsed against the script’s URL.
既定の~scope: ◎ Default scope:
/*
許容される最大な~scopeは、
既定では,~scriptが座している~path
— 次の例では `/js/^l —
になる:
◎
Maximum allowed scope defaults to the path the script sits in "/js/" in this example
*/
navigator.serviceWorker.register("/js/sw.js").then(() => {
console.log("既定の~scope '/js/' で~installに成功しました。");
});
【! "Install succeeded with the default scope '/js/'." 】
`Service-Worker-Allowed^h ~headerが伴われないときの,上位path: ◎ Upper path without Service-Worker-Allowed header:
/*
`Response^I に `Service-Worker-Allowed^h ~headerがないときに,~scopeを~scriptの所在の上位pathに設定する:
◎
Set the scope to an upper path of the script location Response has no Service-Worker-Allowed header
*/
navigator.serviceWorker.register("/js/sw.js", { scope: "/" }).catch(() => {
console.error("~path制約に違反しているため、
~installに失敗しました。");
});
【!"Install failed due to the path restriction violation."】
`Service-Worker-Allowed^h ~headerが伴われるときの,上位path: ◎ Upper path with Service-Worker-Allowed header:
/*
`Response^I に `Service-Worker-Allowed : /^bl が含まれているときに,~scopeを~script所在の上位pathに設定する:
◎
Set the scope to an upper path of the script location Response included "Service-Worker-Allowed : /"
*/
navigator.serviceWorker.register("/js/sw.js", { scope: "/" }).then(() => {
console.log("許容される最大な~scopeは '/' に上書きされたので、
~installに成功しました。");
});
【!"Install succeeded as the max allowed scope was overriden to '/'."】
`Service-Worker-Allowed^h ~headerが伴われていても,~path制約~違反になる例: ◎ A path restriction voliation even with Service-Worker-Allowed header:
/*
`Response^I に
`Service-Worker-Allowed : /foo^bl
が含まれているときに,~scopeを~script所在の上位pathに設定する:
◎
Set the scope to an upper path of the script location Response included "Service-Worker-Allowed : /foo"
*/
navigator.serviceWorker.register("/foo/bar/sw.js", { scope: "/" }).catch(() => {
console.log("許容される最大な~scopeは上書きされましたが,まだ~scopeはその外にあるので、
~installに失敗しました。");
});
【! "Install failed as the scope is still out of the overriden maximum allowed scope."】
構文
`~sw$の`~script資源$swへの[ 要請と, 対する応答 ]により利用される~headerに与える値の `ABNF$r は: ◎ ABNF for the values of the headers used by the service worker's script resource requests and responses:
Service-Worker = `%x73.63.72.69.70.74^_ ; "script", 文字大小区別
注記: `Service-Worker-Allowed^h ~headerの値を検証するときには、 この~ABNFは利用されない — 検証は、 (更新-~algo内で)~URL構文解析~algoが行う。 ◎ Note: The validation of the Service-Worker-Allowed header’s values is done by URL parsing algorithm (in Update algorithm) instead of using ABNF.
謝辞
Deep thanks go to Andrew Betts for organizing and hosting a small workshop of like-minded individuals including: Jake Archibald, Jackson Gabbard, Tobie Langel, Robin Berjon, Patrick Lauke, Christian Heilmann. From the clarity of the day’s discussions and the use-cases outlined there, much has become possible. Further thanks to Andrew for raising consciousness about the offline problem. His organization of EdgeConf and inclusion of Offline as a persistent topic there has created many opportunities and connections that have enabled this work to progress.
Anne van Kesteren has generously lent his encyclopedic knowledge of Web Platform arcana and standards development experience throughout the development of the service worker. This specification would be incomplete without his previous work in describing the real-world behavior of URLs, HTTP Fetch, Promises, and DOM. Similarly, this specification would not be possible without Ian Hickson’s rigorous Web Worker spec. Much thanks to him.
In no particular order, deep gratitude for design guidance and discussion goes to: Jungkee Song, Alec Flett, David Barrett-Kahn, Aaron Boodman, Michael Nordman, Tom Ashworth, Kinuko Yasuda, Darin Fisher, Jonas Sicking, Jesús Leganés Combarro, Mark Christian, Dave Hermann, Yehuda Katz, François Remy, Ilya Grigorik, Will Chan, Domenic Denicola, Nikhil Marathe, Yves Lafon, Adam Barth, Greg Simon, Devdatta Akhawe, Dominic Cooney, Jeffrey Yasskin, Joshua Bell, Boris Zbarsky, Matt Falkenhagen, Tobie Langel, Gavin Peters, Ben Kelly, Hiroki Nakagawa, Jake Archibald, Josh Soref, Jinho Bang, Yutaka Hirano, Michael(tm) Smith, isonmad, Ali Alabbas, Philip Jägenstedt, Mike Pennisi, and Eric Willigers.
Jason Weber, Chris Wilson, Paul Kinlan, Ehsan Akhgari, and Daniel Austin have provided valuable, well-timed feedback on requirements and the standardization process.
The authors would also like to thank Dimitri Glazkov for his scripts and formatting tools which have been essential in the production of this specification. The authors are also grateful for his considerable guidance.
Thanks also to Vivian Cromwell, Greg Simon, Alex Komoroske, Wonsuk Lee, and Seojin Kim for their considerable professional support.