From f37f4f3fcab6e8098d41d011e4e7a73e7c54ad96 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Tue, 19 Dec 2023 15:48:21 +1100 Subject: [PATCH 01/32] FF122 Clipboard API - basic layout, style subedit, secure_context --- files/en-us/web/api/clipboard/index.md | 21 ++++----- files/en-us/web/api/clipboard/read/index.md | 31 ++++--------- .../en-us/web/api/clipboard/readtext/index.md | 25 ++++------ files/en-us/web/api/clipboard/write/index.md | 37 ++++++--------- .../web/api/clipboard/writetext/index.md | 12 ++--- files/en-us/web/api/clipboard_api/index.md | 46 ++++++++++++------- .../api/clipboardevent/clipboarddata/index.md | 12 ++--- .../clipboardevent/clipboardevent/index.md | 5 +- files/en-us/web/api/clipboardevent/index.md | 2 +- .../api/clipboarditem/clipboarditem/index.md | 16 ++++--- .../web/api/clipboarditem/gettype/index.md | 11 ++--- files/en-us/web/api/clipboarditem/index.md | 9 ++-- .../clipboarditem/presentationstyle/index.md | 6 +-- .../web/api/clipboarditem/types/index.md | 14 ++---- .../en-us/web/api/element/copy_event/index.md | 2 + .../en-us/web/api/element/cut_event/index.md | 2 + .../web/api/element/paste_event/index.md | 2 + .../web/api/navigator/clipboard/index.md | 31 ++++--------- files/en-us/web/api/navigator/index.md | 2 +- 19 files changed, 122 insertions(+), 164 deletions(-) diff --git a/files/en-us/web/api/clipboard/index.md b/files/en-us/web/api/clipboard/index.md index 2e1abe142bfeac6..ce3a75b8d8006f7 100644 --- a/files/en-us/web/api/clipboard/index.md +++ b/files/en-us/web/api/clipboard/index.md @@ -7,7 +7,9 @@ browser-compat: api.Clipboard {{APIRef("Clipboard API")}}{{SecureContext_Header}} -The **`Clipboard`** interface implements the [Clipboard API](/en-US/docs/Web/API/Clipboard_API), providing—if the user grants permission—both read and write access to the contents of the system clipboard. The Clipboard API can be used to implement cut, copy, and paste features within a web application. +The **`Clipboard`** interface of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) provides read and read and write access to the contents of the system clipboard. + +This allows a web application to implement cut, copy, and paste features providing the user grants permission. {{InheritanceDiagram}} @@ -15,9 +17,10 @@ The system clipboard is exposed through the global {{domxref("Navigator.clipboar Calls to the methods of the `Clipboard` object will not succeed if the user hasn't granted the needed permissions using the [Permissions API](/en-US/docs/Web/API/Permissions_API) and the `'clipboard-read'` or `'clipboard-write'` permission as appropriate. -> **Note:** In reality, at this time browser requirements for access to the clipboard vary significantly. Please see the section [Clipboard availability](#clipboard_availability) for details. +All of the Clipboard API methods operate asynchronously; they return a {{jsxref("Promise")}} which is resolved once the clipboard access has been completed. +The promise is rejected if clipboard access is denied. -All of the Clipboard API methods operate asynchronously; they return a {{jsxref("Promise")}} which is resolved once the clipboard access has been completed. The promise is rejected if clipboard access is denied. +> **Note:** Browser extensions access the system clipboard using the [WebExtension `clipboard` API](/en-US/docs/Mozilla/Add-ons/WebExtensions/API/clipboard). ## Instance methods @@ -26,17 +29,11 @@ _`Clipboard` is based on the {{domxref("EventTarget")}} interface, and includes - {{domxref("Clipboard.read()","read()")}} - : Requests arbitrary data (such as images) from the clipboard, returning a {{jsxref("Promise")}} that resolves with an array of {{domxref("ClipboardItem")}} objects containing the clipboard's contents. - {{domxref("Clipboard.readText()","readText()")}} - - : Requests text from the system clipboard; returns a `Promise` which is resolved with a string containing the clipboard's text once it's available. + - : Requests text from the system clipboard, returning a `Promise` that if fulfilled with a string containing the clipboard's text once it's available. - {{domxref("Clipboard.write()","write()")}} - - : Writes arbitrary data to the system clipboard. This asynchronous operation signals that it's finished by resolving the returned `Promise`. + - : Writes arbitrary data to the system clipboard, returning a {{jsxref("Promise")}} that resolves when the operation completes. - {{domxref("Clipboard.writeText()","writeText()")}} - - : Writes text to the system clipboard, returning a `Promise` which is resolved once the text is fully copied into the clipboard. - -## Clipboard availability - -The asynchronous clipboard API is a relatively recent addition, and the process of implementing it in browsers is not yet complete. Due to both potential security concerns and technical complexities, the process of integrating this API is happening gradually in most browsers. See the [browser compatibility](#browser_compatibility) section below for more information. - -In browser extensions, you can access the system clipboard using the WebExtension [`clipboard`](/en-US/docs/Mozilla/Add-ons/WebExtensions/API/clipboard) API. + - : Writes text to the system clipboard, returning a `Promise` that is resolved once the text is fully copied into the clipboard. ## Specifications diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 73d3c1c0e7f79eb..5701bc44f4c3755 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -6,18 +6,11 @@ page-type: web-api-instance-method browser-compat: api.Clipboard.read --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} -The **`read()`** method of the -{{domxref("Clipboard")}} interface requests a copy of the clipboard's contents, -delivering the data to the returned {{jsxref("Promise")}} when the promise is -resolved. Unlike {{domxref("Clipboard.readText", "readText()")}}, the -`read()` method can return arbitrary data, such as images. This method can -also return text. - -> **Note:** The asynchronous Clipboard and [Permissions APIs](/en-US/docs/Web/API/Permissions_API) are still in the -> process of being integrated into most browsers, so they often deviate from the -> official rules for permissions and the like. Be sure to review the [compatibility table](#browser_compatibility) before using these methods. +The **`read()`** method of the {{domxref("Clipboard")}} interface requests a copy of the clipboard's contents, delivering the data to the returned {{jsxref("Promise")}} when the promise is resolved. +Unlike {{domxref("Clipboard.readText", "readText()")}}, the `read()` method can return arbitrary data, such as images. +This method can also return text. ## Syntax @@ -31,16 +24,15 @@ None. ### Return value -A {{jsxref("Promise")}} that resolves with an array of {{domxref("ClipboardItem")}} objects -containing the clipboard's contents. The promise is rejected if permission to access the -clipboard is not granted. +A {{jsxref("Promise")}} that resolves with an array of {{domxref("ClipboardItem")}} objects containing the clipboard's contents. +The promise is rejected if permission to access the clipboard is not granted. ## Security -[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. The user has to interact with the page or a UI element in order for this feature to work. +[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. +The user has to interact with the page or a UI element in order for this feature to work. -To read from the clipboard, you must first have the `"clipboard-read"` -permission. +To read from the clipboard, you must first have the `"clipboard-read"` permission. ## Examples @@ -52,10 +44,7 @@ Try copying the butterfly image on the left using the "Copy image" context menu The example will check or ask for permission to read the clipboard, then fetch the image data and display the image data in the empty frame. -> **Note:** At this time, while Firefox does implement -> `read()`, it does not recognize the `"clipboard-read"` -> permission, so attempting to use the [Permissions API](/en-US/docs/Web/API/Permissions_API) to manage access to -> the API will not work. +> **Note:** At this time, while Firefox does implement `read()`, it does not recognize the `"clipboard-read"` permission, so attempting to use the [Permissions API](/en-US/docs/Web/API/Permissions_API) to manage access to the API will not work. #### HTML diff --git a/files/en-us/web/api/clipboard/readtext/index.md b/files/en-us/web/api/clipboard/readtext/index.md index eb470164a81dce6..e7b38829a2f86ad 100644 --- a/files/en-us/web/api/clipboard/readtext/index.md +++ b/files/en-us/web/api/clipboard/readtext/index.md @@ -6,11 +6,9 @@ page-type: web-api-instance-method browser-compat: api.Clipboard.readText --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} -The **{{domxref("Clipboard")}}** interface's -**`readText()`** method returns a {{jsxref("Promise")}} which -resolves with a copy of the textual contents of the system clipboard. +The **`readText()`** method of the {{domxref("Clipboard")}} interface returns a {{jsxref("Promise")}} which fulfils with a copy of the textual contents of the system clipboard. ## Syntax @@ -24,25 +22,22 @@ None. ### Return value -A {{jsxref("Promise")}} that resolves with a string containing the -textual contents of the clipboard. Returns an empty string if the clipboard is empty, -does not contain text, or does not include a textual representation among the -{{domxref("DataTransfer")}} objects representing the clipboard's contents. +A {{jsxref("Promise")}} that resolves with a string containing the textual contents of the clipboard. +Returns an empty string if the clipboard is empty, does not contain text, or does not include a textual representation among the {{domxref("DataTransfer")}} objects representing the clipboard's contents. -To read non-text contents from the clipboard, use the {{domxref("Clipboard.read", - "read()")}} method instead. You can write text to the clipboard using -{{domxref("Clipboard.writeText", "writeText()")}}. +To read non-text contents from the clipboard, use the {{domxref("Clipboard.read", "read()")}} method instead. +You can write text to the clipboard using {{domxref("Clipboard.writeText", "writeText()")}}. -## Security +## Security considerations -[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. The user has to interact with the page or a UI element in order for this feature to work. +[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. +The user has to interact with the page or a UI element in order for this feature to work. The `"clipboard-read"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API) must be granted before you can read data from the clipboard. ## Examples -This example retrieves the textual contents of the clipboard and inserts the returned -text into an element's contents. +This example retrieves the textual contents of the clipboard and inserts the returned text into an element's contents. ```js navigator.clipboard diff --git a/files/en-us/web/api/clipboard/write/index.md b/files/en-us/web/api/clipboard/write/index.md index 2fc45ec3b4a1c53..395b2bb351de9fa 100644 --- a/files/en-us/web/api/clipboard/write/index.md +++ b/files/en-us/web/api/clipboard/write/index.md @@ -6,19 +6,12 @@ page-type: web-api-instance-method browser-compat: api.Clipboard.write --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} -The {{domxref("Clipboard")}} method -**`write()`** writes arbitrary data, such as images, to the -clipboard. This can be used to implement cut and copy functionality. +The **`write()`** method of the {{domxref("Clipboard")}} interface writes arbitrary data, such as images, to the clipboard. +This can be used to implement cut and copy functionality. -The `"clipboard-write"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API), is granted -automatically to pages when they are in the active tab. - -> **Note:** Browser support for the asynchronous clipboard APIs is still -> in the process of being implemented. Be sure to check the [compatibility table](#browser_compatibility) as well as -> [Clipboard availability](/en-US/docs/Web/API/Clipboard#clipboard_availability) for more -> information. +The `"clipboard-write"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API), is granted automatically to pages when they are in the active tab. > **Note:** For parity with Google Chrome, Firefox only allows this function to work with text, HTML, and PNG data. @@ -31,19 +24,16 @@ write(data) ### Parameters - `data` - - : An array of {{domxref("ClipboardItem")}} objects containing data to be written to - the clipboard. + - : An array of {{domxref("ClipboardItem")}} objects containing data to be written to the clipboard. ### Return value -A {{jsxref("Promise")}} which is resolved when the data has been written to the -clipboard. The promise is rejected if the clipboard is unable to complete the clipboard -access. +A {{jsxref("Promise")}} which is resolved when the data has been written to the clipboard. +The promise is rejected if the clipboard is unable to complete the clipboard access. ## Examples -This example function replaces the current contents of the clipboard with a specified -string. +This example function replaces the current contents of the clipboard with a specified string. ```js function setClipboard(text) { @@ -62,14 +52,13 @@ function setClipboard(text) { } ``` -The code begins by creating a new a {{domxref("Blob")}} object. This object is -required to construct a {{domxref("ClipboardItem")}} object which is sent to the -clipboard. The {{domxref("Blob")}} constructor takes in the content we want to copy -and its type. This {{domxref("Blob")}} object can be derived from many sources; for example, a [canvas](/en-US/docs/Web/API/HTMLCanvasElement). +The code begins by creating a new a {{domxref("Blob")}} object. +This object is required to construct a {{domxref("ClipboardItem")}} object which is sent to the clipboard. The {{domxref("Blob")}} constructor takes in the content we want to copy and its type. +This {{domxref("Blob")}} object can be derived from many sources; for example, a [canvas](/en-US/docs/Web/API/HTMLCanvasElement). Next, we create a new {{domxref("ClipboardItem")}} object into which the blob will be placed for sending to the clipboard. -The key of the object passed to the {{domxref("ClipboardItem")}} constructor indicates the content type, the value indicates the content. Then `write()` is called, specifying both a fulfillment function -and an error function. +The key of the object passed to the {{domxref("ClipboardItem")}} constructor indicates the content type, the value indicates the content. +Then `write()` is called, specifying both a fulfillment function and an error function. ### Example of copying canvas contents to the clipboard diff --git a/files/en-us/web/api/clipboard/writetext/index.md b/files/en-us/web/api/clipboard/writetext/index.md index bef7d3a6809e276..28127c309532e26 100644 --- a/files/en-us/web/api/clipboard/writetext/index.md +++ b/files/en-us/web/api/clipboard/writetext/index.md @@ -6,12 +6,9 @@ page-type: web-api-instance-method browser-compat: api.Clipboard.writeText --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} -The {{domxref("Clipboard")}} interface's **`writeText()`** -property writes the specified text string to the system clipboard. Text may be read back -using either {{domxref("Clipboard.read", "read()")}} or {{domxref("Clipboard.readText", - "readText()")}}. +The **`writeText()`** method of the {{domxref("Clipboard")}} interface writes the specified text to the system clipboard, returning a {{jsxref("Promise")}} that is resolved once the system clipboard has been updated. ## Syntax @@ -26,9 +23,8 @@ writeText(newClipText) ### Return value -A {{jsxref("Promise")}} which is resolved once the clipboard's contents have been -updated. The promise is rejected if the caller does not have permission to write to the -clipboard. +A {{jsxref("Promise")}} that is resolved once the clipboard's contents have been updated. +The promise is rejected if the caller does not have permission to write to the clipboard. ## Security diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index a2801c4dca8975a..3962f13cd7b2ae6 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -10,18 +10,38 @@ browser-compat: {{DefaultAPISidebar("Clipboard API")}} -The **Clipboard API** provides the ability to respond to clipboard commands (cut, copy, and paste) as well as to asynchronously read from and write to the system clipboard. +The **Clipboard API** provides the ability to respond to clipboard commands (cut, copy, and paste), as well as to asynchronously read from and write to the system clipboard. + +> **Note:** Use this API in preference to the deprecated {{domxref("document.execCommand()")}} method for accessing the clipboard. > **Note:** This API is _not available_ in [Web Workers](/en-US/docs/Web/API/Web_Workers_API) (not exposed via {{domxref("WorkerNavigator")}}). -This API is designed to supersede accessing the clipboard using {{domxref("document.execCommand()")}}. +## Concepts and usage + +The **clipboard** is a data buffer that is used for short-term data storage and/or data transfers between documents or applications. +It is usually implemented as an anonymous, temporary [data buffer](https://en.wikipedia.org/wiki/Data_buffer), sometimes called the _paste buffer_, that can be accessed from most or all programs within the environment via defined [programming interfaces](https://en.wikipedia.org/wiki/Application_programming_interface). + +A typical application accesses clipboard functionality by mapping [user input](https://en.wikipedia.org/wiki/User_input) such as [keybindings](https://en.wikipedia.org/wiki/Keybinding), [menu selections](), etc. to these interfaces. + +## Interfaces + +- {{domxref("Clipboard")}} {{securecontext_inline}} + - : Provides an interface for reading and writing text and data to or from the system clipboard. + The specification refers to this as the 'Async Clipboard API'. +- {{domxref("ClipboardEvent")}} + - : Represents events providing information related to modification of the clipboard, that is {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} events. + The specification refers to this as the 'Clipboard Event API'. +- {{domxref("ClipboardItem")}} {{securecontext_inline}} + - : Represents a single item format, used when reading or writing data. -> **Note:** The **clipboard** is a data buffer that is used for short-term, data storage and/or data transfers, this can be between documents or applications. -> It is usually implemented as an anonymous, temporary [data buffer](https://en.wikipedia.org/wiki/Data_buffer), sometimes called the paste buffer, that can be accessed from most or all programs within the environment via defined [programming interfaces](https://en.wikipedia.org/wiki/Application_programming_interface). -> -> A typical application accesses clipboard functionality by mapping [user input](https://en.wikipedia.org/wiki/User_input) such as [keybindings](https://en.wikipedia.org/wiki/Keybinding), [menu selections](), etc. to these interfaces. +### Extensions to other interfaces -## Accessing the clipboard +- {{domxref("Navigator.clipboard")}} {{readonlyinline}} {{securecontext_inline}} + - : Returns a {{domxref("Clipboard")}} object that provides read and write access to the system clipboard. + +## Examples + +### Accessing the clipboard Instead of creating a `Clipboard` object through instantiation, you access the system clipboard through the {{domxref("Navigator.clipboard")}} global: @@ -33,16 +53,8 @@ navigator.clipboard ); ``` -This snippet fetches the text from the clipboard and appends it to the first element found with the class `editor`. Since {{domxref("Clipboard.readText", "readText()")}} (and {{domxref("Clipboard.read", "read()")}}, for that matter) returns an empty string if the clipboard isn't text, this code is safe. - -## Interfaces - -- {{domxref("Clipboard")}} {{securecontext_inline}} - - : Provides an interface for reading and writing text and data to or from the system clipboard. The specification refers to this as the 'Async Clipboard API'. -- {{domxref("ClipboardEvent")}} - - : Represents events providing information related to modification of the clipboard, that is {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} events. The specification refers to this as the 'Clipboard Event API'. -- {{domxref("ClipboardItem")}} {{securecontext_inline}} - - : Represents a single item format, used when reading or writing data. +This snippet fetches the text from the clipboard and appends it to the first element found with the class `editor`. +Since {{domxref("Clipboard.readText", "readText()")}} (and {{domxref("Clipboard.read", "read()")}}, for that matter) returns an empty string if the clipboard isn't text, this code is safe. ## Specifications diff --git a/files/en-us/web/api/clipboardevent/clipboarddata/index.md b/files/en-us/web/api/clipboardevent/clipboarddata/index.md index 68bfe307bf0607a..fd2fb95269df3a3 100644 --- a/files/en-us/web/api/clipboardevent/clipboarddata/index.md +++ b/files/en-us/web/api/clipboardevent/clipboarddata/index.md @@ -8,16 +8,12 @@ browser-compat: api.ClipboardEvent.clipboardData {{APIRef("Clipboard API")}} -The **`ClipboardEvent.clipboardData`** property holds a {{domxref("DataTransfer")}} object, which can be used: +The **`clipboardData`** property of the {{domxref("ClipboardEvent")}} interface holds a {{domxref("DataTransfer")}} object, which can be used to: -- to specify what data should be put into the clipboard from the {{domxref("Element/cut_event", "cut")}} and - {{domxref("Element/copy_event", "copy")}} event handlers, typically with a {{domxref("DataTransfer.setData", - "setData(format, data)")}} call; -- to obtain the data to be pasted from the {{domxref("Element/paste_event", "paste")}} event handler, typically - with a {{domxref("DataTransfer.getData", "getData(format)")}} call. +- specify what data should be put into the clipboard from the {{domxref("Element/cut_event", "cut")}} and {{domxref("Element/copy_event", "copy")}} event handlers, typically with a {{domxref("DataTransfer.setData", "setData(format, data)")}} call; +- obtain the data to be pasted from the {{domxref("Element/paste_event", "paste")}} event handler, typically with a {{domxref("DataTransfer.getData", "getData(format)")}} call. -See the {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} events -documentation for more information. +See the {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} events documentation for more information. ## Value diff --git a/files/en-us/web/api/clipboardevent/clipboardevent/index.md b/files/en-us/web/api/clipboardevent/clipboardevent/index.md index bd83f7c3d7f5476..a082297e8220313 100644 --- a/files/en-us/web/api/clipboardevent/clipboardevent/index.md +++ b/files/en-us/web/api/clipboardevent/clipboardevent/index.md @@ -8,10 +8,7 @@ browser-compat: api.ClipboardEvent.ClipboardEvent {{APIRef("Clipboard API")}} -The **`ClipboardEvent()`** constructor returns a new {{domxref("ClipboardEvent")}}, -representing an event providing information related to modification of the clipboard, -that is {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and -{{domxref("Element/paste_event", "paste")}} events. +The **`ClipboardEvent()`** constructor returns a new {{domxref("ClipboardEvent")}}, representing an event providing information related to modification of the clipboard, that is {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} events. ## Syntax diff --git a/files/en-us/web/api/clipboardevent/index.md b/files/en-us/web/api/clipboardevent/index.md index 5ffcc20d670a37d..a3ece80eadd2e63 100644 --- a/files/en-us/web/api/clipboardevent/index.md +++ b/files/en-us/web/api/clipboardevent/index.md @@ -7,7 +7,7 @@ browser-compat: api.ClipboardEvent {{APIRef("Clipboard API")}} -The **`ClipboardEvent`** interface represents events providing information related to modification of the clipboard, that is {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} events. +The **`ClipboardEvent`** interface of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) represents events providing information related to modification of the clipboard, that is {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} events. {{InheritanceDiagram}} diff --git a/files/en-us/web/api/clipboarditem/clipboarditem/index.md b/files/en-us/web/api/clipboarditem/clipboarditem/index.md index 3b7ec7be543637d..1caa56dfa82bc43 100644 --- a/files/en-us/web/api/clipboarditem/clipboarditem/index.md +++ b/files/en-us/web/api/clipboarditem/clipboarditem/index.md @@ -6,9 +6,9 @@ page-type: web-api-constructor browser-compat: api.ClipboardItem.ClipboardItem --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} -The **`ClipboardItem()`** constructor of the {{domxref("Clipboard API")}} creates a new {{domxref("ClipboardItem")}} object which represents data to be stored or retrieved via the {{domxref("Clipboard API")}}, that is {{domxref("clipboard.write()")}} and {{domxref("clipboard.read()")}} respectively. +The **`ClipboardItem()`** constructor creates a new {{domxref("ClipboardItem")}} object, which represents data to be stored or retrieved via the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) {{domxref("clipboard.write()")}} and {{domxref("clipboard.read()")}} methods, respectively. > **Note:** Image format support varies by browser. See the browser compatibility table for the {{domxref("Clipboard")}} interface. @@ -22,18 +22,20 @@ new ClipboardItem(data, options) ### Parameters - `data` - - : An {{jsxref("Object")}} with the {{Glossary("MIME type")}} as the key and data as the value. The data can be represented as a {{domxref("Blob")}}, a {{jsxref("String")}} or a {{jsxref("Promise")}} which resolves to either a blob or string. + - : An {{jsxref("Object")}} with the {{Glossary("MIME type")}} as the key and data as the value. + The data can be represented as a {{domxref("Blob")}}, a {{jsxref("String")}} or a {{jsxref("Promise")}} which resolves to either a blob or string. - `options` {{optional_inline}} - : An object with the following properties: - `presentationStyle` {{optional_inline}} - - : One of the three strings: `unspecified`, `inline` or `attachment`. The default is `unspecified`. + - : One of the three strings: `unspecified`, `inline` or `attachment`. + The default is `unspecified`. -> **Note:** You can also work with text via the {{domxref("Clipboard.readText()")}} and {{domxref("Clipboard.writeText()")}} methods of the {{domxref("Clipboard")}} -> interface. +> **Note:** You can also work with text via the {{domxref("Clipboard.readText()")}} and {{domxref("Clipboard.writeText()")}} methods of the {{domxref("Clipboard")}} interface. ## Examples -The below example requests a png image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create a new {{domxref("ClipboardItem")}}. This item is then written to the clipboard, using the {{domxref("Clipboard.write()")}} method. +The below example requests a png image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create a new {{domxref("ClipboardItem")}}. +This item is then written to the clipboard, using the {{domxref("Clipboard.write()")}} method. > **Note:** You can only pass in one clipboard item at a time. diff --git a/files/en-us/web/api/clipboarditem/gettype/index.md b/files/en-us/web/api/clipboarditem/gettype/index.md index 70bd915f9846175..bdf857c9a5a4e44 100644 --- a/files/en-us/web/api/clipboarditem/gettype/index.md +++ b/files/en-us/web/api/clipboarditem/gettype/index.md @@ -6,7 +6,7 @@ page-type: web-api-instance-method browser-compat: api.ClipboardItem.getType --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} The **`getType()`** method of the {{domxref("ClipboardItem")}} interface returns a {{jsxref("Promise")}} that resolves with a {{domxref("Blob")}} of the requested {{Glossary("MIME type")}} or an error if the MIME type is not found. @@ -30,15 +30,12 @@ A {{jsxref("Promise")}} that resolves with a {{domxref("Blob")}} object. - `NotFoundError` {{domxref("DOMException")}} - : The `type` does not match a known {{Glossary("MIME type")}}. - {{jsxref("TypeError")}} - - : No parameter is specified or the `type` is not that of the - {{domxref("ClipboardItem")}}. + - : No parameter is specified or the `type` is not that of the {{domxref("ClipboardItem")}}. ## Examples -In the following example, we're returning all items on the clipboard via the -{{domxref("clipboard.read()")}} method. Then utilizing the -{{domxref("ClipboardItem.types")}} property to set the `getType()` argument -and return the corresponding blob object. +In the following example, we're returning all items on the clipboard via the {{domxref("clipboard.read()")}} method. +Then utilizing the {{domxref("ClipboardItem.types")}} property to set the `getType()` argument and return the corresponding blob object. ```js async function getClipboardContents() { diff --git a/files/en-us/web/api/clipboarditem/index.md b/files/en-us/web/api/clipboarditem/index.md index f5c803d92138272..9723b306420bea6 100644 --- a/files/en-us/web/api/clipboarditem/index.md +++ b/files/en-us/web/api/clipboarditem/index.md @@ -7,9 +7,9 @@ browser-compat: api.ClipboardItem {{APIRef("Clipboard API")}}{{SecureContext_Header}} -The **`ClipboardItem`** interface of the {{domxref('Clipboard API')}} represents a single item format, used when reading or writing data via the {{domxref('Clipboard API')}}. That is {{domxref("clipboard.read()")}} and {{domxref("clipboard.write()")}} respectively. +The **`ClipboardItem`** interface of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) represents a single item format, used when reading or writing data via the {{domxref('Clipboard API')}}. That is {{domxref("clipboard.read()")}} and {{domxref("clipboard.write()")}} respectively. -The benefit of having the **`ClipboardItem`** interface to represent data, is that it enables developers to cope with the varying scope of file types and data easily. +The benefit of having the **`ClipboardItem`** interface to represent data, is that it enables developers to cope with the varying scope of file types and data. Access to the contents of the clipboard is gated behind the [Permissions API](/en-US/docs/Web/API/Permissions_API): The `clipboard-write` permission is granted automatically to pages when they are in the active tab. The `clipboard-read` permission must be requested, which you can do by trying to read data from the clipboard. @@ -42,7 +42,7 @@ _This interface defines the following methods._ ### Writing To Clipboard -Here we're writing a new {{domxref("ClipboardItem.ClipboardItem", "ClipboardItem()")}} to the {{domxref("Clipboard API", "clipboard")}} by requesting a png image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create the new {{domxref("ClipboardItem")}}. +Here we're writing a new {{domxref("ClipboardItem.ClipboardItem", "ClipboardItem()")}} to the system clipboard by requesting a PNG image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create the new {{domxref("ClipboardItem")}}. ```js async function writeClipImg() { @@ -65,7 +65,8 @@ async function writeClipImg() { ### Reading From The Clipboard -Here we're returning all items on the clipboard via the {{domxref("clipboard.read()")}} method. Then utilizing the {{domxref("ClipboardItem.types")}} property to set the {{domxref("ClipboardItem.getType", "getType()")}} argument and return the corresponding blob object. +Here we're returning all items on the clipboard via the {{domxref("clipboard.read()")}} method. +Then utilizing the {{domxref("ClipboardItem.types")}} property to set the {{domxref("ClipboardItem.getType", "getType()")}} argument and return the corresponding blob object. ```js async function getClipboardContents() { diff --git a/files/en-us/web/api/clipboarditem/presentationstyle/index.md b/files/en-us/web/api/clipboarditem/presentationstyle/index.md index dd69cfc5635af6f..5eba8e5e6aff658 100644 --- a/files/en-us/web/api/clipboarditem/presentationstyle/index.md +++ b/files/en-us/web/api/clipboarditem/presentationstyle/index.md @@ -6,11 +6,9 @@ page-type: web-api-instance-property browser-compat: api.ClipboardItem.presentationStyle --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} -The read-only -**`presentationStyle`** property of the {{domxref("ClipboardItem")}} -interface returns a string indicating how an item should be presented. +The read-only **`presentationStyle`** property of the {{domxref("ClipboardItem")}} interface returns a string indicating how an item should be presented. ## Value diff --git a/files/en-us/web/api/clipboarditem/types/index.md b/files/en-us/web/api/clipboarditem/types/index.md index 4d18b6c0e84cf26..4b823e3a8ec5ab5 100644 --- a/files/en-us/web/api/clipboarditem/types/index.md +++ b/files/en-us/web/api/clipboarditem/types/index.md @@ -6,12 +6,9 @@ page-type: web-api-instance-property browser-compat: api.ClipboardItem.types --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} -The read-only -**`types`** property of the {{domxref("ClipboardItem")}} -interface returns an {{jsxref("Array")}} of {{Glossary("MIME type", 'MIME types')}} -available within the {{domxref("ClipboardItem")}} +The read-only **`types`** property of the {{domxref("ClipboardItem")}} interface returns an {{jsxref("Array")}} of {{Glossary("MIME type", 'MIME types')}} available within the {{domxref("ClipboardItem")}} ## Value @@ -19,11 +16,8 @@ An {{jsxref("Array")}} of available {{Glossary("MIME type", 'MIME types')}}. ## Examples -In the below example, we're returning all items on the clipboard via the -{{domxref("clipboard.read()")}} method. Then checking the `types` property -for available types before utilizing the {{domxref("ClipboardItem.getType()")}} method -to return the {{domxref("Blob")}} object. If no clipboards contents is found for the -specified type, an error is returned. +In the below example, we're returning all items on the clipboard via the {{domxref("Clipboard.read()")}} method. +Then checking the `types` property for available types before utilizing the {{domxref("ClipboardItem.getType()")}} method to return the {{domxref("Blob")}} object. If no clipboards contents is found for the specified type, an error is returned. ```js async function getClipboardContents() { diff --git a/files/en-us/web/api/element/copy_event/index.md b/files/en-us/web/api/element/copy_event/index.md index c1d54ce6f82160c..be7accd16db00c9 100644 --- a/files/en-us/web/api/element/copy_event/index.md +++ b/files/en-us/web/api/element/copy_event/index.md @@ -18,6 +18,8 @@ However, the handler cannot _read_ the clipboard data. It's possible to construct and dispatch a [synthetic](/en-US/docs/Web/Events/Creating_and_triggering_events) `copy` event, but this will not affect the system clipboard. +This event [bubbles](/en-US/docs/Learn/JavaScript/Building_blocks/Events#event_bubbling_and_capture), is [cancelable](/en-US/docs/Web/API/Event/cancelable) and is [composed](/en-US/docs/Web/API/Event/composed). + ## Syntax Use the event name in methods like {{domxref("EventTarget.addEventListener", "addEventListener()")}}, or set an event handler property. diff --git a/files/en-us/web/api/element/cut_event/index.md b/files/en-us/web/api/element/cut_event/index.md index 57ab26497d7f10c..cd187c686de9a06 100644 --- a/files/en-us/web/api/element/cut_event/index.md +++ b/files/en-us/web/api/element/cut_event/index.md @@ -22,6 +22,8 @@ The handler cannot _read_ the clipboard data. It's possible to construct and dispatch a [synthetic](/en-US/docs/Web/Events/Creating_and_triggering_events) `cut` event, but this will not affect the system clipboard or the document's contents. +This event [bubbles](/en-US/docs/Learn/JavaScript/Building_blocks/Events#event_bubbling_and_capture), is [cancelable](/en-US/docs/Web/API/Event/cancelable) and is [composed](/en-US/docs/Web/API/Event/composed). + ## Syntax Use the event name in methods like {{domxref("EventTarget.addEventListener", "addEventListener()")}}, or set an event handler property. diff --git a/files/en-us/web/api/element/paste_event/index.md b/files/en-us/web/api/element/paste_event/index.md index 01ee8294c4dde6f..cb1a89335c3f47d 100644 --- a/files/en-us/web/api/element/paste_event/index.md +++ b/files/en-us/web/api/element/paste_event/index.md @@ -18,6 +18,8 @@ To override the default behavior (for example to insert some different data or a It's possible to construct and dispatch a [synthetic](/en-US/docs/Web/Events/Creating_and_triggering_events) `paste` event, but this will not affect the document's contents. +This event [bubbles](/en-US/docs/Learn/JavaScript/Building_blocks/Events#event_bubbling_and_capture), is [cancelable](/en-US/docs/Web/API/Event/cancelable) and is [composed](/en-US/docs/Web/API/Event/composed). + ## Syntax Use the event name in methods like {{domxref("EventTarget.addEventListener", "addEventListener()")}}, or set an event handler property. diff --git a/files/en-us/web/api/navigator/clipboard/index.md b/files/en-us/web/api/navigator/clipboard/index.md index 5c2b0e9d230e56a..e2b0f28c4ba4c25 100644 --- a/files/en-us/web/api/navigator/clipboard/index.md +++ b/files/en-us/web/api/navigator/clipboard/index.md @@ -6,20 +6,14 @@ page-type: web-api-instance-property browser-compat: api.Navigator.clipboard --- -{{APIRef("Clipboard API")}} +{{APIRef("Clipboard API")}} {{securecontext_header}} -The [Clipboard API](/en-US/docs/Web/API/Clipboard_API) adds to the **{{domxref("Navigator")}}** interface the -read-only **`clipboard`** property, which returns the -{{domxref("Clipboard")}} object used to read and write the clipboard's -contents. +The **`clipboard`** read-only property of the {{domxref("Navigator")}} interface returns a {{domxref("Clipboard")}} object used to read and write the clipboard's contents. -The Clipboard API can be used to implement cut, copy, and paste -features within a web application. +This is the entry point to the [Clipboard API](/en-US/docs/Web/API/Clipboard_API), which can be used to implement cut, copy, and paste features within a web application. -Use of the asynchronous clipboard read and write methods requires that the user grant -the website or app permission to access the clipboard. This permission must be obtained -from the [Permissions API](/en-US/docs/Web/API/Permissions_API) using the -`"clipboard-read"` and/or `"clipboard-write"` permissions. +Use of the asynchronous clipboard read and write methods requires that the user grant the website or app permission to access the clipboard. +This permission must be obtained from the [Permissions API](/en-US/docs/Web/API/Permissions_API) using the `"clipboard-read"` and/or `"clipboard-write"` permissions. ## Value @@ -27,8 +21,7 @@ The {{domxref("Clipboard")}} object used to access the system clipboard. ## Examples -The following code uses `navigator.clipboard` to access the system clipboard -in order to read the contents of the clipboard. +The following code uses `navigator.clipboard` to access the system clipboard in order to read text contents from the clipboard. ```js navigator.clipboard @@ -38,15 +31,11 @@ navigator.clipboard ); ``` -This snippet replaces the contents of the element whose class is -`"cliptext"` with the text contents of the clipboard. Perhaps this code is -being used in a browser extension that displays the current clipboard contents, -automatically updating periodically or when specific events fire. +This snippet replaces the contents of the element whose class is `"cliptext"` with the text contents of the clipboard. +Perhaps this code is being used in a browser extension that displays the current clipboard contents, automatically updating periodically or when specific events fire. -If the clipboard is empty or doesn't contain text, the `"cliptext"` -element's contents are cleared. This happens because {{domxref("Clipboard.readText", - "readText()")}} returns an empty string if the clipboard is empty or doesn't contain -text. +If the clipboard is empty or doesn't contain text, the `"cliptext"` element's contents are cleared. +This happens because {{domxref("Clipboard.readText", "readText()")}} returns an empty string if the clipboard is empty or doesn't contain text. ## Specifications diff --git a/files/en-us/web/api/navigator/index.md b/files/en-us/web/api/navigator/index.md index 2e5d24379df6e6d..05c0af0a7090c54 100644 --- a/files/en-us/web/api/navigator/index.md +++ b/files/en-us/web/api/navigator/index.md @@ -19,7 +19,7 @@ _Doesn't inherit any properties._ - {{domxref("Navigator.bluetooth")}} {{ReadOnlyInline}} {{Experimental_Inline}} - : Returns a {{domxref("Bluetooth")}} object for the current document, providing access to [Web Bluetooth API](/en-US/docs/Web/API/Web_Bluetooth_API) functionality. -- {{domxref("Navigator.clipboard")}} {{ReadOnlyInline}} +- {{domxref("Navigator.clipboard")}} {{ReadOnlyInline}} {{securecontext_inline}} - : Returns a {{domxref("Clipboard")}} object that provides read and write access to the system clipboard. - {{domxref("Navigator.connection")}} {{ReadOnlyInline}} {{Experimental_Inline}} - : Returns a {{domxref("NetworkInformation")}} object containing information about the network connection of a device. From 69189e5a10aefa21254935accffdf2ed4e4799d1 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Tue, 19 Dec 2023 16:06:35 +1100 Subject: [PATCH 02/32] copy event clarification --- files/en-us/web/api/element/copy_event/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/element/copy_event/index.md b/files/en-us/web/api/element/copy_event/index.md index be7accd16db00c9..9b4b56a358fef52 100644 --- a/files/en-us/web/api/element/copy_event/index.md +++ b/files/en-us/web/api/element/copy_event/index.md @@ -8,7 +8,7 @@ browser-compat: api.Element.copy_event {{APIRef}} -The **`copy`** event fires when the user initiates a copy action through the browser's user interface. +The **`copy`** event fires when the user initiates a copy action through the browser's user interface or the [Clipboard API](/en-US/docs/Web/API/Clipboard_API). The event's default action is to copy the selection (if any) to the clipboard. From 70d4931abe17bd95cf2eba4eef62af96245043aa Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Thu, 28 Dec 2023 11:17:31 +1100 Subject: [PATCH 03/32] Remove Window: clipboardchange event from GroupData.json - not implemented --- files/jsondata/GroupData.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/files/jsondata/GroupData.json b/files/jsondata/GroupData.json index ff5006def2f9c6b..266e166d2aed316 100644 --- a/files/jsondata/GroupData.json +++ b/files/jsondata/GroupData.json @@ -148,12 +148,7 @@ "interfaces": ["Clipboard", "ClipboardEvent", "ClipboardItem"], "methods": [], "properties": ["Navigator.clipboard"], - "events": [ - "Window: clipboardchange", - "Element: copy", - "Element: cut", - "Element: paste" - ] + "events": ["Element: copy", "Element: cut", "Element: paste"] }, "Compression Streams API": { "overview": ["Compression Streams API"], From d0be555d72d222f50ba501aa34eaf5c00cffa2b4 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Thu, 28 Dec 2023 11:35:25 +1100 Subject: [PATCH 04/32] Add Element cut/copy/paste events to overview --- files/en-us/web/api/clipboard_api/index.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index 3962f13cd7b2ae6..3055c161b580bde 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -36,14 +36,27 @@ A typical application accesses clipboard functionality by mapping [user input](h ### Extensions to other interfaces +The Clipboard API extends the following APIs, adding the listed features. + - {{domxref("Navigator.clipboard")}} {{readonlyinline}} {{securecontext_inline}} - : Returns a {{domxref("Clipboard")}} object that provides read and write access to the system clipboard. +- [`Element: copy`](/en-US/docs/Web/API/Element/copy_event) event + - : An event fired whenever the user initiates a copy action through the browser's user interface or the Clipboard API. +- [`Element: cut`](/en-US/docs/Web/API/Element/cut_event) event + - : An event fired whenever the user initiates a cut action through the browser's user interface or the Clipboard API. +- [`Element: paste`](/en-US/docs/Web/API/Element/cut_event) event + - : An event fired whenever the user initiates a paste action through the browser's user interface or the Clipboard API. + + ## Examples ### Accessing the clipboard -Instead of creating a `Clipboard` object through instantiation, you access the system clipboard through the {{domxref("Navigator.clipboard")}} global: +The system clipboard is accessed through the {{domxref("Navigator.clipboard")}} global. + +This snippet fetches the text from the clipboard and appends it to the first element found with the class `editor`. +Since {{domxref("Clipboard.readText", "readText()")}} (and {{domxref("Clipboard.read", "read()")}}, for that matter) returns an empty string if the clipboard isn't text, this code is safe. ```js navigator.clipboard @@ -53,9 +66,6 @@ navigator.clipboard ); ``` -This snippet fetches the text from the clipboard and appends it to the first element found with the class `editor`. -Since {{domxref("Clipboard.readText", "readText()")}} (and {{domxref("Clipboard.read", "read()")}}, for that matter) returns an empty string if the clipboard isn't text, this code is safe. - ## Specifications {{Specifications}} From 9e8432d5b225a08b54df91e23f9ba7a7ebec90bf Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Thu, 28 Dec 2023 16:57:43 +1100 Subject: [PATCH 05/32] Security considerations --- files/en-us/web/api/clipboard/read/index.md | 2 +- files/en-us/web/api/clipboard/write/index.md | 7 +++++++ files/en-us/web/api/clipboard/writetext/index.md | 5 +++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 5701bc44f4c3755..534ce77ebbcfbf0 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -27,7 +27,7 @@ None. A {{jsxref("Promise")}} that resolves with an array of {{domxref("ClipboardItem")}} objects containing the clipboard's contents. The promise is rejected if permission to access the clipboard is not granted. -## Security +## Security considerations [Transient user activation](/en-US/docs/Web/Security/User_activation) is required. The user has to interact with the page or a UI element in order for this feature to work. diff --git a/files/en-us/web/api/clipboard/write/index.md b/files/en-us/web/api/clipboard/write/index.md index 395b2bb351de9fa..8f1ec6c9d97d9e9 100644 --- a/files/en-us/web/api/clipboard/write/index.md +++ b/files/en-us/web/api/clipboard/write/index.md @@ -31,6 +31,13 @@ write(data) A {{jsxref("Promise")}} which is resolved when the data has been written to the clipboard. The promise is rejected if the clipboard is unable to complete the clipboard access. +## Security considerations + +[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. +The user has to interact with the page or a UI element in order for this feature to work. + +The `"clipboard-write"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API) is granted automatically to pages when they are in the active tab. + ## Examples This example function replaces the current contents of the clipboard with a specified string. diff --git a/files/en-us/web/api/clipboard/writetext/index.md b/files/en-us/web/api/clipboard/writetext/index.md index 28127c309532e26..08cb088c493d16a 100644 --- a/files/en-us/web/api/clipboard/writetext/index.md +++ b/files/en-us/web/api/clipboard/writetext/index.md @@ -26,9 +26,10 @@ writeText(newClipText) A {{jsxref("Promise")}} that is resolved once the clipboard's contents have been updated. The promise is rejected if the caller does not have permission to write to the clipboard. -## Security +## Security considerations -[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. The user has to interact with the page or a UI element in order for this feature to work. +[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. +The user has to interact with the page or a UI element in order for this feature to work. The `"clipboard-write"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API) is granted automatically to pages when they are in the active tab. From ab031ec8aa5d390bec3be8cbd0c5d8280be0e177 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 29 Dec 2023 08:42:41 +1100 Subject: [PATCH 06/32] Events are 'of the Clipboard API' --- files/en-us/web/api/element/copy_event/index.md | 2 +- files/en-us/web/api/element/cut_event/index.md | 2 +- files/en-us/web/api/element/paste_event/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/files/en-us/web/api/element/copy_event/index.md b/files/en-us/web/api/element/copy_event/index.md index 9b4b56a358fef52..3074f4dbbaca4b3 100644 --- a/files/en-us/web/api/element/copy_event/index.md +++ b/files/en-us/web/api/element/copy_event/index.md @@ -8,7 +8,7 @@ browser-compat: api.Element.copy_event {{APIRef}} -The **`copy`** event fires when the user initiates a copy action through the browser's user interface or the [Clipboard API](/en-US/docs/Web/API/Clipboard_API). +The **`copy`** event of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) fires when the user initiates a copy action through the browser's user interface. The event's default action is to copy the selection (if any) to the clipboard. diff --git a/files/en-us/web/api/element/cut_event/index.md b/files/en-us/web/api/element/cut_event/index.md index cd187c686de9a06..95a848a42dca2a7 100644 --- a/files/en-us/web/api/element/cut_event/index.md +++ b/files/en-us/web/api/element/cut_event/index.md @@ -8,7 +8,7 @@ browser-compat: api.Element.cut_event {{APIRef}} -The **`cut`** event is fired when the user has initiated a "cut" action through the browser's user interface. +The **`cut`** event of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) is fired when the user has initiated a "cut" action through the browser's user interface. If the user attempts a cut action on uneditable content, the `cut` event still fires but the event object contains no data. diff --git a/files/en-us/web/api/element/paste_event/index.md b/files/en-us/web/api/element/paste_event/index.md index cb1a89335c3f47d..18a3edf74afb43f 100644 --- a/files/en-us/web/api/element/paste_event/index.md +++ b/files/en-us/web/api/element/paste_event/index.md @@ -8,7 +8,7 @@ browser-compat: api.Element.paste_event {{APIRef}} -The **`paste`** event is fired when the user has initiated a "paste" action through the browser's user interface. +The **`paste`** event of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) is fired when the user has initiated a "paste" action through the browser's user interface. If the cursor is in an editable context (for example, in a {{HTMLElement("textarea")}} or an element with [`contenteditable`](/en-US/docs/Web/HTML/Global_attributes/contenteditable) attribute set to `true`) then the default action is to insert the contents of the clipboard into the document at the cursor position. From 4db8e1378214df5e32abc32fef3cc17ae7dccda3 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 29 Dec 2023 09:14:35 +1100 Subject: [PATCH 07/32] Clipboard.write() requires transient activation --- files/en-us/web/security/user_activation/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/files/en-us/web/security/user_activation/index.md b/files/en-us/web/security/user_activation/index.md index fd60a1a89c66372..4170be0ad79dbaf 100644 --- a/files/en-us/web/security/user_activation/index.md +++ b/files/en-us/web/security/user_activation/index.md @@ -32,6 +32,7 @@ APIs that require transient activation (list is not exhaustive): - {{domxref("Clients.openWindow()")}} - {{domxref("Clipboard.read()")}} - {{domxref("Clipboard.readText()")}} +- {{domxref("Clipboard.write()")}} - {{domxref("Clipboard.writeText()")}} - {{domxref("ContactsManager.select()")}} - {{domxref("Document.requestStorageAccess()")}} From 8ebdcb756da9801cb8892f9a57d52091f330cefa Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 29 Dec 2023 10:45:43 +1100 Subject: [PATCH 08/32] Clipboard.read() - update example and remove permissions --- files/en-us/web/api/clipboard/read/index.md | 48 +++++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 534ce77ebbcfbf0..4572cc6363153fe 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -8,9 +8,8 @@ browser-compat: api.Clipboard.read {{APIRef("Clipboard API")}} {{securecontext_header}} -The **`read()`** method of the {{domxref("Clipboard")}} interface requests a copy of the clipboard's contents, delivering the data to the returned {{jsxref("Promise")}} when the promise is resolved. -Unlike {{domxref("Clipboard.readText", "readText()")}}, the `read()` method can return arbitrary data, such as images. -This method can also return text. +The **`read()`** method of the {{domxref("Clipboard")}} interface requests a copy of the clipboard's contents, fulfilling the returned {{jsxref("Promise")}} with the data. +The method can return arbitrary data, such as images, HTML markup, or plain text (unlike {{domxref("Clipboard.readText", "readText()")}}, which can only return text). ## Syntax @@ -25,32 +24,38 @@ None. ### Return value A {{jsxref("Promise")}} that resolves with an array of {{domxref("ClipboardItem")}} objects containing the clipboard's contents. -The promise is rejected if permission to access the clipboard is not granted. + +### Exceptions + +- `NotAllowedError` {{domxref("DOMException")}} + - : Thrown if the access to read the clipboard is not allowed. ## Security considerations [Transient user activation](/en-US/docs/Web/Security/User_activation) is required. The user has to interact with the page or a UI element in order for this feature to work. -To read from the clipboard, you must first have the `"clipboard-read"` permission. - ## Examples ### Reading image data This example uses the `read()` method to read image data from the clipboard. -Try copying the butterfly image on the left using the "Copy image" context menu item, then click in the empty frame on the right. +Copy the butterfly image on the left using the "Copy image" context menu item, then click in the empty frame on the right. +The example will fetch the image data and display the image data in the empty frame. -The example will check or ask for permission to read the clipboard, then fetch the image data and display the image data in the empty frame. - -> **Note:** At this time, while Firefox does implement `read()`, it does not recognize the `"clipboard-read"` permission, so attempting to use the [Permissions API](/en-US/docs/Web/API/Permissions_API) to manage access to the API will not work. +> **Note:** Browsers that gate access to the method using the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission (now removed from specification) may require you to grant permission in order to paste the image. #### HTML ```html +

+ Right-click on the butterfly image and then select "Copy Image". Click on the + right-side placeholder to paste. +

A butterfly +

``` #### CSS @@ -66,35 +71,40 @@ img { #### JavaScript +This code provides a mechanism to log any errors to the element with id `log`. + +```js +const logElement = document.querySelector("#log"); +function log(text) { + logElement.innerText = `Error: ${text}`; +} +``` + +This code reads the clipboard when the destination element is clicked and copies the image data into the element. + ```js const destinationImage = document.querySelector("#destination"); destinationImage.addEventListener("click", pasteImage); async function pasteImage() { try { - const permission = await navigator.permissions.query({ - name: "clipboard-read", - }); - if (permission.state === "denied") { - throw new Error("Not allowed to read clipboard."); - } const clipboardContents = await navigator.clipboard.read(); for (const item of clipboardContents) { if (!item.types.includes("image/png")) { - throw new Error("Clipboard contains non-image data."); + throw new Error("Clipboard does not contain image data."); } const blob = await item.getType("image/png"); destinationImage.src = URL.createObjectURL(blob); } } catch (error) { - console.error(error.message); + log(error.message); } } ``` #### Result -{{EmbedLiveSample("Reading image data")}} +{{EmbedLiveSample("Reading image data", "100%", "200")}} ## Specifications From 354dc46ea941e9f0deefd3dd5016a3793c9ab4a7 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 29 Dec 2023 11:31:22 +1100 Subject: [PATCH 09/32] Clipboard.read*/write* - remove permission mentions --- files/en-us/web/api/clipboard/read/index.md | 9 +++++++-- .../en-us/web/api/clipboard/readtext/index.md | 17 ++++++++++++----- files/en-us/web/api/clipboard/write/index.md | 19 ++++++++++++------- .../web/api/clipboard/writetext/index.md | 11 ++++++++--- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 4572cc6363153fe..a37044068ee61f7 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -9,7 +9,9 @@ browser-compat: api.Clipboard.read {{APIRef("Clipboard API")}} {{securecontext_header}} The **`read()`** method of the {{domxref("Clipboard")}} interface requests a copy of the clipboard's contents, fulfilling the returned {{jsxref("Promise")}} with the data. -The method can return arbitrary data, such as images, HTML markup, or plain text (unlike {{domxref("Clipboard.readText", "readText()")}}, which can only return text). + +The method can in theory return arbitrary data (unlike {{domxref("Clipboard.readText", "readText()")}}, which can only return text). +Browsers commonly support reading text, HTML, and PNG image data — see [browser compatibility](#browser_compatibility) for more information. ## Syntax @@ -28,7 +30,7 @@ A {{jsxref("Promise")}} that resolves with an array of {{domxref("ClipboardItem" ### Exceptions - `NotAllowedError` {{domxref("DOMException")}} - - : Thrown if the access to read the clipboard is not allowed. + - : Thrown if the reading from the clipboard is not allowed. ## Security considerations @@ -118,3 +120,6 @@ async function pasteImage() { - [Clipboard API](/en-US/docs/Web/API/Clipboard_API) - [Image support for Async Clipboard article](https://web.dev/articles/async-clipboard) +- {{domxref("Clipboard.readText()")}} +- {{domxref("Clipboard.writeText()")}} +- {{domxref("Clipboard.write()")}} diff --git a/files/en-us/web/api/clipboard/readtext/index.md b/files/en-us/web/api/clipboard/readtext/index.md index e7b38829a2f86ad..7377643098f908b 100644 --- a/files/en-us/web/api/clipboard/readtext/index.md +++ b/files/en-us/web/api/clipboard/readtext/index.md @@ -10,6 +10,9 @@ browser-compat: api.Clipboard.readText The **`readText()`** method of the {{domxref("Clipboard")}} interface returns a {{jsxref("Promise")}} which fulfils with a copy of the textual contents of the system clipboard. +> **Note:** To read non-text contents from the clipboard, use the {{domxref("Clipboard.read", "read()")}} method instead. +> You can write text to the clipboard using {{domxref("Clipboard.writeText", "writeText()")}}. + ## Syntax ```js-nolint @@ -23,18 +26,21 @@ None. ### Return value A {{jsxref("Promise")}} that resolves with a string containing the textual contents of the clipboard. -Returns an empty string if the clipboard is empty, does not contain text, or does not include a textual representation among the {{domxref("DataTransfer")}} objects representing the clipboard's contents. -To read non-text contents from the clipboard, use the {{domxref("Clipboard.read", "read()")}} method instead. -You can write text to the clipboard using {{domxref("Clipboard.writeText", "writeText()")}}. +Returns an empty string if the clipboard is empty, does not contain text, or does not include a textual representation among the objects representing the clipboard's contents. + +### Exceptions + +- `NotAllowedError` {{domxref("DOMException")}} + - : Thrown if the access to read the clipboard is not allowed. +- `NotFoundError` {{domxref("DOMException")}} + - : Thrown if the clipboard indicates that it contains data that can be represented as a text but is unable to provide a textual representation. ## Security considerations [Transient user activation](/en-US/docs/Web/Security/User_activation) is required. The user has to interact with the page or a UI element in order for this feature to work. -The `"clipboard-read"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API) must be granted before you can read data from the clipboard. - ## Examples This example retrieves the textual contents of the clipboard and inserts the returned text into an element's contents. @@ -57,5 +63,6 @@ navigator.clipboard - [Clipboard API](/en-US/docs/Web/API/Clipboard_API) - [Image support for Async Clipboard article](https://web.dev/articles/async-clipboard) +- {{domxref("Clipboard.read()")}} - {{domxref("Clipboard.writeText()")}} - {{domxref("Clipboard.write()")}} diff --git a/files/en-us/web/api/clipboard/write/index.md b/files/en-us/web/api/clipboard/write/index.md index 8f1ec6c9d97d9e9..38abb2dbec51fb0 100644 --- a/files/en-us/web/api/clipboard/write/index.md +++ b/files/en-us/web/api/clipboard/write/index.md @@ -8,12 +8,11 @@ browser-compat: api.Clipboard.write {{APIRef("Clipboard API")}} {{securecontext_header}} -The **`write()`** method of the {{domxref("Clipboard")}} interface writes arbitrary data, such as images, to the clipboard. +The **`write()`** method of the {{domxref("Clipboard")}} interface writes arbitrary data to the clipboard, such as images, fulfilling the returned {{jsxref("Promise")}} on completion. This can be used to implement cut and copy functionality. -The `"clipboard-write"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API), is granted automatically to pages when they are in the active tab. - -> **Note:** For parity with Google Chrome, Firefox only allows this function to work with text, HTML, and PNG data. +The method can in theory write arbitrary data (unlike {{domxref("Clipboard.writeText", "writeText()")}}, which can only write text). +Browsers commonly support writing text, HTML, and PNG image data — see [browser compatibility](#browser_compatibility) for more information. ## Syntax @@ -29,15 +28,18 @@ write(data) ### Return value A {{jsxref("Promise")}} which is resolved when the data has been written to the clipboard. -The promise is rejected if the clipboard is unable to complete the clipboard access. +The promise is rejected if the clipboard is unable to write the data. + +### Exceptions + +- `NotAllowedError` {{domxref("DOMException")}} + - : Thrown if writing to the clipboard is not allowed. ## Security considerations [Transient user activation](/en-US/docs/Web/Security/User_activation) is required. The user has to interact with the page or a UI element in order for this feature to work. -The `"clipboard-write"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API) is granted automatically to pages when they are in the active tab. - ## Examples This example function replaces the current contents of the clipboard with a specified string. @@ -100,3 +102,6 @@ function copyCanvasContentsToClipboard(canvas, onDone, onError) { - [Clipboard API](/en-US/docs/Web/API/Clipboard_API) - [Image support for Async Clipboard article](https://web.dev/articles/async-clipboard) +- {{domxref("Clipboard.writeText()")}} +- {{domxref("Clipboard.read()")}} +- {{domxref("Clipboard.readText()")}} diff --git a/files/en-us/web/api/clipboard/writetext/index.md b/files/en-us/web/api/clipboard/writetext/index.md index 08cb088c493d16a..f22691afe6a22ae 100644 --- a/files/en-us/web/api/clipboard/writetext/index.md +++ b/files/en-us/web/api/clipboard/writetext/index.md @@ -24,15 +24,17 @@ writeText(newClipText) ### Return value A {{jsxref("Promise")}} that is resolved once the clipboard's contents have been updated. -The promise is rejected if the caller does not have permission to write to the clipboard. + +### Exceptions + +- `NotAllowedError` {{domxref("DOMException")}} + - : Thrown if writing to the clipboard is not allowed. ## Security considerations [Transient user activation](/en-US/docs/Web/Security/User_activation) is required. The user has to interact with the page or a UI element in order for this feature to work. -The `"clipboard-write"` permission of the [Permissions API](/en-US/docs/Web/API/Permissions_API) is granted automatically to pages when they are in the active tab. - ## Examples This example sets the clipboard's contents to the string "\". @@ -60,3 +62,6 @@ navigator.clipboard.writeText("").then( - [Clipboard API](/en-US/docs/Web/API/Clipboard_API) - [Image support for Async Clipboard article](https://web.dev/articles/async-clipboard) +- {{domxref("Clipboard.write()")}} +- {{domxref("Clipboard.read()")}} +- {{domxref("Clipboard.readText()")}} From 0337079a4927771a2b8fe5a7c30a9fb60596022d Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 29 Dec 2023 11:33:49 +1100 Subject: [PATCH 10/32] Clipboard interface - remove permissions details --- files/en-us/web/api/clipboard/index.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/files/en-us/web/api/clipboard/index.md b/files/en-us/web/api/clipboard/index.md index ce3a75b8d8006f7..675bc57966292fa 100644 --- a/files/en-us/web/api/clipboard/index.md +++ b/files/en-us/web/api/clipboard/index.md @@ -7,19 +7,18 @@ browser-compat: api.Clipboard {{APIRef("Clipboard API")}}{{SecureContext_Header}} -The **`Clipboard`** interface of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) provides read and read and write access to the contents of the system clipboard. - -This allows a web application to implement cut, copy, and paste features providing the user grants permission. +The **`Clipboard`** interface of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) provides read and write access to the contents of the system clipboard. +This allows a web application to implement cut, copy, and paste features. {{InheritanceDiagram}} The system clipboard is exposed through the global {{domxref("Navigator.clipboard")}} property. -Calls to the methods of the `Clipboard` object will not succeed if the user hasn't granted the needed permissions using the [Permissions API](/en-US/docs/Web/API/Permissions_API) and the `'clipboard-read'` or `'clipboard-write'` permission as appropriate. - All of the Clipboard API methods operate asynchronously; they return a {{jsxref("Promise")}} which is resolved once the clipboard access has been completed. The promise is rejected if clipboard access is denied. +All the methods require [transient user activation](/en-US/docs/Web/Security/Secure_Contexts) and browsers may additionally require user confirmation for some operations (such as copying cross-origin content). + > **Note:** Browser extensions access the system clipboard using the [WebExtension `clipboard` API](/en-US/docs/Mozilla/Add-ons/WebExtensions/API/clipboard). ## Instance methods @@ -29,11 +28,11 @@ _`Clipboard` is based on the {{domxref("EventTarget")}} interface, and includes - {{domxref("Clipboard.read()","read()")}} - : Requests arbitrary data (such as images) from the clipboard, returning a {{jsxref("Promise")}} that resolves with an array of {{domxref("ClipboardItem")}} objects containing the clipboard's contents. - {{domxref("Clipboard.readText()","readText()")}} - - : Requests text from the system clipboard, returning a `Promise` that if fulfilled with a string containing the clipboard's text once it's available. + - : Requests text from the system clipboard, returning a {{jsxref("Promise")}} that is fulfilled with a string containing the clipboard's text once it's available. - {{domxref("Clipboard.write()","write()")}} - : Writes arbitrary data to the system clipboard, returning a {{jsxref("Promise")}} that resolves when the operation completes. - {{domxref("Clipboard.writeText()","writeText()")}} - - : Writes text to the system clipboard, returning a `Promise` that is resolved once the text is fully copied into the clipboard. + - : Writes text to the system clipboard, returning a {{jsxref("Promise")}} that is resolved once the text is fully copied into the clipboard. ## Specifications From a257313c398fbfdbde635448ec1fa66873b27432 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 29 Dec 2023 12:00:20 +1100 Subject: [PATCH 11/32] Clipboard API - make concepts a little less abstract --- files/en-us/web/api/clipboard_api/index.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index 3055c161b580bde..ba228071768ac3c 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -18,10 +18,15 @@ The **Clipboard API** provides the ability to respond to clipboard commands (cut ## Concepts and usage -The **clipboard** is a data buffer that is used for short-term data storage and/or data transfers between documents or applications. -It is usually implemented as an anonymous, temporary [data buffer](https://en.wikipedia.org/wiki/Data_buffer), sometimes called the _paste buffer_, that can be accessed from most or all programs within the environment via defined [programming interfaces](https://en.wikipedia.org/wiki/Application_programming_interface). +The _system clipboard_ is a data buffer belonging to the operating system hosting the browser, which is used for short-term data storage and/or data transfers between documents or applications. +It is usually implemented as an anonymous, temporary [data buffer](https://en.wikipedia.org/wiki/Data_buffer), sometimes called the _paste buffer_, that can be accessed from most or all programs within the environment via defined programming interfaces. -A typical application accesses clipboard functionality by mapping [user input](https://en.wikipedia.org/wiki/User_input) such as [keybindings](https://en.wikipedia.org/wiki/Keybinding), [menu selections](), etc. to these interfaces. +The Clipboard API allows users to programmatically read and write text and other kinds of data to and from the system clipboard in [secure contexts](/en-US/docs/Web/Security/Secure_Contexts), provided the user has recently interacted with the page ([transient user activation](/en-US/docs/Web/Security/User_activation) is required). +Browsers may place additional restrictions over use of the methods to access the clipboard, such as requiring user approval to read or write cross-origin content, or at all! + +Events are fired as the result of {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} operations modifying the clipboard. +The events have a default action, for example the `copy` action copies the current selection to the system clipboard by default. +The default action can be overriden by the event handler — see each of the events for more information. ## Interfaces @@ -41,11 +46,11 @@ The Clipboard API extends the following APIs, adding the listed features. - {{domxref("Navigator.clipboard")}} {{readonlyinline}} {{securecontext_inline}} - : Returns a {{domxref("Clipboard")}} object that provides read and write access to the system clipboard. - [`Element: copy`](/en-US/docs/Web/API/Element/copy_event) event - - : An event fired whenever the user initiates a copy action through the browser's user interface or the Clipboard API. + - : An event fired whenever the user initiates a copy action. - [`Element: cut`](/en-US/docs/Web/API/Element/cut_event) event - - : An event fired whenever the user initiates a cut action through the browser's user interface or the Clipboard API. + - : An event fired whenever the user initiates a cut action. - [`Element: paste`](/en-US/docs/Web/API/Element/cut_event) event - - : An event fired whenever the user initiates a paste action through the browser's user interface or the Clipboard API. + - : An event fired whenever the user initiates a paste action. From 590fdf7914d4da36ab73a2823725c5f7ee6f32ad Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 29 Dec 2023 12:03:18 +1100 Subject: [PATCH 12/32] Navigator.clipboard - remove the text on requiring permissions --- files/en-us/web/api/navigator/clipboard/index.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/files/en-us/web/api/navigator/clipboard/index.md b/files/en-us/web/api/navigator/clipboard/index.md index e2b0f28c4ba4c25..cdebf2521a7d264 100644 --- a/files/en-us/web/api/navigator/clipboard/index.md +++ b/files/en-us/web/api/navigator/clipboard/index.md @@ -12,9 +12,6 @@ The **`clipboard`** read-only property of the {{domxref("Navigator")}} interface This is the entry point to the [Clipboard API](/en-US/docs/Web/API/Clipboard_API), which can be used to implement cut, copy, and paste features within a web application. -Use of the asynchronous clipboard read and write methods requires that the user grant the website or app permission to access the clipboard. -This permission must be obtained from the [Permissions API](/en-US/docs/Web/API/Permissions_API) using the `"clipboard-read"` and/or `"clipboard-write"` permissions. - ## Value The {{domxref("Clipboard")}} object used to access the system clipboard. From 5b41930a4cf0b24c4edadf987b274ea2f23ca033 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 29 Dec 2023 12:14:49 +1100 Subject: [PATCH 13/32] Minor tweaks --- files/en-us/web/api/clipboarditem/index.md | 6 ++---- .../en-us/web/api/clipboarditem/presentationstyle/index.md | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/files/en-us/web/api/clipboarditem/index.md b/files/en-us/web/api/clipboarditem/index.md index 9723b306420bea6..0c30d4f0c1ccd72 100644 --- a/files/en-us/web/api/clipboarditem/index.md +++ b/files/en-us/web/api/clipboarditem/index.md @@ -11,8 +11,6 @@ The **`ClipboardItem`** interface of the [Clipboard API](/en-US/docs/Web/API/Cli The benefit of having the **`ClipboardItem`** interface to represent data, is that it enables developers to cope with the varying scope of file types and data. -Access to the contents of the clipboard is gated behind the [Permissions API](/en-US/docs/Web/API/Permissions_API): The `clipboard-write` permission is granted automatically to pages when they are in the active tab. The `clipboard-read` permission must be requested, which you can do by trying to read data from the clipboard. - > **Note:** To work with text see the {{domxref("Clipboard.readText()")}} and {{domxref("Clipboard.writeText()")}} methods of the {{domxref("Clipboard")}} interface. > **Note:** You can only pass in one clipboard item at a time. @@ -40,7 +38,7 @@ _This interface defines the following methods._ ## Examples -### Writing To Clipboard +### Writing to Clipboard Here we're writing a new {{domxref("ClipboardItem.ClipboardItem", "ClipboardItem()")}} to the system clipboard by requesting a PNG image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create the new {{domxref("ClipboardItem")}}. @@ -63,7 +61,7 @@ async function writeClipImg() { } ``` -### Reading From The Clipboard +### Reading from Clipboard Here we're returning all items on the clipboard via the {{domxref("clipboard.read()")}} method. Then utilizing the {{domxref("ClipboardItem.types")}} property to set the {{domxref("ClipboardItem.getType", "getType()")}} argument and return the corresponding blob object. diff --git a/files/en-us/web/api/clipboarditem/presentationstyle/index.md b/files/en-us/web/api/clipboarditem/presentationstyle/index.md index 5eba8e5e6aff658..9eafd7945ebcfe2 100644 --- a/files/en-us/web/api/clipboarditem/presentationstyle/index.md +++ b/files/en-us/web/api/clipboarditem/presentationstyle/index.md @@ -10,6 +10,8 @@ browser-compat: api.ClipboardItem.presentationStyle The read-only **`presentationStyle`** property of the {{domxref("ClipboardItem")}} interface returns a string indicating how an item should be presented. +For example, in some contexts an image might displayed inline, while in others it might be represented as an attachment. + ## Value One of either `"unspecified"`, `"inline"` or `"attachment"`. From 6fdedb874418d1bad1f362e1ddc30d2892f6c6c3 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 5 Jan 2024 10:21:04 +1100 Subject: [PATCH 14/32] Permissions API- remove clipboard permissions --- files/en-us/web/api/clipboard_api/index.md | 3 +++ files/en-us/web/api/permissions_api/index.md | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index ba228071768ac3c..a0741109d185120 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -28,6 +28,9 @@ Events are fired as the result of {{domxref("Element/cut_event", "cut")}}, {{dom The events have a default action, for example the `copy` action copies the current selection to the system clipboard by default. The default action can be overriden by the event handler — see each of the events for more information. +> **Note:** In addition to transient activation, Chromium also requires `clipboard-read` and `clipboard-write` permissions, which are not supported (and will never be supported) by Firefox or Safari. +> Both `clipboard-read` and `clipboard-write` have been removed from the [Permissions API](/en-US/docs/Web/API/Permissions_API) specification, but are still referenced in the Clipboard API specification. + ## Interfaces - {{domxref("Clipboard")}} {{securecontext_inline}} diff --git a/files/en-us/web/api/permissions_api/index.md b/files/en-us/web/api/permissions_api/index.md index d381b1c44a6c4d2..43ded618e43e548 100644 --- a/files/en-us/web/api/permissions_api/index.md +++ b/files/en-us/web/api/permissions_api/index.md @@ -33,7 +33,6 @@ Not all APIs' permission statuses can be queried using the Permissions API. A non-exhaustive list of permission-aware APIs includes: - [Background Synchronization API](/en-US/docs/Web/API/Background_Synchronization_API): `background-sync` (should always be granted) -- [Clipboard API](/en-US/docs/Web/API/Clipboard_API): `clipboard-read`, `clipboard-write` - [Geolocation API](/en-US/docs/Web/API/Geolocation_API): `geolocation` - [Local Font Access API](/en-US/docs/Web/API/Local_Font_Access_API): `local-fonts` - [Media Capture and Streams API](/en-US/docs/Web/API/Media_Capture_and_Streams_API): `microphone`, `camera` From 337163ba5f03e4183147d3d386bf5292ab3ccdf4 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 5 Jan 2024 10:22:26 +1100 Subject: [PATCH 15/32] Add note about Chromium behaviour --- files/en-us/web/api/clipboard_api/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index a0741109d185120..348d3e8edacd1cc 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -30,6 +30,7 @@ The default action can be overriden by the event handler — see each of the eve > **Note:** In addition to transient activation, Chromium also requires `clipboard-read` and `clipboard-write` permissions, which are not supported (and will never be supported) by Firefox or Safari. > Both `clipboard-read` and `clipboard-write` have been removed from the [Permissions API](/en-US/docs/Web/API/Permissions_API) specification, but are still referenced in the Clipboard API specification. +> Chromium is expected to remove `clipboard-read` in future but [consensus has not been reached](https://github.com/w3c/clipboard-apis/issues/163) for the removal of `clipboard-write`. ## Interfaces From 19e45796402e72cb8ffacfc51958bb2bad574247 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 5 Jan 2024 16:06:06 +1100 Subject: [PATCH 16/32] read() example handles the permissions handled/or not handled --- files/en-us/web/api/clipboard/read/index.md | 42 +++++++++++++++++++-- files/en-us/web/api/clipboard_api/index.md | 11 ++++-- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index a37044068ee61f7..69d81921ffa62f1 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -46,7 +46,8 @@ This example uses the `read()` method to read image data from the clipboard. Copy the butterfly image on the left using the "Copy image" context menu item, then click in the empty frame on the right. The example will fetch the image data and display the image data in the empty frame. -> **Note:** Browsers that gate access to the method using the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission (now removed from specification) may require you to grant permission in order to paste the image. +> **Note:** Chromium browsers gate access to the `read()` method using the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission (now removed from specification) and do not require transient activation. +> If prompted, you will need to grant permission in order to paste the image. #### HTML @@ -82,7 +83,36 @@ function log(text) { } ``` -This code reads the clipboard when the destination element is clicked and copies the image data into the element. +Chromium browsers gate access to the clipboard using the [Permissions API](/en-US/docs/Web/API/Permissions_API) permission `clipboard-read`, while other browsers use transient activation. +On chromium browsers we can check the permission using {{domxref("Permissions.query()")}}, but this will raise a `TypeError` exception on browsers where the permission is not supported. +To cope with the different implementations, we define the following `checkPermission()` function that returns the permission value if the permission exists, `undefined` if it does not (or cannot be retrieved), and re-throws the exception if there is any other error. + +```js +async function checkPermission() { + // Check the clipboard-read permission. + // Catch and log exception if permission is not defined (TypeError) + // On Firefox and Safari returns `undefined` + try { + const permission = await navigator.permissions.query({ + name: "clipboard-read", + }); + return permission.state; + } catch (error) { + if (error instanceof TypeError) { + // Permission not defined or unavailable. + console.error(error.message); + //returns undefined + } else { + // Rethrow other errors, such as invalid state. + throw error; + } + } +} +``` + +The remaining code reads the clipboard when the destination element is clicked and copies the image data into the element. +It checks the result of the `checkPermission()` method defined above, and throws an error if permission is explicitly denied. +Otherwise it attempts to read the clipboard and will paste PNG image data if found. ```js const destinationImage = document.querySelector("#destination"); @@ -90,10 +120,16 @@ destinationImage.addEventListener("click", pasteImage); async function pasteImage() { try { + const permission = await checkPermission(); + if (permission === "denied") { + throw new Error("Not allowed to read clipboard."); + } + + // Read clipboard if not defined (or permission not supported). const clipboardContents = await navigator.clipboard.read(); for (const item of clipboardContents) { if (!item.types.includes("image/png")) { - throw new Error("Clipboard does not contain image data."); + throw new Error("Clipboard does not contain PNG image data."); } const blob = await item.getType("image/png"); destinationImage.src = URL.createObjectURL(blob); diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index 348d3e8edacd1cc..d91b684467e8132 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -24,14 +24,17 @@ It is usually implemented as an anonymous, temporary [data buffer](https://en.wi The Clipboard API allows users to programmatically read and write text and other kinds of data to and from the system clipboard in [secure contexts](/en-US/docs/Web/Security/Secure_Contexts), provided the user has recently interacted with the page ([transient user activation](/en-US/docs/Web/Security/User_activation) is required). Browsers may place additional restrictions over use of the methods to access the clipboard, such as requiring user approval to read or write cross-origin content, or at all! +Chromium browsers require the `clipboard-read` and `clipboard-write` permissions from the [Permissions API](/en-US/docs/Web/API/Permissions_API) to read from, and write to, the clipboard. +The also do not require transient activation. + +> **Note:** The `clipboard-read` and `clipboard-write` permissions are not supported by Firefox or Safari. +> They have been removed from the [Permissions API](/en-US/docs/Web/API/Permissions_API) specification, but are still referenced in the Clipboard API specification. +> Chromium is expected to remove `clipboard-read` in future but [consensus has not been reached](https://github.com/w3c/clipboard-apis/issues/163) for the removal of `clipboard-write`. + Events are fired as the result of {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} operations modifying the clipboard. The events have a default action, for example the `copy` action copies the current selection to the system clipboard by default. The default action can be overriden by the event handler — see each of the events for more information. -> **Note:** In addition to transient activation, Chromium also requires `clipboard-read` and `clipboard-write` permissions, which are not supported (and will never be supported) by Firefox or Safari. -> Both `clipboard-read` and `clipboard-write` have been removed from the [Permissions API](/en-US/docs/Web/API/Permissions_API) specification, but are still referenced in the Clipboard API specification. -> Chromium is expected to remove `clipboard-read` in future but [consensus has not been reached](https://github.com/w3c/clipboard-apis/issues/163) for the removal of `clipboard-write`. - ## Interfaces - {{domxref("Clipboard")}} {{securecontext_inline}} From 0009e9b44b9bc2a9b7e641facb2368619578a4e9 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 11:29:00 +1100 Subject: [PATCH 17/32] Merge specific suggestions from code review Co-authored-by: wbamberg --- files/en-us/web/api/clipboard/read/index.md | 2 +- files/en-us/web/api/clipboard_api/index.md | 2 +- files/en-us/web/api/clipboarditem/index.md | 6 +++--- .../en-us/web/api/clipboarditem/presentationstyle/index.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 69d81921ffa62f1..a6057b7ccd61b30 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -84,7 +84,7 @@ function log(text) { ``` Chromium browsers gate access to the clipboard using the [Permissions API](/en-US/docs/Web/API/Permissions_API) permission `clipboard-read`, while other browsers use transient activation. -On chromium browsers we can check the permission using {{domxref("Permissions.query()")}}, but this will raise a `TypeError` exception on browsers where the permission is not supported. +On Chromium browsers we can check the permission using {{domxref("Permissions.query()")}}, but this will raise a `TypeError` exception on browsers where the permission is not supported. To cope with the different implementations, we define the following `checkPermission()` function that returns the permission value if the permission exists, `undefined` if it does not (or cannot be retrieved), and re-throws the exception if there is any other error. ```js diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index d91b684467e8132..c1061a027ffe356 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -25,7 +25,7 @@ The Clipboard API allows users to programmatically read and write text and other Browsers may place additional restrictions over use of the methods to access the clipboard, such as requiring user approval to read or write cross-origin content, or at all! Chromium browsers require the `clipboard-read` and `clipboard-write` permissions from the [Permissions API](/en-US/docs/Web/API/Permissions_API) to read from, and write to, the clipboard. -The also do not require transient activation. +They also do not require transient activation. > **Note:** The `clipboard-read` and `clipboard-write` permissions are not supported by Firefox or Safari. > They have been removed from the [Permissions API](/en-US/docs/Web/API/Permissions_API) specification, but are still referenced in the Clipboard API specification. diff --git a/files/en-us/web/api/clipboarditem/index.md b/files/en-us/web/api/clipboarditem/index.md index 0c30d4f0c1ccd72..205f5dd1d34054c 100644 --- a/files/en-us/web/api/clipboarditem/index.md +++ b/files/en-us/web/api/clipboarditem/index.md @@ -7,7 +7,7 @@ browser-compat: api.ClipboardItem {{APIRef("Clipboard API")}}{{SecureContext_Header}} -The **`ClipboardItem`** interface of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) represents a single item format, used when reading or writing data via the {{domxref('Clipboard API')}}. That is {{domxref("clipboard.read()")}} and {{domxref("clipboard.write()")}} respectively. +The **`ClipboardItem`** interface of the [Clipboard API](/en-US/docs/Web/API/Clipboard_API) represents a single item format, used when reading or writing clipboard data using {{domxref("clipboard.read()")}} and {{domxref("clipboard.write()")}} respectively. The benefit of having the **`ClipboardItem`** interface to represent data, is that it enables developers to cope with the varying scope of file types and data. @@ -38,7 +38,7 @@ _This interface defines the following methods._ ## Examples -### Writing to Clipboard +### Writing to the clipboard Here we're writing a new {{domxref("ClipboardItem.ClipboardItem", "ClipboardItem()")}} to the system clipboard by requesting a PNG image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create the new {{domxref("ClipboardItem")}}. @@ -61,7 +61,7 @@ async function writeClipImg() { } ``` -### Reading from Clipboard +### Reading from the clipboard Here we're returning all items on the clipboard via the {{domxref("clipboard.read()")}} method. Then utilizing the {{domxref("ClipboardItem.types")}} property to set the {{domxref("ClipboardItem.getType", "getType()")}} argument and return the corresponding blob object. diff --git a/files/en-us/web/api/clipboarditem/presentationstyle/index.md b/files/en-us/web/api/clipboarditem/presentationstyle/index.md index 9eafd7945ebcfe2..3304cdd1b2f73c9 100644 --- a/files/en-us/web/api/clipboarditem/presentationstyle/index.md +++ b/files/en-us/web/api/clipboarditem/presentationstyle/index.md @@ -10,7 +10,7 @@ browser-compat: api.ClipboardItem.presentationStyle The read-only **`presentationStyle`** property of the {{domxref("ClipboardItem")}} interface returns a string indicating how an item should be presented. -For example, in some contexts an image might displayed inline, while in others it might be represented as an attachment. +For example, in some contexts an image might be displayed inline, while in others it might be represented as an attachment. ## Value From cf84e023f5b2a3d96279c7f0c50a201c98973038 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 14:31:16 +1100 Subject: [PATCH 18/32] Fix example as per feedback --- files/en-us/web/api/clipboard/read/index.md | 62 +++++++-------------- 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index a6057b7ccd61b30..9d3024c623509e7 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -43,21 +43,12 @@ The user has to interact with the page or a UI element in order for this feature This example uses the `read()` method to read image data from the clipboard. -Copy the butterfly image on the left using the "Copy image" context menu item, then click in the empty frame on the right. -The example will fetch the image data and display the image data in the empty frame. - -> **Note:** Chromium browsers gate access to the `read()` method using the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission (now removed from specification) and do not require transient activation. -> If prompted, you will need to grant permission in order to paste the image. - #### HTML ```html -

- Right-click on the butterfly image and then select "Copy Image". Click on the - right-side placeholder to paste. -

A butterfly +

``` @@ -70,6 +61,10 @@ img { margin: 0 1rem; border: 1px solid black; } +#reload { + display: block; + margin: 0 1rem; +} ``` #### JavaScript @@ -83,36 +78,18 @@ function log(text) { } ``` -Chromium browsers gate access to the clipboard using the [Permissions API](/en-US/docs/Web/API/Permissions_API) permission `clipboard-read`, while other browsers use transient activation. -On Chromium browsers we can check the permission using {{domxref("Permissions.query()")}}, but this will raise a `TypeError` exception on browsers where the permission is not supported. -To cope with the different implementations, we define the following `checkPermission()` function that returns the permission value if the permission exists, `undefined` if it does not (or cannot be retrieved), and re-throws the exception if there is any other error. +We also add code to reload and clear the example when the "Reload" button is pressed. ```js -async function checkPermission() { - // Check the clipboard-read permission. - // Catch and log exception if permission is not defined (TypeError) - // On Firefox and Safari returns `undefined` - try { - const permission = await navigator.permissions.query({ - name: "clipboard-read", - }); - return permission.state; - } catch (error) { - if (error instanceof TypeError) { - // Permission not defined or unavailable. - console.error(error.message); - //returns undefined - } else { - // Rethrow other errors, such as invalid state. - throw error; - } - } -} +const reload = document.querySelector("#reload"); + +reload.addEventListener("click", () => { + window.location.reload(true); +}); ``` -The remaining code reads the clipboard when the destination element is clicked and copies the image data into the element. -It checks the result of the `checkPermission()` method defined above, and throws an error if permission is explicitly denied. -Otherwise it attempts to read the clipboard and will paste PNG image data if found. +The remaining code reads the clipboard when the destination element is clicked and copies the image data into the `destinationImage` element. +It logs an error it is unable to use the `read()` method, or if the clipboard does not contain data in PNG format. ```js const destinationImage = document.querySelector("#destination"); @@ -120,12 +97,6 @@ destinationImage.addEventListener("click", pasteImage); async function pasteImage() { try { - const permission = await checkPermission(); - if (permission === "denied") { - throw new Error("Not allowed to read clipboard."); - } - - // Read clipboard if not defined (or permission not supported). const clipboardContents = await navigator.clipboard.read(); for (const item of clipboardContents) { if (!item.types.includes("image/png")) { @@ -142,8 +113,15 @@ async function pasteImage() { #### Result +Copy the butterfly image on the left by right-clicking the image and selecting "Copy image" from the context menu. +Then click on the empty frame on the right. +The example will fetch the image data from the clipboard and display the image in the empty frame. + {{EmbedLiveSample("Reading image data", "100%", "200")}} +> **Note:** Chromium browsers gate access to the `read()` method using the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission API. +> If prompted, you will need to grant permission in order to paste the image. + ## Specifications {{Specifications}} From 230076a2d6350d87943001940b21646f6dcdb22c Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 16:14:00 +1100 Subject: [PATCH 19/32] read - add example for more reading of data --- files/en-us/web/api/clipboard/read/clock.png | Bin 0 -> 90575 bytes files/en-us/web/api/clipboard/read/index.md | 124 ++++++++++++++++++- 2 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 files/en-us/web/api/clipboard/read/clock.png diff --git a/files/en-us/web/api/clipboard/read/clock.png b/files/en-us/web/api/clipboard/read/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..999ad528fe9cbf6c958d6e28aff202d6322146e0 GIT binary patch literal 90575 zcmV)0K+eC3P)Px&08mU+MMrQtIXpW&Ksr4@ zGcz?hI65F6ARHMRG%+(56BH#RCLtXjF)l9<3k(zy5;-+CL_R-LPfrK~0|x{I2m}NP z1qB8I0tp8O3kL?o!odm%2*km`#K6DF#>T?H!OzUg%*e+O4-dk^!otA5$i>9V$Hvgj z%*DjS$;HIZ%E`{j$HBnA6crT@4h_-F%M1tz$Hv6Q!ok_q)5ycZ5fKs8&(6)q#>&XZ z)6LAnzrWYi(-s&R)YH?})z!_+%F@u!4h#&Jl9Ir_z0l9j%EQ9T%FD*V!M(b<#=*at zl$6WL$rBS3#l*tR&CSBZ#K60`#>B%73JTZK(bUn{-9mB%Ft*EEa%gNHu z%`GY^)y~Yiva!d<$DEdx#J;`I$j6h7jo8-K(aOlo#l(<{i@CM5CnhGhu&>C%z}3{# z$Hu~*n3%q}w!pl+v8t&;KR=a@j)#MTDJdz|(9hD*(7(UG+0)X4eSI}CG1b%2sH37Q zCMCSJwARwm4Gs>vxVOE$yvfJL!oIv_V`9(8#e8^pdUbUQ2?;?wJ3Bc!YG!5`85x$4 zkh8F`H8nM=rlogtbANn%gMffZMMW?zERBkbL_$Ig3JSKfv$3tM#m2@aA|i{0gl%bQ z#=pKyNl6|cA&`xZTUc0iaBzo!f1sM0FfcGIEiI6Vh^?ih!@Rp+TwKAqx1yY!r=Xv5 zZf?fByOWTR)XT`@+}R=|C1hV-rJkMJ)zpA`c_SbnaBFJ}3k zud53S3Oh0|3JVL3gMiGzym)MBhkJK_a&FMYz`?b#shyh)4GgQHpq7Y(?dIdAnUs!z zda$FPosWn1@a?Xkl+@;#?EnA(7j#liQvhC*f;dYi3Kwv(vdG5lo8H*>-R|Jt5L$G) z001BWNkl>{N%o4u#NqD z4{Q8$uz!+&zhA=l^L(G@QDU+G&v7Fbn;ehNCK8FM*fcedgPM*_Cn$L%pKcA-(@$s>V zsS%hT1;pgo%y{C~t>#+)GH+4Tfr((N; z(6#uj$J?dmE#NXUHZeU?@qaU>CuU};`F81X%TDF$*@bL&{Xw;UHl8>wl%i0MO zASFqXU_HO->jKQUw-j~uiObchi|gz4dhLnMKRWBpQ?oN8D*vr7#^Th?!{xUQx47_4 zwpz;wD7_@@edze-eVCL}Qcu}!2^o$nguQgn{BR;kCm+At?3|P(on<8{bs`j!^}BbI z8FOi+<5TgmQ4af$SWG~vxYgV_HHGT>`h&u2p)7TERaI>enPr92<<<8>J^8wJzo)DX z?*IH}zxs8m)AIFSJpJbW!fIdaeE@W7L)}Ry3Tf`JqUV9D!lJ^t^`hyxSU_rHWrUuvxf?&VWs@#m4g0OEdVJ4%Q7v!Q)-{tptGg7`+g-fVY$;@-oFP{ zk-Mws{e#aiGffpRTCVF_I9xNdkdBOeEXx4D?Fo1OB+ysw#HjcBn@p9sd9WFL`e~Ju zR19LwGO{Z}92EOg=xCZ{Xd+;->}K(J&HfCKbbs0Z7@}7ke|dj3#IyzudFSXR z><2@+*(49G|!31S(v z*Fb(v(?n4d9mfzw9_F3{x16w9^h+`Vv;7r+2V4|R zVBk3ep65lLha131Zoc=MrWH7W>@T->EQtO<^Ouh*n9su1gZ|MV#9Iy+!a)Xb7M$k+ zT5=#>Xe0;1kEWTjo%&Rhwu(jf4j)-*^r+s%{vI zgBzZMaV~e700clef&Z-6HyzClM8AKrVQ!%x%O(YQa&ukCEs$UWNGBS}Qh$|Cl=&x+_11*3({?5e?$m^N+9Y`Erm#GZ;*E1lTp;8cE5HT5~K}2L|o`FFw8Qwx52tl;` z?Tr-+`Dx&gWrXAako{BZ3(jaiPm@#N5S-AwIN+nBAqnzmMXW29X|r6xtaPaO^|Hxi z;+21yxm_!(STmrb#U{wWf;&_YaFB3j2nB{_=oZsLBs9ZdF>#trzh`+Opz(Kmn+^uM z=PzGenLGkHSlQolQ0L+97Ww3rXgj&}g%cAIhJ*&CAN~Z#Qd2dKDZWcw8zj)>?zgvU z>#tc=He3S39rjXKBS6KWR6`&T&!8iXZ^(sd!F>&Z1c)p^hd9X5Yd_oHCdCJV-1A`H z0CxaN1Of-pN}ime(1b9UX23+giMV($&@1L1$1%-of@FGT?&!>Yk}Iob^mt&9>N>33 z7`;OpB(+2X^c#?5L({`pcZwUwhXH8LIDTnk*C4L)ciwHoF@pgDS@jq(!a<`&$WBC} zAQ-ry31R$hIEZ5gSWzH*nX159%g_gZ?T?E$W`6Rjq%YDG>#QoP%6onumLh z7Ti)=3LXY)8ea~Ew8)bd+0@IKZvWxj*jMe2vAK))TCyO)Q=bLx6sg?gCu)1X7y^Yu z4w0HDS*t-Z7af%YniiYAb6@jdF8aldT?ez0=C2%;JXj;9pKtG1yrBmg`MiQ)@kJ{Q z1=Ch^11|7<{AH1Eh+m?D;y9Ygo^bNYOKS4Q*Xxd>vu-`3n(!zF_1hy}5To9wMLMXc zdecL7hAM$>B%D!5P>;~^n(ddz4z3RX$e9LT4ZQZ|Z`T}H*#aPM9*c}Z)~A(5zR}2^ z=9P3hpU&qSq?RBISPB=2D^CNpMq`-KT3GU-H_!~boRJnM^pwCy86(O}Ocb(^Q4}SO(?%Xb`y3fF%F~mNpP2(7+}DpflKhTcMQMTX{}> zedT?U+V8Xq8CJH)^D$k2#oX+T>OPwtNCprKf_v}Eg+#~rM<4W&3#5(=H`pt zn>B|DDHBDCkfo72go9CVPed`w1ue=lMj$QI?#fw(SztSe+U&54i}`T1!AaH-w>Gwe zsn_|~DvAOX3n@$0=XqyB+y8(tiS6I`E6Mx(o{#r+GAw=&M7#lQaAh?C2lx>LL@AdG z)s1Nmjr{oN(bDzbzhmwDu6@~d@=qu4jw9#S=-?tyQu(mk6X)I1ss#6TE?Qwh?P2kV z1xf{Ru~J~j^p%VS6K;2B0fT3eA&aN#)S_VW)ZFPb3X8&La!t#&U4UWx7D2!&063W- zLoE1aP%|Qk*8U^U*ioNMi+gD$dN}c+`4XbJ|;)Idkt;F_{QyP!(V-@r!Wb0UQDot}_J16Y6A$n&kynumuSMMFP!9 z=f&t~b9Uc*?}V3UyW_t;d%qCP2@{s^B3F%!8)ath3ARG0bP9rkB`5$3?pmJ~01Zji zYNg_f=g)7>Jet1zY-6K$^LY1KyW8(~+wIBQ^V2IUy^W1a$IpyidR{1Sc)yCb^MEYi zV13CsFYr7{SW|f7A%R)M!S!t3&BraEL>Xf&Ll8hypDx`Wxcl+Uw%4uQd-IF_vBT)f zWlAN}C>pjXeI~?%+mpK#n=}Z~umljQjgUjkIEUt-^Su7Lx&Ewov;XM$^7j`mWb-2< z`LQp~j0`%B#$e;COWzNFTh5mo*$ZdZW=>r?zjS%3SzWEy7_e#Yf(dQHqocs;VfQqA zyNPSYVo=8pGPdV=*Z>|$67abhdP%J`bhOa@aL=~xJa+D%Um87mcVVHHW>J!cyv=r6(uVZ5=L}AldN}&o$C5hufM#wHjIKhvB9sdeUa65T~%Wj)-N}7 zLst!Btl4wan5r7iSnJftx8-tvWNvM7rrqx?tyk;yPA!$7RaZ%YFm>6s@47x5#`PqG zd4LI2!I>?V115Pm#R*taPZvi&&waU#XY;?@SAJCb&A>w8%2vt^9XucsYzc@1EtmTi zGJ#Xi60HcDqW3Jrm13vT34Z ztfR_PRihHCG=|rf`zuR6^sctb)C-ZKqpp^!(jAt<jem+L-@w?EL4S-3J~r6@hb9sYk#hV3f&lqhb$=qLT1 zULROg!txRisl8FTFf1r2hBKUv?u=CoO&(O8VR=Eg=F5OfBm2p6zjvZpO>+(mr+`br zH9(S`=K1R|iu4ZP_R8`XGPp#mS+CLK=98X_F1?y2uO3 zJOTe=(FRZW(xiKYVqyiUPUrR0F0j}FLEpMn2*aR$C$4CkqUh?KpS18nRXG&LE$-6~ z9Mol@=x=}oDzR82JHOn0)=JhoNwkADA_EHDw0+a{{g5k^G2eG>0fcJh(s1baq;N7( z?_3={F|%Xa&9`>u?_EB8bi5#1#b!H4;|LOxaRTzf3PPc_!4}{`Bm!cCoRdfw3okd? z_Zn(g|2NmVq42<&Q*jiXcxbw!@==kk_ylhh)i`)S3&G$kqL-_xT5)1(r7^PB?mbDBe5~v^|*6*J!^gq~MB-yn$+fE%B8s~?w z(s2aRbp*^-bW~4#H6wpMF(4ZBPs>HdOxLPUSC+Gm{^l?gp@kk|p(~oA#}p;5L`WGd zKJPqqM~P_hhqx+CAx#uz>uqA-h-#?RuM5jvIDIOWYtqg=+ckOkwkrnWLdIHvgJ&kL zJtE?Jba(h#sx&ly`qMqzh$MSP=1zQec6@=KaD)@|u;r6%1%s4cK>BA-wjt%f7VpfZ zJFB-q4XLjbQ&BW2t0r)0p%5vGs>LB#e43&eTxz`Ffw-V^K&fc*+VEb!8T?-rG;|R` zBUYYY?yaZlkS+dnKmeAww%-H-zH9ox2MNr!2@`M;d$COqJ1CKaxu<5g4M}$IZ7ljn zhB!q`$@DNGgKZg)z`GM5gqTG%Sn_4`=dnjf760|ByV!Wc3?d-H#LDAVi?%#2YCH}Y zGyz3F6xSvu07QI(uA;?t<)cHgoS@C{ibPUly2uz)nt-BK%4_YVW;&e@69lqd2wRxETsuglOFtBEf4DsY@Gth~&-^@4qCOXDQUPjnmFixz4Z<8x^AvHX1hw2!`#zXSAX$|Nqf;9$0>V)ETGVesUO z-1t@wBpGc@zyJ3CSKY66mdAc~WR!yv23-a#7M>IDXpm<~%oT=M5^}`YQ?=I{lVyD( zvq}Bs1azQ#UlkmIZ^(K7B>b59dzi8Mmay6og2<(^Z9(a+-NueNzT6sN|d??w-FI71V_zJuB<0gIq`{>iNrgF`b+dBNeGWQHRV##;PgHSWZF>ORB3eK z=DxRml(Ku@#hLVxs|A`l0*TOqy|`$U$KJzpaSsQ2GExe}Ml$Kb%kG+^OFUH~>mVl} zMfif^7z78wwc<1gLb;rsTSF86sNL;7d)iuWHLKO;%T{y!*|XkCzr8#&vo@CnIF3`H zZAcD?>QAXswvrd=2)d{j#~@t@!pPw$JoqqW3PpHKxjs*UOG}IekJ?jcQxeI-_~`Yw zd<6U+|(WlA9?PB6S?vR3U)mW?Rg5)aZsJR(k4AS+a7 zkX&eFhv(7VExoM&@Q<&5`_CJHfBa>|r>W6+?aN5Q3%pS-zV&B3#MSA+^F%ZyYDEODpgge&(!3xGhjkU&c3y!PANlI+Z9 zFCQHWvsEA#!4Kp-j<#uqHfKYOR_uE@Qnkm%%z@LZ;ZIi8##;X=91n3T%)nD9|ASDp9++F;$gMy%g-n<%T&>N%wX(H)M|sje zdajV>|BJ|E6~q7<(I*g`MA(w)$qn3xxbLOXt(7%Np?VZ^|HI7L|1_0maXgusoyqL% zW_ObP17s&OD;pqS;^;cV?k}xNh7u-WO=engwPe7`U9*D$QgGT5Q`!`3y15N) z*U~a+DGEZ0v?NWA&I;;|CVS3#ZjJweJluQjrG(JubHC?%&UxwyY-EFSu@x+&bZ(OB=`kr z1SO+GcpyQB*QllDRO7;!ZI|Z1?|hh!svKiv9@vngb}G6A_2#hla#IfvvzdBe6L8mS zZa=;mm%J*)B`hVPELAF%)N~)cluq}q+{!J#82(}YInC{vPyC&FPZA#mZN+C7oK98J z<8k0nC>)NYioUzB&`NJ9^aZ8IzbA^>I}ctg=WadfO;2`rm%;4+MGRRalzeZdtar+% ztgc4~@d{pn69g|=JLg3@@I5gzhC?{x4QHC0tH+$)mEG8GeCN0En8S$jplC&PH+HH5 z)DFVNHkIdLRsli8wg;C`&I1D@u2k$TfD15k6+*DNI$xV z-Hr=P7?mi+CG!qYseyqDJExF5>NJZ?9gGnIjm0OHd9aDmKUX&K z__R6>P=vzc;CV&FsZtr$Pa_J0Ua#+fyQ-im6P_UP+Iew+up z`JsL8@%s52=}9nphC!@6Uv*e|r&i(8C!YY72!JHx<&-EG#DQGMN`x&h2CjNp;}zNZ zZd*!xD?MR1v^L`H3RrpAsW*xp3GB=v5_bUmr*P`VO)0zm^S#M(s177(+a?LQxrEi- z-4LkSrdF5N{(A@Q;?p_<%qz@o(v$S?9aV=1>Iw!5Dr)s=gF^ve)CRTMz^fe~4}%(Y zV&IzwYb*B1>y8!pPjwg|zNs+8VH`8^$BvHzV2e7nda*6t4M^Y$z?53T%1-g3=w8{( zqyiYMl*oYNfC>MkowCn@1i=`BuIBm2St&TOUjO-ZQRYQRf06KcZ#bVXxK@(;ybD;juq_H zRvu_*C>XA-Z2}<1rKE8w@-#9X0U=CJ<0I-uqvD}L-+s#P_sc6S+Dfffez>a202TwT z4^Ud2o`Dkh)uSWojQMn&vSBF{j#zh6*;CG{mH5<8_BkCSx(I=Qz|LF+p+M*o+=38- z6D2mcE|0D5B5Qy5*Xh{>)n$xURBAx&hpIqDU``caEo{(*4vSu8p#SCi4Z0Gs+k_QI zIW?Pr29()t|B5|Z)52vuzi(KLQOCh|{_~W);efX2T#>e6c<|v;WNa~|(`7hssAYV7 z+}e{LU0oaFE>0N=aZ25CYVr2dwI%!yPUQRL{wYIAC@-y?<(S3%@ z=2R~(Wl7kdAf=R>m8A#c_cp>;F)}eC$U(`pvc(B38AeQ?pKt(-WT9)ZUS2w7_Mj{q|zhE@Kd+>*_0 zP1TrK^#^eR>v8<&2&f}|^3iHa4KaT7?*k6ZWjiX0N((KAKG8NjFl<+ce)7eleKevl z@(^Mojyxcwf~Vq-!q3`V{xJh@)sXZc`_G*|>8NP(iCaMJAjk3Y0^hIN~;CMzet#11ETw!T( zB>zN)zJMCl>RfhXI`8;r#an^sX6EIf(BM+5#zBz!}7o=Dh4 znZ%;FMe}NziQ2ln_ap88qT7B{;Prnh&#Dgdh$jEl<1A4+D*v zsT%yKCiuXwzN9tXkXCJ`1_8&J!#s;rB_|G99xN?xC89I87!1G>BVQ0v_;CIcxWgEt z1B_rW;qwg*(L2P%W~P`HL#ZGZ_+3$-b@|G}fv<~;ia)QY?Jz><(#~h^4BX#5n=Y%# zFNYx+DVh7^#Ac?MrMR5n;t+-lkRT8jMK6I&Md`-YR`b6;rq**la*~cr`EYrg!iHluCD`nWsF^Tm1(6cZo) z?aMiBN8c}T*)=-C~AQkLN2a_Nrhu7 z0U`{HQrRqN8zl1frCzVGQPvFAh8yZ|9lJ@xonMe9ePACBK8kzn*-AO4l~Re+ zw1d7O#k+To#(U4_wuk4R&lfnL{O*(&7nXccxAZI*n-K#Q#wiR`A`P5m6hng12nH$P zWyh|bU=a5ntJNAr!3-gheEecsd7X*IGh9$Ra6tPR56N}aAG6sLw^vuvgoLsVDQl~N zxwqX7*JGX~pgdeHAs4)$!6F&D3g{%GtFK*>m<5h z(4ni#+GVxUORM$5g$q4QD<~vpFwF4Hc_u7){aiif^r#04Iy*XezVol6qn4+M^S!ik zLNN<3A!>7_r+WTR%+>$2bzWgr(Y97q)aD z)DbqYLSingyH-Hh#kI$WA@&6mM==oa1w$M{Bgg5*1VRbm#Dopvz_1cvtlFw1T1e>n z!_GPHb;v(Za>0?4NdCCbea`bd=e+mTq0z-?nB|w53s&9CcqepdK4!+oDkJM`}cbrP^@xuRf*%Q>Uc@br0;fFaI^X_ zNQYrhW<}}XkGCIL6Wr+SP53E1l|&7wR8*H36gI>_K3uB^1U!)d4Z&qYrqBWCVR3`{ z6-G!qw=ki13Hi8dwMUen9?I|-Jmz<1gP#pPj?9nKkP)sN%u3i@t5ei0b3J6V01Q9_ z9|GwK{8JQ_g@i=2peuLuz8pk$93SDHmeb+@7Q~-3gEe|+egHOIaJkDLp2yK2;DLbT zj&7iqm(+|cPgQ)gIlJ4_;!$Um9jMQr^E$Cq^)hONUd($8j4+;G;>H#lF2cbDK=3X} za`AA&Bml&Ym=G!`ETsDk(6=xpEP#ZiR^`UtD>#3$OoMh3^Qk9ZM zxTF9{q^T%5Esp0CcwqTLRCwZwzV@>~sT6$+k^{%lR5A}I$jQYe)URlVJN$B>)Y(BndzTIP(Al&*M{`7qOyX9RXyBB~Z>7D8ob*GGkP{5~i3D zCD0jrQdpF_XTJqVviI%Te{@Z)j5Qz3ru7k&nW!P0J@Zem7yK@uAn=3)8~#hYA+8rfHT#Js_8$U7bNJHdGtA$dFukUU%F- zbC1jWc5_wDj94y3z5}BJWY7}rESttC3)9kWIJgej`#DdNa=jDB& zmAl>Dw|cFQMYs--H;gEt_9*-bqJ&v+u|Ci9@UB+rcHza3cOS_xd(26Hjt2{4Ya`fC zQKYG8wHJgFfMkA6)R47e1ff3>7Q%ujN#P;3>$Li|?N;_zE{yxGW$D-oOgBq`tX_G^ zRgr7=MqRe3_8~;`4J5`Wk|P&{B>QT6r1P>e82=4?eaoIbO67ll;Gfs3P(Vhblc9kc zKJ1fq!-lnrZ))ghYisN7?(P`ocmxCrxN|yEP*rlZq@<*(-8dZ<0W66XGZGs+IWh9b zNEI*#oy3z6#uF6yrblyz`eVwsG7O$CKD`nAeW|jIn&Npw;7N7i|IY2+OoCP5E7bb4BMj|^?smq=myrtQ87@?H?WHc z0pxsv$+~_q82=!{V^;509;pA@+-hh`#t{rTc(Y1HXkhh`b=)QSrb|Yyo*%hT6Cjhr zX?lDe{eVQ3zX}h(zu$Dr&LMXs8|n#C#pYy~I9X~TrpR3{R=IjZ_R3QiGmoX#o6Yb3 z{zR~NZn?b~r;2inMFX4y2G||r==AegF=Zfl5uUjOVhm{efG$gl?A*r8{er)G|`jB(8SxM^k-xEU4R**qgb+3b#(`;X4W3%Rc{7U4K3=_WM$WP1jlnz zMUE=Ws1atFkMJM~chQ&TGU8A(<|_F z(qtcIce3Jz@cPhtvC>8DNq_{e2FafT)7=pW;=dE(^!I3c1MWw6wx)itkp zV^E}c_S!@hfh;gjbYbblot|YYczyf&yETg5KH!HNd!1}}hESjpXX69xN%L?bu7G?1 z;h|cMp4~uAKbvx)eJpf4H5mMz!DC5!XP@%Bb;+9O;D$o7!F?Y4$W9?A;93;1bwph} zM|$6_nf88D!TrH&eM5^kpDg#cwwg@%+iHs7Q&YdG|JH&7tcDjIDTzLoE#!$^))S=3 zupH(?R@PYoNajj&%8HdIGm_r_Hux1IiHbN5h-_e2rFoLquo6Y;C7`o&*?1SR1tGy6 zm)qfJ8hK-zIP&v1Rrj=6dN(`wZf}gLloy9+tT~P5oOd}n?Q-_0LP5%rt0F}oFKEBT zRm^Tyt3Bq_FF!9c{ID8geJU%9e^9DeQ;M!;iEJ!=Lnw^6`$AS0ZUQlMbGjc-yDu;Q z`l-U3y{1MyA`w$#L&H*QYoyf#kJkH7hj783gKmhzsKCpTLYT-ZA4b#F`GOI)+8w3! z%0tQwi)G*JZ0*8b5O;L!inMX`TWGi<_5u80JQzDPcZh=x*@zED61Z?GD?=mOv-IKB zT?%8RcEL@<09?29Ju_6K;!&2J1i|Lx*6-1{nzA4{tc`h4kHzA6JlW$psoeKg&X1xM zg`9CiZWvN03XBwh!IMIOkJIaP4o5of!#LD;=kn>(gXdNdgNRg7dam&4O6x>pL*qoG zVP$opJgd^)7J&o)ce4D{9o(soP`Og6$MLwpq@F>-)MS{%WGgQQtm0+Ek&4NBXP@8H#Og(L3PL;E)kUAuD!myqP=pDPSRCMG5t9~G&+%WI8B<3vMbsYzQ{ z|Ft^jQcnJGgfV8dH2=&Q+Whm6-3eHB9V7eLy~%4;m(AmNyj+ zkjq7O02r)EYo{WGQ_-jfZyBe%k^B0Fa5rCo;>>kidXiUqDHK@(7{s!i>!FCTqs`bj zsq5-en`_M$b45{3ps@k*S}rX;M{DYEn@!p-4R3bTL3H(sq;XEW9Oc74=P-?atpReu zfyWD{)bA$$(rnp#VzYW~xn?{&F-udC51zj(ijYYq6n6OGDW397RN#ktTY85Ong7XG zKJ2)V9a`6e^@G}kuFA`aSgWuXEwW+--_$p(dsLIFfU9Z)LKQ`GQ1eLV=|60KVD?x( zNz+&xuM+R}oU(2_3P-m#o+K-KAy;38Z)XudFW z+MQIn*rXAqBqTm5+@Gqns1Ls#|H}g(lr2SF3iaaZaMe)C_!`IAsau0(3;Smh8DDrw zvRgnCuioKnfAc4fBd-*UPgm-q)J>zwGPXb2T!5p&4Sph@ukzvif2ezf2_5;NC>dMx z*4~&+Hkgm@E8hR$S!XW`gO4wqNOx#o{ZcYFjI!anQPycpTgT}YtoidjcXB!Myl(=}Ls0=&Q zfd&?ub1+!EKJ`MqlU@;}AE-3{xVzojQ=!yjE4zE{lUsi}?(qomK|5zIq@Ye3?QJzhiR#9dmkqCe96f2ZrU;UG5BfWa z$!XFA#eu;T_Ni@!?SC;>9F$!~i#s&NC3;Vt@Q5sJ|!; zhNa0~4tOeePip<@cQ2P}OUP;wAXFDL^Y5c{2OgCA-iF?zkEcSZ6tnwCU?olXXCh_e zcg0qtG+Cm(9>L)_@i?&tD3aCgR`3|J_`)zKj9UW(xfPnSvVt-W3tUWVDb$9}Xw%6= zd=XEQ7}R?_T{Fv7Y^Fr0+HrN?7ONZp zg-U57PJ!kHERTYC7PsoJW*cx_>&co>qQXH^8+rafJD4NW#*L0zHo>>=P2Iaq5h*@z z2QSnb>alIna118^CK|?Yai^Qhwd(YzcMXxZruTaK`hGT~3m{b%Otc4s@>Z1hy|ta^ z9%o=^rB;Vhed^HmcG7A8O22mWuFR@cu{=$Ga7R~>z;(OU!W5f49_krG3O|3VzVqL3 zMc{I4Xs>RmRSRg?lr~un&nOb@6KArAw*U~&%<@BFrdSv+5M&C4$Ku-CRdMaC;Ml`s zYY2$fv3xk5FH4uz=wvpa7r+EyrS^r4k_&?PeErPIS~whD>FUz=bb#rmydDtgq+LW{ z-p7K)z$A>(I{3lsA7?iJk-hN6LiE4^HWTX|&2@pD(TralR|&>F^iTnnG;q5jKzRf=UzKT7cvs}#z5e>A#}kc>OX_W?eB3z$ zChNk;0yjLS62bmOLo%|AZZwH~s|$0xlr#QPfAvIo#Ke&oG)U7A0WMENZ^RXR!%%1O zMp6i>!(6j8OztqC|8#ns3rf=4uMoZ#bO}zu$BHEV2oh z#y|jt@JNt0tRf;~y_X-94yN0be|+-o(~&z%jdb`iv>l>jcN1fVUdr1j{fwaE;`|9W zsR3foc7@Hmku$#YZp%lGa4&ooEI&~=h0i7~QVn2v09Ute(4ZDDc@Y9YUSzb)uRpC? zOt*^SCA_k8>on;AGUv*}u#nw-v|sOcIvh^V?E$dilND{2T#p_kl6Ov9u2b4-WT2e1 zDGXn9ezy4iGo%-f#~!?wAdM5Z$E(C* ziHgr>02P_iW>dj6>7A+%_ zv!kOA>hCljxJbhtZs-=82zCT}cQ#r;g+#cizKakcC2zgYrp*f~O6Zo&a{ zfALpm&)LneCi7kQD{=vjrn2D*kgOn+HvUsyR3nQKMe&(IUVD6;P>`%BOop~3P<(uE zYi5N2Ig)ruk#3N5_X8;-ga&c=bNEHf+9=Qo~kdTQY_IlWCEhgkuj5rJ+s z(m51fD;YZ&@{zhyqrg%xIaij4$M4B)d!{btsV72;U= zLW6eWN~ux<>;NvKXZTONYnhpuznG8-~JR!?T0Xt9;n9 zplK!fpguN-N2{&!C>2k8w!VRy6>eh-P#oG1e*E*Z=b!7H&UwdtxUE1#HoT~;3pqsJ zQ*=ne96ysRNIoWs77AHKoHSY>O;g04$~rmTj0->W_r>?J_8-a0+n=>3Z~x(M7yrBA z{U_ovqu=_h`czt4tTa)|D$;~fX>@#CTymU5bu5!%uJJ^oBApIMUMnx}GfzXmG(Xnh zX&%ZTzbYx|U%&w{a7mCn2_iBwTV~Pb*akm*@|RV8<3~xz>S#!yNJ3ZZU9}Xy&}NvQ z_rlOc(cD6?Yx>R7$UDD3kn!aW$K3x|yB4OV&NMvTnZ3;HbZ7bp6xb75IL)C5(hx4n zCX@q3gPACaC>gZq5Mx*kL`Xz*VQm000l8?_0M!_|h+LGQF%T}*h-3){sRXpJ3g~*N zZbi0ZcW3r}zhM8sa%Kp_3^`2B^S#gWyqE98((0c>!wi-Dy%ShA1raQFTdmI5H=l#r zp_-$9B%UjFkCu3~lBAHR>|KXiNzJMr)%?gAEU7m`+HvsU)z0yeS|hB|8JU_Sf09j0 zJ_AU)dG-PaOs!rYvO7i}yB?IABZ?JK5DOH=|Gpk0#B|Rqq*3|IyF8fw@WsK#ncroNAcLc_Zl93e05@?^R4NH(WNoYt0hYHarM_p zyd@vNVKUDv#JjoN1EAQUv9X*K5j<5UMFasMr?vm6G{chzK;#rH0bq8C6Gj_+v+lQ|9Jl;<{rTmKK^WX5MiCpT|KgoWG0RERd2FZ7=`VTa`)@*ro6$kD3ND$Xx955D}7f4^LEeSJ_s^G5r01WG$z2 zWlpKhVzqws+tm}0w2c`zF1xG_3#Qj7UGPQb2EbemmIEHOEp2~U3nARlund$1{%W9j z_HD9P&=s(wtgEvChZZpR0IN&jIE4pz_d(jRb69rA1OcLPwOk22T-Fu;SrkV-1Av&U zRmm)fhA5PY1#$=Os}ta`xAsx zU0j@i5yM+(2$dWvg<--NP8f#~?dF1*aJTTHwtl%OU{lVh(O@*V#%8amm5s9e;o-W@ zV?7i1?qTV1FE->)V~}8;h=^2vB~z7TCx!IqY{nSDonI^U(`Z9wxx1W<$W)TF1QzY- z6<$AqrN$%O9`mZn$nVp_GcN9LcUjB*tOGQKlTPULT5XRUZc}ZoY5K+5NU&EY6B}^N zL{@)0|1{alBn1R!cikzlS!`&ooVXr$tPuh z+!FRrw-rOgp^$@YFu+p~8DcT0hkyb&Wl!2(gF}vne7fGY0&zNTd(d$11pb9ycIrO>Wlc*h2%@tl8cxN~KEHl%K!z z&asIJe>1*$-!yn&tf!y@#wm=~qmwda$l+XX^3$1tjCIjuG4l z9|A`Yj6RFlpteen+qgB^4J>v~*3nt_#-=&jD5Jv()3^A`s%T?IHgcQ)nAQYRP3Tn2;D@hW*o z;Eo+pyi5SZ10mw5$jTG|>7b{j*-TjKV5LC9S-!By?gwPtUL@7(q_@2PUBp}vjKJeL zZ~9T8kQMUd&r8iau3qYC1K5ZaID?xbo3WyMX`*kUt`0tXO--X@(g%2G#%7a~xA1sdcoo-s zfwDY{07yDKOEJXP(pV+2XgWcvBGJzc96vQj=@CuQYX zw2sdQmZQZHV!RIpVIpRjJ)kBW$S=9P(2Cn%J=73DHuXwUOO(pS8d(jVV{@mc57H7m zj`8gDc`)~+smQror#N3TnKS>0_jn_$Tf4&oM-_ZuUA z$=lC3-5%?Qs{zP|(b3`6HvkZg)eSL;=FUcjXl%f(ARq0Q_gfy}u+Q_M<>w8N4T%lm z?ep(mdG|P&&7?Ncd{xC%d=kXgWwr zf|M^ms^deX@U<)*L4od5v|Jbm&}K$36o+9HB1RD!q>s5h{t$bMV^5N^!BUi9F}SfQ zAJqL=Umxi$UIW7gh&VA%#GbpuGBpX(o~^g{91+JD4~3i794&v<3?e7t;lLVy5g4Z-Wp zc3;QR_Z4}P#+u0o1!Pzqhh@%pG#|q7IQXFF-*q^xAj1}5YT&a)13VLr<4pxm!41-L zvR=8ZJ`m_9*NfsH#h~P@P6v1h|@#I_c+jr^yNu{%-Ei38miaPe$Me^UT}1 zTcxGi4S&*VrEncB)oRnz(QeV;#Dpvjjvyinq9v0OFkloI5fc*=)<160m^2#WlQ#in zWs+32^0*QkzD>g*CCB+%3REU?KIu!K%*u;e3@!)u=2{ z=P7p0U<2IsBquE7Kv--jlm2SP>H!gP>?x88LBoM^{zux?1~qkN;Xk{x}a8YHEW(vl9rC+hA%UE}(=UY`fH;BM_D%#DHQUAt3bw zFk_h1fC0(|R8nw?_`SOB%%1Zmj{93)$Yo$i2J+nVJm)#*y!R%7{}Zt^O;Z{(6QQi; zAVkPy$ZYV3{$nF^*RNg-rV9iHgTP=Gn59ywfss<;DTbziwpfu|4zB|6s=3^x%=nb} z0!|`_lfW^|k+Y#bTw56TZnYD;CZHs;#xhX%^AkT^n8OO!NyjIxU627sc&p~Jqf9C5 zi_7r0ua2L+O8nty%QLJrTKbz0+q^Z_H``c95jfgrn6QWm(?T1oaaftt^pI#_-K@EF3| z%>rGOD3#cfl{nuq&Ei|43lFIOR#=$$xmxkyZZo!wAVL%rKY|DxAd{t8y`BMC2WKMUCPAJ6DR4>w zf8i+s!aHIeT@=?u{hcBl@aw#3aw&tcb03a0v5MM88_90ujJ0ZQQaCJ<3?`|B$;x4uakKP~MXQ{cvS2!;z zP0Ia;B2CRhhfXVtB#c(D{bchAmcilC9L3b3KKY-cmq%t=Djro z28w1t13<>%2$_=+L7{{!3lV~pwe&RP@lXAW)Js5ie7;%V?CTYr4F;QSkLEoLt2dhA znIQ2Lm4vkSF(AUtjL!tG$@dQdAQn6wID7Vp#c|c8z*~KwC8pCQvHdxSi3U4sRb)VK-bT*>PBkp#f012+7{nzhD4u;aWV|4uWwz3 zeFHci$ayUQjePlP-nEVTH7Xk3;M7oX2Zo{ftDB4rtf5*9vbcmYuo7QQGsNQsDx zfINq@VH{3}0d8_~8ZTD0ZSyu~pQO)ZLZ8@(K5^pWQ=G3mdHbI;XxwoJd|TUz8v#>e zpGq+`X+4r3X;=e2z$tmf+SJosZwEv!N4I^QAp0S4tM>8X6TQAp-8#lgf0Mr{H+MTk zh^x2q262mV7|TG>C_IbqD{s2jDx5L-lP$% zd0C_E%;_R+l|+&gw{5dHHjV4Vkp!J?aZ16>1_B6B762j#Qvv6+*$l}Q4IYr* zp%EC_bWdow8Q=MrA%Ez8^{UZOVDRq^M4^QGeV7-($hjPB`gbYB(XG- z7AQPdF+ZV0M6QRYK2PNFwxp%Sz89xbRg*cDA_x-MoxKnwcxTdIcK&eS6sB94@V8z5 z=EjOi+1IX6&&?j`K=YM{kYtT+we%JjgGJ~BA!&;aE5GjW-aCH0-|O|R<5FjT*ou;l zfVc=CU_{7OcRC@x>MkCc?r8Ad+=#6i=_p;5s!G3#iA#&+sh0te=4Q*{lwMSz1{dgg0D!;;h&m8IXa>vbfp1uNUs+bl z7=@Z0*FqQ}zNMEh{DY6sv;;9k@JEpakYJ+bYhLqv3_^Iilwuf-oJHaSqmSf8^F<;# zmx2g^HEsz{sWaZ$!`rhb?Y-UN&84MaN+8_=buTMBQ}*}gL#XZ8P;3PuA@%M4;YncS zK9#=K(R}u5R^BrlMH$7}a<6>^5V4`&wncVUM0b9XB3G~7YkTWVYXe^QdHZ${byr1C zPXrKLojzNAPlYQ#f7<5DI*JN1N;>{ohnr877}P4KbNP;=lC)+HwL0+LYPZf^_z5dl zU9{WU6LTMX?j-j+7+;KSF~oVaz~%3@v9E5kyLo zNCA$K(hp8pbmN4w_zB6`g~_~_w2#E^wqvtIqSb=9%Van+35bSNHyiM4|M%4Gp*nKaZ@VZl_r1M z1(XFMVzUEfxgnV*=~YL5LsMtNeXL*Q)nUawuh`x{F~&_^mN@SmB*Q`o$ANM}R~N~E zuB=h1G-E%g;+oa%ev~nA*SfkoGxP7;c$~qMKZrCC2~}oYpJb3pVlMxyk)I zca}R)NWLWl+Le=_G!m6SdGCrV70$_DTd>xc*K*ih+;O(2`#LCYL`fp9og~4>zv&GE zX}z7UZ`g_#e%{^ynjVc1&=4XYO+CecN5@F#k-DtWyp|6?#0u}P(>m+^?6EX)-=)Bf zhu9~>s}>zN3EA%49A;P8GA|^N3J z++)`mfzb?zm_f*mta*n}xI<_*N;RIpWUILY1^j{x-nI7d;}F^p;y^*!2@Ce`b>S&~Lc(VWiOKKtcE^ZgVm{sMj4PG& zX-y`jvXKm+o*$Zo7`ah?@DprYk$PV1gw~|g@)lmX_x+Ev>-~u$zr*PZn>5$-FKEPF zSuQLt6rl`VScjPdl?uW&3$wsggbIv^>?jM$Z08(~k%MA6wTH^y!PR&yBBCJ2Sy8sK z4J#nYdWh(uF+ncXN<2+$&NqG0=kr~9>04Y$T!tUU?=#Qmd7jUFX1+In*qpTzj3U1k zjPdzOuwsJ^;VUc%(kUl1q8vcA>4nZe-#hfnc!AuG8<1U zOr~kqj9asds(P55Ob%ZXJQWDmht_G3ei1 z*t0_Zf_f%LJ7>F=wRZPNZ#e=w4gH>Dy~O!DkM6#i8LD5Vas{*Nae7Q`x!D`uf4`vB zY;LX8A{x>#p&^Dl9GTMNmk+1%O0oBEu&)Lba*F)v4!F1NSDufZ&Sr93&k+(&H8nl@>f-#)s;c5|20mn0=l;I0ex#;u z#Nn>`=k9#i-e6%eEl0;^S8&4iH4YvR_p^J7sUu4ra@HmPGVGuAzr{%Wx)`?K2|N~Z zA=3~71adxjiR2?AvCqH1BM3mKq1aOx^-=iPq4sON!|svsb94(4O|!4|64`~QqFTsD z3)$VaciT)m3JTl>)--E+JOKG*+Be-Wu_RGQuuF5VzeA!3`<_hANmx0TZb%|%!h01h zQ-C&OiFsMn6iwqrSyV(`;}k;|H4)zfA{mOIak9wsA}7nD$m_bOxHLro9$uTlzJ7i~!}o2{*zQVUXJKiIILZHs4{GpDYO{4YJmx#|Bn@*%s; z`po?Ee>XP|2cDlkvOk7RYQCT;s2HDrk~ty9krS)#_d*1a3;q6Z|M9iw^>=#M)&Yqn zeI=_oq_aEhCp@4ZC&8TKmq^HiJ*=Y`b-#OJad~gA$3609AG?32`0|6Qh}|6>I#pj^ zRQmHZ5<`f-nRg)A& zkp#o5NW7p(iXiZ^!An%RWQAv}05&qGD>48P1E5F%Q1KGaLq8-9Kdp$+bs%e~pq2_F zEvcZRSIv~hifEpKY_A#}@7NokZnjvgvDLB2B)O(u_(i9)g)WmIk^Geyxq3y*d*_TP-eH*kb` ztsf!z`oaWJqk^h-k+7h=0=+;f;!%q@uOdslh~)=Zf(D4FJ^=%b z*YO!-guV@$1DfbO9YjIX42klH%aB}lK@cQY+1NdrqKBw2@D6IGBvi)3{aWFFZ3VF# zcI;>~wQZw7(o$2)%GS^fZL_>{=b`h|{-uZDTwVt8J@)c}hW#0^nplirF!{xA!VURU z>-P^H_p^JGRxc#6j~jmfYF-+n&$W@^m*w;HjQZlmea!A&9B-PTn{Q}KkCtY{U(XiP2k!NoQqST)oo-1>ONdTF zFo(;9s6P(a?W#ky&%KTS0*0s(+^&G4<)RQG0u(vr>(cmloFd7YqM2b z)AB6u#U~^rX^~Dz_p8U8x3o-kNnnVN0TKvFx&#muUdOo)qa>+F6{uJ^>1Bou)SJ@; zR44|M&Wp^2;j1D91V}>Cd88MJ2**nt$U*F|>jFn<#4EuHkJS=Grn>=1nZpqsU70|D zSgdJgKyvm#Zmy}q1W*780ttkqzJBP`==l8n9(K<=%+{H%;ydLdbvdsq=lcgUI;asJ z6%4NY&~e0{KS_|Vs>L`m@xP}-OAqUOlQz$~{NQgi2lohmcZli7rwk7uV%p(OvBe%ZV7BC? z<)ud_yqDxyddW1T;lg9iRf-c=2SeD16#(HO=!PpGlC$MyR3E&6gMDUS> z(3TzO2gQ_!a}`bK_42nz~G#7S4ig&j3nS(43| z*>hjVWd3AZh|)j_?|k>3bMANFch^K?H)sFrNIU*LwfD4q`a;9Vh8D{HQ(PDAZ`SsWxlf#ij{F2=zxJLJTH@-D2&}AVL;mvF{%D0}z%j zC1ZxV0x_6zg$WyL7@-j~Ti`!@Rsml_ZTTdhM0twW>3E-xsGmZ}Y@sw}w!m8I1Y|9q z32|inZ3w)Oh3B8_8X`bq^BKutuo>Lck>}qGN0L`iu&!`@p?eR}^uS-GBacw{xeb;d7Ki z9`eu(bC;X`^`}<~T zZ*YHC<=)9FR}T+=cBW0<96a)IYikDxUHM)qiL1PI?Ha90wZrXJ)lB?2M6K2P<{cB9 z2R?y+vM3);7MpkUBTa?OK32z2DhdJ>tZ||Sola*lTcD`SJgD62g9l`MJUJ31FT{t= zDib_@4xD1fht3?r&+=h%B0;D&cpEY%I?;6VST`Z^=!bh8$J*3tliTgyVce!Q<`ryg zhc>U)S1Xkr%GTDD93!7MO`U<(x;iH_yNt-6-)|gmN~My<%(Kz2q9Bl^L29RsZ0PRJ zkII!NijiE_A~0xwuNO(Wcl9jt%iqXnI?Egqm05&ngvyCBfm9Vm&*w*=ui^?tN%>&O zsj-94=UyZOFS1*Ztr{AsF>&ws+|}XXHaZ4_{2=^CowDMC>gqy$bwOZbUV&DlQK?KS zwaGvIkD-~KnT3U!+betx$1%e4Jnd!7j6HhU2Hgu122BGE*gbO)CJgMF#G!T`Ey>A zA!PU10Z6fXv&yaAs4XZA1gZzkDcWwJF%yH-RbXWFvVCqGBs4-JiU7g$5r%8_)k z!~g2w(1&GEI*~ZM@=`oH_93ll+HcKet#c>d99VmOOlFbQ_RamuSx)1aifFVc#mM;_ zB=G01C=Jgn8YlvF;TM;zMQ}dsxi&jpi-gs*SDu7UeY=x$&{xB|Wjr8wTOd`G%2Iux z&{4P^e4dvFR}9agve(p8zXP6&O_!QDPsql3zRm(eJQlMpVvu2xv~&=wVG5IAn9*6O zHi7_<=wBby7U2Y64p#!1YnEiIf*>*bC~YBWF}@%pk}@XtfkYOpRx*kBw3s#3o&HRw zGvn`UF7+7fc9X}X))cEuJ2Wb-1~QQP8}$|2f8Si8Y$amH-vS&(|Y#o z>B?*}olewWy>|cB;87=}FLfD2PJNS)tnVTtCs!JOHZou|)(sZ<#i|*EW&jnH$$&(2 z#S=VSE`&=F`FGa_XsZ$gi6XA}?aAK8*_BjXed2tV)yi5d zVOrf_310RW60A9hUWcF|1LBkVCq&T)3L*JrMP&HMtcX?;1R^i{c7Y@@BS#x!WjXwZ zgIjqlNsmQQ;yIhm<1v{$YWohm+wVq7HEwi(NCFkj`sRvvNol3FB1mdKZEBjLo2qYI z^ltHXHO{_&7Fl|(Hd&W&B>P5B-KATrzAs0F#LIdH@^edi;K0eD(Km>kJNLKUgLIaG;V*fTWwMmn*{M&&ftOcf$ZUkRs}}ju#^Si z9#2}8u`(QN1mux5929txQ!s)s7XU>JQcP?FDmtCyna=i0c-6;fMFB~Pm>o790VM%3 zkPTH*AkRSScwa$asa7eltS!uP3?vt8;|zA2$>Xu9O(u=j?e^#8Z8io1oqyB^^!kd5 zx^$whBT4mmh%KZoYBs$%N$tOMBI_64mD*%7k!kwt@dNpBFvwELVELe8Pfu0u5)vZa zG9vQ%+_%pmXLXN__Pn*qDpu|g`l_OzAwuPL*CrZ!k{@+B<7?xQwPe&I`Q5jtXWRby z;ziRq9kc`TSY8>vl%1La7-T?NcDA%8>-2&83_Tv)6IoNSTjQo4Xpbpl@V`z@csN6d z`WHCXU<-$FZNf|t4x6=vk+6_iAfXtBtRG|M!-9p#8?P92boqVOPX*B|O8tR_*(V}c zMB08tLiz%AFhGPStPq2|86U9fF!GRCW*tj4N0zg37F&pcIk7?W8Vnw4(ze5nY*xXs zLI-}NEpX701VnwMiG(tdsAx{4cY;aU+IFuTz5!<6vcK^(9VF$=rc$YZfBf>Hht5F- zl1JRRq}UKUlwXvqcL0&tXm9Swbm(5nS*!ITZzDkDNwHKQAxva{L+Oe}{{g3H8N@Cu zVMO6{uGuql@Ojs(bZ2U~((CQ2^q##rJ3T!zGC4jzc?CKV{-bqgI#68y>c`hlUtV}R zdo}&w+k2*BJMGtbY|`StPWUBQ0zhIQZ(s`xg29H%Wx+FSVX>%jCFOFvU=_khSx8LC zL_W{QqK{bIT5Gq4eb#>eqrN91l9%-ER=@;6*cMn49glR?Por5MgHHe``S>7Jwix`< zAQEB7!qSdC0)(^MY6KQULS6Q1x5}-_3mA>Yf_26K-Q(!!%+xo(TFed)XBUs8YGK;5 zl(l4L?`v%E{+&Xkv*pW$J(SNQ@yKA@skqfcBP@%GXiw?DaoPcwZwm*B^a7Bc(N%Sz z{JMlj{y<}qM92k6E?t4oX$E9;lQV)f5K%<_6Ia}gUF+++lnkUVU923zbMocBukPGA zbpP1#V?)ndYUOm5@V|Kd-9k_IH`Mqa8@;`pdCb(%f>f&+-SVB@!~~R-fr=R+meC<9 z1WPEyFtBZ50g{M;UYytLQ-ancNj`5;aI+K{9*34jQID1 zgU*u&D9clb$VHT&&Ibb^m&dxhS0}XIe#cpUG&gj->L(hx>yo*nN(Q8AARiWeDYCYt zB!6kmsrl)%bG6NZS93HU`k8m{c;&uZ|6}ZGW132{aP}+Nf4e{S=ghKe&}^1i!<0uv7#jxEWq-KDiV_@jjG##t~-s89;irNSMi(aWbm z?gA>vrzoEbh&cF}-RHd3`8f_kVu%5ApL@>pJm)>{Ib|2>>+5I6qb^sZAQH~$nppOY z*qi!TkDwix?5xSWB|}S}qB?YO&Jq(GW@-&_XYzu?!y_P3(I-%$(z{Nw@ni)>lhK-T z99aldZarSgjy;q!pMcHvYS;ACyrPq>O3^_@vAT6iGAIDd`uPr zhe%!@E*%*W)oMOU)@b%Y5qgdsDed>PPJ4YLJ~sI@ zbkiBwX>(PbhSXv=dp^Be{pqoeiAXrwxO;c{dV10cXwYERf3s@+4Sp6PM^k}FsBgGA zG0yPPrS8!NdqY$E5AY&Csr?od!Zs-9v!8W~+&XQJrSE)zM3zOiC++>Dq!a7;fv=wp zos2w*o*pko$|^2y>6w_jdOZ{h)z583NbUlU*N=RC-lm2IFSS51P?q*|q9uhB%p5PP zLmOXpsdQY#aVD5EH=dGPLQ=tB1xPF=YVin>r$FZ>=?{_>NlT~v`p=5hVAU&!4(wwcp9vbD*{g{7s*hdhUll$2!j@6GvqG=GI|B+@Wi=g3m0tEz3VhY~DzEBn!I@aBGAp~Mi47I=9Jsbcaqd%bN`^)&Z2WSWU z+kL(Hex$%tv==^~t-3pUAT1tb84F5#q`P|R)ow-3#8`1`8U!dKS(PNB0XWq&Sgxl#2jP2q9Fyq|OIzD4}OcKK$d`s3@h>v#j;(%X0Ni-cep}gU00z4!CJbTF|L_31sXj5D6Nc&T}5|0f&)MpdfA}W6D0O z6-mnCI!mh8s6TJCg8G&HC-F_INsSfF`L6+xYyMNcw;#vI;6rfvKA9I`Ki7%XxEd;$#)I2jvy7AV{k7 zihGKptKkm^AKGuQgQ8kG+s3E&hyVZ}07*naRF3u0+xw{)AVz&o| zn|}OG&6~wm)E;;nAn8=QN@aSNcB>st53a8V)8e)C3V1KIPIX3}Y*lr%Q1ews%h=Pw zwdId#+*0UYTj5B!vG9KbbgMEj+_3aDh;VPJ+uJZeooRDn74jc|WV&Vb?#5Rhl^RQ6 zN8FOhAiyV>1QT9nxCfEEoTxv3P!VmCtaE&BVBTCh4-;a9%L8>&Xs8NQmkI8j9j03k zeuzMl<=EsaZ=yU3so4ASxmA&o_W(1%wn>N;gUtlb=?0y%4oN|vrd2bSl9HWW2-9Aw zHO)@$uxoE#-^{(`Z@%1~dsIgsfaGzcs%>wtV~ltNOp@19bqLX zz2i$fNv5@KT<9AePAqV0A8ueF@{R_SpHkZ}bA{>OZ5e05k)BvcnwpwLjwh`qSi7Ed zXY`M)c}0z9U7eMcEtM@}Egkne+sc<|0+lngxD^eDbDk_Y5gOj%z>Y@+`KmF`LoZ@v zV8Fg3$QDj;I6&j_{Ls~IA?D@)hR8b*6K)b!Cd7nEufW*B9$Gc!BHnIEl3n{`=q_e3 zOw@NG8(2Bfq|?jn-|ML$tTX9ky(G`ZwqEwK`lug&Hdg1UEMVkCo5=B!h~L6fb<4=J zW)$j+1e2sdY?)IsLF?MmjIKk2_ZNM3#Q4m}^w4V8WLHVf?)C=3;jEutE3X>d>uDJq zCqQd$6k zgQ-@2A5nCy4pqKip^gPP=Qk|vz=cz3*GgRuHs(Aay`Z3E#Y!iMKm^}XVyn|s^I?$q zm*-Vg*b=OuB!SbJ=x7*@2c*tB3?{^f0cKrtKxlE$zA2hysNW3Dwr>W~(C+g--ddRS zcycOoN^<_@WMk&NPr)K>ojpA?wT8y1j$d&Vgd1He?RBSu!Sy8g=6FqQZ{LBpJ{y3P zh3t@8v|f>s2zdQhKmXqQAZ&xd+okhwveug&S+uh(za~!g{-7HAZW^fDr+pIUuyX=vXwQT~@ zlnq+Txm~J?uz+|?^%5~WURtQSfQn!IMH5%v&oW#*_ zE|)<^xC+NMo2 z`RQ3FNMYfZ1=GBjtG{RqZ>_dnsqbc5fmy4b|PrUFj~7x<4)Y!Z0f zO2@P?C)AOM@BlE7!xELPs22#(QQp!~L0$wP+x|qpI_meoe6GeOr{^YTMN#Ahk!+}B zfD4t#t@9k|JcmG+OEWn$-J~;TYf}ml*$-#D_L&vcqG8Lxb8{*xCR=Yh>qeaQJF9CG ztnYz(1n9ydmXaY-M0P8;-w)ZS*i6*)>GopRzM{yoN_Y1)XM)^6td2lEEW^T^NHMx!56tq zQkGm)*_8yU$x47BxA5TIC>7Rqh3Yz9#KT9{CD-ABOFo~Dkwr)JpcbMop<@$r#=2OH zEWIw88*Y0YunvE^G@F~fKl6AthJ@F}iYL$#r^y6m56E~YG}i5MS}gdEvlzgS3bo=? z8|IYxRBC-L>n`%{-*2-WEvv6r(iE~Tb#JcKP9kXS()=7Pe*Wl8q^j@a$0v3-I&PI( zY34bOsI{-7kzH2F@>Q_)294x0K>R~Y*1!KP5vwy!mG>aKy_%7OFrlLcaVxdi^@vrl z=pk73xc_&f4@bglOEm*GS-gt0H?`M1UhZ8aKrRh#DmG=C_R6%h%$J;qez-Q+SF3xG!Q1j5B)fzMgC0X>R)T@lPyy$HpQdSR&D9`XErc&J-Yqh5* z*(A#J1lcfTnmx5keJ4(j{-O22Y9|;{849hcZnXyWlZ5Ctq%foer{@4>bE=eEP)(<1}pH`6z# zUq(iHdj8c=+Yg3NR=D8tW?#+Fl7^P4E#XLUaf#Mbtgg^#19QqFHcva%n-OG7)*@N( z;**)o!l&1w8Ii&kFW8Mgd8bY^^1fI!@^mCaC3z~=Qa?6e)KNE`n T)R|+Fky;@! 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 a^8N}+8d&+lx6K{^0000 **Note:** Chromium browsers gate access to the `read()` method using the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission API. > If prompted, you will need to grant permission in order to paste the image. +### Reading data from the clipboard + +This example uses the `read()` method to read data from the clipboard and log whatever data is stored in the clipboard. + +This differs from the previous version that it will display text, HTML, and image {{domxref("ClipboardItem")}} objects (rather than just images). + +#### HTML + +```html +JPG butterfly image +PNG clock image +
Click here to copy clipboard data.
+ +

+``` + +#### CSS + +```css +img { + height: 100px; + width: 100px; + margin: 0 1rem; + border: 1px solid black; +} + +#destination { + min-height: 300px; + min-width: 90%; + margin: 0 1rem; + border: 1px solid black; +} + +#reload { + display: block; + margin: 0 1rem; +} +``` + +#### JavaScript + +This code provides a mechanism to log any errors to the element with id `log`. + +```js +const logElement = document.querySelector("#log"); +function log(text) { + logElement.innerText = `Error: ${text}`; +} +``` + +We also add code to reload and clear the example when the "Reload" button is pressed. + +```js +const reload = document.querySelector("#reload"); + +reload.addEventListener("click", () => { + window.location.reload(true); +}); +``` + +The remaining code reads the clipboard when the destination element is clicked and displays each {{domxref("ClipboardItem")}} element along with its MIME type. +It logs an error it is unable to use the `read()` method, or if the clipboard contains any other MIME type. + +```js +const destinationDiv = document.querySelector("#destination"); +destinationDiv.addEventListener("click", pasteData); + +async function pasteData() { + destinationDiv.innerText = ""; //Clear inner text + try { + const clipboardContents = await navigator.clipboard.read(); + for (const item of clipboardContents) { + for (const mimeType of item.types) { + const mimeTypeElement = document.createElement("p"); + mimeTypeElement.innerText = `MIME type: ${mimeType}`; + destinationDiv.appendChild(mimeTypeElement); + if (mimeType === "image/png") { + const pngImage = new Image(); // Image constructor + pngImage.src = "image1.png"; + pngImage.alt = "PNG image from clipboard"; + const blob = await item.getType("image/png"); + pngImage.src = URL.createObjectURL(blob); + destinationDiv.appendChild(pngImage); + } else if (mimeType === "text/html") { + const blob = await item.getType("text/html"); + const blobText = await blob.text(); + const clipHTML = document.createElement("pre"); + clipHTML.innerText = blobText; + destinationDiv.appendChild(clipHTML); + } else if (mimeType === "text/plain") { + const blob = await item.getType("text/plain"); + const blobText = await blob.text(); + const clipPlain = document.createElement("pre"); + clipPlain.innerText = blobText; + destinationDiv.appendChild(clipPlain); + } else { + throw new Error(`${mimeType} not supported.`); + } + } + } + } catch (error) { + log(error.message); + } +} +``` + +#### Result + +Copy some text, or the butterfly (JPG) or clock (PNG) images below (to copy images right-click on them and then select "Copy image" from the context menu). +Select the indicted frame below to paste this information from the clipboard into the frame. + +{{EmbedLiveSample("Reading data from the clipboard", "100%", "450")}} + +Notes: + +- Even though the butterfly image is a PNG file, it is copied into the clipboard as a PNG. +- If prompted, you will need to grant permission in order to paste the image. + ## Specifications {{Specifications}} From b8de2c3e5a8cc384c2da373f81e01c8dad3f2503 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 16:16:46 +1100 Subject: [PATCH 20/32] Remove guide on interacting with web extensions --- files/jsondata/GroupData.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/files/jsondata/GroupData.json b/files/jsondata/GroupData.json index 266e166d2aed316..e0145f3f9736c98 100644 --- a/files/jsondata/GroupData.json +++ b/files/jsondata/GroupData.json @@ -142,9 +142,6 @@ }, "Clipboard API": { "overview": ["Clipboard API"], - "guides": [ - "/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard" - ], "interfaces": ["Clipboard", "ClipboardEvent", "ClipboardItem"], "methods": [], "properties": ["Navigator.clipboard"], From 5916b79a9fc191acd7ef5139c5bfdc63a95f5dc4 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 17:57:28 +1100 Subject: [PATCH 21/32] Security requirements --- files/en-us/web/api/clipboard_api/index.md | 43 +++++++++++++++++----- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index c1061a027ffe356..1124686aa5c1648 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -21,15 +21,7 @@ The **Clipboard API** provides the ability to respond to clipboard commands (cut The _system clipboard_ is a data buffer belonging to the operating system hosting the browser, which is used for short-term data storage and/or data transfers between documents or applications. It is usually implemented as an anonymous, temporary [data buffer](https://en.wikipedia.org/wiki/Data_buffer), sometimes called the _paste buffer_, that can be accessed from most or all programs within the environment via defined programming interfaces. -The Clipboard API allows users to programmatically read and write text and other kinds of data to and from the system clipboard in [secure contexts](/en-US/docs/Web/Security/Secure_Contexts), provided the user has recently interacted with the page ([transient user activation](/en-US/docs/Web/Security/User_activation) is required). -Browsers may place additional restrictions over use of the methods to access the clipboard, such as requiring user approval to read or write cross-origin content, or at all! - -Chromium browsers require the `clipboard-read` and `clipboard-write` permissions from the [Permissions API](/en-US/docs/Web/API/Permissions_API) to read from, and write to, the clipboard. -They also do not require transient activation. - -> **Note:** The `clipboard-read` and `clipboard-write` permissions are not supported by Firefox or Safari. -> They have been removed from the [Permissions API](/en-US/docs/Web/API/Permissions_API) specification, but are still referenced in the Clipboard API specification. -> Chromium is expected to remove `clipboard-read` in future but [consensus has not been reached](https://github.com/w3c/clipboard-apis/issues/163) for the removal of `clipboard-write`. +The Clipboard API allows users to programmatically read and write text and other kinds of data to and from the system clipboard in [secure contexts](/en-US/docs/Web/Security/Secure_Contexts), provided the user has met the criteria outlined in the [Security considerations](#security-considerations). Events are fired as the result of {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} operations modifying the clipboard. The events have a default action, for example the `copy` action copies the current selection to the system clipboard by default. @@ -61,6 +53,39 @@ The Clipboard API extends the following APIs, adding the listed features. +## Security considerations + +The Clipboard API allows users to programmatically read and write text and other kinds of data to and from the system clipboard in [secure contexts](/en-US/docs/Web/Security/Secure_Contexts). + +The specification requires that a user has recently interacted with the page in order to read from the clipboard ([transient user activation](/en-US/docs/Web/Security/User_activation) is required). +If the read operation is caused by user interaction with a browser or OS "paste element" (such as a context menu), the browser is expected to pop up a paste prompt for user acknowledgement. +For writing to the clipboard the specification expects that the page has been granted the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-write` permission, and the browser may also require [transient user activation](/en-US/docs/Web/Security/User_activation). +Browsers may place additional restrictions over use of the methods to access the clipboard. + +Browser implementations have diverged from the specification. +The differences are captured in the [Browser compatibility](#browser_compatibility) section and the current state is summarized below: + +Chromium browsers: + +- Reading requires the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission be granted, but transient activation is not required. +- Writing requires either transient activation or the `clipboard-read` permission or transient activation. + If the permission is granted, it persists, and further transient activation is not required. +- The HTTP [Permissions-Policy](/en-US/docs/Web/HTTP/Headers/Permissions-Policy) permissions `clipboard-read` and `clipboard-write` must be allowed for {{HTMLEelement("iframes")}} that read from or write to the clipboard. +- No persistent paste-prompt is displayed when a read operation is caused by a browser or OS "paste element". + +Firefox & Safari: + +- Reading and writing require transient activation. +- The paste-prompt is is suppressed if reading same-origin clipboard content. +- The `clipboard-read` and `clipboard-write` permissions are not supported (and not planned to be supported) by Firefox or Safari. + +Firefox [Web Extensions](/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard): + +- Reading text is only available for extensions with the Web Extension [`clipboardRead`](/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#clipboardread) permission. + With this permission the extension does not require transient activation or a paste prompt. +- Writing text is available in secure context and with transient activation. + With the Web Extension [`clipboardWrite`](/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#clipboardwrite) permission transient activation is not required. + ## Examples ### Accessing the clipboard From 3c6f1f9cc156daee3119b853e56f8083c34528fd Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 18:08:24 +1100 Subject: [PATCH 22/32] Add security considerations to the other methods --- files/en-us/web/api/clipboard/index.md | 5 ++--- files/en-us/web/api/clipboard/read/index.md | 5 +++-- files/en-us/web/api/clipboard/readtext/index.md | 5 +++-- files/en-us/web/api/clipboard/write/index.md | 5 +++-- files/en-us/web/api/clipboard/writetext/index.md | 5 +++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/files/en-us/web/api/clipboard/index.md b/files/en-us/web/api/clipboard/index.md index 675bc57966292fa..e61348045dade72 100644 --- a/files/en-us/web/api/clipboard/index.md +++ b/files/en-us/web/api/clipboard/index.md @@ -17,9 +17,8 @@ The system clipboard is exposed through the global {{domxref("Navigator.clipboar All of the Clipboard API methods operate asynchronously; they return a {{jsxref("Promise")}} which is resolved once the clipboard access has been completed. The promise is rejected if clipboard access is denied. -All the methods require [transient user activation](/en-US/docs/Web/Security/Secure_Contexts) and browsers may additionally require user confirmation for some operations (such as copying cross-origin content). - -> **Note:** Browser extensions access the system clipboard using the [WebExtension `clipboard` API](/en-US/docs/Mozilla/Add-ons/WebExtensions/API/clipboard). +All the methods require a [secure context](/en-US/docs/Web/Security/Secure_Contexts). +Additional requirements for using the API are discussed in the [Security consideration](/en-US/docs/Web/API/Clipboard_API#security_considerations) section of the API overview topic. ## Instance methods diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 6a13ca887fc3686..6d8c5849f65b1d6 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -34,8 +34,9 @@ A {{jsxref("Promise")}} that resolves with an array of {{domxref("ClipboardItem" ## Security considerations -[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. -The user has to interact with the page or a UI element in order for this feature to work. +Reading from the clipboard can only be done in a [secure context](/en-US/docs/Web/Security/Secure_Contexts). + +Additional security requirements are covered in the [Security consideration](/en-US/docs/Web/API/Clipboard_API#security_considerations) section of the API overview topic. ## Examples diff --git a/files/en-us/web/api/clipboard/readtext/index.md b/files/en-us/web/api/clipboard/readtext/index.md index 7377643098f908b..0ecb3b38651282a 100644 --- a/files/en-us/web/api/clipboard/readtext/index.md +++ b/files/en-us/web/api/clipboard/readtext/index.md @@ -38,8 +38,9 @@ Returns an empty string if the clipboard is empty, does not contain text, or doe ## Security considerations -[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. -The user has to interact with the page or a UI element in order for this feature to work. +Reading from the clipboard can only be done in a [secure context](/en-US/docs/Web/Security/Secure_Contexts). + +Additional security requirements are covered in the [Security consideration](/en-US/docs/Web/API/Clipboard_API#security_considerations) section of the API overview topic. ## Examples diff --git a/files/en-us/web/api/clipboard/write/index.md b/files/en-us/web/api/clipboard/write/index.md index 38abb2dbec51fb0..9d4c153aeb153e4 100644 --- a/files/en-us/web/api/clipboard/write/index.md +++ b/files/en-us/web/api/clipboard/write/index.md @@ -37,8 +37,9 @@ The promise is rejected if the clipboard is unable to write the data. ## Security considerations -[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. -The user has to interact with the page or a UI element in order for this feature to work. +Writing to the clipboard can only be done in a [secure context](/en-US/docs/Web/Security/Secure_Contexts). + +Additional security requirements are covered in the [Security consideration](/en-US/docs/Web/API/Clipboard_API#security_considerations) section of the API overview topic. ## Examples diff --git a/files/en-us/web/api/clipboard/writetext/index.md b/files/en-us/web/api/clipboard/writetext/index.md index f22691afe6a22ae..2427501b118bd06 100644 --- a/files/en-us/web/api/clipboard/writetext/index.md +++ b/files/en-us/web/api/clipboard/writetext/index.md @@ -32,8 +32,9 @@ A {{jsxref("Promise")}} that is resolved once the clipboard's contents have been ## Security considerations -[Transient user activation](/en-US/docs/Web/Security/User_activation) is required. -The user has to interact with the page or a UI element in order for this feature to work. +Writing to the clipboard can only be done in a [secure context](/en-US/docs/Web/Security/Secure_Contexts). + +Additional security requirements are covered in the [Security consideration](/en-US/docs/Web/API/Clipboard_API#security_considerations) section of the API overview topic. ## Examples From 274e7e6c263a9d823bc7d396f4c064f607604a5f Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 21:35:55 +1100 Subject: [PATCH 23/32] Fix typos. Update readText --- files/en-us/web/api/clipboard/read/index.md | 3 +-- files/en-us/web/api/clipboard/readtext/index.md | 11 +++++++---- files/en-us/web/api/clipboard_api/index.md | 11 ++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 6d8c5849f65b1d6..3dd70a647e531f4 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -120,8 +120,7 @@ The example will fetch the image data from the clipboard and display the image i {{EmbedLiveSample("Reading image data from clipboard", "100%", "200")}} -> **Note:** Chromium browsers gate access to the `read()` method using the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission API. -> If prompted, you will need to grant permission in order to paste the image. +> **Note:** If prompted, grant permission in order to paste the image. ### Reading data from the clipboard diff --git a/files/en-us/web/api/clipboard/readtext/index.md b/files/en-us/web/api/clipboard/readtext/index.md index 0ecb3b38651282a..14a981fac4051ea 100644 --- a/files/en-us/web/api/clipboard/readtext/index.md +++ b/files/en-us/web/api/clipboard/readtext/index.md @@ -44,12 +44,15 @@ Additional security requirements are covered in the [Security consideration](/en ## Examples -This example retrieves the textual contents of the clipboard and inserts the returned text into an element's contents. +This example retrieves the textual contents of the clipboard and inserts the returned text into a selected element's contents. ```js -navigator.clipboard - .readText() - .then((clipText) => (document.getElementById("outbox").innerText = clipText)); +const destination = document.getElementById("outbox"); +destinationImage.addEventListener("click", () => { + navigator.clipboard + .readText() + .then((clipText) => (destination.innerText = clipText)); +}); ``` ## Specifications diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index 1124686aa5c1648..952706691633056 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -58,7 +58,7 @@ The Clipboard API extends the following APIs, adding the listed features. The Clipboard API allows users to programmatically read and write text and other kinds of data to and from the system clipboard in [secure contexts](/en-US/docs/Web/Security/Secure_Contexts). The specification requires that a user has recently interacted with the page in order to read from the clipboard ([transient user activation](/en-US/docs/Web/Security/User_activation) is required). -If the read operation is caused by user interaction with a browser or OS "paste element" (such as a context menu), the browser is expected to pop up a paste prompt for user acknowledgement. +If the read operation is caused by user interaction with a browser or OS "paste element" (such as a context menu), the browser is expected to prompt the user for acknowledgement. For writing to the clipboard the specification expects that the page has been granted the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-write` permission, and the browser may also require [transient user activation](/en-US/docs/Web/Security/User_activation). Browsers may place additional restrictions over use of the methods to access the clipboard. @@ -67,16 +67,17 @@ The differences are captured in the [Browser compatibility](#browser_compatibili Chromium browsers: -- Reading requires the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission be granted, but transient activation is not required. -- Writing requires either transient activation or the `clipboard-read` permission or transient activation. +- Reading requires the [Permissions API](/en-US/docs/Web/API/Permissions_API) `clipboard-read` permission be granted. + Transient activation is not required. +- Writing requires either the `clipboard-read` permission or transient activation. If the permission is granted, it persists, and further transient activation is not required. -- The HTTP [Permissions-Policy](/en-US/docs/Web/HTTP/Headers/Permissions-Policy) permissions `clipboard-read` and `clipboard-write` must be allowed for {{HTMLEelement("iframes")}} that read from or write to the clipboard. +- The HTTP [Permissions-Policy](/en-US/docs/Web/HTTP/Headers/Permissions-Policy) permissions `clipboard-read` and `clipboard-write` must be allowed for {{HTMLElement("iframe")}} elements that access the clipboard. - No persistent paste-prompt is displayed when a read operation is caused by a browser or OS "paste element". Firefox & Safari: - Reading and writing require transient activation. -- The paste-prompt is is suppressed if reading same-origin clipboard content. +- The paste-prompt is is suppressed if reading same-origin clipboard content, but not cross-origin content. - The `clipboard-read` and `clipboard-write` permissions are not supported (and not planned to be supported) by Firefox or Safari. Firefox [Web Extensions](/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard): From 310dfc1f11c293983c50224b9242747c36d02646 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 22:09:35 +1100 Subject: [PATCH 24/32] Make examples async --- files/en-us/web/api/clipboard/write/index.md | 61 +++++++++---------- .../web/api/clipboard/writetext/index.md | 17 +++--- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/files/en-us/web/api/clipboard/write/index.md b/files/en-us/web/api/clipboard/write/index.md index 9d4c153aeb153e4..8c953f78f4a623b 100644 --- a/files/en-us/web/api/clipboard/write/index.md +++ b/files/en-us/web/api/clipboard/write/index.md @@ -28,7 +28,9 @@ write(data) ### Return value A {{jsxref("Promise")}} which is resolved when the data has been written to the clipboard. -The promise is rejected if the clipboard is unable to write the data. +Note that if the underlying OS does not support multiple native clipboard items on the system clipboard, then only the first {{domxref("ClipboardItem")}} in the array is written. + +The promise is rejected if the clipboard is unable to write to the clipboard. ### Exceptions @@ -43,54 +45,51 @@ Additional security requirements are covered in the [Security consideration](/en ## Examples -This example function replaces the current contents of the clipboard with a specified string. +### Write text to the clipboard + +This example function replaces the current contents of the clipboard with a specified string when a button is pressed. +Note that for this particular case, you could just as readily use `Clipboard.read()`. ```js -function setClipboard(text) { +button.addEventListener("click", setClipboard("")); + +async function setClipboard(text) { const type = "text/plain"; const blob = new Blob([text], { type }); const data = [new ClipboardItem({ [type]: blob })]; - - navigator.clipboard.write(data).then( - () => { - /* success */ - }, - () => { - /* failure */ - }, - ); + await navigator.clipboard.write(data); } ``` -The code begins by creating a new a {{domxref("Blob")}} object. -This object is required to construct a {{domxref("ClipboardItem")}} object which is sent to the clipboard. The {{domxref("Blob")}} constructor takes in the content we want to copy and its type. +The `setClipboard()` method begins by creating a new a {{domxref("Blob")}} object. +This object is required to construct a {{domxref("ClipboardItem")}} object which is sent to the clipboard. +The {{domxref("Blob")}} constructor takes in the content we want to copy and its type. This {{domxref("Blob")}} object can be derived from many sources; for example, a [canvas](/en-US/docs/Web/API/HTMLCanvasElement). Next, we create a new {{domxref("ClipboardItem")}} object into which the blob will be placed for sending to the clipboard. The key of the object passed to the {{domxref("ClipboardItem")}} constructor indicates the content type, the value indicates the content. -Then `write()` is called, specifying both a fulfillment function and an error function. +Then `write()` is called with `await`. +A `try..catch` block could be used to catch any errors writing the data. + +### Write canvas contents to the clipboard -### Example of copying canvas contents to the clipboard +This example writes the canvas to a blob, using the default MIME type of `image/png`, and then writes the blob to the clipboard. ```js -function copyCanvasContentsToClipboard(canvas, onDone, onError) { - canvas.toBlob((blob) => { - let data = [new ClipboardItem({ [blob.type]: blob })]; - - navigator.clipboard.write(data).then( - () => { - onDone(); - }, - (err) => { - onError(err); - }, - ); - }); +// Get canvas can add an event handler for the click event. +const canvas = document.getElementById("canvas"); +canvas.addEventListener("click", copyCanvasContentsToClipboard()); + +async function copyCanvasContentsToClipboard() { + // Copy canvas to blob + const blob = await canvas.toBlob(); + // Create ClipboardItem with blob and it's type, and add to an array + let data = [new ClipboardItem({ [blob.type]: blob })]; + // Write the data to the clipboard + await navigator.clipboard.write(data); } ``` -> **Note:** You can only pass in one clipboard item at a time. - ## Specifications {{Specifications}} diff --git a/files/en-us/web/api/clipboard/writetext/index.md b/files/en-us/web/api/clipboard/writetext/index.md index 2427501b118bd06..be6a8e0dceaad66 100644 --- a/files/en-us/web/api/clipboard/writetext/index.md +++ b/files/en-us/web/api/clipboard/writetext/index.md @@ -41,14 +41,15 @@ Additional security requirements are covered in the [Security consideration](/en This example sets the clipboard's contents to the string "\". ```js -navigator.clipboard.writeText("").then( - () => { - /* clipboard successfully set */ - }, - () => { - /* clipboard write failed */ - }, -); +button.addEventListener("click", writeClipboardText("")); + +async function writeClipboardText(text) { + try { + await navigator.clipboard.writeText(text); + } catch (error) { + console.log(error.message); + } +} ``` ## Specifications From d66a63d5f21042b5bc5be6d4a5f9324fd1886071 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Mon, 8 Jan 2024 22:18:29 +1100 Subject: [PATCH 25/32] Remove that write one at a time comment --- files/en-us/web/api/clipboarditem/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/files/en-us/web/api/clipboarditem/index.md b/files/en-us/web/api/clipboarditem/index.md index 205f5dd1d34054c..bcc9650dc765721 100644 --- a/files/en-us/web/api/clipboarditem/index.md +++ b/files/en-us/web/api/clipboarditem/index.md @@ -13,8 +13,6 @@ The benefit of having the **`ClipboardItem`** interface to represent data, is th > **Note:** To work with text see the {{domxref("Clipboard.readText()")}} and {{domxref("Clipboard.writeText()")}} methods of the {{domxref("Clipboard")}} interface. -> **Note:** You can only pass in one clipboard item at a time. - ## Constructor - {{domxref("ClipboardItem.ClipboardItem", "ClipboardItem()")}} From a4767ae5fb7e4d05512c92ce4350d008be1004ea Mon Sep 17 00:00:00 2001 From: wbamberg Date: Mon, 8 Jan 2024 10:04:33 -0800 Subject: [PATCH 26/32] Update files/en-us/web/api/clipboard_api/index.md --- files/en-us/web/api/clipboard_api/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/clipboard_api/index.md b/files/en-us/web/api/clipboard_api/index.md index 952706691633056..da1999c6c2a1b89 100644 --- a/files/en-us/web/api/clipboard_api/index.md +++ b/files/en-us/web/api/clipboard_api/index.md @@ -21,7 +21,7 @@ The **Clipboard API** provides the ability to respond to clipboard commands (cut The _system clipboard_ is a data buffer belonging to the operating system hosting the browser, which is used for short-term data storage and/or data transfers between documents or applications. It is usually implemented as an anonymous, temporary [data buffer](https://en.wikipedia.org/wiki/Data_buffer), sometimes called the _paste buffer_, that can be accessed from most or all programs within the environment via defined programming interfaces. -The Clipboard API allows users to programmatically read and write text and other kinds of data to and from the system clipboard in [secure contexts](/en-US/docs/Web/Security/Secure_Contexts), provided the user has met the criteria outlined in the [Security considerations](#security-considerations). +The Clipboard API allows users to programmatically read and write text and other kinds of data to and from the system clipboard in [secure contexts](/en-US/docs/Web/Security/Secure_Contexts), provided the user has met the criteria outlined in the [Security considerations](#security_considerations). Events are fired as the result of {{domxref("Element/cut_event", "cut")}}, {{domxref("Element/copy_event", "copy")}}, and {{domxref("Element/paste_event", "paste")}} operations modifying the clipboard. The events have a default action, for example the `copy` action copies the current selection to the system clipboard by default. From c8adb137d4855672f1d62018963b6d82ab4f4bc2 Mon Sep 17 00:00:00 2001 From: wbamberg Date: Mon, 8 Jan 2024 10:25:26 -0800 Subject: [PATCH 27/32] typo --- files/en-us/web/api/clipboard/read/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 3dd70a647e531f4..3425eff1193779b 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -90,7 +90,7 @@ reload.addEventListener("click", () => { ``` The remaining code reads the clipboard when the destination element is clicked and copies the image data into the `destinationImage` element. -It logs an error it is unable to use the `read()` method, or if the clipboard does not contain data in PNG format. +It logs an error if it is unable to use the `read()` method, or if the clipboard does not contain data in PNG format. ```js const destinationImage = document.querySelector("#destination"); From 77e96f5de87d7fd12f6c07d8645554e9de7471df Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Tue, 9 Jan 2024 09:54:11 +1100 Subject: [PATCH 28/32] Apply suggestions from code review Co-authored-by: wbamberg --- files/en-us/web/api/clipboard/read/index.md | 4 ++-- files/en-us/web/api/clipboard/write/index.md | 4 ++-- files/en-us/web/api/clipboard/writetext/index.md | 2 +- files/en-us/web/api/clipboarditem/clipboarditem/index.md | 2 +- files/en-us/web/api/clipboarditem/index.md | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 3425eff1193779b..86eb6566694349c 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -126,7 +126,7 @@ The example will fetch the image data from the clipboard and display the image i This example uses the `read()` method to read data from the clipboard and log whatever data is stored in the clipboard. -This differs from the previous version that it will display text, HTML, and image {{domxref("ClipboardItem")}} objects (rather than just images). +This differs from the previous version in that it will display text, HTML, and image {{domxref("ClipboardItem")}} objects (rather than just images). #### HTML @@ -237,7 +237,7 @@ Select the indicted frame below to paste this information from the clipboard int Notes: -- Even though the butterfly image is a PNG file, it is copied into the clipboard as a PNG. +- Even though the butterfly image is a JPG file, when read from the clipboard it is a PNG. - If prompted, you will need to grant permission in order to paste the image. ## Specifications diff --git a/files/en-us/web/api/clipboard/write/index.md b/files/en-us/web/api/clipboard/write/index.md index 8c953f78f4a623b..c2613a1edd400b1 100644 --- a/files/en-us/web/api/clipboard/write/index.md +++ b/files/en-us/web/api/clipboard/write/index.md @@ -48,7 +48,7 @@ Additional security requirements are covered in the [Security consideration](/en ### Write text to the clipboard This example function replaces the current contents of the clipboard with a specified string when a button is pressed. -Note that for this particular case, you could just as readily use `Clipboard.read()`. +Note that for this particular case, you could just as readily use `Clipboard.writeText()`. ```js button.addEventListener("click", setClipboard("")); @@ -84,7 +84,7 @@ async function copyCanvasContentsToClipboard() { // Copy canvas to blob const blob = await canvas.toBlob(); // Create ClipboardItem with blob and it's type, and add to an array - let data = [new ClipboardItem({ [blob.type]: blob })]; + const data = [new ClipboardItem({ [blob.type]: blob })]; // Write the data to the clipboard await navigator.clipboard.write(data); } diff --git a/files/en-us/web/api/clipboard/writetext/index.md b/files/en-us/web/api/clipboard/writetext/index.md index be6a8e0dceaad66..4b81cd4f897834a 100644 --- a/files/en-us/web/api/clipboard/writetext/index.md +++ b/files/en-us/web/api/clipboard/writetext/index.md @@ -47,7 +47,7 @@ async function writeClipboardText(text) { try { await navigator.clipboard.writeText(text); } catch (error) { - console.log(error.message); + console.error(error.message); } } ``` diff --git a/files/en-us/web/api/clipboarditem/clipboarditem/index.md b/files/en-us/web/api/clipboarditem/clipboarditem/index.md index 1caa56dfa82bc43..23e03b2ec95339e 100644 --- a/files/en-us/web/api/clipboarditem/clipboarditem/index.md +++ b/files/en-us/web/api/clipboarditem/clipboarditem/index.md @@ -34,7 +34,7 @@ new ClipboardItem(data, options) ## Examples -The below example requests a png image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create a new {{domxref("ClipboardItem")}}. +The below example requests a PNG image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create a new {{domxref("ClipboardItem")}}. This item is then written to the clipboard, using the {{domxref("Clipboard.write()")}} method. > **Note:** You can only pass in one clipboard item at a time. diff --git a/files/en-us/web/api/clipboarditem/index.md b/files/en-us/web/api/clipboarditem/index.md index bcc9650dc765721..87a5aec9f08c697 100644 --- a/files/en-us/web/api/clipboarditem/index.md +++ b/files/en-us/web/api/clipboarditem/index.md @@ -38,7 +38,7 @@ _This interface defines the following methods._ ### Writing to the clipboard -Here we're writing a new {{domxref("ClipboardItem.ClipboardItem", "ClipboardItem()")}} to the system clipboard by requesting a PNG image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create the new {{domxref("ClipboardItem")}}. +Here we're writing a new {{domxref("ClipboardItem.ClipboardItem", "ClipboardItem()")}} to the system clipboard by requesting a PNG image using the {{domxref("Fetch API")}}, and in turn, the {{domxref("Response.blob()", "responses' blob()")}} method, to create the new `ClipboardItem`. ```js async function writeClipImg() { From 304937c50ef862e9365ff0372c0f8f3a3b80f53f Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Tue, 9 Jan 2024 09:55:41 +1100 Subject: [PATCH 29/32] Update files/en-us/web/api/clipboard/read/index.md --- files/en-us/web/api/clipboard/read/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 86eb6566694349c..2f5fc9fa1090ab2 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -231,7 +231,7 @@ async function pasteData() { #### Result Copy some text, or the butterfly (JPG) or clock (PNG) images below (to copy images right-click on them and then select "Copy image" from the context menu). -Select the indicted frame below to paste this information from the clipboard into the frame. +Select the indicated frame below to paste this information from the clipboard into the frame. {{EmbedLiveSample("Reading data from the clipboard", "100%", "450")}} From e0d3b01ecd64d70a8ce3337de1f57d7e665ab2f9 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Tue, 9 Jan 2024 10:09:45 +1100 Subject: [PATCH 30/32] Test image source has effect on rendering --- files/en-us/web/api/clipboard/read/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 2f5fc9fa1090ab2..aefe1c0db36b509 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -131,8 +131,8 @@ This differs from the previous version in that it will display text, HTML, and i #### HTML ```html -JPG butterfly image -PNG clock image +JPG butterfly image +PNG clock image
Click here to copy clipboard data.

From 7476556eda3cb642fb026c3b87f564891575f16f Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Tue, 9 Jan 2024 15:08:06 +1100 Subject: [PATCH 31/32] Remove clock (not rendering). Try sample link for chromium --- files/en-us/web/api/clipboard/read/clock.png | Bin 90575 -> 0 bytes files/en-us/web/api/clipboard/read/index.md | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 files/en-us/web/api/clipboard/read/clock.png diff --git a/files/en-us/web/api/clipboard/read/clock.png b/files/en-us/web/api/clipboard/read/clock.png deleted file mode 100644 index 999ad528fe9cbf6c958d6e28aff202d6322146e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90575 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 T)R|+Fky;@! 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 a^8N}+8d&+lx6K{^0000 -PNG clock image
Click here to copy clipboard data.

@@ -230,9 +229,11 @@ async function pasteData() { #### Result -Copy some text, or the butterfly (JPG) or clock (PNG) images below (to copy images right-click on them and then select "Copy image" from the context menu). +Copy some text or the butterfly (JPG) image below (to copy images right-click on them and then select "Copy image" from the context menu). Select the indicated frame below to paste this information from the clipboard into the frame. +> **Note:** On Chromium browsers you will need to {{LiveSampleLink("Reading data from the clipboard","run this example in its own tab")}} (the inline example below is run in a frame, which is not granted the [Permissions-Policy](/en-US/docs/Web/HTTP/Headers/Permissions-Policy) `clipboard-read` and `clipboard-write` permissions [required by Chromium browsers](/en-US/docs/Web/API/Clipboard_API#security_considerations)). + {{EmbedLiveSample("Reading data from the clipboard", "100%", "450")}} Notes: From 657a16899c9336c31d5a1168e70105f2b5617b11 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Tue, 9 Jan 2024 15:20:29 +1100 Subject: [PATCH 32/32] Remove the live sample link --- files/en-us/web/api/clipboard/read/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/files/en-us/web/api/clipboard/read/index.md b/files/en-us/web/api/clipboard/read/index.md index 06d7b16ef39e176..47f1199e1c348d5 100644 --- a/files/en-us/web/api/clipboard/read/index.md +++ b/files/en-us/web/api/clipboard/read/index.md @@ -232,14 +232,13 @@ async function pasteData() { Copy some text or the butterfly (JPG) image below (to copy images right-click on them and then select "Copy image" from the context menu). Select the indicated frame below to paste this information from the clipboard into the frame. -> **Note:** On Chromium browsers you will need to {{LiveSampleLink("Reading data from the clipboard","run this example in its own tab")}} (the inline example below is run in a frame, which is not granted the [Permissions-Policy](/en-US/docs/Web/HTTP/Headers/Permissions-Policy) `clipboard-read` and `clipboard-write` permissions [required by Chromium browsers](/en-US/docs/Web/API/Clipboard_API#security_considerations)). - {{EmbedLiveSample("Reading data from the clipboard", "100%", "450")}} Notes: - Even though the butterfly image is a JPG file, when read from the clipboard it is a PNG. - If prompted, you will need to grant permission in order to paste the image. +- This may not work on chromium browsers as the sample frame is not granted the [Permissions-Policy](/en-US/docs/Web/HTTP/Headers/Permissions-Policy) `clipboard-read` and `clipboard-write` permissions ([required by Chromium browsers](/en-US/docs/Web/API/Clipboard_API#security_considerations)). ## Specifications