PWA のタブ形式アプリケーション モード

プログレッシブ ウェブアプリのタブを使用して、複数のドキュメントを同時に操作する

コンピューティングの世界では、デスクトップ メタファーは、ユーザーがコンピュータをより直感的に操作できるように、グラフィカル ユーザー インターフェース(GUI)で使用される一連の統一コンセプトであるインターフェース メタファーです。デスクトップのメタファーに沿って、GUI タブは書籍、紙のファイル、カード索引に挿入される従来のカードタブをモデルにしています。タブ付きドキュメント インターフェース(TDI)またはタブは、複数のドキュメントまたはパネルを 1 つのウィンドウに含めることができるグラフィック コントロール要素です。タブは、ドキュメントセットを切り替えるためのナビゲーション ウィジェットとして使用されます。

プログレッシブ ウェブアプリは、ウェブアプリ マニフェストの display プロパティによって決まるさまざまな表示モードで実行できます。fullscreenstandaloneminimal-uibrowser のいずれかを指定できます。これらのディスプレイ モードは、明確に定義された代替チェーン"fullscreen""standalone""minimal-ui""browser")に従います。ブラウザが特定のモードをサポートしていない場合、チェーン内の次のディスプレイ モードにフォールバックします。デベロッパーは、必要に応じて "display_override" プロパティを使用して独自のフォールバック チェーンを指定できます。

タブ付きアプリケーション モードとは

これまでこのプラットフォームには、PWA デベロッパーがタブ形式のドキュメント インターフェースをユーザーに提供できる方法がありませんでした。たとえば、同じ PWA ウィンドウで異なるファイルを編集できるようにする方法です。タブ形式のアプリモードでは、このギャップが解消されます。

タブ形式のアプリモードのユースケース

タブ形式のアプリケーション モードを使用するサイトの例としては、次のようなものがあります。

  • ユーザーが複数のドキュメント(またはファイル)を同時に編集できる生産性向上アプリ。
  • ユーザーがタブごとに異なる部屋で会話できるコミュニケーション アプリ。
  • 記事のリンクを新しいアプリ内タブで開く読書アプリ。

デベロッパーが作成したタブとの違い

ドキュメントを個別のブラウザタブに配置すると、リソースの分離が実現されます。これは、現在のウェブでは不可能です。デベロッパーが作成したタブは、ブラウザのタブのように数百のタブにスケーリングすることはできません。ナビゲーション履歴、[このページの URL をコピー]、[このタブをキャスト]、[このページをウェブブラウザで開く] などのブラウザのアフォーダンスは、デベロッパーが作成したタブ形式のインターフェース ページには適用されますが、選択したドキュメント ページには適用されません。

"display": "browser" との違い

現在の "display": "browser" にはすでに特定の意味があります。

ユーザー エージェントでハイパーリンクを開くためのプラットフォーム固有の規則(ブラウザのタブや新しいウィンドウなど)を使用して、ウェブ アプリケーションを開きます。

ブラウザは UI に関して何でもできますが、"display": "browser" が突然「ブラウザの操作要素はなく、タブ付きドキュメント インターフェースの別のアプリケーション固有のウィンドウで実行」を意味するようになったとしたら、これは明らかにデベロッパーの期待を大きく裏切ることになります。

"display": "browser" を設定すると、アプリケーション ウィンドウに表示されることから実質的にオプトアウトできます。

現在のステータス

ステップ ステータス
1. 説明を作成する 完了
2. 仕様の最初の下書きを作成する 完了
3. フィードバックを収集してデザインを反復する 完了
4. オリジン トライアル 完了
5. リリース 完了(ChromeOS)

タブ形式のアプリケーション モードを使用する

タブ形式のアプリモードを使用するには、デベロッパーはウェブアプリ マニフェストで特定の "display_override" モード値を設定して、アプリを有効にする必要があります。

{
  "display": "standalone",
  "display_override": ["tabbed"]
}

次に、必要に応じてプロパティ "tab_strip" を使用してタブの動作を微調整できます。使用できるサブプロパティは "home_tab""new_tab_button" の 2 つです。"tab_strip" プロパティが存在しない場合、デフォルトは次のオブジェクトになります。

"tab_strip": {
  "new_tab_button": {
    "url": <start_url>,
  },
}

[ホーム] タブ

[ホーム] タブは固定されたタブで、アプリで有効にすると、アプリが開いているときは常に表示されます。このタブは移動しないでください。このタブからクリックされたリンクは、新しいアプリタブで開きます。アプリは、このタブがロックされている URL とタブに表示されるアイコンをカスタマイズできます。

"tab_strip" オブジェクトの "home_tab" メンバーには、アプリケーションの最上位メニューとして機能する特別な「ホームタブ」に関する情報が含まれます。次のメンバーが含まれています。

  • "scope_patterns": "scope_patterns" メンバーは、マニフェスト URL を基準としたホームタブのスコープを定義する URL パターンのリストです。

新しいタブボタン

"tab_strip" オブジェクトの "new_tab_button" メンバーは、クリックまたは有効化されたときにアプリケーション ウィンドウ内に新しいアプリケーション コンテキストを開く UI アフォーダンス(ボタンなど)の動作を記述します。次のメンバーがあります。

  • "url": "url" メンバーは、処理されたマニフェストのスコープ内にあるマニフェスト URL を基準とした URL を表す文字列です。

処理されたマニフェストの new_tab_button の "url" メンバーがホームタブ スコープ外にある場合、アプリには新しいタブボタンがあります。アプリケーションに新しいタブボタンがない場合は、ブラウザはユーザーに対して「新しいタブ」アフォーダンスを利用できないようにします。

サンプルコードの全文

タブ形式のインターフェースを持つアプリの動作を構成する完全な例は次のようになります。

{
  "name": "Tabbed App Example",
  "start_url": "/",
  "display": "standalone",
  "display_override": ["tabbed"],
  "tab_strip": {
    "home_tab": {
      "scope_patterns": [
        {"pathname": "/"},
        {"pathname": "/index.html"}
      ]
    },
    "new_tab_button": {
      "url": "/create"
    }
  }
}

タブ付きアプリケーション モードを検出する

アプリは、CSS または JavaScript で display-mode CSS メディア機能を確認することで、タブ付きアプリケーション モードで実行されているかどうかを検出できます。

@media (display-mode: tabbed) {
  /* Styles to apply in tabbed application mode. */
}
const tabbedApplicationModeEnabled = window.matchMedia('(display-mode: tabbed)').matches;

Launch Handler API との連携

Launch Handler API を使用すると、サイトはアプリの起動を既存のアプリ ウィンドウにリダイレクトして、重複するウィンドウが開かないようにできます。タブ形式のアプリで "client_mode": "navigate-new" が設定されている場合、アプリの起動時に既存のアプリ ウィンドウに新しいタブが開きます。

デモ

ChromeOS でタブ付きアプリを試すことができます。

  1. アプリ tabbed-application-mode.glitch.meソースコード)をインストールします。
  2. 各タブのさまざまなリンクをクリックします。

タブアプリケーション モードのデモ(tabbed-application-mode.glitch.me)。

フィードバック

Chrome チームは、タブ付きアプリケーション モードのご利用状況について、皆様のご意見をお聞かせいただきたいと考えています。

API 設計について

タブ形式のアプリモードで、想定どおりに動作しない点はありますか?作成したウェブアプリ マニフェストに関する問題にコメントします。

実装に関する問題を報告する

Chrome の実装にバグが見つかりましたか?new.crbug.com でバグを報告します。できるだけ詳細な情報を含めてください。再現手順も記載してください。[コンポーネント] ボックスに UI>Browser>WebAppInstalls を入力します。Glitch は、簡単な再現ケースを共有するのに適しています。

API のサポートを表示する

タブ形式のアプリモードを使用する予定ですか?公開サポートは、Chrome チームが機能を優先付けするうえで役立ち、他のブラウザ ベンダーに、その機能のサポートがどれほど重要であるかを示します。

ハッシュタグ #TabbedApplicationMode を使用して @ChromiumDev にツイートを送信し、どこでどのように使用しているかをお知らせください。

謝辞

タブ形式のアプリケーション モードは Matt Giuca が検討しました。Chrome での試験運用版の実装は、Alan Cutter によるものです。このドキュメントは Joe Medley によって確認されています。ウィキメディア コモンズTill Niermann によるヒーロー画像。