1. 導入
サービスワーカーは、オリジンストレージによってのみ制限されるサイズのアセットをフェッチし、キャッシュする能力を持っています。ただし、ユーザーがサイトから離れたりブラウザを閉じたりすると、サービスワーカーは終了される可能性があります。これは、waitUntil()
に渡された未解決のプロミスがある場合でも発生する可能性があります。数分以内に解決されない場合、ブラウザはこれをサービスワーカーの乱用と見なしてプロセスを終了することがあります。
これはバッテリーとプライバシーにとっては優れていますが、ポッドキャストや映画などの大きなアセットをダウンロードしてキャッシュしたり、動画や画像をアップロードしたりするのが難しくなります。
この仕様の目的は以下の通りです:
-
ユーザーがオリジンへのすべてのウィンドウやワーカーを閉じても、フェッチ(リクエスト&レスポンス)を続行できるようにする。
-
アプリによって定義されたように、多くのリクエストを含む単一のジョブを可能にする。
-
ブラウザ/OSがそのジョブの進行状況を示すUIを表示し、ユーザーが一時停止/中止できるようにする。
-
接続が不安定な場合に、ブラウザ/OSがダウンロードを一時停止/再開することを可能にする。
-
アプリがジョブの成功/失敗に反応し、結果をキャッシュするなどの対応を可能にする。
-
バックグラウンドでフェッチされたリソースにフェッチ中にアクセスできるようにする。
2. レルム
すべてのプラットフォームオブジェクトは、特に指定がない限り、コンテキストオブジェクトの関連するレルム内で作成されます。
3. インフラストラクチャ
リソースは、ユーザーエージェントがリソースがまもなく利用可能になると考える場合、一時的に利用不可と見なされます。理由には以下が含まれる場合があります:
-
ユーザーエージェントがオフラインである。
-
ユーザーエージェントがキャプティブポータルの背後にいる。
バックグラウンドフェッチタスクソースは、タスクソースです。
3.1. サービスワーカー登録の拡張
サービスワーカー登録には以下が追加されます:
-
アクティブなバックグラウンドフェッチ (マップ)。各キーはDOMStringであり、各項目はバックグラウンドフェッチです。初期状態では空のマップです。
-
アクティブなバックグラウンドフェッチ編集キュー (並列キュー)。初期状態では新しい並列キューを開始する結果です。
3.2. バックグラウンドフェッチ
バックグラウンドフェッチは以下で構成されます:
-
ID (DOMString)。
-
レコード (リスト of バックグラウンドフェッチレコード)。
-
タイトル (DOMString)。
-
ダウンロード合計 (数値)。
-
アップロード合計 (数値)。
-
アップロード済み (数値)、初期値は0。
-
結果 (
BackgroundFetchResult
)、 初期値は空文字列。 -
失敗理由 (
BackgroundFetchFailureReason
)、 初期値は空文字列。 -
レコード利用可能フラグ 初期状態では設定済み。
-
アイコン (リスト of
ImageResource
)。 -
サービスワーカー登録 (サービスワーカー登録)。
-
更新処理キュー (並列キュー)。初期状態では新しい並列キューを開始する結果。
-
一時停止フラグ、初期状態では未設定。
-
すべて中止フラグ、初期状態では未設定。
3.2.1. 表示
-
UIはbgFetchのサービスワーカー登録のスコープURLのオリジンを目立つ形で表示しなければなりません。
-
もしbgFetchの一時停止フラグが未設定であり、bgFetchの結果が空文字列でない場合、UIは帯域幅が使用されていることを示さなければなりません。
-
bgFetchの結果が空文字列でない限り、UIは中止されることなく(例: スワイプで閉じられる)解消されてはなりません。
-
UIはbgFetchのタイトルを表示することができます。
-
UIはbgFetchのアイコンから表示用の画像リソース (icon) を選択し、処理に成功した後、新しいリクエストを使用してフェッチすることができます。そのプロパティは以下の通りです:
- URL
-
iconのsrc。
- クライアント
-
environment。
- Keepaliveフラグ
-
設定済み。
- サービスワーカーモード
-
"
none
"。 - 宛先
-
"
image
"。 - モード
-
"
no-cors
"。 - 認証モード
-
"
include
"。
-
UIはbgFetchのダウンロード合計、アップロード合計、保存されたボディバイトの合計、アップロード済み、一時停止フラグ、および結果を使用してフェッチの進行状況を表示することができます。
-
UIはユーザーがbgFetchを中止できるようにbgFetchのすべて中止フラグを設定する方法を提供しなければなりません。
-
もしbgFetchのリクエストがすべてメソッド `
GET
`である場合、UIはbgFetchの一時停止フラグを切り替える方法を提供することができます。注記: メソッドが`
GET
`でない場合、リクエストを再発行すると望ましくない副作用が生じる可能性があります。 -
UIはアクティブ化される可能性があります(例: クリックによって)、その場合バックグラウンドフェッチクリックイベントを発火します。
-
操作が完了してもUIが維持される場合があります。この場合、UIは引き続きアクティブ化可能です。
permissionをPermissionDescriptor
として許可状態を取得します。そのname
は"background-fetch"
で、environmentで指定されます。もしpermissionが"prompt"
である場合、ユーザーエージェントはこのアルゴリズムの開始時にbgFetchの一時停止フラグを設定することができます。ユーザーエージェントはユーザーがバックグラウンドフェッチを受け入れる(bgFetchの一時停止フラグを解除する)か、拒否する(bgFetchのすべて中止フラグを設定する)ことを許可すべきです。ユーザーエージェントは常に許可または常に拒否するオプションを提供することもできます。これをこの許可に対するユーザーの意図に関する新情報として使用することができます。
ユーザーが従量制接続を使用している場合や、バックグラウンドでバックグラウンドフェッチが開始された場合、ユーザーエージェントはbgFetchの一時停止フラグを設定することも検討できます。
3.3. バックグラウンドフェッチレコード
バックグラウンドフェッチレコードは以下で構成されます:
-
リクエスト (リクエスト)。
-
応答データ (バックグラウンドフェッチ応答)、初期値は新しいバックグラウンドフェッチ応答。
3.4. バックグラウンドフェッチ応答
バックグラウンドフェッチ応答は以下で構成されます:
-
応答 (応答またはnull)、初期値はnull。
-
結果 (
BackgroundFetchFailureReason
、"success"
、または"redundant"
)、初期値は空文字列。
応答は公開される場合があります。その場合結果が空文字列、"success"
、または"bad-status"
である必要があります。
4. アルゴリズム
4.1. バックグラウンドフェッチを実行する
注記: これはバックグラウンドフェッチの「バックグラウンド」部分を管理するアルゴリズムです。バックグラウンドフェッチごとにこのアルゴリズムのインスタンスは1つしか実行されません。
-
swRegistrationをbgFetchのサービスワーカー登録とします。
-
settledFetchesを0に設定します。
-
immediateFailureをfalseに設定します。
-
failureReasonを空文字列に設定します。
-
settledFetchesがbgFetchのレコードのサイズに等しいか、またはimmediateFailureがtrueになるまで待ちます。
-
もしimmediateFailureがtrueである場合、bgFetchのすべて中止フラグを設定します。
注記: レコードを完了するアルゴリズムはこのフラグを監視し、設定されるとフェッチを終了します。
-
以下の手順をキューに追加するをswRegistrationのアクティブなバックグラウンドフェッチ編集キューに対して実行します:
-
activeBgFetchesをswRegistrationのアクティブなバックグラウンドフェッチとします。
-
idをbgFetchのIDとします。
-
もしactiveBgFetchesがバックグラウンドフェッチを含むなら、activeBgFetches[id]を削除します。
-
それ以外の場合、failureReasonを
"aborted"
に設定します。注記: これは、
abort()
が正常に呼び出されたが、同時にフェッチの1つが失敗した場合の競合状態を処理します。abort()
からtrueが返された場合、これにより関連する中止イベントが発生します。 -
もしfailureReasonが空文字列でない場合:
-
それ以外の場合、bgFetchの結果を
"success"
に設定します。 -
バックグラウンドフェッチインスタンスを更新する をbgFetchに対して実行します。
-
eventNameを空文字列に設定します。
-
eventConstructorをnullに設定します。
-
もしfailureReasonが
"aborted"
である場合:-
eventNameを"
backgroundfetchabort
"に設定します。 -
eventConstructorを
BackgroundFetchEvent
に設定します。
-
-
それ以外の場合、もしfailureReasonが空文字列でない場合:
-
eventNameを"
backgroundfetchfail
"に設定します。 -
eventConstructorを
BackgroundFetchUpdateUIEvent
に設定します。
-
-
それ以外の場合:
-
eventNameを"
backgroundfetchsuccess
"に設定します。 -
eventConstructorを
BackgroundFetchUpdateUIEvent
に設定します。
-
-
機能イベントを発火するをeventNameを名前としてeventConstructorを使用し、swRegistrationで以下のプロパティを持つイベントを実行します:
登録
-
イベントオブジェクトの関連するレルムにおいてbgFetchのBackgroundFetchRegistrationインスタンスを取得する結果。
その後dispatchedEventを並列で以下の手順を実行します:
-
dispatchedEventがアクティブでなくなるまで待ちます。
-
bgFetchのレコード利用可能フラグを未設定にします。
-
バックグラウンドフェッチインスタンスを更新するをbgFetchに対して実行します。
-
4.2. レコードを完了する
注: このアルゴリズムは、バックグラウンドフェッチレコードのフェッチを管理します。 このアルゴリズムのインスタンスは、バックグラウンドフェッチレコードごとに1つ開始されますが、 フェッチを再試行したり、部分的なレスポンスの次の部分をフェッチするために再帰的に呼び出されます。
-
responseDataをrecordのレスポンスデータとします。
-
downloadTotalをbgFetchのダウンロード合計とします。ただし0でない場合はその値を、それ以外の場合は無限大とします。
-
bgFetchの一時停止フラグが解除されるのを待ちます。
-
requestをrecordのリクエストのコピーとします。
注: この時点でリクエストは完全にストレージに保持されています。ストリームとして開始された場合でも同様です。
-
requestのkeepalive フラグを設定します。
-
requestのサービスワーカーモードを"
none
"に設定します。 -
rangeStartをresponseDataの長さとします。
-
もしrangeStartが0でない場合は、Range ヘッダーを追加してrequestにrangeStartを設定します。
注: rangeStartが0の場合、通常のリクエストが行われます。これにより、初期リクエストでコンテンツエンコーディングを利用できます。
Accept-Encoding: identity
がRangeヘッダーを持つリクエストに追加されるためです。 -
fetchAttemptCompleteを false とします。
-
lastTransmittedSizeを 0 とします。
-
Fetch requestを実行します。
このステップの残りの部分では、Fetch "callbacks" を使用していますが、現在タスクをキューに入れています。これは望ましくも可能でもないため、タスクがキューに入っていないと仮定します。(issue)
requestのリクエストボディを処理するには、以下の手順を実行します:
-
bgFetchのアップロード済みをtransmittedSizeから lastTransmittedSizeを引いた値で増加させます。
-
lastTransmittedSizeをtransmittedSizeに設定します。
レスポンスを処理するには、responseに対して以下の手順を実行します:
-
responseがネットワークエラーの場合:
-
リソースが一時的に利用できない状態であり、 requestのmethodが `
GET
`の場合、リソースが一時的に利用できない状態でなくなるまで 待機し、fetchAttemptCompleteをtrueに設定してこれらの手順を中止します。注: requestのmethodが `
GET
`でない場合、リクエストを再発行することで意図しない副作用が 発生する可能性があります。リクエストを再開する標準的な方法が利用可能になった場合、 それがここで採用されます。 -
responseが中止されたネットワークエラー の場合、responseDataのresultを
"aborted"
に設定し、それ以外の場合は"fetch-error"
に設定します。 -
fetchAttemptCompleteをtrueに設定して、これらの手順を中止します。
-
-
responseのstatusが
206
の場合:-
もし部分レスポンスを検証するがrangeStart、response、およびresponseDataのレスポンスに対して無効を返す場合、次を実行します:
-
responseDataのresultを
"fetch-error"
に設定します。 -
fetchAttemptCompleteをtrueに設定します。
-
進行中のフェッチを終了し、 これらの手順を中止します。
-
-
-
それ以外の場合:
-
responseDataのresultを
"redundant"
に設定します。 -
responseDataを新しいバックグラウンドフェッチレスポンス に設定します。
-
recordのレスポンスデータ をresponseDataに設定します。
注: レコードオブジェクトの作成アルゴリズムは、 前のバックグラウンドフェッチレスポンス への参照を保持する場合があります。
-
-
rangeStartが0であるか、responseのstatusが
206
でない場合、 responseDataのresponseをresponse のコピーに設定します。ただしbodyを除きます。 -
streamから1バイト以上が送信された場合は、bytesを送信されたバイト数 として以下の手順を実行します:
-
bgFetchの保存されたボディ バイト合計にbytesのサイズを加算した値が downloadTotalを超える場合:
-
streamをキャンセル します。
-
responseDataのresultを
"download-total-exceeded"
に設定し、fetchAttemptCompleteをtrueに設定してこれらの手順を中止します。
-
-
bytesをresponseDataのbytesに追加します。
-
前の手順がクォータ制限を超えたために失敗した場合、responseDataのresultを
"quota-exceeded"
に設定し、fetchAttemptCompleteをtrueに設定してこれらの手順を中止します。
-
-
任意の時点でstreamのバイト送信が正常に完了した場合:
-
responseのstatusが
206
である場合:-
firstBytePos、lastBytePos、および completeLengthをresponseからcontent-range値を抽出 した結果とします。
-
completeLengthがnullでなく、かつresponseDataのbytesの 長さに等しい場合、 responseDataのresultを
"success"
に設定します。注: リソース全体または残りを要求しても、 サーバーが残りを返さない場合があります。この場合、追加のリクエストを行う必要があります。
-
-
それ以外の場合、responseのstatusがokステータスでない場合、 responseDataのresultを
"bad-status"
に設定します。 -
それ以外の場合、responseDataのresultを
"success"
に設定します。 -
fetchAttemptCompleteをtrueに設定します。
-
-
任意の時点でstreamがエラー状態になった場合:
-
リソースが一時的に利用できない状態であり、 requestのmethodが `
GET
`の場合、リソースが一時的に利用できない状態でなくなるまで 待機し、fetchAttemptCompleteをtrueに設定します。 -
それ以外の場合、responseDataのresultを
"fetch-error"
に設定し、fetchAttemptCompleteをtrueに設定します。
-
-
resultを空文字列とします。
-
以下の手順を実行しますが、中止条件としてbgFetchのpaused flagまたはabort all flagが設定された場合:
-
fetchAttemptCompleteがtrueになるのを待ちます。
-
resultをresponseDataのresultに設定します。
-
-
-
bgFetchのpaused flagが設定されている場合、 requestのmethodが`
GET
`であることを確認します。 -
bgFetchのabort all flagが設定されている場合、 responseDataのresultを
"aborted"
に設定します。 -
resultをresponseDataのresultに設定します。
注: フェッチを終了することで結果が変更される可能性があるため、この時点で結果を保存します。
-
進行中のフェッチを終了します。
-
-
resultが空文字列の場合、レコードを完了するをbgFetchおよび recordに対して実行します。
4.3. バックグラウンドフェッチインスタンスを更新する
-
downloadedをbgFetchの保存されたボディバイト合計とします。
-
uploadedをbgFetchのアップロード済みとします。
-
resultをbgFetchの結果とします。
-
failureReasonをbgFetchの失敗理由とします。
-
recordsAvailableを、bgFetchのレコード利用可能フラグが設定されている場合はtrue、そうでない場合はfalseとします。
-
環境設定オブジェクトのうち、そのオリジンがbgFetchのサービスワーカーレジストレーションの スコープURLのオリジンと等しいものをそれぞれ取り出し、envの責任あるイベントループにバックグラウンドフェッチタスクをキューイングして以下の手順を実行します:
-
bgFetchRegistrationを、BackgroundFetchRegistrationのうち、バックグラウンドフェッチが bgFetchと等しいものとします。該当するインスタンスが存在しない場合はnullとします。
注: BackgroundFetchRegistrationインスタンスを取得するアルゴリズムによって、環境ごとに最大1つ存在します。
-
bgFetchRegistrationがnullの場合、これらの手順を中止します。
-
もしrecordsAvailableがfalseであり、かつbgFetchRegistrationのレコード利用可能フラグが設定されている場合、bgFetchRegistrationのレコード利用可能フラグを解除します。
-
もしbgFetchRegistrationの結果が空文字列でない場合、これらの手順を中止します。
注: これにより、バックグラウンドフェッチが確定した後に進行状況が報告されるのを防ぎます。これは、操作が中止されたが、一部のフェッチがまだ終了していない場合に可能です。
-
以下のすべてが真である場合:
-
bgFetchRegistrationのダウンロード済みが downloadedと等しい。
-
bgFetchRegistrationのアップロード済みが uploadedと等しい。
-
bgFetchRegistrationの結果が resultと等しい。
-
bgFetchRegistrationの失敗理由が failureReasonと等しい。
これらの手順を中止します。
-
-
bgFetchRegistrationのダウンロード済みを downloadedに設定します。
-
bgFetchRegistrationのアップロード済みを uploadedに設定します。
-
bgFetchRegistrationの結果を resultに設定します。
-
bgFetchRegistrationの失敗理由を failureReasonに設定します。
-
イベントを"
progress
"という名前で bgFetchRegistrationに発火します。
-
4.4. バックグラウンドフェッチクリックイベントを発火する
BackgroundFetchEvent
という名前の
"backgroundfetchclick
"の機能イベントを発火する:
registration
-
イベントオブジェクトの関連するRealmで、bgFetchのBackgroundFetchRegistrationインスタンスを取得する結果。
4.5. BackgroundFetchRegistrationインスタンスを取得する
注: このアルゴリズムは、BackgroundFetchRegistrationインスタンスが、BackgroundFetchManager
のライフサイクル全体で特定のバックグラウンドフェッチに対して同じインスタンスを返すことを保証します。ブラウザが最適化を行うことは問題ありませんが、特定のバックグラウンドフェッチに対して複数のインスタンスが作成されたと判別されない限り(例:等価性、拡張プロパティ、または弱い関連データを通じて)。
-
instancesMapを、このrealm内に存在する唯一の
BackgroundFetchManager
のBackgroundFetchRegistrationインスタンスとします。 -
もしinstancesMap[bgFetch]が存在する場合、 instancesMap[bgFetch]を返します。
-
instanceを、このrealm内の新しい
BackgroundFetchRegistration
とし、 そのバックグラウンドフェッチを bgFetchに設定します。 -
instancesMap[bgFetch]をinstanceに設定します。
-
instanceを返します。
4.6. 部分的なレスポンスを検証する
注: このアルゴリズムは、部分的なレスポンスがリクエストされた内容と合理的に一致するかどうかを確認し、オプションで以前のレスポンスと組み合わせるべきかを確認します。
-
断言: partialResponseのステータスが
206
である。 -
responseFirstBytePos、responseLastBytePos、および responseCompleteLengthを、partialResponseからcontent-range値を抽出する結果とします。これが失敗した場合、invalidを返します。
-
もしresponseFirstBytePosがexpectedRangeStartと等しくない場合、invalidを返します。
-
もしpreviousResponseがnullでない場合:
-
《`
ETag
`、`Last-Modified
`》のheaderNameそれぞれに対して: -
もしpreviousResponseのステータスが
206
の場合:-
previousResponseFirstBytePos、 previousResponseLastBytePos、および previousResponseCompleteLengthを、previousResponseからcontent-range値を抽出した結果とします。これが失敗した場合、invalidを返します。
-
もしpreviousResponseCompleteLengthがnullでない場合、かつ responseCompleteLengthが previousResponseCompleteLengthと等しくない場合、invalidを返します。
-
-
-
validを返します。
4.7. Content-Rangeの値を抽出する
注: このアルゴリズムは、Content-Range
を単一バイトのContent-Rangeとして解析し、値を抽出します。
-
contentRangeValueを、responseのヘッダーリスト内で
Content-Range
とバイトケース非依存で一致するヘッダーの最初の値とします。 -
contentRangeValueを単一バイトのContent-Rangeに従って解析して失敗した場合、失敗を返します。
-
firstBytePosを、contentRangeValueを単一バイトのContent-Rangeとして解析した際に
first-byte-pos
という名前の部分を整数として解析したものとします。 -
lastBytePosを、contentRangeValueを単一バイトのContent-Rangeとして解析した際に
last-byte-pos
という名前の部分を整数として解析したものとします。 -
completeLengthを、contentRangeValueを単一バイトのContent-Rangeとして解析した際に
complete-length
という名前の部分とします。 -
もしcompleteLengthが
"*"
である場合、completeLengthをnullに設定し、それ以外の場合はcompleteLengthを整数として解析したものに設定します。 -
firstBytePos、lastBytePos、およびcompleteLengthを返します。
整数としての解析について infra/189を参照。
4.8. レコードオブジェクトを作成する
注: このアルゴリズムは、バックグラウンドフェッチレコードのためのプラットフォームオブジェクトを作成します。また、保存されたバイトからのレスポンスのストリーミングを管理します。この時点でバックグラウンドフェッチ操作がまだ進行中である可能性があります。
すべてのプラットフォームオブジェクトはrealm内で作成されなければなりません。
-
recordObjectsを新しいリストとします。
-
各 recordをrecordsから以下のように処理する:
-
responseDataをrecordのレスポンスデータとします。
-
recordObjectを新しい
BackgroundFetchRecord
とします。 -
recordObjectの
responseReady
を新しいPromiseに設定します。 -
requestObjectを以下の設定を持つ新しい
Request
オブジェクトとします: -
recordObjectの
request
をrequestObjectに設定します。 -
transmittedBytesを0とします。
-
streamを新しいReadable Streamとし、以下の手順を並行して実行するプルアクションを持たせる:
-
responseDataの長さがtransmittedBytesを超えるか、またはresponseDataの結果が空文字列でなくなるのを待つ。
-
bytesをnullとします。
-
もしresponseDataの長さがtransmittedBytesを超え、かつresponseDataが公開可能である場合:
-
タスクをキューに追加し、以下を実行する:
-
もしbytesがnullでない場合:
-
arrayを新しい
Uint8Array
オブジェクトとし、ArrayBuffer
をラップする。
-
-
もしresponseDataが公開可能であり、responseDataの結果が空文字列でなく、かつtransmittedBytesがresponseDataの長さと等しい場合、streamを閉じる。
-
それ以外の場合、もしresponseDataの結果が
"aborted"
である場合、streamをエラー状態にする。
-
-
-
-
recordObjectsを返します。
4.9. バックグラウンドフェッチを含むか
-
もしmapがバックグラウンドフェッチを含む bgFetchの場合、falseを返します。
-
trueを返します。
5. ヘッダー構文
以下はHTTP ABNFで定義された単一バイトのContent-Rangeの構文です:
"bytes=" first-byte-pos "-" last-byte-pos "/" complete-length first-byte-pos = 1*DIGIT last-byte-pos = 1*DIGIT complete-length = ( 1*DIGIT / "*" )
注: これはRFC 7233で許可されている構文のサブセットです。
上記をレールロード図にした場合:
6. API
6.1.
拡張 ServiceWorkerGlobalScope
partial interface ServiceWorkerGlobalScope {attribute EventHandler ;
onbackgroundfetchsuccess attribute EventHandler ;
onbackgroundfetchfail attribute EventHandler ;
onbackgroundfetchabort attribute EventHandler ; };
onbackgroundfetchclick
6.1.1. イベント
以下は、すべてのServiceWorker
インターフェイスを実装するオブジェクトによって、イベントハンドラーIDL属性としてサポートされるべきイベントハンドラー(およびその対応するイベントハンドラーイベントタイプ)です:
イベントハンドラーイベントタイプ | イベントハンドラー | インターフェイス |
---|---|---|
backgroundfetchsuccess
| onbackgroundfetchsuccess
| BackgroundFetchUpdateUIEvent
|
backgroundfetchfail
| onbackgroundfetchfail
| BackgroundFetchUpdateUIEvent
|
backgroundfetchabort
| onbackgroundfetchabort
| BackgroundFetchEvent
|
backgroundfetchclick
| onbackgroundfetchclick
| BackgroundFetchEvent
|
6.2. 拡張 ServiceWorkerRegistration
partial interface ServiceWorkerRegistration {readonly attribute BackgroundFetchManager backgroundFetch ; };
ServiceWorkerRegistration
には、バックグラウンドフェッチマネージャ
(BackgroundFetchManager
)
が含まれます。初期状態では、新しいBackgroundFetchManager
であり、そのサービスワーカーレジストレーション
はコンテキストオブジェクトのサービスワーカーレジストレーションです。
backgroundFetch
属性のgetterは、コンテキストオブジェクトのバックグラウンドフェッチマネージャ
を返さなければなりません。
6.3.
BackgroundFetchManager
[Exposed =(Window ,Worker )]interface {
BackgroundFetchManager Promise <BackgroundFetchRegistration >fetch (DOMString , (
id RequestInfo or sequence <RequestInfo >),
requests optional BackgroundFetchOptions = {});
options Promise <BackgroundFetchRegistration ?>get (DOMString );
id Promise <sequence <DOMString >>getIds (); };dictionary {
BackgroundFetchUIOptions sequence <ImageResource >;
icons DOMString ; };
title dictionary :
BackgroundFetchOptions BackgroundFetchUIOptions {unsigned long long = 0; };
downloadTotal
BackgroundFetchManager
には以下が含まれます:
-
BackgroundFetchRegistration インスタンス(マップ)で、キーがバックグラウンドフェッチ、値が
BackgroundFetchRegistration
オブジェクトです。初期状態では空のマップです。 -
サービスワーカーレジストレーション(サービスワーカーレジストレーション)です。
6.3.1. fetch()
fetch(id, requests, options)
メソッドを呼び出すと、以下の手順を実行します:
-
registrationをコンテキストオブジェクトのサービスワーカーレジストレーションとします。
-
recordsを新しいリストとします。
-
uploadTotalを0とします。
-
もしrequestsが
RequestInfo
の場合、requestsを« requests »に設定します。 -
もしrequestsが空の場合、 Promiseを以下で拒否された状態で返します:
TypeError
。 -
各requestをrequestsから以下のように処理します:
-
internalRequestを、以下を実行した結果のリクエストとします:
Request
コンストラクタをrequestと共に呼び出します。これが例外をスローした場合、Promiseを例外で拒否された状態で返します。 -
もしinternalRequestのモードが"
no-cors
"の場合、 Promiseを以下で拒否された状態で返します:TypeError
。 -
internalRequestのクライアントをnullに設定します。
-
recordを新しいバックグラウンドフェッチレコードとします。
-
recordのリクエストをinternalRequestに設定します。
-
リストに追加としてrecordをrecordsに追加します。
-
-
promiseを新しいPromiseとします。
-
以下の手順をエンキューとして registrationのアクティブなバックグラウンドフェッチ編集キューに追加します:
-
permissionを、以下を満たす権限状態とします:
PermissionDescriptor
のname
が"background-fetch"
であり、コンテキストオブジェクトの関連設定オブジェクトです。 -
もしpermissionが
"denied"
である場合、promiseを以下で拒否して手順を中止します:NotAllowedError
DOMException
。 -
bgFetchMapをregistrationのアクティブなバックグラウンドフェッチとします。
-
もしregistrationのアクティブワーカーがnullである場合、promiseを以下で拒否して手順を中止します:
TypeError
。 -
以下のプロパティを持つ新しいbgFetchを作成し、bgFetchMap[id]に設定します:
- id
-
id。
- records
-
records。
- download total
-
optionsの
downloadTotal
メンバー。 - upload total
-
uploadTotal。
- icons
-
optionsの
icons
メンバーが存在する場合それを使用し、存在しない場合は空のリスト。 - title
-
optionsの
title
メンバーが存在する場合それを使用し、存在しない場合は空文字列。 - service worker registration
-
registration。
-
Bgfetchタスクをキューに追加して以下を実行:
-
Promiseを解決し、BackgroundFetchRegistrationインスタンスを取得し bgFetchをコンテキストオブジェクトの関連するRealmで返します。
-
-
並行して、bgFetchを表示します。
-
並行して、バックグラウンドフェッチを実行します。
-
-
promiseを返します。
6.3.2.
get()
get(id)
メソッドを呼び出すと、新しいPromise promiseを返し、以下の手順を並行して実行します:
-
registrationをコンテキストオブジェクトに関連付けられたサービスワーカーレジストレーションとします。
-
bgFetchをregistrationのアクティブなバックグラウンドフェッチ[id]とします。
-
もしbgFetchが未定義の場合、Promiseを解決してpromiseに未定義を設定し、これらの手順を中止します。
-
以下の手順をエンキューとしてbgFetchの更新処理キューに追加します:
-
Bgfetchタスクをキューに追加としてtaskを実行し、以下の手順を実行します:
-
bgFetchRegistrationを、BackgroundFetchRegistrationインスタンスを取得してbgFetchをコンテキストオブジェクトの関連するRealmに設定した結果とします。
-
Promiseを解決してpromiseにbgFetchRegistrationを設定します。
-
-
taskが完了するのを待ちます。
注: これにより、新しい
BackgroundFetchRegistration
インスタンスがprogress
イベントを見逃さないことを保証します。
-
6.3.3. getIds()
getIds()
メソッドを呼び出すと、新しいPromise promiseを返し、以下の手順を並行して実行します:
-
registrationをコンテキストオブジェクトに関連付けられたサービスワーカーレジストレーションとします。
-
Promiseを解決してpromiseに以下の結果を設定します: キーを取得したregistrationのアクティブなバックグラウンドフェッチ。
6.4.
BackgroundFetchRegistration
[Exposed =(Window ,Worker )]interface :
BackgroundFetchRegistration EventTarget {readonly attribute DOMString id ;readonly attribute unsigned long long uploadTotal ;readonly attribute unsigned long long uploaded ;readonly attribute unsigned long long downloadTotal ;readonly attribute unsigned long long downloaded ;readonly attribute BackgroundFetchResult result ;readonly attribute BackgroundFetchFailureReason failureReason ;readonly attribute boolean recordsAvailable ;attribute EventHandler onprogress ;Promise <boolean >abort ();Promise <BackgroundFetchRecord >match (RequestInfo ,
request optional CacheQueryOptions = {});
options Promise <sequence <BackgroundFetchRecord >>matchAll (optional RequestInfo ,
request optional CacheQueryOptions = {}); };
options enum {
BackgroundFetchResult ,
"" ,
"success" };
"failure" enum { // バックグラウンドフェッチがまだ完了していない、または成功した場合。
BackgroundFetchFailureReason , // 操作がユーザーによって中止されたか、abort() が呼び出された場合。
"" , // レスポンスが「not-ok-status」だった場合。
"aborted" , // CORS、MIX、不正な部分レスポンス、または再試行できない一般的なネットワークエラーなど、その他の理由でフェッチが失敗した場合。
"bad-status" , // 操作中にストレージのクォータに到達した場合。
"fetch-error" , // 提供された downloadTotal を超えた場合。
"quota-exceeded" };
"download-total-exceeded"
BackgroundFetchRegistration
インスタンスには以下が含まれます:
-
バックグラウンドフェッチ (バックグラウンドフェッチ)。
-
ダウンロード済み (数値)、 初期値はバックグラウンドフェッチの保存されたボディバイト合計のコピー。
-
アップロード済み (数値)、 初期値はバックグラウンドフェッチのアップロード済みのコピー。
-
結果 (
BackgroundFetchResult
)、 初期値はバックグラウンドフェッチの結果のコピー。 -
失敗理由 (
BackgroundFetchFailureReason
)、 初期値はバックグラウンドフェッチの失敗理由のコピー。 -
ID (数値)、バックグラウンドフェッチのIDのコピー。
-
アップロード合計 (数値)、バックグラウンドフェッチのアップロード合計のコピー。
-
ダウンロード合計 (数値)、バックグラウンドフェッチのダウンロード合計のコピー。
-
レコード利用可能フラグ。 初期値はバックグラウンドフェッチのレコード利用可能フラグが設定されている場合に設定され、そうでない場合は未設定。
注: 上記の値は同期的に利用可能なようにコピーされています。
ID
属性のgetterはコンテキストオブジェクトのIDを返さなければなりません。
uploadTotal
属性のgetterはコンテキストオブジェクトのアップロード合計を返さなければなりません。
downloadTotal
属性のgetterはコンテキストオブジェクトのダウンロード合計を返さなければなりません。
uploaded
属性のgetterはコンテキストオブジェクトのアップロード済みを返さなければなりません。
downloaded
属性のgetterはコンテキストオブジェクトのダウンロード済みを返さなければなりません。
result
属性のgetterはコンテキストオブジェクトの結果を返さなければなりません。
failureReason
属性のgetterはコンテキストオブジェクトの失敗理由を返さなければなりません。
recordsAvailable
属性のgetterは、コンテキストオブジェクトのレコード利用可能フラグが設定されている場合にtrueを、そうでない場合にfalseを返さなければなりません。
6.4.1. イベント
onprogress
イベントハンドラーのイベントハンドラーイベントタイプはprogress
です。
progress
イベントはEvent
インターフェースを使用します。
6.4.2. abort()
abort()
メソッドは、呼び出された時、新しいPromise promiseを返し、以下の手順を並行して実行しなければなりません:
-
bgFetchをコンテキストオブジェクトに関連付けられたバックグラウンドフェッチとします。
-
swRegistrationをbgFetchのサービスワーカーレジストレーションとします。
-
以下の手順をエンキューとして swRegistrationのアクティブなバックグラウンドフェッチ編集キューに追加します:
-
activeBgFetchesをswRegistrationのアクティブなバックグラウンドフェッチとします。
-
idをbgFetchのIDとします。
-
もしactiveBgFetchesがバックグラウンドフェッチを含まない bgFetchである場合、 Promiseを解決してpromiseにfalseを設定し、これらの手順を中止します。
-
activeBgFetches[id]を削除します。
-
Promiseを解決してpromiseにtrueを設定します。
-
bgFetchのすべて中止フラグを設定します。
-
6.4.3. match()
match(request, options)
メソッドは、呼び出された時、以下の手順を実行しなければなりません:
-
promiseを次のアルゴリズムを呼び出した結果とします:
matchAll()
にrequestとoptionsを渡します。 -
Promiseが解決された時に実行する手順の結果を返します。 その結果、promiseにmatchesを渡し、matches[0]を返します。
注: ユーザーエージェントは上記を最適化し、matchAll()
を呼び出すよりも高速にすることが推奨されます。
6.4.4. matchAll()
matchAll(request, options)
メソッドは、呼び出された時、以下の手順を実行しなければなりません:
-
もしコンテキストオブジェクトのレコード利用可能フラグが未設定の場合、 Promiseを以下で拒否して返します:
InvalidStateError
DOMException
。 -
promiseを新しいPromiseとします。
-
以下の手順を並行して実行します:
-
matchingRecordsを空のリストとします。
-
各recordについて、以下をコンテキストオブジェクトのバックグラウンドフェッチのレコードから実行します:
-
もしリクエストがキャッシュされたアイテムに一致する ためのrequest、recordのリクエスト、 recordのレスポンスデータの レスポンス、 およびoptionsがtrueを返す場合、 リストに追加としてrecordをmatchingRecordsに追加します。
-
-
Bgfetchタスクをキューに追加して、 Promiseを解決し、 promiseにレコードオブジェクトを作成してmatchingRecordsをコンテキストオブジェクトの 関連するRealmで設定します。
-
-
promiseを返します。
6.5.
BackgroundFetchRecord
[Exposed =(Window ,Worker )]interface {
BackgroundFetchRecord readonly attribute Request request ;readonly attribute Promise <Response >responseReady ; };
BackgroundFetchRecord
には以下が含まれます:
request
属性のgetterはコンテキストオブジェクトのリクエストを返さなければなりません。
responseReady
属性のgetterはコンテキストオブジェクトのレスポンスプロミスを返さなければなりません。
6.6.
BackgroundFetchEvent
[Exposed =ServiceWorker ]interface :
BackgroundFetchEvent ExtendableEvent {(
constructor DOMString ,
type BackgroundFetchEventInit );
init readonly attribute BackgroundFetchRegistration registration ; };dictionary :
BackgroundFetchEventInit ExtendableEventInit {required BackgroundFetchRegistration ; };
registration
BackgroundFetchEvent
にはバックグラウンドフェッチ (バックグラウンドフェッチ) が含まれます。初期値は値registration
が初期化された際のバックグラウンドフェッチです。
registration
属性は初期化された値を返さなければなりません。
6.7.
BackgroundFetchUpdateUIEvent
[Exposed =ServiceWorker ]interface :
BackgroundFetchUpdateUIEvent BackgroundFetchEvent {(
constructor DOMString ,
type BackgroundFetchEventInit );
init Promise <undefined >updateUI (optional BackgroundFetchUIOptions = {}); };
options
BackgroundFetchUpdateUIEvent
にはUI更新済みフラグが含まれ、初期値は未設定です。
6.7.1. updateUI()
updateUI(options)
メソッドは、呼び出された時、新しいPromise
promiseを返し、以下の手順を並行して実行しなければなりません:
-
以下のいずれかがtrueの場合:
-
コンテキストオブジェクトの
isTrusted
属性がfalse。 -
コンテキストオブジェクトのUI更新済みフラグ が設定されている。
-
コンテキストオブジェクトがアクティブでない。
InvalidStateError
DOMException
をスローします。 -
-
コンテキストオブジェクトのUI更新済みフラグを設定します。
-
もしoptionsがnullの場合、返します。
-
bgFetchをコンテキストオブジェクトのバックグラウンドフェッチとします。
-
もしoptionsの
icons
メンバーが存在する場合、bgFetchのアイコンを optionsのicons
に設定します。 -
もしoptionsの
title
メンバーが存在する場合、bgFetchのタイトルを optionsのtitle
に設定します。 -
Promiseを解決します。
7. 自動化
ユーザーエージェントの自動化およびアプリケーションテストの目的で、この文書は拡張コマンドを[WebDriver]仕様に定義します。
7.1. クリック
メソッド | URIテンプレート |
---|---|
POST | /session/{session id}/backgroundfetch/{id}/click |
バックグラウンドフェッチクリック 拡張コマンドは、表示のバックグラウンドフェッチをユーザーがアクティブにすることをシミュレートします。リモートエンドステップは以下の通りです:
-
もし現在のトップレベルブラウジングコンテキスト が既に閉じられている場合、WebDriverエラーをWebDriverエラーコード no such windowと共に返します。
-
pageURLを現在のトップレベルブラウジングコンテキストのアクティブドキュメントのURLとします。
-
swRegistrationをpageURLに対する一致するサービスワーカーレジストレーションとします。
-
もしswRegistrationがnullの場合、WebDriverエラーをステータス
400
およびJSONエラーコード "invalid service worker state
"と共に返します。 -
bgFetchを、バックグラウンドフェッチの中で、idがurl変数 idで、サービスワーカーレジストレーションがswRegistrationの最新のものとし、それが存在しない場合はnullとします。
-
もしbgFetchがnullの場合、WebDriverエラーをステータス
404
およびJSONエラーコード "background fetch not found
"と共に返します。 -
WebDriver成功を返します。
8. プライバシーと帯域幅の使用
フェッチは大規模で完了までに長時間かかる場合があります。この間、ユーザーは1つ以上のサーバーからデータをフェッチします。この操作中に変更される可能性のあるユーザーのIPアドレスは、時間をかけてユーザーの位置を追跡するために使用される可能性があります。
これを軽減するために、バックグラウンドフェッチを表示する手順では以下を要求します:
-
フェッチを行うサイトのオリジンを表示すること。
-
バックグラウンドフェッチがアクティブである間、UIを閉じることができないこと。
-
操作を簡単に中止できること。
-
操作を一時停止状態で開始し、ユーザーの操作を必要とすること。
この手順はまた、ユーザーが従量制接続を使用している場合、ユーザーエージェントがバックグラウンドフェッチを一時停止できるようにします。
保存されるすべてのデータは、特定のサービスワーカーレジストレーションに関連付けられています。サービスワーカーレジストレーションをクリアすると、関連付けられたすべてのバックグラウンドフェッチがクリアされます。