Web Share API

W3C 勧告

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2023/REC-web-share-20230530/
最新公開バージョン:
https://www.w3.org/TR/web-share/
最新エディタ草案:
https://w3c.github.io/web-share/
履歴:
https://www.w3.org/standards/history/web-share
コミット履歴
テストスイート:
https://wpt.live/web-share/
実装報告:
https://w3c.github.io/web-share/imp-report/
編集者:
Matt Giuca (Google Inc.)
Eric Willigers (Google Inc.)
Marcos Cáceres (Apple Inc.)
フィードバック:
GitHub w3c/web-share (プルリクエスト, 新規 issue, オープン issue)
正誤表:
正誤情報あり
ブラウザー対応:
caniuse.com

関連情報 翻訳.


概要

この仕様は、テキスト、リンク、その他のコンテンツをユーザーが選択した任意の送信先に共有するためのAPIを定義します。

利用可能な共有先はこの仕様では指定されていません。ユーザーエージェントが提供します。例えば、アプリ、ウェブサイト、連絡先などが考えられます。

この文書のステータス

このセクションは、本書が公開された時点での文書のステータスについて説明します。現行の W3C 公開文書の一覧と、この技術レポートの最新版は W3C 技術レポート一覧 https://www.w3.org/TR/ で確認できます。

本書は Web Applications Working Group により 勧告プロセスに則って 勧告として公開されました。

W3C は本仕様のWeb標準としての広範な展開を推奨します。

W3C 勧告は、十分な合意形成の後に W3C およびそのメンバーによって支持され、 ワーキンググループのメンバーが ロイヤリティフリーライセンス へのコミットメントを行った仕様です。 今後の勧告の更新には 新機能 が組み込まれる可能性があります。

本書は W3C 特許ポリシーの下で活動するグループにより作成されています。 W3Cグループ関連公開特許情報リスト を管理しており、そのページには特許の公開方法も記載されています。特許の実質的な請求項が含まれると考えられる特許を知っている場合は、 W3C特許ポリシー第6節に従って情報を開示する必要があります。

この文書は 2021年11月2日 W3C プロセス文書によって管理されています。

実装状況

このセクションは規範的ではありません。

コンテンツ共有機能は、基盤となるオペレーティングシステムが「共有」機能を提供していること、およびOSのUI慣習に依存することが多いです。例えば、一部のOSでは「共有シート」が表示され、他のOSではポップアップメニューが使われます。これらの依存性により、Web Share APIをすべてのOSで利用可能にするために実装者による継続的な取り組みが行われています。この進行中の取り組みは、限られたOSでテストを実行して生成される実装報告に失敗として反映されています。ただし、ワーキンググループはWeb Share APIが今後さらに多くのOSで利用できるようになり、すでに幅広いデバイスの主要なOSで広く利用可能になっていることに楽観的です。

1. 使用例

このセクションは規範的ではありません。

1.2 ファイルの共有

この例はファイルを共有する方法を示します。files メンバーは配列であり、複数のファイルを共有できます。

2: ファイルの共有
shareButton.addEventListener("click", async () => {
  const file = new File(data, "some.png", { type: "image/png" });
  try {
    await navigator.share({
      title: "Example File",
      files: [file]
    });
  } catch (err) {
    console.error("Share failed:", err.message);
  }
});

1.3 共有の検証

canShare() メソッドに ShareData 辞書を渡すと、共有データの 検証が行われます。share() と異なり、一時的なアクティベーションなしで呼び出すことができます。

const file = new File([], "some.png", { type: "image/png" });

// ファイルがサポートされているか確認
if (navigates.canShare({files: [file]})) {
  // pngファイルの共有はおそらく可能です...
}

// URLの共有が可能か確認
if (navigates.canShare({ url: someURL })) {
  // URLは有効で、共有可能です...
}

1.4 メンバーのサポート状況の確認

WebIDL辞書の仕様により、share() にユーザーエージェントが認識しないメンバーを渡した場合、それらは無視されます。 複数のメンバーを共有する際、ユーザーエージェントが一部のメンバーをサポートしない場合は問題となることがあります。すべてのメンバーがサポートされていることを確認したい場合は、canShare() に個別に渡してサポートされているか確認できます。

4: 共有の将来対応
const data = {
  title: "Example Page",
  url: "https://example.com",
  text: "This is a text to share",
  someFutureThing: "some future thing",
};
const allSupported = Object.entries(data).every(([key, value]) => {
  return navigator.canShare({ [key]: value });
});
if (allSupported) {
  await navigator.share(data);
}

または、サポートされていないメンバーのUIコンポーネントを表示しないようにアプリケーションのUIを調整することもできます。

5: サポートされていないメンバーの除外
const data = {
  title: "Example Page",
  url: "https://example.com",
  text: "This is a text to share",
  someFutureThing: "some future thing",
};

// サポートされていないもの...
const unsupported = Object.entries(data).filter(([key, value]) => {
  return !navigator.canShare({ [key]: value });
});

1.5 サードパーティコンテキストでのAPI有効化

デフォルトの許可リストである 'self' により、Web Share APIはデフォルトでファーストパーティコンテキストでのみ利用可能です。

サードパーティは、iframeallow 属性を使って、このAPIの利用を許可できます:

また、ファーストパーティコンテキストでAPIを無効化するには、HTTPレスポンスヘッダーを指定します:

詳細やオリジンごとのパーミッションポリシーの制御方法については Permissions Policy 仕様をご参照ください。

2. API定義

2.1 Navigator インターフェイスへの拡張

WebIDLpartial interface Navigator {
  [SecureContext] Promise<undefined> share(optional ShareData data = {});
  [SecureContext] boolean canShare(optional ShareData data = {});
};

2.1.1 内部スロット

このAPIは Navigator インターフェイスに以下の内部スロットを追加します。

Promise? [[sharePromise]]
this.[[sharePromise]] は、ユーザーが現在データを 共有先 に共有しようとする意図を表すPromiseです。初期値は null です。

2.1.2 share() メソッド

share() メソッドが 引数 data を指定して呼び出された場合、以下のセキュリティ上の影響を 考慮しながら、以下に列挙された手順を実行する。

Web Share を使用すると、ウェブサイトから 共有ターゲットへデータを送信でき、 これはネイティブアプリケーションである場合がある。この機能は Web Share に固有のものではないが、潜在的な セキュリティリスクが多数存在し、その深刻度は(基盤となる プラットフォームによって)異なる可能性がある。

share() に渡されたデータは、 共有を受信する 共有ターゲットに存在するバッファオーバーフローやその他のリモートコード実行脆弱性を 悪用するために使用される可能性がある。これを防ぐ一般的な方法は 存在しないが、実装者はその可能性があることを認識しておく必要がある (特にファイルを共有する場合)。

共有された URL を参照解除し、その情報を転送する 共有ターゲットは、 本来は機密である可能性のある情報を、意図せず 転送してしまう場合がある。共有が、その アプリケーション、それが実行されるホスト、またはそのネットワーク上の場所からのみアクセス可能なコンテンツを参照している場合、 予期しない情報漏洩につながる可能性がある。

悪意のあるサイトは、最終的にローカルリソースへ解決される URL を 提供することで、情報を漏洩する共有ターゲットを悪用する可能性がある。 これには、"file:" URL や、通常であれば アクセスできない可能性があるローカルサービスなどが含まれるが、それらに限定されない。この API では共有される URL を制限された一連の 共有可能なスキームに限定しているものの、 他の URL へのリダイレクトや、それらの URL 内のホストに対する DNS レコードの変更を 利用して、アプリケーションにコンテンツを取得させる可能性がある。

これらの攻撃に利用されることを避けるため、共有ターゲットは URL を受け取り、コンテンツを取得し、その情報を 共有せずに処理できる。たとえば、写真編集アプリケーションは、 自身に「共有」された画像を取得する場合がある。共有ターゲットはまた、 参照先コンテンツを一切取得せずに URL を共有することもできる。

プレビューの提供またはコンテンツの共有を目的としてコンテンツを取得する 共有ターゲットには、情報漏洩のリスクがある。ユーザーによってプレビューされ、 許可されたコンテンツは転送しても安全である可能性があるが、 どの情報を機密とすべきかを人が常に判断できるとは限らないため、 あらゆるコンテンツの転送にはリスクが伴う。特に、title は、 攻撃者がコンテンツの性質をユーザーに誤認させるために 使用する可能性がある(5. アクセシビリティに関する考慮事項も参照)。

DOMException を使用するあらゆる場合と同様に、 実装者は、 share() が 拒否されたときに、エラーメッセージでどのような情報が明らかになるかを慎重に考慮する必要がある。 利用可能な 共有ターゲットが存在しない場合と、ユーザーによる キャンセルの場合を区別するだけでも、ユーザーのデバイスにどの共有ターゲットが インストールされているかに関する情報が明らかになる可能性がある。

  1. globalthis関連する グローバルオブジェクトとする。
  2. documentglobal関連付けられた Documentとする。
  3. document完全に アクティブでない場合、"InvalidStateError" DOMException拒否された promiseを返す。
  4. document使用を 許可されていない "web-share" の場合、 "NotAllowedError" DOMException拒否された promiseを返す。
  5. this.[[sharePromise]]null でない場合、 "InvalidStateError" DOMException拒否された promiseを返す。
  6. global一時的な アクティベーションを持たない場合、"NotAllowedError" DOMException拒否された promiseを返す。
  7. globalユーザー アクティベーションを消費する
  8. basethis関連する 設定オブジェクトAPI ベース URLとする。
  9. database を用いて 共有データを検証した結果が false を返す場合、TypeError拒否された promiseを返す。
  10. dataurl メンバーが存在する場合:
    1. url を、dataurl に対し base を用いて URL パーサーを実行した結果とする。
    2. 表明: urlURL である。
    3. datadata のコピーに設定し、その url メンバーを、url に対して URL シリアライザーを 実行した結果に設定する。
  11. セキュリティ上の考慮事項によりファイルタイプがブロックされている場合、 "NotAllowedError" DOMException拒否された promiseを返す。
  12. this.[[sharePromise]]新しい promise に設定する。
  13. this.[[sharePromise]] を返し、並行して:
    1. 利用可能な 共有ターゲットが存在しない場合、global を使用して ユーザー インタラクションタスクソース上にグローバルタスクを キューに入れ、次を行う:
      1. this.[[sharePromise]] を "AbortError" DOMException拒否する
      2. this.[[sharePromise]]null に設定する。
      3. このアルゴリズムを終了する。
    2. ユーザーに 1 つ以上の 共有 ターゲットの選択肢と、操作を中止する機能を提示する。この UI サーフェスはセキュリティ確認として機能し、ウェブサイトが ネイティブアプリケーションへ密かにデータを送信できないようにする。ユーザー エージェントは、ユーザーが共有されるコンテンツを確認できる中間 UI を (OS レベルの UI がこの機能を提供しない場合) 表示するべきである
    3. ユーザーの選択を待つ。
    4. ユーザーが共有操作の中止を選択した場合、global を使用して ユーザー インタラクションタスクソース上にグローバル タスクをキューに入れ、次を行う:
      1. this.[[sharePromise]] を "AbortError" DOMException拒否する
      2. this.[[sharePromise]]null に設定する。
      3. このアルゴリズムを終了する。
    5. 選択された 共有ターゲットをアクティブ化し、 data をターゲットに取り込むのに適した形式へ変換し、 変換されたデータをターゲットへ送信する。
    6. ターゲットの起動またはデータの送信中にエラーが発生した場合、 global を使用して ユーザー インタラクションタスクソース上にグローバル タスクをキューに入れ、次を行う:
      1. this.[[sharePromise]] を "DataError" DOMException拒否する
      2. this.[[sharePromise]]null に設定する。
      3. このアルゴリズムを終了する。
    7. データが 共有ターゲットへ正常に送信されたか、または OS へ正常に送信された時点で(共有ターゲットへの送信を 確認できない場合)、 global を使用して ユーザー インタラクションタスクソース上に グローバル タスクをキューに入れ、次を行う:
      注記
      1. this.[[sharePromise]]undefined解決する
      2. this.[[sharePromise]]null に設定する。

2.1.3 canShare(data) メソッド

canShare() メソッドが引数 ShareData data を指定して呼び出された場合、 次の手順を実行する:

  1. documentthis関連する グローバルオブジェクト関連付けられた Document とする。
  2. document完全に アクティブでない場合、false を返す。
  3. document使用を 許可されていない "web-share" の場合、 false を返す。
  4. datathis関連する 設定オブジェクトAPI ベース URLを用いて 共有データを検証した結果を返す。
注記: canShare() は将来互換ではない

2.1.4 共有データの検証

共有可能なスキーム とは、以下の URL スキーム のいずれかです:

共有データの検証database で実行するには、次の手順を実行します:

  1. datatitle, texturlfiles のいずれも存在しない場合、false を返します。
  2. titletexturl のいずれかが存在する場合、titleTextOrUrl を true とします。
  3. datafiles メンバーが存在する場合:
    1. titleTextOrUrl が false で、datafiles メンバーが空の場合、false を返します。
      注記

      { files: [] } のような辞書は空辞書として扱われます。ただし {text: "text", files: []} のような辞書は、files が単に無視されるだけなので問題ありません。

    2. 実装がファイル共有をサポートしていない場合、false を返します。
    3. ユーザーエージェントが files 内のいずれかのファイルが悪意ある共有(内容・サイズ・その他特徴によって悪意があると判断した場合)になると考える場合、false を返します。
  4. dataurl メンバーが存在する場合:
    1. urlURLパーサーdataurl メンバーと base を使い、エンコーディングオーバーライド無しで実行した結果とします。
    2. url が失敗の場合、false を返します。
    3. urlスキームローカルスキームfilejavascriptwswss のいずれかの場合、false を返します。
    4. urlスキーム共有可能なスキーム でない場合、false を返します。
  5. true を返します。

2.2 ShareData 辞書

WebIDLdictionary ShareData {
  sequence<File> files;
  USVString title;
  USVString text;
  USVString url;
};

ShareData 辞書は複数のオプションのメンバーで構成されています:

files メンバー
共有するファイル。
text メンバー
共有されるメッセージ本文となる任意のテキスト。
title メンバー
共有される文書のタイトル。共有先によっては無視される場合があります。
url メンバー
共有されるリソースを指すURL文字列。
注記

3. 共有先

共有先とは、ユーザーエージェントが共有データを送信する抽象的な送信先の概念です。何が共有先になるかはユーザーエージェントの裁量によります。

共有先は必ずしも ShareData を直接受け取れるとは限りません(このAPIを前提に作られていない場合)。しかし、MUST ShareData で公開される概念の一部または全部に合致するデータを受け取れる能力を持っていなければなりません。共有先向けにデータを適切な形式に変換するために、ユーザーエージェントは SHOULD ShareData のメンバーを共有先の同等の概念にマッピングします。必要に応じてメンバーを破棄したり結合しても MAY です。ペイロードの各メンバーの意味は共有先の裁量です。

注記
ShareData を共有ターゲット(またはオペレーティング システム)の ネイティブ形式にマッピングするのは、一部のプラットフォームには 同等のメンバーの組が存在しないため、難しい場合がある。たとえば、ターゲットに "text" メンバーはあるが "URL" メンバーがない場合(Android がこれに該当する)、1 つの解決策は、 texturl の両方のメンバーを ShareData から連結し、その結果をターゲットの "text" メンバーとして 渡すことである。

各共有先は、ShareData ペイロードの内容によって条件付きで利用可能になることが MAY です。これは share() メソッドに渡されたペイロードに依存します。

3.1 共有先の例

このセクションは規範的ではありません。

共有先のリストは、ユーザーエージェントやホストOSによってさまざまなソースから構築されます。例:

注記
ウェブサイトが共有データの受信先として登録されるケースの標準化が試みられています。詳細は Web Share Target を参照してください。

場合によっては、ホストOSがWeb Shareに類似した共有やインテントシステムを提供することがあります。その場合、ユーザーエージェントは共有データをOSに転送するだけで、ネイティブアプリへ直接送信する必要はありません。

4. Permissions Policy との統合

この仕様は、文字列 "web-share" によって識別されるポリシー制御パーミッションを定義します。 その デフォルト許可リスト'self' です。つまり、サードパーティコンテキストではデフォルトでAPIの利用が 許可されません

ユーザーエージェントが Permissions PolicyPermissions-Policy HTTPヘッダーをサポートするかどうかは 任意 です。

開発者は、Permissions Policy 仕様で定義された手段を使って、サードパーティコンテキストがこのAPIを 利用可能かどうかを制御できます。

注記: Permissions Policy 実装状況

5. アクセシビリティに関する考慮事項

このセクションは規範的ではありません。

この仕様を使ってユーザーインターフェースで情報を表示する場合、実装者はプラットフォームのOSレベルのアクセシビリティガイドラインに従うことが望まれます。また、共有はエンドユーザーに対してセキュリティ上の影響を及ぼす可能性があるため、share() メソッドの説明にあるように、共有UIはアクセシブルかつプラットフォームのセキュリティガイドラインも考慮して設計する必要があります。主な考慮点は以下の通りです:

これらの要素は、視覚・運動・認知障害を持つユーザーがウェブページで共有されるコンテンツの性質をより理解できるようにします。

6. プライバシーに関する考慮事項

7. 適合性

非規範的と明記されたセクション以外にも、この仕様書中の著作ガイドライン、図、例、注記はすべて非規範的です。それ以外の内容はすべて規範的です。

本書の MAYMUSTOPTIONALSHOULD というキーワードは、 BCP 14 [RFC2119] [RFC8174] に記載された通り、ここに示すようにすべて大文字で現れる場合に限り、その意味で解釈されます。

8. IDL索引

WebIDLpartial interface Navigator {
  [SecureContext] Promise<undefined> share(optional ShareData data = {});
  [SecureContext] boolean canShare(optional ShareData data = {});
};

dictionary ShareData {
  sequence<File> files;
  USVString title;
  USVString text;
  USVString url;
};

9. 変更履歴

このセクションは規範的ではありません。

勧告案フェーズで、仕様に以下の規範的変更が加えられました。完全な変更リストはコミットログをご覧ください。

最初の公開ワーキングドラフトから勧告候補までに仕様に加えられた規範的変更は以下の通りです。完全な変更リストはコミットログをご覧ください。

A. 謝辞

編集者は、下記の W3C グループの貴重なフィードバックに感謝します。これにより本仕様は大きく改善されました: Accessible Platform Architectures Working GroupInternationalization Working GroupPrivacy Interest GroupTechnical Architecture Group

Web Intents チームにも感謝します。彼らはウェブアプリの相互運用ユースケースの基礎を築きました。特に Paul Kinlan 氏はWeb Shareの初期の普及活動に大きく貢献しました。

B. 参考文献

B.1 規範的参考文献

[fetch]
Fetch標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://fetch.spec.whatwg.org/
[fileapi]
File API. Marijn Kruisselbrink. W3C. 2023年2月6日. W3C作業草案. URL: https://www.w3.org/TR/FileAPI/
[html]
HTML標準. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[PERMISSIONS-POLICY]
Permissions Policy. Ian Clelland. W3C. 2023年3月22日. W3C作業草案. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
RFCで要件レベルを示すためのキーワード. S. Bradner. IETF. 1997年3月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119キーワードの大文字・小文字の曖昧さ. B. Leiba. IETF. 2017年5月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/rfc/rfc8174
[url]
URL標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://url.spec.whatwg.org/
[WEBIDL]
Web IDL標準. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

B.2 参考情報

[encoding]
Encoding標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://encoding.spec.whatwg.org/