- From: Domenic Denicola <notifications@github.com>
- Date: Thu, 04 Nov 2021 08:58:38 -0700
- To: w3c/clipboard-apis <clipboard-apis@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/clipboard-apis/pull/158/review/797927619@github.com>
@domenic commented on this pull request.
We need to straighten out the relationship between the JS/IDL `ClipboardItem` and the "conceptual" clipboard item as a first step; it's making it hard to understand the intent of much of the rest of the text.
> <pre class="idl" data-highlight="webidl">
- typedef sequence<ClipboardItem> ClipboardItems;
+ typedef (DOMString or Blob) ClipboardItemDataType;
In the output, the indentation for this IDL block is all messy; see https://pr-preview.s3.amazonaws.com/w3c/clipboard-apis/pull/158.html#clipboard-item-interface.
I'd expect:
- Indenting stuff inside braces
- Lining up parameter declarations when a definition is split over multiple lines.
- Newline after `[SecureContext, Exposed=Window]`
> + Making the range of cells available as an image will allow the user to paste the cells into Photoshop, while the text/plain format can be used by applications like Windows Notepad.
+
+ Apps that support pasting only a single [=ClipboardItem=] should use the first [=ClipboardItem=].
+ Apps that support pasting more than one [=ClipboardItem=] could, for example, provide a user interface that previews the contents of each [=ClipboardItem=] and allow the user to choose which one to paste.
+ Further, apps are expected to enumerate the mime-types of the [=ClipboardItem=] they are pasting and select the one best-suited for the app according to some app-specific algorithm.
+ Alternatively, an app can present the user with options on how to paste a [=ClipboardItem=], e.g. “paste as image” or “paste formatted text”, etc.
+
+ A [=ClipboardItem=] contains multiple representations. Each representation consists of a MIME type and a corresponding {{DOMString}} or [=Blob=].
+
+ <dl class=note>
+ <dt><code><var>clipboardItem</var> = new ClipboardItem([<var>items</var>, <var>options</var>])</code>
+ <dd>
+ Creates a new [=ClipboardItem=] object. <var>items</var> are used to fill its MIME types and [=Promise=]s to [=Blob=]s corresponding to the MIME types, <var>options</var> can be used to fill its {{ClipboardItemOptions}},
+ as per the example below.
+
+ <pre class="example javascript">
Syntax highlighting doesn't appear to be working in the output at https://pr-preview.s3.amazonaws.com/w3c/clipboard-apis/pull/158.html#clipboard-item-interface ; I'm not sure why though as I'm not familiar with ReSpec.
>
- dictionary ClipboardItemOptions {
- PresentationStyle presentationStyle = "unspecified";
+ </dl>
+ <p>
+ The <a constructor lt="ClipboardItem()">ClipboardItem</a> step for <code>new ClipboardItem(<var>items</var>, <var>options</var>)</code> is to set [=this=]'s items to <var>items</var> and options to <var>options</var>
```suggestion
The constructor steps for <code>new ClipboardItem(<var>items</var>, <var>options</var>)</code> are to set [=this=]'s items to <var>items</var> and options to <var>options</var>.
```
Also I think you need to mark this up as defining the constructor but I'm not sure how to do that in ReSpec.
>
- dictionary ClipboardItemOptions {
- PresentationStyle presentationStyle = "unspecified";
+ </dl>
+ <p>
+ The <a constructor lt="ClipboardItem()">ClipboardItem</a> step for <code>new ClipboardItem(<var>items</var>, <var>options</var>)</code> is to set [=this=]'s items to <var>items</var> and options to <var>options</var>
+ </p>
+
+ <h4 attribute for=ClipboardItem lt=presentationStyle>presentationStyle</h4>
+ <p>It is an <a href=https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#enumerated-attribute>enumerated attribute</a> whose keywords are the <code>string</code>, <code>unspecified</code>, <code>inline</code> and <code>attachment</code>.
enumerated attribute only applies to content attributes, i.e. attributes of HTML elements.
IDL attributes need to be defined with getter/setter steps. I think you can just delete this sentence.
> - dictionary ClipboardItemOptions {
- PresentationStyle presentationStyle = "unspecified";
+ </dl>
+ <p>
+ The <a constructor lt="ClipboardItem()">ClipboardItem</a> step for <code>new ClipboardItem(<var>items</var>, <var>options</var>)</code> is to set [=this=]'s items to <var>items</var> and options to <var>options</var>
+ </p>
+
+ <h4 attribute for=ClipboardItem lt=presentationStyle>presentationStyle</h4>
+ <p>It is an <a href=https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#enumerated-attribute>enumerated attribute</a> whose keywords are the <code>string</code>, <code>unspecified</code>, <code>inline</code> and <code>attachment</code>.
+
+ Note: {{ClipboardItem/presentationStyle}} helps distinguish between "inline" data(e.g. selecting text on a web page and copying), vs. file-like data (e.g. copying a plain text file).
+ This difference is used to provide a hint when writing to the system pasteboard on iOS/iPadOS. This allows apps like Notes to insert a file attachment when copying a plain text file from the Files app, but insert text inline when
+ copying a selected piece of plain text from another app. In both cases, the MIME type in the pasteboard would be text/plain. This is used for both reading and writing.
+ </p>
+
+ <p>{{ClipboardItem/presentationStyle}} getter steps are to return [=this=]'s {{ClipboardItem/presentationStyle}}</p>
This definition is circular; it is returning itself.
You need to instead define an associated concept, and have the getter return that. E.g.
```html
Each {{ClipboardItem}} has a <dfn for="ClipboardItem">presentation style</dfn>, which is a {{PresentationStyle}}.
The <dfn attribute for="ClipboardItem">presentationStyle</dfn> getter steps are to return [=this=]'s [=ClipboardItem/presentation style=].
```
Then, somewhere else in the spec, you need to set a given ClipboardItem's `[=ClipboardItem/presentation style=]`.
>
- readonly attribute FrozenArray<DOMString> types;
+ dictionary ClipboardItemOptions {
+ PresentationStyle presentationStyle = "unspecified";
+ };
+ </pre>
+ <p><dfn export for=ClipboardItem id=concept-clipboard-item>ClipboardItem</dfn></p>
+ A [=ClipboardItem=] is conceptually data that the user has expressed a desire to make shareable by invoking a "cut" or "copy" command.
So you seem to have introduced a separate "conceptual" `[=ClipboardItem=]`, which is not the same as a `{{ClipboardItem}}` IDL/JavaScript object. (Note: normally we would give these "conceptual" items names like "clipboard item", not "ClipboardItem".)
That can work, but you need to be explicit about the relationship. E.g., does each `{{ClipboardItem}}` have a `[=ClipboardItem=]` (which you might call `the {{ClipboardItem}}'s [=ClipboardItem/clipboard item=]?). That is what is done for things like `Response`'s response in https://fetch.spec.whatwg.org/#concept-response-response . Then you have to be very clear about what acts on the conceptual clipboard item, and what acts on the `{{ClipboardItem}}` object. E.g. below I suggest associating a "presentation style" with a `{{ClipboardItem}}`. But maybe it should instead be associated with the conceptual clipboard item, if it's something the OS cares about? Then the getter steps would do something like `Return [=this=]'s [=ClipboardItem/clipboard item=]'s [=clipboard item/presentation style=]`.
Or, you could try to directly store information on the `{{ClipboardItem}}` object. That is probably the more common approach, but it might get confusing when talking about the OS integration, since I assume operating systems don't directly deal with IDL/JS objects.
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/clipboard-apis/pull/158#pullrequestreview-797927619
Received on Thursday, 4 November 2021 15:58:52 UTC