-
Notifications
You must be signed in to change notification settings - Fork 22.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Editorial review: Add documentation for Screen Capture extensions, element capture and region capture #36939
Changes from 16 commits
6edd354
3e80b04
bc36f1c
96bc1f5
27e5207
536f60a
5c20d74
2e95813
cb3315e
fc26a2d
24d1675
6f3f1f7
b8dac53
8ad73f5
a419c6d
fa7a504
57dafb6
0ca8d4d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
--- | ||
title: "BrowserCaptureMediaStreamTrack: clone() method" | ||
short-title: clone() | ||
slug: Web/API/BrowserCaptureMediaStreamTrack/clone | ||
page-type: web-api-instance-method | ||
status: | ||
- experimental | ||
browser-compat: api.BrowserCaptureMediaStreamTrack.clone | ||
--- | ||
|
||
{{APIRef("Screen Capture API")}}{{SeeCompatTable}}{{securecontext_header}} | ||
|
||
The **`clone()`** method of the {{domxref("BrowserCaptureMediaStreamTrack")}} interface returns a clone of the original `BrowserCaptureMediaStreamTrack`. | ||
|
||
This method is functionally identical to {{domxref("MediaStreamTrack.clone()")}}, except that it handles cases where cropping or restriction have been applied to the track. The returned clone is identical to the original `BrowserCaptureMediaStreamTrack`, but with any cropping or restriction removed. | ||
|
||
> [!NOTE] | ||
> When attempting to crop a captured stream using {{domxref("BrowserCaptureMediaStreamTrack.cropTo", "cropTo()")}} or restrict it using {{domxref("BrowserCaptureMediaStreamTrack.restrictTo", "restrictTo()")}}, elements will not be cropped or restricted to if the track being captured has clones. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we instead say something like: "If a track has clones, its cropTo() and restrictTo() will reject with an error." I think this is clearer than "elements will not be cropped or restricted to". Also I couldn't see a source for this in the specification. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See https://developer.chrome.com/docs/web-platform/element-capture#restricting and https://developer.chrome.com/docs/web-platform/region-capture#cropping. I don't think it is in the spec, rather it is a current technical limitation they are trying to work around. But I'm not sure if it is helpful to separate this information out as a result. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the info! It's usually our practice to distinguish between restrictions that are intentional per spec and browser bugs, and I think we ought to do that here, too. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK, done! |
||
|
||
## Syntax | ||
|
||
```js-nolint | ||
clone() | ||
``` | ||
|
||
### Parameters | ||
|
||
None. | ||
|
||
### Return value | ||
|
||
A {{domxref("BrowserCaptureMediaStreamTrack")}} instance. | ||
|
||
## Examples | ||
|
||
```js | ||
// Options for getDisplayMedia() | ||
const displayMediaOptions = { | ||
preferCurrentTab: true, | ||
}; | ||
|
||
// Create crop target from DOM element | ||
const demoElem = document.querySelector("#demo"); | ||
const cropTarget = await CropTarget.fromElement(demoElem); | ||
|
||
// Capture video stream from user's webcam and isolate video track | ||
const stream = | ||
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); | ||
chrisdavidmills marked this conversation as resolved.
Show resolved
Hide resolved
|
||
const [track] = stream.getVideoTracks(); | ||
|
||
// Crop video track | ||
await track.cropTo(cropTarget); | ||
|
||
// Create uncropped clone of the track | ||
const clonedTrack = track.clone(); | ||
``` | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) | ||
- [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
--- | ||
title: "BrowserCaptureMediaStreamTrack: cropTo() method" | ||
short-title: cropTo() | ||
slug: Web/API/BrowserCaptureMediaStreamTrack/cropTo | ||
page-type: web-api-instance-method | ||
status: | ||
- experimental | ||
browser-compat: api.BrowserCaptureMediaStreamTrack.cropTo | ||
--- | ||
|
||
{{APIRef("Screen Capture API")}}{{SeeCompatTable}}{{securecontext_header}} | ||
|
||
The **`cropTo()`** method of the {{domxref("BrowserCaptureMediaStreamTrack")}} interface crops a self-capture stream to the area in which a specified DOM element is rendered. | ||
|
||
## Syntax | ||
|
||
```js-nolint | ||
cropTo(cropTarget) | ||
``` | ||
|
||
### Parameters | ||
|
||
- `cropTarget` | ||
- : A {{domxref("CropTarget")}} instance representing the element rendering area the stream should be cropped to, or `null`/`undefined`, in which case any previously-set cropping is removed from the track. | ||
chrisdavidmills marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Return value | ||
|
||
A {{jsxref("Promise")}} that resolves to {{jsxref("undefined")}}. | ||
|
||
The promise will reject if: | ||
|
||
- The track [`kind`](/en-US/docs/Web/API/MediaStreamTrack/kind) is not `"video"`, or its [`readyState`](/en-US/docs/Web/API/MediaStreamTrack/readyState) is not `"live"`. | ||
- The crop target element no longer exists. | ||
- The track being cropped has clones or is not a track captured from the user's screen. | ||
- `CropTarget` is not a {{domxref("CropTarget")}} instance, `null`, or `undefined`. | ||
- `CropTarget` was created in a tab other than the one being captured. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same question as in the guide page, how is this possible? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same as other page; deleted! |
||
|
||
## Examples | ||
|
||
### Basic cropping example | ||
|
||
```js | ||
// Options for getDisplayMedia() | ||
const displayMediaOptions = { | ||
preferCurrentTab: true, | ||
}; | ||
|
||
// Create crop target from DOM element | ||
const demoElem = document.querySelector("#demo"); | ||
const cropTarget = await CropTarget.fromElement(demoElem); | ||
|
||
// Capture video stream from user's webcam and isolate video track | ||
const stream = | ||
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); | ||
const [track] = stream.getVideoTracks(); | ||
|
||
// Crop video track | ||
await track.cropTo(cropTarget); | ||
|
||
// Broadcast cropped stream in <video> element | ||
videoElem.srcObject = stream; | ||
``` | ||
|
||
See [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) for in-context example code. | ||
|
||
### Stopping the cropping | ||
|
||
You can stop the cropping by making a call to `cropTo()` on a previously-cropped track, passing an argument of `null` to it: | ||
|
||
```js | ||
// Stop cropping | ||
await track.cropTo(null); | ||
``` | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) | ||
- [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
--- | ||
title: BrowserCaptureMediaStreamTrack | ||
slug: Web/API/BrowserCaptureMediaStreamTrack | ||
page-type: web-api-interface | ||
status: | ||
- experimental | ||
browser-compat: api.BrowserCaptureMediaStreamTrack | ||
--- | ||
|
||
{{APIRef("Screen Capture API")}}{{SeeCompatTable}} | ||
|
||
The **`BrowserCaptureMediaStreamTrack`** interface of the {{domxref("Screen Capture API", "Screen Capture API", "", "nocode")}} represents a single video track. It extends the {{domxref("MediaStreamTrack")}} class with methods to limit the part of a self-capture stream (for example, a user's screen or window) that is captured. | ||
|
||
{{InheritanceDiagram}} | ||
|
||
## Instance methods | ||
|
||
- {{domxref("BrowserCaptureMediaStreamTrack.clone", "clone()")}} {{Experimental_Inline}} | ||
- : Returns an uncropped, unrestricted clone of the original `BrowserCaptureMediaStreamTrack`. | ||
- {{domxref("BrowserCaptureMediaStreamTrack.cropTo", "cropTo()")}} {{Experimental_Inline}} | ||
- : Crops a self-capture stream to the area in which a specified DOM element is rendered. | ||
- {{domxref("BrowserCaptureMediaStreamTrack.restrictTo", "restrictTo()")}} {{Experimental_Inline}} | ||
- : Restricts a self-capture stream to a specific DOM element. | ||
|
||
## Examples | ||
|
||
See [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) for in-context example code. | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) | ||
- [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
--- | ||
title: "BrowserCaptureMediaStreamTrack: restrictTo() method" | ||
short-title: restrictTo() | ||
slug: Web/API/BrowserCaptureMediaStreamTrack/restrictTo | ||
page-type: web-api-instance-method | ||
browser-compat: api.BrowserCaptureMediaStreamTrack.restrictTo | ||
--- | ||
|
||
{{APIRef("Screen Capture API")}}{{SeeCompatTable}}{{securecontext_header}} | ||
|
||
The **`restrictTo()`** method of the {{domxref("BrowserCaptureMediaStreamTrack")}} interface restricts a self-capture stream to a specific DOM element (and its descendants). | ||
|
||
## Syntax | ||
|
||
```js-nolint | ||
restrictTo(restrictionTarget) | ||
``` | ||
|
||
### Parameters | ||
|
||
- `restrictionTarget` | ||
- : A {{domxref("RestrictionTarget")}} instance representing the element the stream should be restricted to, or `null`/`undefined`, in which case any previously-set restriction is removed from the track. | ||
chrisdavidmills marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Return value | ||
|
||
A {{jsxref("Promise")}} that resolves to {{jsxref("undefined")}}. | ||
|
||
The promise will reject if: | ||
|
||
- The track [`kind`](/en-US/docs/Web/API/MediaStreamTrack/kind) is not `"video"`, or its [`readyState`](/en-US/docs/Web/API/MediaStreamTrack/readyState) is not `"live"`. | ||
- The restriction target element no longer exists. | ||
- The track being restricted has clones or is not a track captured from the user's screen. | ||
- `RestrictionTarget` is not a {{domxref("RestrictionTarget")}} instance, `null`, or `undefined`. | ||
- `RestrictionTarget` was created in a tab other than the one being captured. | ||
|
||
## Examples | ||
|
||
### Basic restriction example | ||
|
||
```js | ||
// Options for getDisplayMedia() | ||
const displayMediaOptions = { | ||
preferCurrentTab: true, | ||
}; | ||
|
||
// Create restriction target from DOM element | ||
const demoElem = document.querySelector("#demo"); | ||
const restrictionTarget = await RestrictionTarget.fromElement(demoElem); | ||
|
||
// Capture video stream from user's webcam and isolate video track | ||
const stream = | ||
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); | ||
const [track] = stream.getVideoTracks(); | ||
|
||
// Restrict video track | ||
await track.restrictTo(restrictionTarget); | ||
|
||
// Broadcast restricted stream in <video> element | ||
videoElem.srcObject = stream; | ||
``` | ||
|
||
See [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) for in-context example code. | ||
|
||
### Stopping the restriction | ||
|
||
You can stop the restriction by making a call to `restrictTo()` on the same track, passing an argument of `null` to it: | ||
|
||
```js | ||
// Stop restricting | ||
await track.restrictTo(null); | ||
``` | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) | ||
- [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
--- | ||
title: "CropTarget: fromElement() static method" | ||
short-title: fromElement() | ||
slug: Web/API/CropTarget/fromElement_static | ||
page-type: web-api-static-method | ||
browser-compat: api.CropTarget.fromElement_static | ||
--- | ||
|
||
{{APIRef("Screen Capture API")}}{{SeeCompatTable}}{{securecontext_header}} | ||
|
||
The **`fromElement()`** static method of the {{domxref("CropTarget")}} interface returns a `CropTarget` instance that can be used to crop a captured video track to the area in which a specified element is rendered. | ||
|
||
## Syntax | ||
|
||
```js-nolint | ||
CropTarget.fromElement(element) | ||
``` | ||
|
||
### Parameters | ||
|
||
- `element` | ||
- : A reference to an {{domxref("Element")}} that you want to use as a crop target. | ||
|
||
### Return value | ||
|
||
A {{jsxref("Promise")}} that resolves to a {{domxref("CropTarget")}} object instance, which can then be passed to {{domxref("BrowserCaptureMediaStreamTrack.CropTo()")}} to crop the video captured in the track to just the area the specified DOM element is rendered in. | ||
|
||
`CropTarget` objects are serializable. They can be passed to another document using {{domxref("Window.postMessage()")}}, for example. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh I suppose that's how it would be possible to get one from another tab! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Dammmnit. I've added those details back in on the reference pages. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, sorry about this! But please see also #36939 (comment). |
||
|
||
## Examples | ||
|
||
```js | ||
// Options for getDisplayMedia() | ||
const displayMediaOptions = { | ||
preferCurrentTab: true, | ||
}; | ||
|
||
// Create crop target from DOM element | ||
const demoElem = document.querySelector("#demo"); | ||
const cropTarget = await CropTarget.fromElement(demoElem); | ||
|
||
// Capture video stream from user's webcam and isolate video track | ||
const stream = | ||
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); | ||
const [track] = stream.getVideoTracks(); | ||
|
||
// Crop video track | ||
await track.cropTo(cropTarget); | ||
|
||
// Broadcast cropped stream in <video> element | ||
videoElem.srcObject = stream; | ||
``` | ||
|
||
See [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) for in-context example code. | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) | ||
- [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_API/Element_Region_Capture) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The guide page says:
Is there anything we should capture in this API page about that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note added