[3] [DFN[[RUBYB[サービスワーカー登録]@en[service worker registration]]]]

* 仕様書

[REFS[
- [1] [CITE@en[Service Workers Nightly]] ([TIME[2017-02-16 20:10:49 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-containing-service-worker-registration>
- [2] '''[CITE@en[Service Workers Nightly]] ([TIME[2017-02-16 20:10:49 +09:00]]) <https://w3c.github.io/ServiceWorker/#service-worker-registration-concept>'''
- [12] [CITE@en[Service Workers Nightly]] ([TIME[2017-02-25 12:50:35 +09:00]]) <https://w3c.github.io/ServiceWorker/#selection>
- [25] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#serviceworkercontainer-interface>
-- [21] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#navigator-service-worker-register>
-- [37] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#navigator-service-worker-getRegistration>
-- [54] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#navigator-service-worker-getRegistrations>
- [84] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-scope-to-registration-map>
- [86] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-job-type>
- [66] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#start-register>
- [89] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#register-algorithm>
- [113] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#update-algorithm>
- [124] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#soft-update-algorithm>
- [168] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#installation-algorithm>
- [204] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#extensions-to-the-serviceworkerregistration-interface>
]REFS]

* メンバー

[FIG(short list)[ [205] [CODE[ServiceWorkerRegistration]]
- [CODE[pushManager]]
]FIG]

* 状態

[8] [[サービスワーカー登録]]は、次の状態を持ちます。

[FIG(list members)[
: [F[適用範囲URL]] :
[[サービスワーカー登録]]は[F[適用範囲URL]]ごとに1つ存在します。
: [F[インストール中ワーカー]] :
: [F[待機中ワーカー]] :
: [F[活性ワーカー]] :
: [DFN[[F[last update check time]]]] :
初期値は [CODE[null]] [SRC[>>2]]。
: [F[キャッシュ利用]] : [[ブール型]]。初期値は[[偽]]。
: [DFN[[F[uninstalling flag]]]] :
初期値は[[未設定]]。 [SRC[>>2]]
: [F[タスクキュー群]] :
: [F[[CODE(DOMi)@en[NavigationPreloadManager]]]] :
: [F[navigation preload enabled flag]] :
: [F[navigation preload header value]] :
: [F[ジョブキュー][サービスワーカージョブキュー]] :
: [F[プッシュ購読]] :
: [F[[CODE[PushManager]]]] :
]FIG]


* [CODE(DOMi)@en[ServiceWorkerContainer]] インターフェイス [CODE(DOMm)@en[register]] メソッド

[22] [CODE(DOMi)@en[ServiceWorkerContainer]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[register]]]] [[メソッド]]は、
次の[[引数]]を持ちます。

[FIG(list members)[
: [VAR[スクリプトURL]] : [CODE(IDL)@en[USVString]] [SRC[>>25]]。
: [VAR[オプション群]] :[[辞書]] [CODE(IDL)@en[RegistrationOptions]] (省略可能) [SRC[>>25]]。
]FIG]

[24] [[辞書]] [DFN[[CODE(IDL)@en[RegistrationOptions]]]]
は、次の[[メンバー][辞書メンバー]]を持ちます [SRC[>>25]]。

[FIG(list members middle)[
- [CODE(DOMa)@en[scope][適用範囲URL]] ([CODE(IDL)@en[USVString]])
- [CODE(DOMa)@en[type][スクリプト型]] ([CODE(IDL)@en[WorkerType]], 既定値 [CODE[classic][古典スクリプト]])
- [CODE(DOMa)@en[useCache]] ([CODE(IDL)@en[boolean]], 既定値[[偽]])
]FIG]

[23] この[[メソッド]]は、 [CODE(IDL xattr)@en[NewObject]] です [SRC[>>25]]。

[26] 次のようにしなければ[MUST[なりません]] [SRC[>>21]]。

[FIG(steps)[
= [28] [VAR[約束]]を、[[約束]]に設定します。
= [29] [VAR[クライアント]]を、[[文脈オブジェクト]]の[F[サービスワーカークライアント]]に設定します。
= [30] [VAR[URL]]を、[VAR[スクリプトURL]]を[[文脈オブジェクト]]の[F[関連設定群オブジェクト]]の[F[API基底URL]]に対して[[構文解析][URL構文解析]]した結果に設定します。
= [31] [VAR[オプション群]]の [CODE(DOMa)@en[scope]] が[[存在]]するなら、
== [32] [VAR[適用範囲URL]]を、[VAR[オプション群]]の [CODE(DOMa)@en[scope]]
を[[文脈オブジェクト]]の[F[関連設定群オブジェクト]]の[F[API基底URL]]に対して[[構文解析][URL構文解析]]した結果に設定します。
= [33] それ以外の場合、
== [27] [VAR[適用範囲URL]]を、 [CODE[null]] に設定します。
= [34] [[登録開始]]します。
[FIG(list members middle)[
: [VAR[適用範囲URL]] : [VAR[適用範囲URL]]
: [VAR[スクリプトURL]]: [VAR[URL]]
: [VAR[約束]] : [VAR[約束]]
: [VAR[クライアント]] : [VAR[クライアント]]
: [VAR[参照元]] : [VAR[クライアント]]の[F[作成URL]]
: [VAR[ワーカー型]] : [VAR[オプション群]]の [CODE(DOMa)@en[type][WorkerType]]
: [VAR[キャッシュ利用]] : [VAR[オプション群]]の [CODE(DOMa)@en[useCache]]
]FIG]
= [35] [VAR[約束]]を返します。
]FIG]

* [CODE(DOMi)@en[ServiceWorkerContainer]] インターフェイス [CODE(DOMm)@en[getRegistration]] メソッド

[36] [CODE(DOMi)@en[ServiceWorkerContainer]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[getRegistration]]]] [[メソッド]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>37]]。

[FIG(steps)[
= [38] [VAR[クライアントURL]]を、[[省略可能]]な第1引数を
[CODE(IDL)@en[USVString]] と解釈した結果に設定します。
[[既定値]]は[[空文字列]]とします。 [SRC[>>25]]
= [39] [VAR[クライアント]]を、[[文脈オブジェクト]]の[F[サービスワーカークライアント]]に設定します。
= [40] [VAR[URL]]を、[VAR[クライアントURL]]を[[文脈オブジェクト]]の[F[関連設定群オブジェクト]]の[F[API基底URL]]に対して[[構文解析][URL構文解析]]した結果に設定します。
= [41] [VAR[URL]] が[[失敗]]の場合、
== [42] [CODE(JS)@en[TypeError]] で[[拒絶]]した[[約束]]を返し、ここで停止します。
= [43] [VAR[URL]]の[F[起源][URLの起源]]が[VAR[クライアント]]の[F[起源]]と[[同じ起源]]でない場合、
== [44] [CODE(JS)@en[SecurityError]] [[例外]]で[[拒絶]]した[[約束]]を返し、ここで停止します。
= [45] [VAR[約束]]を、新しい[[約束]]に設定します。
= [46] 並列の処理を開始します。
= [47] [VAR[約束]]を返します。
]FIG]

[48] 並列の処理は、次のようにします [SRC[>>37]]。

[FIG(steps)[
= [49] [VAR[登録]]を、[VAR[URL]] についての[[サービスワーカー登録の一致]]の結果に設定します。
= [50] [VAR[登録]]が [CODE[null]] 以外の場合、
== [51] [VAR[約束]]を、[VAR[登録]]を表す [CODE(DOMi)@en[ServiceWorkerRegistration]]
で[[解決][約束の解決]]します。
= [52] それ以外の場合、
== [53] [VAR[約束]]を、[[未定義]]で[[解決][約束の解決]]します。
]FIG]

* [CODE(DOMi)@en[ServiceWorkerContainer]] インターフェイス [CODE(DOMm)@en[getRegistrations]] メソッド

[55] [CODE(DOMi)@en[ServiceWorkerContainer]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[getRegistration''s'']]]] [[メソッド]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>54]]。

[FIG(steps)[
= [56] [VAR[クライアント]]を、[[文脈オブジェクト]]の[F[サービスワーカークライアント]]に設定します。
= [57] [VAR[約束]]を、新しい[[約束]]に設定します。
= [58] 並列の処理を開始します。
= [59] [VAR[約束]]を返します
]FIG]

[60] 並列の処理は、次のようにします [SRC[>>54]]。

[FIG(steps)[
= [61] [VAR[配列]]を、新しい[[配列]]に設定します。
= [62] [[scope to registration map]] の各 ([VAR[キー]], [VAR[値]]) について、
== [63] [VAR[キー]]を[[構文解析][URL構文解析]]した結果の[F[起源][URLの起源]]が[VAR[クライアント]]の[F[起源]]と[[同じ起源]]で、
[VAR[値]]の [F[uninstalling flag]] が[[偽]]なら、
=== [64] [VAR[配列]]に、
@@ [VAR[値]]と関連付けられた [CODE(DOMi)@en[ServiceWorkerRegistration]]
を追加します。
= [65] [VAR[約束]]を、[VAR[配列]]で[[解決][約束の解決]]します。
]FIG]

* 処理

** 作成

[85] [[ジョブ][サービスワーカージョブ]]の[F[ジョブ型]]の[DFN[[RUBYB[[[登録][登録ジョブ]]]@en[register]]]]と[DFN[[RUBYB[[[更新][更新ジョブ]]]@en[update]]]]
[SRC[>>86]] は、[[サービスワーカー]]の作成処理を表しています。


[67] [DFN[[RUBYB[登録開始]@en[Start Register]]]]は、
[VAR[適用範囲URL]]、
[VAR[スクリプトURL]]、
[VAR[約束]]、
[VAR[クライアント]]、
[VAR[参照元]]、
[VAR[ワーカー型]]、
[VAR[キャッシュ利用]]について、
次のようにしなければ[MUST[なりません]] [SRC[>>66]]。

[FIG(steps)[
= [70] 次の'''いずれか'''の場合:
=- [71] [VAR[スクリプトURL]]が[[失敗]]
=- [72] [VAR[スクリプトURL]]の[F[scheme][URL scheme]]が [[HTTP(S) scheme]] では''ない''
=- [73] [VAR[スクリプトURL]]の[F[path][URL path]]が
[[ASCII大文字・小文字不区別]]で [CODE[%2F]] や [CODE[%5C]] を含む
== [68] [VAR[約束]]を、[CODE(JS)@en[TypeError]] で[[拒絶]]します。
== [69] ここで停止します。
= [74] [VAR[適用範囲URL]]が [CODE[null]] の場合、
== [75] [VAR[適用範囲URL]]を、[VAR[スクリプトURL]]の[[ディレクトリーURL]]に設定します。
= [76] 次の'''いずれか'''の場合:
=- [79] [VAR[適用範囲URL]]が[[失敗]]
=- [80] [VAR[適用範囲URL]]の[F[scheme][URL scheme]]が [[HTTP(S) scheme]] では''ない''
=- [81] [VAR[適用範囲URL]]の[F[path][URL path]]が
[[ASCII大文字・小文字不区別]]で [CODE[%2F]] や [CODE[%5C]] を含む
== [83] [VAR[約束]]を、 [CODE(JS)@en[TypeError]] で[[拒絶]]します。
== [77] ここで停止します。
= [82] [VAR[ジョブ]]を、[[ジョブ作成]]の結果に設定します。
[FIG(list members middle)[
: [VAR[ジョブ型]] : [[登録][登録ジョブ]]
: [VAR[適用範囲URL]] : [VAR[適用範囲URL]]
: [VAR[スクリプトURL]] : [VAR[スクリプトURL]]
: [VAR[約束]] : [VAR[約束]]
: [VAR[クライアント]] : [VAR[クライアント]]
]FIG]
= [87] [VAR[ジョブ]]を次の通り設定します。
[FIG(list members middle)[
: [F[ワーカー型]] : [VAR[ワーカー型]]
: [F[キャッシュ利用]] : [VAR[キャッシュ利用]]
: [F[参照元]] : [VAR[参照元]]
]FIG]
= [78] [[Schedule Job]] を実行します。
[FIG(list members)[
: [VAR[ジョブ]] : [VAR[ジョブ]]
: [VAR[ジョブキュー]] : [[利用者エージェント]]の[F[[[適用範囲URL]]から[[ジョブキュー][サービスワーカージョブキュー]]への[[写像]]]]の[VAR[適用範囲URL]]の値
]FIG]
]FIG]

[88] [[登録開始]]により追加された[[ジョブ][サービスワーカージョブ]]は、
適当なタイミングで[[登録][登録ジョブ]]を呼び出します。


[125] [DFN[[RUBYB[ソフト更新]@en[Soft Update]]]]は、
[VAR[登録]]と[VAR[force bypass cache flag]]について次のようにします 
[SRC[>>124]]。

[FIG(steps)[
= [162] [VAR[最新ワーカー]]を、[VAR[登録]]についての[[最新ワーカーの取得]]の結果に設定します。
= [157] [VAR[最新ワーカー]]が [CODE[null]] の場合、
== [158] ここで停止します。
= [160] [VAR[ジョブ]]を、[[ジョブ作成]]の結果に設定します。
[FIG(list members)[
: [VAR[[[ジョブ型]]]] : [[更新][更新ジョブ]]
: [VAR[適用範囲URL]] : [VAR[登録]]の[F[適用範囲URL]]
: [VAR[スクリプトURL]] : [VAR[最新ワーカー]]の[F[スクリプトURL][サービスワーカー]]
: [VAR[約束]] : [CODE[null]]
: [VAR[クライアント]] : [CODE[null]]
]FIG]
= [159] [VAR[ジョブ]]の[F[ワーカー型]]を、[VAR[最新ワーカー]]の[F[型][ワーカー型]]に設定します。
= [161] [VAR[ジョブ]]の [F[force bypass cache flag]] を、 [VAR[force bypass cache flag]]
に設定します。
= [165] [VAR[ジョブキュー]]を、[[利用者エージェント]]の[F[[[適用範囲URL]]から[[ジョブキュー]]への[[写像]]]]の[VAR[ジョブ]]の[F[適用範囲URL]]の値に設定します。
= [163] [VAR[ジョブ]]と[VAR[ジョブキュー]]について [[Schedule Job]] を実行します。
]FIG]

[164] [[handle fetch]] と [[handle functional event]] から呼び出されます。

[155] [[利用者エージェント]]は、更新を検査したい時にいつでもこの手順を呼び出すことができます
[SRC[>>124]]。
また、[[開発者ツール]]からの呼び出しなど[[デバッグ]]を補助するために
[VAR[force bypass cache flag]] を使うことができます [SRC[>>124]]。

[167] [[ソフト更新]]により追加された[[ジョブ][サービスワーカージョブ]]は、
適当なタイミングで[[更新][更新ジョブ]]を呼び出します。

** スクリプトの取得と実行

[90] [DFN[[RUBYB[登録]@en[Register]]]]は、
[[ジョブ][サービスワーカージョブ]][VAR[ジョブ]]と[[ジョブキュー][サービスワーカージョブキュー]][VAR[ジョブキュー]]を次のようにします [SRC[>>89]]。

[FIG(steps)[
= [91] 次の''いずれか''の場合:
[FIG(list)[
- [96] [VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]の[F[起源][URLの起源]]について
[[potentially trustworthy origin]] を適用した結果が [[Not Trusted]]
- [95] [VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]と[VAR[ジョブ]]の[F[参照元]]の[F[起源][URLの起源]]が[[同じ起源]]でない
- [97] [VAR[ジョブ]]の[F[適用範囲URL]]の[F[起源][URLの起源]]と[VAR[ジョブ]]の[F[参照元]]の[F[起源][URLの起源]]が[[同じ起源]]でない
]FIG]
== [92] [VAR[ジョブ]]と [CODE[SecurityError]] [[例外]]について[[ジョブ約束の拒絶]]を呼び出します。
== [93] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]を呼び出します。
== [94] ここで停止します。
= [98] [VAR[登録]]を、[VAR[ジョブ]]の[F[適用範囲URL]]について[[登録を取得]]した結果に設定します。
= [99] [VAR[登録]]が [CODE[null]] 以外の場合、
== [100] [VAR[登録]]の [F[uninstalling flag]] が[[真]]の場合、
=== [101] [VAR[登録]]の [F[uninstalling flag]] を、[[偽]]に設定します。
== [102] [VAR[最新ワーカー]]を、[VAR[登録]]について[[最新ワーカーを取得]]した結果に設定します。
== [103] 次の''すべて''を満たす場合:
[FIG(list)[
- [104] [VAR[最新ワーカー]]が [CODE[null]] 以外
- [105] [VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]が[VAR[最新ワーカー]]の[F[スクリプトURL][サービスワーカー]]と[VAR[素片識別子除外フラグ]]を設定して[[等価][URL等価]]
- [106] [VAR[ジョブ]]の[F[キャッシュ利用]]と[VAR[登録]]の[F[キャッシュ利用]]が等しい
]FIG]
=== [107] [VAR[ジョブ]]と[VAR[登録]]の [CODE(DOMi)@en[ServiceWorkerRegistration]] 
について[[ジョブ約束の解決]]をします。
=== [108] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]を呼び出します。
=== [109] ここで停止します。
= [110] それ以外の場合、
== [111] [VAR[ジョブ]]の[F[適用範囲URL]]と[VAR[ジョブ]]の[F[キャッシュ利用]]について[[登録の設定]]をします。
= [112] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[更新][更新ジョブ]]します。
]FIG]

[115] [[ジョブを走らせる]]処理から呼び出されます。

-*-*-

[114] [DFN[[RUBYB[更新]@en[Update]]]]は、
[VAR[ジョブ]]と[VAR[ジョブキュー]]を次のようにします [SRC[>>113]]。

[FIG(steps)[
= [116] [VAR[登録]]を、[VAR[ジョブ]]の[F[適用範囲URL]]について[[登録を取得]]した結果に設定します。
= [117] [VAR[登録]]が [CODE[null]] か、
[VAR[登録]]の [F[uninstalling flag]] が[[真]]の場合、
== [118] [VAR[ジョブ]]と [CODE(JS)@en[TypeError]] で[[ジョブ約束を拒絶]]します。
== [119] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
= [120] [VAR[最新ワーカー]]を、[VAR[登録]]について[[最新ワーカーを取得]]した結果に設定します。
= [121] [VAR[ジョブ]]の[F[ジョブ型]]が[[更新][更新ジョブ]]で、
[VAR[最新ワーカー]]の[F[スクリプトURL][サービスワーカー]]が[VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]と[VAR[素片識別子除外フラグ]]を設定して[[等価][URL等価]]で''ない''場合、
== [122] [VAR[ジョブ]]と [CODE(JS)@en[TypeError]] で[[ジョブ約束を拒絶]]します。
== [123] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
= [126] [VAR[ジョブ]]の[F[ワーカー型]]により、
[FIG(switch)[
: [CODE[classic][古典スクリプト]] :
[[古典ワーカースクリプトのfetch]]を実行します。
[FIG(list members)[
: [VAR[URL]] : [VAR[ジョブ]]の[F[スクリプトURL]]
: [VAR[fetchクライアント設定群]] :
[VAR[ジョブ]]の[F[クライアント][サービスワーカークライアント]]
: [VAR[[[終点]]]] : [CODE[serviceworker]]
: [VAR[スクリプト設定群オブジェクト]] :
@@ この[[サービスワーカー]]用に作られる[[環境設定群オブジェクト]]
: [VAR[fetchの実行]] : [[サービスワーカー]]用の処理
([VAR[登録]]、[VAR[ジョブ]]、[VAR[最新ワーカー]]を参照します。
[VAR[HTTPS状態]]、[VAR[参照元ポリシー]]を設定することがあります。)
: [VAR[続きの処理]] : >>127
]FIG]
: [CODE[module][モジュールスクリプト]] :
[[モジュールワーカースクリプトグラフのfetch]]を実行します。
[FIG(list members)[
: [VAR[URL]] : [VAR[ジョブ]]の[F[スクリプトURL]]
: [VAR[fetchクライアント設定群オブジェクト]] :
[VAR[ジョブ]]の[F[クライアント][サービスワーカークライアント]]
: [VAR[[[終点]]]] : [CODE[serviceworker]]
: [VAR[credentialsモード]] : [CODE[omit][credentialsモード]]
: [VAR[モジュール写像設定群オブジェクト]] :
@@ この[[サービスワーカー]]用に作られる[[環境設定群オブジェクト]]
: [VAR[fetchの実行]] : [[サービスワーカー]]用の処理
([VAR[登録]]、[VAR[ジョブ]]、[VAR[最新ワーカー]]を参照します。
[VAR[HTTPS状態]]、[VAR[参照元ポリシー]]を設定することがあります。)
: [VAR[続きの処理]] : >>127
]FIG]
]FIG]
]FIG]

[127] [VAR[スクリプト]]についての続きの処理は、次のようにします [SRC[>>113]]。

[FIG(steps)[
= [129] [VAR[スクリプト]]が [CODE[null]] の場合、
== [128] [VAR[ジョブ]]と [CODE(JS)@en[TypeError]] について[[ジョブ約束を拒絶]]します。
== [130] [VAR[最新ワーカー]]が [CODE[null]] の場合、
=== [131] [VAR[登録]]について[[登録を消去]]します。
=== [132] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
=== [133] ここで停止します。
= [134] 次の''すべて''を満たす場合:
[FIG(list)[
- [135] [VAR[最新ワーカー]]が [CODE[null]] 以外
- [136] [VAR[最新ワーカー]]の[F[スクリプトURL][サービスワーカー]]が[VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]と[VAR[素片識別子除外フラグ]]を設定して[[等価][URL等価]]
- [137] [VAR[スクリプト]]の[F[ソーステキスト]]と[VAR[最新ワーカー]]の[F[ソーステキスト]]が[[バイト列]]として等しい
- [138] [VAR[スクリプト]]が[[古典スクリプト]]の場合、
-- [139] [VAR[スクリプト]]の[F[モジュール記録]]の [F(ss)[ECMAScriptCode]]
が[VAR[最新ワーカー]]の[F[スクリプト資源]]の[F[モジュール記録]]の [F(ss)[ECMAScriptCode]]
と[[バイト列]]として等しい
]FIG]
== [140] [VAR[ジョブ]]と[VAR[登録]]の [CODE(DOMi)@en[ServiceWorkerRegistration]]
について[[ジョブ約束を解決]]します。
== [141] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
== [142] ここで停止します。
= [143] [VAR[ワーカー]]を、新しい[[サービスワーカー]]に設定します。
[FIG(list members)[ [144] [[サービスワーカー]]
: [F[識別子][サービスワーカー]] : 新しい固有の[[不透明]]文字列
: [F[スクリプトURL][サービスワーカー]] : [VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]
: [F[スクリプト資源]] : [VAR[スクリプト]]
: [F[型][ワーカー型]] : [VAR[ジョブ]]の[F[ワーカー型]]
]FIG]
= [145] [VAR[ワーカー]]の[F[スクリプト資源]]の[F[HTTPS状態]]を、[VAR[HTTPS状態]]に設定します。
= [146] [VAR[ワーカー]]の[F[スクリプト資源]]の[F[参照元ポリシー]]を、[VAR[参照元ポリシー]]に設定します。
= [147] [VAR[結果]]を、[[サービスワーカーを走らせる]]処理を実行した結果に設定します。
[FIG(list members)[
: [VAR[ワーカー]] : [VAR[ワーカー]]
: [VAR[force bypass cache for importscripts flag]] : [VAR[ジョブ]]の [F[force bypass cache for importscripts flag]]
]FIG]
= [148] [VAR[結果]]が[[失敗]]の場合、
== [149] [VAR[ジョブ]]と [CODE(JS)@en[TypeError]] について[[ジョブ約束を拒絶]]します。
== [150] [VAR[最新ワーカー]]が [CODE[null]] の場合、
=== [151] [VAR[登録]]について[[登録を消去]]します。
== [152] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
== [153] ここで停止します。
= [154] [VAR[ジョブ]]、[VAR[ワーカー]]、[VAR[登録]]、[VAR[ジョブキュー]]について[[インストール][インストール (サービスワーカー)]]します。
]FIG]

[156] [[更新][更新ジョブ]]は、[[ジョブを走らせる]]処理の他に、
[[登録][登録ジョブ]]からも呼び出されます。

-*-*-

[169] [DFN[[RUBYB[インストール]@en[Install]]]]は、
[VAR[ジョブ]]、[VAR[ワーカー]]、[VAR[登録]]、[VAR[ジョブキュー]]を次のようにします
[SRC[>>168]]。

[FIG(steps)[
= [170] [VAR[失敗]]を、[[偽]]に設定します。
= [198] [VAR[完了時]]を、[[すべて終わったら実行]]に設定します。
= [171] [VAR[最新ワーカー]]を、[VAR[登録]]の[[最新ワーカーの取得]]の結果に設定します。
= [172] [VAR[登録]]、[CODE[installing]]、[VAR[ワーカー]]について[[登録状態更新]]します。
= [173] [VAR[登録]]の[F[インストール中ワーカー]]と[[インストール中]]、
[VAR[完了時]]について[[ワーカー状態の更新]]を実行します。
= [174] [VAR[ジョブ]]と[VAR[登録]]の [CODE(DOMi)@en[ServiceWorkerRegistration]] について[[ジョブ約束の解決]]をします。
= [175] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[処理]] :
[FIG(steps)[
= 
@@ [176] 
[[サービスワーカークライアント]]であって[F[作成URL]]が[VAR[登録]]の[F[適用範囲URL]]と[[サービスワーカー登録一致]]するものの [CODE(DOMi)@en[ServiceWorkerRegistration]] や、
[[サービスワーカー]]であって[F[containing service worker registration]] が[VAR[登録]]であるものについて、順に、
== [177] [[イベントを発火]]します。
[FIG(list members)[
: [VAR[[[イベント型]]]] : [CODE(DOMe)@en[updatefound]]
]FIG]
]FIG]
: [VAR[[[タスク源]]]] : ?
]FIG]
= [178] [VAR[インストール中ワーカー]]を、[VAR[登録]]の[F[インストール中ワーカー]]に設定します。
= [179] [VAR[インストール中ワーカー]]と[VAR[ジョブ]]の [F[force bypass cache flag]]
について、[[サービスワーカーを走らせる]]処理を実行します。
= [180] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[処理]] : >>197
: [VAR[捨てる処理]] : 失敗の時の処理 (>>182)
: [VAR[[[タスク源]]]] : ?
]FIG]
]FIG]

[197] タスクは、次のようにします [SRC[>>168]]。

[FIG(steps)[
= [181] [[イベントを発火]]します。
[FIG(list members)[
: [VAR[[[インターフェイス][イベントインターフェイス]]]] : [CODE(DOMi)@en[InstallEvent]]
: [VAR[[[イベント型]]]] : [CODE(DOMe)@en[install][InstallEvent]]
: [VAR[[[対象][イベント対象]]]] : [VAR[インストール中ワーカー]]の[F[大域オブジェクト]]
: [VAR[[F[pending promises count]] が [N[0]] になった時の処理]] : 
失敗の時の処理 (>>182)
]FIG]
[[サービスワーカーの終端]]で中断された場合、
[[並列に]]、失敗の時の処理 (>>182) をします。
= [189] [VAR[登録]]の[F[インストール中ワーカー]]の[F[imported scripts updated flag]]
を、[[真]]に設定します。
= [190] [VAR[登録]]の[F[待機中ワーカー]]が [CODE[null]] でない場合、
== [191] [VAR[登録]]の[F[待機中ワーカー]]について、[[サービスワーカーの終端]]を実行します。
== [192] [VAR[登録]]の[F[待機中ワーカー]]、「冗長」、[VAR[完了時]]について、
[[ワーカー状態の更新]]を実行します。
= [193] [VAR[登録]]と[CODE[waiting]]と[VAR[登録]]の[F[インストール中ワーカー]]について、
[[登録状態の更新]]を実行します。
= [194] [VAR[登録]]と[CODE[installing]]と[CODE[null]]について、
[[登録状態の更新]]を実行します。
= [195] [VAR[登録]]の[F[待機中ワーカー]]、「インストール済み」、[VAR[完了時]]について、
[[ワーカー状態の更新]]を実行します。
= [196] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]を実行します。
= [199] [VAR[完了時]]について完了時に[VAR[登録]]について[[活性化挑戦]]します。

]FIG]

[182] 失敗の時の処理は、次のようにします [SRC[>>168]]。

[FIG(steps)[
= [183] [VAR[失敗]]を、[[真]]に設定します。
= [184] [VAR[登録]]の[F[インストール中ワーカー]]と「冗長」について、
[[ワーカー状態の更新]]を実行します。
= [185] [CODE[installing]] と [CODE[null]] について[[登録状態の更新]]を実行します。
= [186] [VAR[最新ワーカー]]が [CODE[null]] の場合、
== [187] [VAR[登録]]について[[登録消去]]を実行します。
= [188] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]を実行します。
]FIG]




** 登録解除

[166] [[ジョブ][サービスワーカージョブ]]の[F[ジョブ型]]の[DFN[[RUBYB[[[登録解除][登録解除ジョブ]]]@en[unregister]]]]
[SRC[>>86]]。


[202] [[プッシュ購読の非活性化]]

** 管理

[9] [[利用者エージェント]]は、[DFN[[F[scope to registration map]]]] を持ちます。
これは[[順序付き写像]]であって、
[[キー]]は[[適用範囲URL]]で、[[値]]は[[サービスワーカー登録]]です。
[SRC[>>84, >>2]]

;; [10] [[サービスワーカー登録]]の[[寿命]]は、 [CODE(DOMi)@en[ServiceWorkerRegistration]]
[[オブジェクト]]の[[寿命]]より長いです。 [SRC[>>2]]

[5] [F[適用範囲URL]]が同じ[[サービスワーカー登録]]が既にあれば、新しいもので置き換えられます。
[SRC[>>2]]

[4] [[利用者エージェント]]は、[F[適用範囲URL]]が異なる限り、
同じ[[起源]]の複数の[[サービスワーカー登録]]を有効化して構いません。
[SRC[>>2]]

@@ [20] [[scope to registration map]] 追加時に [CODE[ready]] の処理

** 選択

[11] [[サービスワーカークライアント]][VAR[クライアント]]は、
[VAR[要求]]の処理に当たり、
[[サービスワーカー登録]]を次のように[DFN[[RUBYB[選択]@en[select]]]]します [SRC[>>12]]。

[FIG(steps)[
= [13] [VAR[要求]]の[F[URL][要求URL]]が[F[局所][局所URL]]で''ない''なら、
== [14] [VAR[クライアント]]が[[利用者エージェント]]の [F[scope to registration map]] から[[サービスワーカー登録一致]]した結果を返します。
= [15] それ以外の場合、
== [16] [VAR[クライアント]]の[F[有責閲覧文脈]]が[[入れ子閲覧文脈]]の場合、
=== [18] [VAR[クライアント]]の[F[親閲覧文脈]]の環境の[[サービスワーカー登録]]を
(あれば) 返します。
== [19] [VAR[クライアント]]が[[ワーカークライアント]]なら、
=== [17] [VAR[クライアント]]の[F[ワーカーの文書群]]のいずれかの環境の[[サービスワーカー登録]]を
(あれば) 返します。
]FIG]

@@ [DFN[サービスワーカー登録の一致]]

** clear

[203] clear 時、[[プッシュ購読]]は削除されます。

* 文脈

[6] [[サービスワーカー]]は、[DFN[[F[containing service worker registration]]]]
を持ちます。値は[[サービスワーカー登録]]です。 [SRC[>>1]]

[7] [[サービスワーカー]]の[F[containing service worker registration]]は、
その[[サービスワーカー]]を含むものです。 [SRC[>>1]]


[200] [CITE@en[How to create registration objects (#1445)]]
([[jakearchibald]]著, [TIME[2019-07-01 17:55:21 +09:00]])
<https://github.com/w3c/ServiceWorker/commit/7c07a47c06d9f1eb6de5c9580fa8a50382d37a14>

[201] [CITE@en[How to create registration objects by jakearchibald · Pull Request #1445 · w3c/ServiceWorker]]
([TIME[2020-01-12 15:02:20 +09:00]])
<https://github.com/w3c/ServiceWorker/pull/1445>