クリップボードAPIとイベント

W3C作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-clipboard-apis-20250516/
最新公開バージョン:
https://www.w3.org/TR/clipboard-apis/
編集者ドラフト:
https://w3c.github.io/clipboard-apis/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/clipboard-apis/
フィードバック:
GitHub
仕様内でインライン
編集者:
(Google)
(Microsoft)
元編集者:
(Mozilla)
(Microsoft)
説明書:
非同期クリップボードAPI説明書

概要

この文書は、システムのクリップボード上のデータへアクセスするためのAPIについて説明します。デフォルトのクリップボード操作(切り取り、コピー、貼り付け)を上書きするための操作や、クリップボードの内容へ直接アクセスするための操作を提供します。

この文書のステータス

このセクションは、本書の公開時点における文書のステータスについて説明します。現行のW3C公開文書および本技術報告書の最新版は、W3C標準と草案のインデックス(https://www.w3.org/TR/)で確認できます。

本書はWeb Editing ワーキンググループによって、作業草案として勧告トラックに基づき公開されました。 作業草案として公開されていることは、W3Cおよびその会員による承認を意味するものではありません。

本書はドラフト文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 この文書を進行中の作業以外として引用することは適切ではありません。

この文書への変更履歴はhttps://github.com/w3c/clipboard-apisで追跡できます。

この文書は、W3C特許ポリシーの下で活動するグループによって作成されました。W3Cは、グループの成果物に関連する特許開示の公開リストを管理しています。該当ページには特許の開示方法も記載されています。特許の内容を知っている個人は、その特許が必須クレームを含むと考える場合、W3C特許ポリシー第6節に従い情報を開示しなければなりません。

この文書は、2023年11月3日W3Cプロセス文書に準拠しています。

1. はじめに

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

この仕様は、システムクリップボードがウェブアプリケーションにどのように公開されるかを定義します。

本仕様で説明されているAPIは、主に2つあります:

2. ユースケース

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

2.1. デフォルトのクリップボード操作の変更

デフォルトのクリップボード操作(切り取り/コピー/貼り付け)を変更したいシナリオは多数存在します。いくつか例を挙げます:

2.2. リモートクリップボード同期

リモートデバイスと通信するウェブアプリケーション(例: リモートアクセスやリモートシェルアプリケーション)では、2つのデバイス間でクリップボードデータを同期させる必要がある場合があります。

このユースケースで重要なのは、ユーザーのジェスチャや操作がなくてもクリップボードへアクセスできる必要があることです。

リモートデバイスからローカルクリップボードへデータをコピーするには、ウェブアプリケーションがリモートのクリップボードデータを取得し、write()でローカルクリップボードへ書き込みます。
ローカルクリップボードデータをリモートデバイスへコピーするには、ウェブアプリケーションがclipboardchangeイベントを監視し、クリップボードが更新されるたびにread()でクリップボードからデータを取得し、新しいクリップボードデータをリモートデバイスへ送信します。

2.3. クリップボードアクションのトリガー

ユーザーエージェントに対して代替インターフェースを提供するアプリケーションでは、ユーザーエージェント内でクリップボードアクションをトリガーできる必要がある場合があります。

例えば、スクリーンリーダーアプリケーションが標準Webブラウザーによりアクセシブルなインターフェースを提供する場合、リーダーはコンテンツを表示し、ユーザーが操作できるようにしますが、コピーなどのクリップボード操作は基盤となるブラウザ内で行う必要があります(コピー時にブラウザが追加するメタデータなども正しく設定されるように)。

3. 用語

編集可能コンテキストとは、編集ホスト、textarea要素、またはtype属性が"text"、"search"、"tel"、"url"、"email"、"password"、"number"のいずれかに設定されているinput要素のいずれかを指します。

4. モデル

プラットフォームはシステムクリップボードを提供します。

システムクリップボードは、システムクリップボードアイテムのリストを持ち、それらをまとめてシステムクリップボードデータと呼びます。

システムクリップボードアイテムは、システムクリップボード表現のリストを持ちます。

システムクリップボード表現は、name(文字列)と、data(バイト列)を持ちます。

5. クリップボードイベント

5.1. クリップボードイベントインターフェース

ClipboardEventインターフェースはEvent インターフェースを拡張します。

dictionary ClipboardEventInit : EventInit {
  DataTransfer? clipboardData = null;
};
clipboardData

イベントに関連するデータやメタデータを保持するためのDataTransfer オブジェクトです。

[Exposed=Window]
interface ClipboardEvent : Event {
  constructor(DOMString type, optional ClipboardEventInit eventInitDict = {});
  readonly attribute DataTransfer? clipboardData;
};
clipboardData

clipboardData属性はDataTransfer インターフェースのインスタンスであり、ユーザーによるコピー・切り取り・貼り付け操作の間、スクリプトがシステムクリップボード上の値を読み取り・操作できるようにします。 関連するドラッグデータストアはシステムクリップボードのライブかつフィルタされたビューであり、スクリプトが安全にアクセスできる必須データ型のみが公開されます。合成イベントの場合、ドラッグデータストアにはイベントを作成したスクリプトが追加したデータのみが含まれます。

clipboardDataオブジェクトのitemsfiles プロパティによって、クリップボードのマルチパートや非テキストデータの処理が可能です。

このインターフェースはイベントの構築に使用できます。 以下はその例です:

var pasteEvent = new ClipboardEvent('paste');
pasteEvent.clipboardData.items.add('My string', 'text/plain');
document.dispatchEvent(pasteEvent);

注: 合成クリップボードイベントは実際にクリップボードや 文書を変更しません。つまり、上記のスクリプトでpasteイベントは発火しますが、 データが文書内に貼り付けられることはありません。

5.2. クリップボードイベント

5.2.1. clipboardchangeイベント

clipboardchange イベントはシステムクリップボードの内容が変更されたときに発火します。これらの変更には以下のようなもの(例示)があります:

クリップボードの内容がユーザーエージェント外で変更された場合、ユーザーエージェントがフォーカスを再取得した時点でclipboardchange イベントが必ず発火します。

合成されたcutcopy イベントはシステムクリップボードを更新しないため、 "clipboardchange"イベントは発火しません。

5.2.2. copy イベント

ユーザーがコピー操作を開始すると、ユーザーエージェントはcopyという名前のクリップボードイベントを発火します。

イベントがキャンセルされない場合、現在選択されているデータがシステムクリップボードへコピーされます。 現在のドキュメントの選択範囲は変化しません。

copy イベントはバブルし、キャンセル可能で、構成可能です。

このイベントの処理モデルの詳細は§ 8.1 コピーアクションを参照してください。

合成copy イベントは手動で構築してディスパッチできますが、 システムクリップボードの内容には影響しません。

5.2.3. cut イベント

ユーザーが切り取り操作を開始すると、ユーザーエージェントはcutという名前のクリップボードイベントを発火します。

編集可能コンテキストの場合、イベントがキャンセルされなければ、現在選択されているデータがシステムクリップボードに配置され、選択範囲が文書から削除されます。 cut イベントは選択されたデータが削除される前に発火します。切り取り操作が完了すると、選択範囲は折りたたまれます。

編集可能コンテキストの場合、clipboardData は空リストになります。この場合でもcut イベントは発火します。

cut イベントはバブルし、キャンセル可能で、構成可能です。

このイベントの処理モデルの詳細は§ 8.2 切り取りアクションを参照してください。

合成cut イベントは手動で構築してディスパッチできますが、 文書やシステムクリップボードの内容には影響しません。

5.2.4. paste イベント

ユーザーが貼り付け操作を開始すると、ユーザーエージェントはpasteという名前のクリップボードイベントを発火します。 このイベントは、クリップボードデータが文書に挿入される前に発火します。

カーソルが編集可能コンテキスト内にある場合、貼り付け操作はそのコンテキストでサポートされている最適な形式(あれば)でクリップボードデータを挿入します。

貼り付け操作は非編集可能コンテキストでは効果がありませんが、paste イベントは必ず発火します。

paste イベントはバブルし、キャンセル可能で、構成可能です。

このイベントの処理モデルの詳細は§ 8.3 貼り付けアクションを参照してください。

合成paste イベントは手動で構築してディスパッチできますが、 文書の内容には影響しません。

5.3. 他のスクリプトやイベントとの統合

5.3.1. クリップボードの変更が許可されているイベントハンドラ

以下のいずれかが真の場合、イベントハンドラはクリップボードへ書き込みできます:

実装は、実装者がそのイベントタイプがユーザーの意図を表す可能性が高いと判断した場合、他の信頼できるイベントタイプでもクリップボードの変更を許可してもよいです。また、信頼された特定サイトやアプリがスクリプトスレッドの起源に関係なくクリップボードを変更できるようにする設定をサポートしてもよいです。

合成されたcut およびcopy イベントはシステムクリップボードのデータを変更してはなりません

5.3.2. クリップボードからの読み取りが許可されているイベントハンドラ

以下のいずれかが真の場合、イベントハンドラはシステムクリップボードからデータを読み取ることができます:

合成されたpaste イベントは実際のシステムクリップボード上のデータへのアクセスをスクリプトに与えてはなりません

5.3.3. リッチテキスト編集APIとの統合

実装がスクリプトからクリップボードコマンドを実行する方法(例: document.execCommand() メソッドで "cut"、"copy"、"paste" コマンドを呼び出す)をサポートしている場合、実装は必ず対応するアクションをトリガーし、それに応じたクリップボードイベントをディスパッチします。

スクリプトAPIからコピー・切り取り・貼り付けアクションをトリガーする際の手順:

  1. 対応するアクションを同期的に実行する。

  2. アクションの戻り値をAPI呼び出しの戻り値として使用する。

注: スクリプトAPI経由でトリガーされたコピーや切り取りコマンドは、イベントが信頼できユーザーによってトリガーされた場合、または実装がそれを許可するように設定されている場合のみ、実際のクリップボードの内容に影響します。スクリプトAPI経由の貼り付けコマンドは、実装がそれを許可するよう設定されている場合のみ、貼り付けイベントを発火しクリップボード内容へのアクセスを許可します。クリップボードの読み書きアクセスを許可する実装設定方法は本仕様の範囲外です。

5.3.4. 他のイベントとの相互作用

クリップボード操作がキーボード入力でトリガーされた場合、実装は必ずその操作を開始するイベントを発火しなければなりません。イベントは非同期ですが、関連するキーのkeyupイベントの前にディスパッチされなければなりません。

切り取り・貼り付け操作は、実装がサポートする他のイベント(textInput、input、change、検証イベント、DOMCharacterDataModified、DOMNodeRemoved/DOMNodeInsertedなど)をディスパッチする場合があります。これらのイベントは、切り取り・貼り付けイベントの処理が完了した後に発火するようキューされます。

実装はコピー操作に応じて、textInput、input、change、検証イベントなど、他の入力関連イベントをディスパッチしてはなりません。

5.3.5. 選択やフォーカスを変更するイベントリスナー

イベントリスナーが選択やフォーカス可能領域を変更した場合、クリップボード操作は 必ず変更後の選択に対して完了しなければなりません。

6. クリップボードイベントAPI

クリップボードイベントAPIを使用すると、ユーザーエージェントのデフォルトの切り取り、コピー、貼り付け動作を上書きできます。

クリップボードへのアクセスは、標準のDataTransfer のメソッドを使って、itemsClipboardEventclipboardData 属性で操作します。 この結果、これらのクリップボードAPIはClipboardEvent ハンドラのコンテキスト内でのみクリップボードデータにアクセスできます。

注: クリップボードイベントハンドラの外部でクリップボードにアクセスしたい場合は、§ 7 非同期クリップボードAPIを参照してください。

注: クリップボードイベントAPIは同期的であり、できることに制限があります。権限取得や画像のトランスコードなど、ブロッキングの可能性がある操作はこれらのAPIではサポートされていません。ブロッキングや時間のかかる操作に対応するより強力なAPIについては§ 7 非同期クリップボードAPIを参照してください。

6.1. copyイベントの上書き

デフォルトのcopy イベントの動作を上書きするには、copy イベントハンドラを追加し、そのイベントハンドラ内でpreventDefault() を呼び出してイベントをキャンセルする必要があります。

イベントをキャンセルすることで、システムクリップボードclipboardData のデータで更新されます。 ClipboardEvent がキャンセルされない場合は、現在のドキュメント選択のデータがコピーされます。

// クリップボードにコピーされる内容を上書きする例
document.addEventListener('copy', function(e) {
  // e.clipboardDataは初期状態では空ですが、コピーしたいデータを設定できます。
  e.clipboardData.setData('text/plain', 'Hello, world!');
  e.clipboardData.setData('text/html', '<b>Hello, world!</b>');

  // ドキュメント選択範囲がクリップボードに書き込まれるのを防ぐために必要です。
  e.preventDefault();
});

6.2. cutイベントの上書き

デフォルトのcut イベントの動作を上書きするには、cut イベントハンドラを追加し、そのイベントハンドラ内でpreventDefault() を呼び出してイベントをキャンセルする必要があります。

イベントをキャンセルすることで、システムクリップボードclipboardData のデータで更新されます。 ClipboardEvent がキャンセルされない場合は、現在のドキュメント選択のデータがコピーされます。

cut イベントをキャンセルすると、ドキュメントが更新されなくなります(つまり、現在選択されているテキストは削除されません)。選択されたテキストを削除するには、イベントハンドラ内で手動でドキュメントを更新する必要があります。

// クリップボードにコピーされる内容を上書きする例
document.addEventListener('cut', function(e) {
  // e.clipboardDataは初期状態では空ですが、切り取り時にコピーしたいデータを設定できます。
  // クリップボードにコピーしたいデータを書き込みます。
  e.clipboardData.setData('text/plain', 'Hello, world!');
  e.clipboardData.setData('text/html', '<b>Hello, world!</b>');

  // cut操作をキャンセルするため、選択されたテキストを手動で削除する必要があります。
  deleteCurrentDocumentSelection();

  // ドキュメント選択範囲がクリップボードに書き込まれるのを防ぐために必要です。
  e.preventDefault();
});

6.3. pasteイベントの上書き

デフォルトのpaste イベントの動作を上書きするには、paste イベントハンドラを追加し、そのイベントハンドラ内でpreventDefault() を呼び出してイベントをキャンセルする必要があります。

イベントをキャンセルすることで、ユーザーエージェントがシステムクリップボードのデータでドキュメントを更新しなくなります。

paste イベントをキャンセルすると、ドキュメントが更新されなくなります(つまり、何も貼り付けられません)。データをドキュメントに貼り付けるには、イベントハンドラ内で手動で貼り付け処理を行う必要があります。

また、貼り付け時にはドラッグデータストアモードのフラグが読み取り専用になるため、setData()paste イベントハンドラ内で呼び出しても、挿入されるデータやクリップボード上のデータは変更されません。

// クリップボードから貼り付けられる内容を上書きする例
document.addEventListener('paste', function(e) {
  // e.clipboardDataは貼り付け直前のデータを含みます。
  if (e.clipboardData.types.indexOf('text/html') > -1) {
    var oldData = e.clipboardData.getData('text/html');
    var newData = '<b>Ha Ha!</b> ' + oldData;

    // 貼り付け操作をキャンセルするため、手動でデータをドキュメントに貼り付けます。
    pasteClipboardData(newData);

    // デフォルトの貼り付け動作を防ぐために必要です。
    e.preventDefault();
  }
});

6.4. 必須データ型

実装は、以下のデータ型についてOSのクリップボード形式の説明を認識し、DataTransferItemListClipboardItem を適切に記述することで、貼り付けイベント時に正しい内容を提供し、コピー・切り取りイベント時にはOSクリップボード上に正しいデータ形式を設定しなければなりません。

6.4.1. クリップボードからの読み取り

これらのデータ型は、クリップボード上に対応するネイティブ型が存在する場合、pasteイベントで公開されなければなりません:

6.4.2. クリップボードへの書き込み

これらのデータ型は、copycutイベント時にDataTransfer オブジェクトに追加された場合、対応するネイティブ型の説明と共にクリップボードへ配置されなければなりません。

警告!信頼されていないスクリプトがクリップボードへ書き込めるデータ型は、セキュリティ対策として制限されています。信頼されていないスクリプトは、ローカルソフトウェアの脆弱性を引き起こす既知のデータをクリップボードに配置しようとする場合があります。

6.5. 任意データ型

実装は、以下のデータ型についてOSのクリップボード形式の説明を認識してもよく、ClipboardItem を貼り付けイベント時に適切に記述し、コピー・切り取りイベント時にはOSクリップボード上に正しいデータ形式を設定してもよいです。

これらのデータ型は、クリップボード上に対応するネイティブ型が存在する場合、UAによって公開されることがあります:

6.6. 未サニタイズデータ型

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

以下のデータ型はUAによってサニタイズされてはなりません:

以下のデータ型はUAによってサニタイズされない場合があります:

任意未サニタイズデータ型とは、ウェブ著者が指定するもので、UAによってサニタイズされない場合があるmime typeです。 有効な任意未サニタイズデータ型は以下の通りです:

任意未サニタイズデータ型は、UAのプライバシー要件によってサポートされない場合があります。

7. 非同期クリップボードAPI

partial interface Navigator {
  [SecureContext, SameObject] readonly attribute Clipboard clipboard;
};

7.2. ClipboardItemインターフェース

typedef Promise<(DOMString or Blob)> ClipboardItemData;

[SecureContext, Exposed=Window]
interface ClipboardItem {
  constructor(record<DOMString, ClipboardItemData> items,
              optional ClipboardItemOptions options = {});

  readonly attribute PresentationStyle presentationStyle;
  readonly attribute FrozenArray<DOMString> types;

  Promise<Blob> getType(DOMString type);

  static boolean supports(DOMString type);
};

enum PresentationStyle { "unspecified", "inline", "attachment" };

dictionary ClipboardItemOptions {
  PresentationStyle presentationStyle = "unspecified";
};
clipboardItem = new ClipboardItem([items, options])
新しいClipboardItem オブジェクトを作成します。items表現のリストを表し、各表現mime typeと、対応するPromiseBlobまたはDOMStringを持ちます。optionsClipboardItemOptions の値を設定するために使います。下記の例を参照してください。
const format1 = 'text/plain';
const promise_text_blob = Promise.resolve(new Blob(['hello'], {type: format1}));
const clipboardItemInput = new ClipboardItem(
  {[format1]: promise_text_blob},
  {presentationStyle: "unspecified"});
clipboardItem.getType(type)
mime type typeに対応するPromiseBlobとして返します。
clipboardItem.types
このクリップボードアイテムオブジェクト内のmime typeのリストを返します。
ClipboardItem.supports(type)
type必須データ型または任意データ型に含まれていればtrue、そうでなければfalseを返します。

クリップボードアイテムは、ユーザーが「切り取り」や「コピー」コマンドを実行することで共有可能にしたいデータを概念的に表します。クリップボードアイテムには2つの役割があります。1つ目は、ウェブサイトがユーザーによってシステムクリップボードにコピーされたデータを読み取れるようにすること。2つ目は、ウェブサイトがシステムクリップボードへデータを書き込めるようにすることです。

例えばユーザーがネイティブアプリのスプレッドシートからセル範囲をコピーした場合、1つのクリップボードアイテムになります。ユーザーがデスクトップから複数のファイルをコピーした場合は、そのファイルリストは複数のクリップボードアイテムとして表現されます。

プラットフォームによっては、クリップボード上に複数のクリップボードアイテムを同時に保持できる場合もあれば、新しいもので前のクリップボードアイテムを置き換える場合もあります。

クリップボードアイテム表現リストを持ち、各表現は関連するmime typeMIMEタイプ)、初期値falseisCustomフラグ(この表現をwebカスタムフォーマットとして扱うかどうかを示す)、およびdataClipboardItemData)を持ちます。

webカスタムフォーマットisCustomtrueに設定されたものです。

スプレッドシートからセル範囲をコピーした場合、image(image/png)、HTMLテーブル(text/html)、プレーンテキスト(text/plain)、webカスタムフォーマット(web text/csv)として表現されることがあります。

これらのMIMEタイプは、同じクリップボードアイテムを異なる忠実度レベルで表現し、貼り付け時にターゲットアプリがより扱いやすくなります。

セル範囲を画像として利用可能にすることで、ユーザーは画像編集アプリに貼り付けることができますし、text/plainはテキストエディタアプリで利用できます。

クリップボードアイテム表示スタイルPresentationStyle)を持ちます。 これは、アプリがクリップボードアイテムの適切な表現内容を貼り付け時にインライン挿入するか、添付ファイルとして扱うかを区別するために使われます。

1つのクリップボードアイテムのみ貼り付け可能なWebアプリは、最初のクリップボードアイテムを使うべきです。

write() は最後のクリップボードアイテムを選択します。

複数のクリップボードアイテムを貼り付け可能なWebアプリは、例えば各クリップボードアイテムの内容をプレビューするUIを提供し、ユーザーがどれを貼り付けるか選択できるようにしてもよいです。 また、アプリは貼り付けるMIMEタイプを列挙し、アプリ独自のアルゴリズムで最適なものを選んでもよいです。 あるいは、ユーザーに「画像として貼り付け」「書式付きテキストとして貼り付け」等の選択肢を提示することもできます。

ClipboardItem オブジェクトには対応するクリップボードアイテムclipboard item)が関連付けられています。

ClipboardItem オブジェクトには対応するtypes arrayFrozenArray<DOMString)が関連付けられています。

ClipboardItem オブジェクトを作成するには、clipboard item clipboardItemとRealm realmが与えられたとき、以下の手順を実行します:

  1. clipboardItemObjectnew ClipboardItemrealmを使って作成する。

  2. clipboardItemObjectクリップボードアイテムclipboardItemに設定する。

new ClipboardItem(items, options) のコンストラクタ手順:

  1. itemsが空の場合、TypeErrorをスローする。

  2. optionsが空の場合、options["presentationStyle"] = "unspecified"とする。

  3. thisclipboard itemを新しいclipboard itemに設定する。

  4. thisclipboard itempresentation styleoptions["presentationStyle"]で設定する。

  5. typesDOMStringのリストとして作成する。

  6. itemsの各(key, value)について:

    1. representationを新しいrepresentationとして作成する。

    2. isCustomfalseとする。

    3. key"web "で始まる場合、

      1. "web "のプレフィックスを取り除き、残りをkeyに代入する。

      2. isCustomtrueに設定する。

    4. representationisCustomフラグをisCustomで設定する。

    5. mimeTypekeyに対してMIME型のパースの結果で設定する。

    6. mimeTypeが失敗の場合、TypeErrorをスローする。

    7. thisclipboard itemlist of representationsが、mimeTypeと[representation/isCustom]がisCustomであるrepresentation含む場合、TypeErrorをスローする。

    上記のステップは、ユーザーエージェントがよく知るmime-typeと著者がカスタム型として扱う意図があるものとの衝突を防ぎます。例えば、著者のitemsリストに"text/html"と"web text/html"の両方のrepresentationを含めることが可能です。

    1. representationMIME typemimeTypeで設定する。

    2. representationdatavalueで設定する。

    3. representationthisclipboard itemlist of representationsに追加する。

    4. mimeTypeStringmimeTypeMIME型をシリアライズした結果で設定する。

    5. isCustomtrueの場合、mimeTypeStringの先頭に"web "を付与する。

    6. mimeTypeStringtypesに追加する。

  7. thistypes arraytypesから凍結配列を作成した結果で設定する。

7.2.1. presentationStyle

presentationStyle ゲッターの手順は、thisclipboard itempresentation styleを返すこと。

7.2.2. types

types ゲッターの手順は、thistypes arrayを返すこと。

7.2.3. getType(type)

このメソッドは以下の手順を実行する:

  1. realmthis関連レルムとする。

  2. isCustomfalseとする。

  3. type"web "で始まる場合、

    1. "web "を取り除き、残りの文字列をtypeに代入する。

    2. isCustomtrueにする。

  4. mimeTypetypeに対してMIME型のパースの結果とする。

  5. mimeTypeが失敗なら、TypeErrorをスローする。

  6. itemTypeListthisclipboard itemlist of representationsとする。

  7. prealm内の新しいPromiseとする。

  8. itemTypeListの各representationについて:

    1. representationMIME typemimeTypeであり、 representationisCustomisCustomなら:

      1. representationDataPromiserepresentationdataとする。

      2. Promiseが解決されたときの反応

        1. representationDataPromiseが値vでfulfilledされた場合:

          1. vDOMStringなら:

            1. dataAsBytesvUTF-8エンコードした結果とする。

            2. blobDatadataAsBytesで作成したBlobとし、 typemimeTypeシリアライズ済み)で設定する。

            3. pblobDataでresolveする。

          2. vBlobなら:

            1. pvでresolveする。

        2. representationDataPromiseがrejectされた場合:

          1. pをrejectし、"NotFoundError" DOMExceptionrealmで返す。

            ウェブ開発者は根本的なreject理由に関心があるかもしれません。

      3. pを返す。

  9. pをrejectし、"NotFoundError" DOMExceptionrealmで返す。

  10. pを返す。

7.2.4. supports(type)

このメソッドは以下の手順を実行する:

  1. type必須データ型または任意データ型に含まれる場合、trueを返す。

  2. そうでなければ、falseを返す。

7.3. Clipboardインターフェース

typedef sequence<ClipboardItem> ClipboardItems;

[SecureContext, Exposed=Window]
interface Clipboard : EventTarget {
  Promise<ClipboardItems> read(optional ClipboardUnsanitizedFormats formats = {});
  Promise<DOMString> readText();
  Promise<undefined> write(ClipboardItems data);
  Promise<undefined> writeText(DOMString data);
};

dictionary ClipboardUnsanitizedFormats {
  sequence<DOMString> unsanitized;
};

Clipboard インターフェースの一部のメソッドは、複数のClipboardItem オブジェクトを受け取ったり返したりします。ただし、すべてのプラットフォームが複数のクリップボードアイテムをサポートしているわけではありません。そのようなプラットフォームでは、下記のアルゴリズムでClipboardItem のうち最初以外は無視されます。write() へ渡す場合も、read()readText() もOSからは1つのクリップボードアイテムしか取得しません。

クリップボードアイテム群 オブジェクトは、sequence型のクリップボードアイテムの集合です。

ウェブ著者は、システムクリップボードwrite(data) メソッドで内容を書き込むために、dataとしてClipboardItem の配列を作成する必要があります。read() は、システムクリップボードデータの内容を表すPromise 型のクリップボードアイテム群を返します。

unsanitized は、著者が任意未サニタイズデータ型として扱いたいmime typeに対応するDOMStringsequenceです。

unsanitized オプションはUAによってサポートされない場合があります。ウェブ著者は、unsanitized に記載したMIME型の内容が必ず未サニタイズであると仮定してはいけません。プライバシーモードによってはこのオプションが許可されないことがあります。

クリップボードタスクソース は、システムクリップボードデータの読み書きに応じてトリガーされます。

7.3.1. read(formats)

read(formats) メソッドは以下の手順を実行する:
  1. realmthis関連レルムとする。

  2. prealm内の新しいPromiseとする。

  3. formatsが空でない場合:

    1. formats["unsanitized"]の各formatについて:

      1. format任意未サニタイズデータ型に含まれていない場合、pをrejectし、format"NotAllowedError" DOMExceptionrealmで返す。

  4. 以下の手順を並列で実行する:

    1. rクリップボード読み取り権限の確認の結果とする。

    2. rがfalseの場合:

      1. グローバルタスクをキューに追加し、permission task source上で realmglobal objectに対し pをreject"NotAllowedError" DOMExceptionrealmで返す。

      2. この手順を中断する。

    3. dataシステムクリップボードデータのコピーとする。

    4. itemssequence<クリップボードアイテム>として作成する。

    5. dataの各systemClipboardItemについて:

      1. itemを新しいクリップボードアイテムとして作成する。

      2. systemClipboardItem内の各systemClipboardRepresentationについて:

        1. mimeTypesystemClipboardRepresentationnameを使ってOS固有形式からよく知られたMIME型アルゴリズムの結果とする。

        2. mimeTypeがnullの場合、このループを継続する。

        3. representationを新しいrepresentationとして作成する。

        4. representationMIME typemimeTypeで設定する。

        5. isUnsanitizedfalseとする。

        6. formatsが空でない場合:

          1. formats["unsanitized"]の各formatについて:

            1. formatMIME typeと等しい場合、isUnsanitizedをtrueにする。

        7. representationdatasystemClipboardRepresentationdataでresolveする。

          著者がgetTypeを呼び出した後に、システムクリップボードから非同期でデータを取得できるようにすべきですが、この手順だとread時点でデータが提供されることを示唆しています。

        8. UAは、representationdataをサニタイズしてもよいですが、representationMIME typeの本質が"image/png"の場合は、メタデータ保持のためサニタイズしてはなりません。また、以下条件を満たす場合も除外します:

          1. representationMIME type未サニタイズデータ型リストに含まれる。

          2. isUnsanitizedがtrueである。

        9. representationitemlist of representationsに追加する。

        10. isUnsanitizedfalseにする。

      3. itemlist of representationsのサイズが0より大きければ、itemitemsに追加する。

    6. itemsのサイズが0より大きい場合:

      1. firstItemitems[0]とする。

      2. Webカスタム形式の読み取りアルゴリズムをfirstItemに対して実行する。

    7. そうでなければ:

      1. customItemを新しいクリップボードアイテムとする。

      2. Webカスタム形式の読み取りアルゴリズムをcustomItemに対して実行する。

      3. customItemlist of representationsのサイズが0より大きければ、customItemitemsに追加する。

    8. グローバルタスクをキューに追加し、クリップボードタスクソース上で realmglobal objectに対し、以下の手順を実行する:

      1. clipboardItemssequence<ClipboardItem>として作成する。

      2. itemsの各クリップボードアイテム underlyingItemについて:

        1. clipboardItemを、ClipboardItemオブジェクトの生成手順に従いunderlyingItemrealmで生成する。

        2. clipboardItemclipboardItemsに追加する。

      3. pclipboardItemsでresolveする。

  5. pを返す。

const items = await navigator.clipboard.read();
const textBlob = await items[0].getType("text/plain");
const text = await (new Response(textBlob)).text();

7.3.2. readText()

readText() メソッドは以下の手順を実行する:
  1. realmthis関連レルムとする。

  2. prealm内の新しいPromiseとする。

  3. 以下の手順を並列で実行する:

    1. rクリップボード読み取り権限の確認の結果とする。

    2. rがfalseの場合:

      1. グローバルタスクをキューに追加し、permission task source上で realmglobal objectに対し pをreject"NotAllowedError" DOMExceptionrealmで返す。

      2. この手順を中断する。

    3. dataシステムクリップボードデータのコピーとする。

      一部のOSには複数のクリップボード(例: Linuxの"primary"、"secondary"、"selection")が存在します。どのクリップボードからデータを読み取るか定義してください。

      サニタイズ済みコピーの定義を追加してください。

    4. グローバルタスクをキューに追加し、クリップボードタスクソース上で realmglobal objectに対し、以下の手順を実行する:

      1. dataの各systemClipboardItemについて:

        1. systemClipboardItem内の各systemClipboardRepresentationについて:

          1. mimeTypesystemClipboardRepresentationnameを使ってOS固有形式からよく知られたMIME型アルゴリズムの結果とする。

          2. mimeTypeがnullの場合、このループを継続する。

          3. representationを新しいrepresentationとして作成する。

          4. representationMIME type本質が"text/plain"の場合:

            1. representationMIME typemimeTypeで設定する。

            2. representationDataPromiserepresentationdataとする。

            3. Promiseが解決されたときの反応

              1. representationDataPromiseが値vでfulfilledされた場合:

                1. vDOMStringなら:

                  1. pvでresolveする。

                  2. pを返す。

                2. vBlobなら:

                  1. stringvのバイト列をUTF-8デコードした結果とする。

                  2. pstringでresolveする。

                  3. pを返す。

              2. representationDataPromiseがrejectされた場合:

                1. pをrejectし、"NotFoundError" DOMExceptionrealmで返す。

                2. pを返す。

      2. pをrejectし、"NotFoundError" DOMExceptionrealmで返す。

      3. pを返す。

navigator.clipboard.readText().then(function(data) {
  console.log("取得した文字列: ", data);
});

7.3.3. write(data)

write(data) メソッドは以下の手順を実行する:
  1. realmthis関連レルムとする。

  2. prealm内の新しいPromiseとする。

  3. 以下の手順を並列で実行する:

    1. rクリップボード書き込み権限の確認の結果とする。

      clipboard-writeは https://github.com/w3c/clipboard-apis/pull/164 で削除されました。

    2. rがfalseの場合:

      1. グローバルタスクをキューに追加し、permission task source上で realmglobal objectに対し pをreject"NotAllowedError" DOMExceptionrealmで返す。

      2. この手順を中断する。

    3. グローバルタスクをキューに追加し、クリップボードタスクソース上で realmglobal objectに対し、以下の手順を実行する:

      1. itemListcleanItemListを空のsequence<Blob>として作成する。

      2. dataListsequence<ClipboardItem>として作成する。

      3. datasizeが1より大きく、かつ現在のOSがシステムクリップボードで複数のネイティブクリップボードアイテムをサポートしていない場合は、data[0]をdataListに追加し、そうでなければdataListdataとする。

        dataに複数アイテムが含まれ、OSが複数のネイティブクリップボードアイテムをサポートしている場合、現行アルゴリズムは各アイテムを順に書き込むが、本来はまとめて書き込むべきです。

      4. dataListの各clipboardItemについて:

        1. clipboardItemclipboard itemlist of representationsの各representationについて:

          1. representationDataPromiserepresentationdataとする。

          2. Promiseが解決されたときの反応

            1. representationDataPromiseが値vでfulfilledされた場合:

              1. vDOMStringなら:

                1. dataAsBytesvUTF-8エンコードした結果とする。

                2. blobDatadataAsBytesで作成したBlobとし、typerepresentationMIME typeで設定する。

                3. blobDataitemListに追加する。

              2. vBlobなら、vitemListに追加する。

            2. representationDataPromiseがrejectされた場合:

              1. pをrejectし、"NotAllowedError" DOMExceptionrealmで返す。

              2. この手順を中断する。

        2. itemListの各blobについて:

          1. typeblobtypeとする。

          2. type必須データ型または任意データ型リストに含まれていない場合、pをrejectし、"NotAllowedError" DOMExceptionrealmで返し、この手順を中断する。

          3. cleanItemblobの(オプションでサニタイズされた)コピーとする。

            サニタイズ済みコピーの定義を追加してください。

          4. サニタイズ処理が試みられたが正常に完了しなかった場合、以下の手順を実行する:

            1. pをrejectし、"NotAllowedError" DOMExceptionをrealmで返す。

            2. この手順を中断する。

          5. cleanItemcleanItemListに追加する。

        3. optionclipboardItemclipboard itempresentation styleとする。

        4. blobとoptionをクリップボードへ書き込むcleanItemListoptionを使用)。

      5. pをresolveする。

  4. pを返す。

var data = [new ClipboardItem({ "text/plain": Promise.resolve(new Blob(["Text data"], { type: "text/plain" })) })];
navigator.clipboard.write(data).then(function() {
  console.log("クリップボードへのコピーに成功しました!");
}, function() {
  console.error("クリップボードへの書き込みに失敗しました :-(");
});

7.3.4. writeText(data)

writeText(data) メソッドは以下の手順を実行する:
  1. realmthis関連レルムとする。

  2. prealm内の新しいPromiseとする。

  3. 以下の手順を並列で実行する:

    1. rクリップボード書き込み権限の確認の結果とする。

      clipboard-writeは https://github.com/w3c/clipboard-apis/pull/164 で削除されました。

    2. rがfalseの場合:

      1. グローバルタスクをキューに追加し、permission task source上で realmglobal objectに対し pをreject"NotAllowedError" DOMExceptionをrealmで返す。

      2. この手順を中断する。

    3. グローバルタスクをキューに追加し、クリップボードタスクソース上で realmglobal objectに対し、以下の手順を実行する:

      1. itemListを空のsequence<Blob>として作成する。

      2. textBlobを新しいBlobtype属性は"text/plain;charset=utf-8"、バイト列はdataUTF-8エンコード)で作成する。

        注: Windowsではdata内の`\n`を`\r\n`に置換してからtextBlobを作成してください。

      3. textBlobitemListに追加する。

      4. optionを"unspecified"に設定する。

      5. blobとoptionをクリップボードへ書き込むitemListoptionを使用)。

      6. pをresolveする。

  4. pを返す。

await navigator.clipboard.writeText("こんにちは!");

8. クリップボードアクション

このセクションでは、クリップボードアクションおよびイベント発火の処理モデルについて定義します。

各クリップボードアクションには、script-triggeredscript-may-access-clipboardという2つのフラグがあります。

script-triggeredフラグは、例えばdocument.execCommand()の呼び出しなど、スクリプトによってアクションが実行された場合にセットされます。今後クリップボードと連携するスクリプトAPIもこれらのアクションを利用し、script-triggeredフラグを適切にセットする必要があります。

script-may-access-clipboardフラグは、以下のように設定されます:

  1. アクションがcopyまたはcutであり、スクリプトスレッドがクリップボードの変更が許可されている場合、

    1. アクションのscript-may-access-clipboardフラグをセットする

  2. アクションがpasteであり、スクリプトスレッドがクリップボードからの読み取りが許可されている場合、

    1. アクションのscript-may-access-clipboardフラグをセットする。

8.1. コピーアクション

コピーアクションは次の手順で構成されます:

  1. script-triggeredフラグがセットされている場合、

    1. script-may-access-clipboardフラグが未セットの場合、

      1. コピーアクションからfalseを返し、このアルゴリズムを終了する

  2. copyという名前のクリップボードイベントを発火する

  3. イベントがキャンセルされなかった場合、

    1. 選択されている内容(あれば)をクリップボードにコピーする。実装は、ウェブページ内で選択された内容に対してtext/htmlおよびtext/plainのクリップボード形式も作成することが推奨されます。

    2. clipboardchangeという名前のクリップボードイベントを発火する

  4. イベントがキャンセルされた場合、

    1. write content to the clipboardアルゴリズムを呼び出し、DataTransferItemListリストitems、clear-was-calledフラグ、types-to-clearリストを渡す。

  5. コピーアクションからtrueを返す

8.2. 切り取りアクション

切り取りアクションは次の手順で構成されます:

  1. script-triggeredフラグがセットされている場合、

    1. script-may-access-clipboardフラグが未セットの場合、

      1. 切り取りアクションからfalseを返し、このアルゴリズムを終了する

  2. cutという名前のクリップボードイベントを発火する

  3. イベントがキャンセルされなかった場合、

    1. 編集可能コンテキストで切り取りが有効な選択範囲があれば、

      1. 選択されている内容(あれば)をクリップボードにコピーする。実装は、ウェブページ内で選択された内容に対してtext/htmlやtext/plainのクリップボード形式も作成することが推奨されます。

      2. 選択範囲の内容を文書から削除し、選択範囲を折りたたむ。

      3. clipboardchangeという名前のクリップボードイベントを発火する

      4. 変更によって発火すべきイベントをキューに追加する。詳細は§ 5.3 他のスクリプトやイベントとの統合を参照。

    2. 選択範囲がなく、またはコンテキストが編集不可の場合、

      1. falseを返す

  4. イベントがキャンセルされた場合、

    1. write content to the clipboardアルゴリズムを呼び出し、DataTransferItemListリストitems、clear-was-calledフラグ、types-to-clearリストを渡す。

    2. clipboardchangeという名前のクリップボードイベントを発火する

  5. 切り取りアクションからtrueを返す

8.3. 貼り付けアクション

貼り付けアクションについては、script-may-access-clipboardフラグは、クリップボードから読み取れるサイトやアプリを決定する実装依存の権限機構に依存します。スクリプトによって貼り付けアクションがトリガーされた場合、実装はユーザーの許可なしにクリップボードの内容を利用可能にしてはなりません。権限が未付与の場合、許可ダイアログにはスクリプトスレッドに関連付けられたドキュメントのホスト名を含めなければなりません。

貼り付けアクションは次の手順で構成されます:

  1. script-triggeredフラグがセットされている場合、

    1. script-may-access-clipboardが未セットの場合、

      1. 貼り付けアクションからfalseを返し、このアルゴリズムを終了する

  2. pasteという名前のクリップボードイベントを発火する

  3. イベントがキャンセルされなかった場合、

    1. 編集可能コンテキスト内で貼り付けが有効な選択やカーソルがある場合、

      1. クリップボード上の最適な内容(あれば)をそのコンテキストに挿入する。

      2. 変更によって発火すべきイベントをキューに追加する。詳細は§ 5.3 他のスクリプトやイベントとの統合を参照。

    2. それ以外の場合、

      1. falseを返す

  4. イベントがキャンセルされた場合

    1. falseを返す

  5. アクションからtrueを返す

9. Permissions APIとの統合

[permissions] APIは、ウェブサイトが強力な機能(クリップボードなど)へアクセスするための統一的な方法を提供します。これにより、ウェブサイトはユーザーから権限を要求したり、どの権限があるかを照会できます。

クリップボードについては、1つの権限が定義されています:"clipboard-write"

注: クリップボード権限は現在、非同期クリップボードAPIのみに適用されます。将来の本仕様のバージョンでは、他のクリップボード操作にもこの権限が適用される可能性があります。

これらのクリップボード権限は強力な機能であり、権限関連のアルゴリズムと型は以下のように定義されます:

permission descriptor type
dictionary ClipboardPermissionDescriptor : PermissionDescriptor {
  boolean allowWithoutGesture = false;
};

クリップボード権限は4種類あります:

それぞれの関係は次の通りです:

ユーザーエージェントは本仕様で記載されたClipboardPermissionDescriptor を必ずサポートしなければなりませんが、デフォルト設定やユーザーへの表示方法(あるいは表示しない方法)については完全に制御できます。

ユーザーエージェントがクリップボードへの書き込みを個別にユーザーが設定でき、常にユーザー操作が必要となるよう制御したい場合、各ディスクリプタは以下のように扱われます:

9.1. クリップボード読み取り権限

9.1.1. クリップボード読み取り権限の確認

  1. hasGestureを、関連グローバルオブジェクト一時的なアクティベーションを持つ場合true、そうでなければfalseとする。

  2. もしhasGestureなら、

    1. 現在のスクリプトがユーザーエージェントまたはOSが作成した「貼り付け」要素のユーザー操作により実行されている場合trueを返す。

  3. falseを返す。

9.2. クリップボード書き込み権限

9.2.1. クリップボード書き込み権限の確認

  1. writeWithoutGesture{ name: "clipboard-write", allowWithoutGesture: true }権限の権限状態とする。

  2. writeWithoutGesturegrantedならtrueを返す。

  3. hasGestureを、関連グローバルオブジェクト一時的なアクティベーションを持つ場合true、そうでなければfalseとする。

  4. もしhasGestureなら、

    1. 現在のスクリプトがユーザーエージェントまたはOSが作成した「cut」または「copy」要素のユーザー操作により実行されている場合systemCopyをtrueとする。

    2. systemCopyがtrueならtrueを返す。

    3. 権限の利用要求{ name: "clipboard-write", allowWithoutGesture: false }権限に対して実行した結果を返す。

      注: ユーザーエージェントは、より強い権限を要求し、暗黙的にこの権限を更新する選択も可能です。

  5. 権限の利用要求{ name: "clipboard-write", allowWithoutGesture: true }権限に対して実行した結果を返す。

10. セキュリティに関する考慮事項

著者がユーザーによってコピーされる内容を変更したり、選択されたことのないデータを自動的にコピーしたり、情報の貼り付けを無制限に許可することは、様々なセキュリティ上の懸念を引き起こす可能性があります。

例えば以下のようなシナリオがあります:

10.1. HTMLやマルチパートデータの貼り付け

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

フォーマット済みデータやマルチパートデータの貼り付けには特定のセキュリティリスクがあります。

どのようなポリシーを採用するかは、以下の要素を考慮して判断します:

シナリオと考えられるセキュリティポリシーの概要:

データのオリジン スクリプトのオリジン ルール
オンラインソース由来 データと同じ HTMLをサニタイズしない。ローカルファイルへのアクセスはしない。
異なるオリジン コンテンツをサニタイズする場合がある。ローカルファイルへのアクセスはしない。
ローカルアプリケーション由来 任意 HTMLをサニタイズしない。ローカルファイルへのアクセスを許可。

一部の実装は、リッチテキスト貼り付け時にSCRIPT要素やjavascript:リンクなど悪意のある可能性のある内容をデフォルトで除去することでリスクを軽減しますが、pasteイベントハンドラで元の未サニタイズデータを取得・処理できるようにしています。

10.2. 一般的なセキュリティポリシー

実装は、参照されたオンラインリソースをダウンロードしたり、その内容をfiles リストやDataTransferItemListで公開してはなりません

クリップボード上のデータがローカルアプリケーション由来でない場合、実装は参照されているローカルファイルへのアクセスを許可してはなりません。例えば、データに<img src="file://localhost/example.jpg">が含まれていても、データのオリジンがオンラインリソースであれば、example.jpgのエントリをclipboardData.itemsリストに追加してはなりません。

10.3. 画像のトランスコード

悪意のある画像データがクリップボードに置かれるのを防ぐため、画像データは安全なバージョンにトランスコードされる場合があります。これによって、ウェブサイトが他のアプリケーションの脆弱性を悪用するのを防止します。

実装は、クリップボードから画像を読み取る場合はトランスコードすべきではありません。画像のトランスコードは、画像の物理的な解像度など重要なメタデータを失う可能性があります。 これは、画像がウェブサイトと共有される他の方法(たとえば`<input type=file>`)とも一貫しています。

10.4. 迷惑行為対策

スクリプトはDataTransfer APIを使って、コピーや切り取りイベントでシステムクリップボード上のデータを変更し、ユーザーを困惑・混乱させる場合があります。本仕様はこうした迷惑行為の防止までは意図していませんが、実装は追加の制限を設けてもかまいません。

実装は、スクリプトが過剰な量のデータをクリップボードに置こうとした場合も、適切に処理しなければなりません。

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

これらのAPIはユーザーのクリップボードデータへのアクセスを提供するため、クリップボードに氏名や住所、パスワードなど個人を特定できる情報(PII)が含まれている可能性があり、重大なプライバシー上の懸念があります。

一般的に、ユーザーエージェントは信頼されていないスクリプトがこれらのAPIを使ってユーザーのクリップボードデータに無制限にアクセスすることを許可してはなりません

11.1. プライバシーとクリップボードイベントAPI

Clipboard Event APIは、クリップボードイベントハンドラのコンテキスト内で実行されているスクリプトに、システムクリップボードのコピーへのアクセスと、クリップボードに書き込まれるデータの変更の可能性を提供します。

ユーザーエージェントは、Clipboard Event APIでアクセスできるデータのセキュリティを確保するため、以下の点に注意すべきです:

Clipboard Event APIはClipboard permissionの対象ではありませんが、ユーザーエージェントはこのAPI自体を無効化したり、アクセスを許可するサイトを設定できる方法を提供してもかまいません。

11.2. プライバシーと非同期クリップボードAPI

非同期クリップボードAPIは強力な機能であり、すべてのスクリプトからクリップボードデータにアクセスできる(Clipboard Eventハンドラに限定されない)上に、ユーザー操作なしでもデータにアクセス可能となる場合があります。

悪用防止のため、このAPIはスクリプトがフォーカスを持つ文書のコンテキスト内で実行されている場合にのみ利用可能でなければなりません

11.2.1. プライバシーとクリップボード権限

クリップボード権限はこのAPIへのアクセスを制御しますが、ユーザーエージェントは権限のデフォルト値やユーザーが設定可能な権限項目を選択できます。例えば、ユーザーエージェントはユーザー操作がある場合のみ非同期クリップボードAPIへのアクセスを許可し、操作なしの場合はスクリプトからのアクセス要求を常に拒否するようにできます。

ユーザーエージェントは、ユーザーが権限を与えてから一定時間が経過した後や、ユーザーがサイトを最後に訪問してから一定時間が経過した後、あるいはユーザーがページから離れた場合などに、権限を自動的に失効させる選択も可能です:

11.3. その他のプライバシー懸念

ユーザーエージェントがdocument.execCommand("paste")を使ってクリップボードデータの読み取りを許可する場合、ユーザーが明示的にそのアクセスを許可したことを必ず確認しなければなりません。

12. 謝辞

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

編集者は本仕様の現行状態に導くため、様々な会議やメーリングリストで支えてくださった前任編集者の貢献に感謝します。

編集者はまた、MicrosoftによるData Transfer機能のドキュメント[MICROSOFT-CLIP-OP][HTML5]仕様の初期ドラフトから得られた知的財産にも謝意を表します。Paul Libbrecht氏によるドラフト「安全なコピー&ペースト」にも感謝します(このドラフトはWeb上から入手できなくなっています)。

最後に、下記の方々の貢献にも感謝いたします:

Adam Barth, Shawn Carnell, Daniel Cheng, Daniel Dardailler, Domenic Denicola, Al Gilman, James Graham, James Greene, Ian Hickson, Darwin Huang, Lachlan Hunt, Philip Jägenstedt, Anne van Kesteren, Marijn Kruisselbrink, Aaron Leventhal, Jim Ley, Paul Libbrecht, "Martijn", Glenn Maynard, Chris Mills, ms2ger, Ryosuke Niwa, Robert O’Callahan, Dave Poehlman, "ROBO Design", Janina Sajka, Rich Schwerdtfeger, Jonas Sicking, Maciej Stachowiak, Mihai Sucan, Dmitry Titov, Ojan Vafai, Tarquin Wilton-Jones, Tom Wlodkowski, Bo Cupp, mbrodesser および Boris Zbarsky.

付録A: アルゴリズム

クリップボードに内容を書き込む

入力

items: DataTransferItemList の書き込むアイテムリスト

clear-was-called: boolean型

types-to-clear: リスト型

出力

なし

  1. itemsリストが空でない場合、

    1. クリップボードをクリアする

    2. リスト内の各パートについて、

      1. データ型がtext/plainの場合、

        1. OSやロケールの規則に従ってエンコーディングが正しいことを保証する

        2. プラットフォームの規則に従って改行コードを正規化する

        3. テキストを適切なOSクリップボード形式記述子でクリップボードに配置する

      2. それ以外でデータ型が必須データ型リストに含まれている場合、

        1. パートを適切なOSクリップボード形式記述子でクリップボードに配置する

      3. その他

        1. この部分は実装依存・・・

          実装依存にするのは好ましくありません。どうすべきか?

          注: OSクリップボードの実装制限により、スクリプトはカスタムフォーマットが他のアプリケーションで利用可能になると仮定すべきではありません。例えばMicrosoft Windowsでは、登録できるカスタムクリップボードフォーマット数に制限があります。setData()のtype引数には任意の文字列が使えますが、必須データ型を使うのが強く推奨されます。

  2. それ以外の場合(itemsリストが空の場合)、クリップボードをクリアするかどうか以下の手順で判断する:

    1. アイテムリストが空で、clear-was-calledフラグがtrueの場合、

      1. types-to-clearリストが空なら、

        1. クリップボードをクリアする

      2. それ以外の場合、

        1. OS・実装依存の方法でtypes-to-clearリストに含まれる型をクリップボードから削除する

          「クリップボードから特定の型のみ削除する」機能はリスクがある。重要性が低く、主要プラットフォームで簡易に実装できるか疑問です。

blobとオプションをクリップボードに書き込む

入力

items: sequence<Blob>

presentationStyle: クリップボードアイテムpresentation style

出力

なし

  1. webCustomFormatssequence<Blob>として作成する。

  2. itemsの各itemについて:

    1. formatStringitemtypeに対してOS固有のよく知られたフォーマットを実行した結果とする。

    2. formatStringが空の場合、以下の手順を実行:

      1. webCustomFormatStringitemtypeとする。

      2. webCustomFormatを空のtypeとして作成する。

      3. もしwebCustomFormatString"web "で始まる場合、"web "を除去し残りの文字列をwebMimeTypeStringに保存する。

      4. webMimeTypewebMimeTypeStringに対してMIME型のパースを実行した結果とする。

      5. もしwebMimeTypeが失敗なら、すべての手順を中断する。

      6. webCustomFormattype本質webMimeTypeに等しくする。

      7. itemtypewebCustomFormatに設定する。

      8. webCustomFormatwebCustomFormatsに追加する。

    3. payloaditemのバイト列をUTF-8デコードした結果とする。

    4. payloadpresentationStyleformatStringをネイティブクリップボードフォーマットとして使い、システムクリップボードに挿入する。

    一部のOSには複数のクリップボード(例: Linuxの"primary"、"secondary"、"selection")が存在します。どのクリップボードに書き込むか定義してください。

  3. Webカスタムフォーマットの書き込みwebCustomFormatsに対して実行する。

OS固有のよく知られたフォーマット

入力

mimeType: type

出力

wellKnownFormat: プラットフォーム固有の文字列型。MacではNSPasteboardType、WindowsではLPCWSTR、Linuxではconst char*。

Windowsの詳細は https://docs.microsoft.com/en-us/windows/win32/dataxchg/standard-clipboard-formats および https://docs.microsoft.com/en-us/windows/win32/dataxchg/about-atom-tables?redirectedfrom=MSDN Macの詳細は https://developer.apple.com/documentation/appkit/nspasteboardtype

  1. wellKnownFormatを空文字列とする。

  2. mimeType本質が"text/plain"の場合、

    Windowsの場合:

    1. CF_UNICODETEXTをwellKnownFormatに代入する。

    MacOSの場合:

    1. NSPasteboardTypeStringをwellKnownFormatに代入する。

    Linux・ChromeOS・Androidの場合:

    1. "text/plain"をwellKnownFormatに代入する。

  3. それ以外でmimeType本質が"text/html"の場合、

    Windowsの場合:

    1. CF_HTMLをwellKnownFormatに代入する。

    MacOSの場合:

    1. NSPasteboardTypeHTMLをwellKnownFormatに代入する。

    Linux・ChromeOS・Androidの場合:

    1. "text/html"をwellKnownFormatに代入する。

  4. それ以外でmimeType本質が"image/png"の場合、

    Windowsの場合:

    1. "PNG"をwellKnownFormatに代入する。

    MacOSの場合:

    1. NSPasteboardTypePNGをwellKnownFormatに代入する。

    Linux・ChromeOS・Androidの場合:

    1. "image/png"をwellKnownFormatに代入する。

  5. それ以外でmimeType本質が"image/svg+xml"の場合、

    Windowsの場合:

    1. CFSTR_MIME_SVG_XMLをwellKnownFormatに代入する。

    MacOSの場合:

    1. UTTypeSVGをwellKnownFormatに代入する。

    Linux・ChromeOS・Androidの場合:

    1. "image/svg+xml"をwellKnownFormatに代入する。

  6. wellKnownFormatを返す。

OS固有フォーマットからよく知られたMIME型を得る

入力

osFormatName: プラットフォーム固有の文字列型。MacではNSPasteboardType、WindowsではLPCWSTR、Linuxではconst char*。

出力

mimeType: MIME型

Windowsの詳細は https://docs.microsoft.com/en-us/windows/win32/dataxchg/standard-clipboard-formats および https://docs.microsoft.com/en-us/windows/win32/dataxchg/about-atom-tables?redirectedfrom=MSDN Macの詳細は https://developer.apple.com/documentation/appkit/nspasteboardtype

Windowsの場合:

  1. osFormatNameが"UnicodeText"なら、mimeTypeStringを"text/plain"に設定する。

  2. それ以外でosFormatNameが"HTML Format"なら、mimeTypeStringを"text/html"に設定する。

  3. それ以外でosFormatNameが"PNG"なら、mimeTypeStringを"image/png"に設定する。

  4. それ以外でosFormatNameがCFSTR_MIME_SVG_XMLなら、mimeTypeStringを"image/svg+xml"に設定する。

MacOSの場合:

  1. osFormatNameがNSPasteboardTypeStringなら、mimeTypeStringを"text/plain"に設定する。

  2. それ以外でosFormatNameがNSPasteboardTypeHTMLなら、mimeTypeStringを"text/html"に設定する。

  3. それ以外でosFormatNameがNSPasteboardTypePNGなら、mimeTypeStringを"image/png"に設定する。

  4. それ以外でosFormatNameがUTTypeSVGなら、mimeTypeStringを"image/svg+xml"に設定する。

Linux・ChromeOS・Androidの場合:

  1. osFormatNameが"text/plain"なら、mimeTypeStringを"text/plain"に設定する。

  2. それ以外でosFormatNameが"text/html"なら、mimeTypeStringを"text/html"に設定する。

  3. それ以外でosFormatNameが"image/png"なら、mimeTypeStringを"image/png"に設定する。

  4. それ以外でosFormatNameが"image/svg+xml"なら、mimeTypeStringを"image/svg+xml"に設定する。

  1. mimeTypemimeTypeStringに対してMIME型のパースを実行した結果とする。

  2. mimeTypeを返す。

Webカスタムフォーマットの読み取り

入力

itemクリップボードアイテム

  1. webCustomFormatMapOS固有のカスタムマップ名とする。

  2. webCustomFormatMapシステムクリップボードから読み取る。

    webCustomFormatMapの読み取り処理をより詳細に規定すべき。

  3. webCustomFormatMapが空なら、itemを返す。

  4. webCustomFormatMapStringwebCustomFormatMapからデシリアライズしたJSON文字列とする。

    注: webCustomFormatMapの内容デシリアライズにはJSONリーダーが必要。

  5. webCustomFormatMapString内の各(key, value)について:

    1. mimeTypekeyに対してMIME型のパースの結果とする。

    2. mimeTypeが失敗なら、ループを継続する。

    3. representationを新しいrepresentationとして作成する。

    4. representationMIME typemimeTypeに設定する。

    5. representationisCustomフラグをtrueに設定する。

    6. webCustomFormatvalueを使ってシステムクリップボードから読み取る。

    7. 読み取りが成功した場合、representationdataシステムクリップボードの取得データに設定し、失敗ならループを継続する。

    8. representationitemlist of representationsに追加する。

Webカスタムフォーマットの書き込み

入力

itemssequence<Blob>

  1. idxを0で初期化する。

  2. webCustomFormatMapOS固有のカスタムマップ名とする。

  3. webCustomFormatMapStringを空のJSON文字列とする。

  4. itemsの各itemについて:

    1. webCustomFormatOS固有のカスタム名とする。

    2. webCustomFormatIdxwebCustomFormatidxを結合した結果とする。

    3. itemtypeをキー、webCustomFormatIdxを値として webCustomFormatMapStringにJSONシリアライザーで追加する。

      注: webCustomFormatMapStringへのシリアライズにはJSONライターが必要。

    4. itemwebCustomFormatIdxをフォーマットとしてシステムクリップボードに挿入する。

    5. idxをインクリメントする。

    6. idxが100を超えたら、このループを終了する。

  5. webCustomFormatMapStringwebCustomFormatMapをフォーマットとしてシステムクリップボードに挿入する。

OS固有のカスタムマップ名

出力

webCustomFormatMap、文字列

Windowsの場合:

  1. webCustomFormatMapに"Web Custom Format Map"を代入する。

  2. webCustomFormatMapを返す。

MacOSの場合:

  1. webCustomFormatMapに"org.w3.web-custom-format.map"を代入する。

  2. webCustomFormatMapを返す。

Linux、ChromeOS、Androidの場合:

  1. webCustomFormatMapに"application/web;type=\"custom/formatmap\""を代入する。

  2. webCustomFormatMapを返す。

OS固有のカスタム名

出力

webCustomFormat、文字列

Windowsの場合:

  1. webCustomFormatに"Web Custom Format"を代入する。

  2. webCustomFormatを返す。

MacOSの場合:

  1. webCustomFormatに"org.w3.web-custom-format.type-"を代入する。

  2. webCustomFormatを返す。

Linux、ChromeOS、Androidの場合:

  1. webCustomFormatに"application/web;type=\"custom/format\""を代入する。

  2. webCustomFormatを返す。

クリップボードイベントの発火

入力

e、発火するClipboardEvent

出力

なし

  1. clear-was-calledfalseとする。

  2. types-to-clearを空リストとする。

  3. clipboard-event-dataを空のDataTransfer オブジェクト(itemsリストは空)とする。

  4. clipboard-entryを現在のクリップボード内容のシーケンス番号、またはOSクリップボードがシーケンス番号をサポートしない場合はnullとする。

  5. trustedをイベントがユーザーエージェントによって生成された場合true、それ以外はfalseとする。

  6. targetを次のように設定する:

    1. コンテキストが編集可能な場合:

      1. targetを、ドキュメント順で可視選択範囲またはカーソルの開始位置を含む要素、なければbody要素とする。

    2. コンテキストが編集不可の場合:

      1. targetをフォーカスされているノード、なければbody要素とする。

  7. イベントを次のように処理する:

    1. eが"paste"の場合:

      1. clipboard-event-dataの内部drag data store modeフラグをread-onlyに設定する。

      2. trustedtrue、または実装がスクリプト生成イベントにOSクリップボードの読み取り権限を与えるよう設定されている場合:

        1. OSクリップボード上の各clipboard-partについて以下を実行:

          1. clipboard-partがプレーンテキストの場合:

            1. テキストがスクリプトエンジン内部のエンコーディングであることを保証する。

            2. new-dataを新しいDataTransferItem とし、drag data item kindstringdrag data item type stringtext/plain

            3. new-dataのデータをプレーンテキストに設定する。

            4. new-dataclipboard-event-dataitemsリストに追加する。

          2. clipboard-partがファイル参照の場合、その各ファイル参照について:

            1. 参照ファイルのMIME型を判定する。

            2. new-dataを新しいDataTransferItem とし、drag data item kindfiledrag data item type stringはMIME型(不明ならapplication/octet-stream)。

            3. new-dataのデータをファイル参照データに設定する。

            4. new-dataclipboard-event-dataitemsリストに追加する。

          3. clipboard-partがOSの規則によるHTMLまたはXHTML形式テキストの場合:

            1. 実装がHTML貼り付けをサポートしていれば、HTML貼り付けイベントの処理clipboard-partclipboard-event-dataで実行する。

          4. clipboard-partが他のサポートされたバイナリまたはテキスト型(必須データ型参照)の場合:

            1. データのMIME型を判定する。

            2. new-dataを新しいDataTransferItem とし、drag data item kindfiledrag data item type stringはMIME型。

            3. new-dataのデータをバイナリまたはテキストデータに設定する。

            4. new-dataclipboard-event-dataitemsリストに追加する。

      3. clipboard-event-datafiles プロパティをitemsリストに合わせて更新する。

      4. clipboard-event-datatypes プロパティをitemsリストに合わせて更新する。

    2. eが"copy"または"cut"の場合:

      1. 関連DataTransfer オブジェクトの内部drag data store modeフラグをread/writeに設定する。

  8. eclipboardDataclipboard-event-dataに設定する。

  9. eisTrustedtrustedに設定する。

  10. ecomposed をtrueに設定する。

  11. イベントeをバブル・キャンセル可能として、ClipboardEvent インターフェースを使用しtargetで発火する。

    イベント発火中のデータアクセス要件は[HTML]で定義されています。追加のクリップボードイベント固有の処理規則は下記の通りです:

    なぜここに?なぜHTML仕様に記載しない?

    1. スクリプトがclearData()またはclear() を呼び出し、かつDataTransfer オブジェクトの内部drag data store modeフラグがread/writeの場合:

      1. clear-was-calledフラグをtrueに設定する。引数が指定されている場合はその引数をtypes-to-clearリストに追加する。

    2. スクリプトがsetData()を呼び出すかitemsを変更し、clear-was-calledフラグがtrueの場合:

      1. types-to-clearリストが空なら:

        1. clear-was-calledフラグをfalseに設定する。

      2. それ以外の場合、setData()type引数または新規アイテムのdrag data item type stringtypes-to-clearリストに含まれていれば:

        1. それをリストから除去し、リストが空になったらclear-was-calledフラグをfalseに設定する。

    3. スクリプトがgetData()を呼び出すかDataTransferItemList のitemsにアクセスし、clipboard-entryがセットされている場合:

      1. クリップボードデータのシーケンス番号がclipboard-entryと一致するか確認し、一致しない場合はDataTransferItemList オブジェクトの内部drag data store modeprotectedに設定する。

    警告!pasteイベントを監視する悪意のあるスクリプトは、ユーザーが今後クリップボードに置く内容を読み取るため、無限ループを仕掛ける可能性があります。クリップボードのシーケンス番号が取得できないプラットフォームでは、他の制限を実装すべきです。

HTML貼り付けイベントの処理

入力

clipboard-part、処理対象のクリップボードパート

clipboard-event-data、このイベント用のDataTransferオブジェクト

出力

なし

  1. new-dataを新しいDataTransferItem とし、drag data item kindPlain Unicode stringdrag data item type stringは適宜text/htmlまたはapplication/xhtml+xml

  2. clipboard-partからマークアップを抽出し、適切なパーサーでDOMツリーを構築する。

  3. マークアップのソースURLが判明している場合、HREFやSRC属性の相対URLをソースURLを基準に絶対URLに解決し、属性値を絶対URLにする。

  4. マークアップのオリジンがローカルアプリケーションの場合、ローカルファイルやOSクリップボード内の他パート参照があるか確認し、参照があればsub-part参照はcid:URLスキーム[RFC2392]でcontent-id参照に必ず置換する。各属性について下記手順で処理:

    これらの手順は必要か?内部参照を持つネイティブ(プラットフォーム)クリップボード実装の存在を把握しているか?

    この機能は要件不明かつクロスプラットフォームで検証困難なためリスクあり。

    1. clipboard-event-dataitems に参照されたファイルまたはクリップボード部品のエントリが既に存在する場合、

      1. itemNumberに既存エントリのインデックスを設定する。

    2. それ以外の場合、

      1. new-file-dataを新しいDataTransferItemdrag data item kindは"file"、drag data item type stringはファイルまたはクリップボード部品のMIME型(不明ならapplication/octet-stream))として作成する。

      2. file-infoを新しいFile オブジェクト(nameはHTML属性内容の名前部分、lastModifiedは参照ファイルのタイムスタンプまたはクリップボード部品参照なら0)として作成する。

      3. new-file-dataの内部File オブジェクトにfile-infoを設定する。

      4. new-file-dataclipboard-event-dataitems に追加し、そのエントリのインデックスをitemNumberとする(DataTransferItemList内)。

    3. ローカルファイルやクリップボード部品を参照していたDOM属性を 'cid:'+itemNumber の文字列に更新する。

  5. 処理後のDOMをシリアライズし、そのHTMLコードでnew-dataを更新する。

  6. new-dataclipboard-event-dataitems に追加する。

適合性

文書上の規約

適合性要件は、記述的な断定とRFC 2119の用語の組み合わせで表現されます。 「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」といったキーワードは、 この文書の規範部分でRFC 2119に従って解釈されます。 ただし、可読性のため、これらの単語は本仕様書ではすべて大文字では表記されません。

本仕様のテキストは、明示的に非規範と記載された部分、例、および注釈を除いてすべて規範的です。 [RFC2119]

本仕様書の例は「例えば」で始まるか、またはclass="example"のように規範テキストと区別されて記載されます:

これは参考例です。

参考となる注記は「注」から始まり、class="note"で規範テキストと区別されて記載されます:

注:これは参考となる注記です。

適合するアルゴリズム

アルゴリズムの一部として命令形で記載された要件(例:"先頭の空白文字を除去する" や "falseを返してこれらの手順を中断する" など)は、アルゴリズムの導入部で用いられたキーワード("must"、"should"、"may"など)の意味で解釈されます。

アルゴリズムや特定の手順として記載された適合性要件は、同等の結果が得られる限り、どのような方法でも実装できます。 とくに、本仕様で定義されたアルゴリズムは理解しやすくすることを目的としており、パフォーマンスを意図したものではありません。 実装者は最適化することを推奨します。

索引

本仕様で定義されている用語

参照によって定義される用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM標準. 現行標準. URL: https://dom.spec.whatwg.org/
[ENCODING]
Anne van Kesteren. Encoding標準. 現行標準. URL: https://encoding.spec.whatwg.org/
[FileAPI]
Marijn Kruisselbrink. File API. 2024年12月4日. WD. URL: https://www.w3.org/TR/FileAPI/
[HTML]
Anne van Kesteren; 他. HTML標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. 現行標準. URL: https://infra.spec.whatwg.org/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing標準. 現行標準. URL: https://mimesniff.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. 2024年12月20日. WD. URL: https://www.w3.org/TR/permissions/
[RFC2119]
S. Bradner. RFCにおける要求レベルを示すキーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC2392]
E. Levinson. Content-IDおよびMessage-ID URL. 1998年8月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2392
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準. 現行標準. URL: https://webidl.spec.whatwg.org/

参考情報

[HTML5]
Ian Hickson; 他. HTML5. 2018年3月27日. REC. URL: https://www.w3.org/TR/html5/
[MICROSOFT-CLIP-OP]
About DHTML Data Transfer. Microsoft Developer Network.. URL: https://msdn.microsoft.com/en-us/ie/ms537658(v=vs.94)
[SVG11]
Erik Dahlström; 他. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/

IDL索引

dictionary ClipboardEventInit : EventInit {
  DataTransfer? clipboardData = null;
};

[Exposed=Window]
interface ClipboardEvent : Event {
  constructor(DOMString type, optional ClipboardEventInit eventInitDict = {});
  readonly attribute DataTransfer? clipboardData;
};

partial interface Navigator {
  [SecureContext, SameObject] readonly attribute Clipboard clipboard;
};

typedef Promise<(DOMString or Blob)> ClipboardItemData;

[SecureContext, Exposed=Window]
interface ClipboardItem {
  constructor(record<DOMString, ClipboardItemData> items,
              optional ClipboardItemOptions options = {});

  readonly attribute PresentationStyle presentationStyle;
  readonly attribute FrozenArray<DOMString> types;

  Promise<Blob> getType(DOMString type);

  static boolean supports(DOMString type);
};

enum PresentationStyle { "unspecified", "inline", "attachment" };

dictionary ClipboardItemOptions {
  PresentationStyle presentationStyle = "unspecified";
};

typedef sequence<ClipboardItem> ClipboardItems;

[SecureContext, Exposed=Window]
interface Clipboard : EventTarget {
  Promise<ClipboardItems> read(optional ClipboardUnsanitizedFormats formats = {});
  Promise<DOMString> readText();
  Promise<undefined> write(ClipboardItems data);
  Promise<undefined> writeText(DOMString data);
};

dictionary ClipboardUnsanitizedFormats {
  sequence<DOMString> unsanitized;
};

dictionary ClipboardPermissionDescriptor : PermissionDescriptor {
  boolean allowWithoutGesture = false;
};

課題索引

ウェブ開発者は、拒否理由の詳細に関心がある場合があります。
著者が getType を呼び出した後、システムクリップボードから非同期でデータを読み取れるようにすべきですが、この一連の手順では read の時点でデータが提供されることを示唆しています。
一部のOS(例: Linuxの "primary", "secondary", "selection")には複数のクリップボードがあります。どこからデータを読み取るか定義してください。
サニタイズ済みコピーの定義を追加してください。
clipboard-write は https://github.com/w3c/clipboard-apis/pull/164 で削除されました。
data に複数のアイテムが含まれており、かつOSが複数のネイティブクリップボードアイテムをサポートしている場合、現在のアルゴリズムはアイテムをシーケンスでシステムクリップボードに書き込むが、まとめて書き込むべきです。
サニタイズ済みコピーの定義を追加してください。
clipboard-write は https://github.com/w3c/clipboard-apis/pull/164 で削除されました。
実装依存にするのは好ましくありません。どうすべきか?
「クリップボードから特定の型のみ削除する」機能はリスクがあります。重要性が低く、主要なプラットフォームで容易に実装できるか疑問です。
一部のOS(例: Linuxの "primary", "secondary", "selection")には複数のクリップボードがあります。どこにデータを書き込むか定義してください。
webCustomFormatMap の読み取り処理をより詳細に規定すべきです。
なぜここで?なぜHTML仕様に含めないのか?
これらの手順は必要ですか?内部参照を持つ複数部品をサポートするネイティブ(プラットフォーム)クリップボード実装が存在するのでしょうか?
この機能は必要性が不明であり、クロスプラットフォームでテストが難しいためリスクがあります。
MDN

Clipboard/read

Firefox🔰 90+Safari13.1+Chrome?
Opera63+Edge?
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet12.0+Opera Mobile54+
MDN

Clipboard/readText

FirefoxNoneSafari13.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Clipboard/write

In all current engines.

Firefox87+Safari13.1+Chrome66+
Opera63+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android66+Android WebView?Samsung Internet12.0+Opera Mobile54+
MDN

Clipboard/writeText

In all current engines.

Firefox63+Safari13.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Clipboard

In all current engines.

Firefox63+Safari13.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ClipboardEvent/ClipboardEvent

In all current engines.

Firefox22+Safari10.1+Chrome58+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ClipboardEvent/clipboardData

In all current engines.

Firefox22+Safari10.1+Chrome41+
Opera?Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ClipboardEvent

In all current engines.

Firefox22+Safari10.1+Chrome41+
Opera?Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ClipboardItem/ClipboardItem

In all current engines.

Firefox🔰 87+Safari13.1+Chrome98+
Opera?Edge98+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android98+Android WebView?Samsung Internet?Opera Mobile?
MDN

ClipboardItem/getType

In all current engines.

Firefox🔰 87+Safari13.1+Chrome76+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android84+Android WebView?Samsung Internet?Opera Mobile?
MDN

ClipboardItem/presentationStyle

Firefox🔰 87+Safari13.1+ChromeNone
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ClipboardItem/types

In all current engines.

Firefox🔰 87+Safari13.1+Chrome76+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android84+Android WebView?Samsung Internet?Opera Mobile?
MDN

ClipboardItem

In all current engines.

Firefox🔰 87+Safari13.1+Chrome76+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android84+Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/copy_event

In all current engines.

Firefox22+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/cut_event

In all current engines.

Firefox22+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/paste_event

In all current engines.

Firefox22+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Navigator/clipboard

In all current engines.

Firefox63+Safari13.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?