この仕様は、すでに開いているアプリインスタンスに関して、Web アプリケーションが アプリ起動の挙動を構成できるようにする API を定義する。 この API は、音楽プレイヤーなどの単一インスタンス Web アプリの ニーズに応えることを目的としている。
この API を実装するには、ユーザーエージェントは [[[appmanifest]]] をサポートしなければならない。
音楽プレイヤーアプリは、音楽の再生を中断することなく、 アプリショートカットによる起動を既存のウィンドウへ送ることを望む。 この音楽アプリは、次に示すように [[[appmanifest]]] に [=manifest/launch_handler=] エントリを追加することになる。
{
"name": "Music Player",
"shortcuts": [{
"name": "Now Playing",
"url": "/"
}, {
"name": "Library",
"url": "/library"
}, {
"name": "Favorites",
"url": "/favorites"
}, {
"name": "Discover",
"url": "/discover"
}],
"launch_handler": {
"client_mode": "focus-existing"
}
}
[=manifest/client_mode=] パラメーターを [=client mode/focus-existing=] に設定すると、 アプリ起動は、既存のアプリインスタンス(存在する場合)を、 現在の文書からナビゲートさせることなくフォーカスする。
{{LaunchParams}} は、音楽プレイヤーがその {{LaunchConsumer}} 内で {{LaunchParams/targetURL}} を読み取り、 スクリプトで処理できるように、{{Window/launchQueue}} に キュー投入される。例:
window.launchQueue.setConsumer((launchParams) => {
const url = launchParams.targetURL;
// If the URL is to one of the app sections, updates the app view to
// that section without interrupting currently playing music.
if (maybeFocusAppSection(url)) {
return;
}
// Could not handle the launch in-place, just navigate the page
// (interrupts any playing music).
location.href = url;
});
すでに音楽プレイヤーアプリを使って音楽を聴いているユーザーが、 "Library" アプリショートカットを起動すると、/library へのアプリ起動が トリガーされる。この起動は既存のアプリインスタンスへルーティングされ、 ページの {{Window/launchQueue}} にキュー投入される。そして、割り当てられた {{LaunchConsumer}} を通じて、現在の音楽再生に影響を与えることなく、 音楽プレイヤーのライブラリセクションをフォーカスする。
次の手順は、拡張ポイント、 すなわち manifest を処理する 手順に追加される。
`launch_handler` は、 Web アプリ起動がどのように挙動すべきかの構成を含む 辞書である。
[=manifest/client_mode=] が唯一のメンバーであるにもかかわらず、 [=manifest/launch_handler=] は辞書である。これは、将来ほかの種類の 挙動が必要になった場合に、さらにメンバーを追加できる余地を 与えるためである。
[=ordered map=] |json:ordered map|、[=ordered map=] |manifest:ordered map| が与えられたときの、 processing the launch_handler member の手順は次のとおりである。
[=manifest/launch_handler=] の `client_mode` メンバーは、 1 つ以上の [=client mode targets=] を指定する [=string=] または [=strings=] のリストである。[=client mode target=] は、 Web アプリ起動に使用する特定のクライアント選択および ナビゲーション挙動を宣言する。
ユーザーエージェントは、プラットフォームの制約に応じて、 [=client mode targets=] のサブセットのみをサポートしてもよい (例:モバイルデバイスは、複数のアプリインスタンスを同時に サポートしない場合がある)。
client mode targets は次のとおりである。
ユーザーエージェントは、プラットフォームに最も適したものを 決定することが期待される。たとえば、単一のアプリインスタンス のみをサポートするモバイルデバイスでは、ユーザーエージェントは `navigate-existing` を使用してもよい。一方、複数のウィンドウを サポートするデスクトップデバイスでは、データ損失を避けるために `navigate-new` を使用してもよい。
起動の {{LaunchParams}} を受け取り、それに対して何かを行うには、 ページが {{Window/launchQueue}} に {{LaunchConsumer}} を設定しておく 必要がある。ページが何も処理しない場合、起動のユーザー体験は 壊れているように見える可能性が高い。
[=ordered map=] |json_launch_handler:ordered map|、 [=ordered map=] |manifest_launch_handler:ordered map| が与えられたとき、 process the `client_mode` member するには、次を実行する。
`client_mode` は文字列のリストを受け入れる。これによりサイトは、 推奨する [=client mode target=] がユーザーエージェントまたは プラットフォームでサポートされていない場合に使用する、フォールバックの [=client mode targets=] を指定できる。リスト内で最初にサポートされている [=client mode target=] エントリが使用される。
この仕様は、[=manifest/launch_handler=] の挙動を含めるため、 既存の [=launch a web application=] アルゴリズムを、 [=launch a web application with handling=] の手順に置き換える。
launch a web application with handling する手順は、 次のアルゴリズムで与えられる。このアルゴリズムは、 [=Document/processed manifest=] |manifest:processed manifest|、 任意の [=URL=] または {{LaunchParams}} |params|、 任意の [=POST resource=] |POST resource| を取り、 [=application context=] を返す。
|application context| は [=assigned launch consumer=] を持つ 既存のインスタンスである可能性があるため、新たに追加された {{LaunchParams}} を処理する必要がある。
prepare an application context する手順は、次のアルゴリズムで 与えられる。このアルゴリズムは、 [=Document/processed manifest=] |manifest:processed manifest|、 {{LaunchParams}} |launch params|、任意の [=POST resource=] |POST resource| を取り、[=application context=] を返す。
|client mode| で分岐し、次の下位手順を実行する:
適切な選択戦略としては、最も最近フォーカスされていたものを 選ぶことが考えられる。
{{LaunchQueue}} |queue| が与えられたときの process unconsumed launch params する手順は次のとおりである。
[Exposed=Window] interface LaunchParams {
readonly attribute DOMString? targetURL;
readonly attribute FrozenArray<FileSystemHandle> files;
};
{{LaunchParams/targetURL}} は、アプリケーションの [=manifest/within scope=] でなければならない、起動の [=URL=] を表す。
{{LaunchParams/files}} 内のすべての |file handle:FileSystemHandle| について、 {{FileSystemPermissionDescriptor/mode}} を {{FileSystemPermissionMode/"readwrite"}} に設定してファイルシステム権限を 照会した場合、{{PermissionState/"granted"}} を返さなければならない。
callback LaunchConsumer = any (LaunchParams params);
partial interface Window {
readonly attribute LaunchQueue launchQueue;
};
[Exposed=Window] interface LaunchQueue {
undefined setConsumer(LaunchConsumer consumer);
};
{{LaunchQueue}} は、初期状態で空の {{LaunchParams}} の [=list=] である unconsumed launch params を持つ。
{{LaunchQueue}} は、初期状態で null である任意の {{LaunchConsumer}}、 すなわち assigned launch consumer を持つ。
{{LaunchQueue/setConsumer(consumer)}} メソッド手順は次のとおりである。
{{LaunchParams}} は、起動イベントの発火とページスクリプトによる イベントリスナーの取り付けとの間の競合状態を避けるために、 イベント経由ではなく {{LaunchQueue}} 経由で文書へ渡される。 対照的に、{{LaunchQueue}} は、{{LaunchConsumer}} が設定されるまで、 キュー投入されたすべての {{LaunchParams}} をバッファする。
この仕様には、既知のアクセシビリティ上の考慮事項はない。
実装は、[=manifest/client_mode=] が [=client mode/focus-existing=] である起動について [=launching a web application with handling=] する際、注意を払うべきである。 これらの起動は、[=manifest/navigation scope=] の外部に URL を 漏えいしてはならない。これは、[=Document/processed manifest=] |manifest| が与えられた場合、両方向に適用される。