diff options
author | Josh Matthews <josh@joshmatthews.net> | 2020-07-14 12:06:46 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2020-07-14 12:48:45 -0400 |
commit | 1ae117f67b63c0ce574b595a26cbad9fe309639d (patch) | |
tree | 4e1c9c3f8257f3d37497601b79b4a3076143c1a6 | |
parent | 9fe92ecb4c35747fd58b13f6ae23eb0f31a14680 (diff) | |
download | servo-1ae117f67b63c0ce574b595a26cbad9fe309639d.tar.gz servo-1ae117f67b63c0ce574b595a26cbad9fe309639d.zip |
dom: Add stub implementation for HTMLCanvasElement.captureStream.
-rw-r--r-- | components/config/prefs.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmlcanvaselement.rs | 15 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLCanvasElement.webidl | 5 | ||||
-rw-r--r-- | resources/prefs.json | 1 |
4 files changed, 24 insertions, 0 deletions
diff --git a/components/config/prefs.rs b/components/config/prefs.rs index bf78d8d584d..a3302e1f597 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -133,6 +133,9 @@ mod gen { enabled: bool, } }, + canvas_capture: { + enabled: bool, + }, canvas_text: { enabled: bool, }, diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 4b7d54b323d..c9060c7d8f3 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -7,10 +7,12 @@ use crate::dom::bindings::cell::{ref_filter_map, DomRefCell, Ref}; use crate::dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::{ HTMLCanvasElementMethods, RenderingContext, }; +use crate::dom::bindings::codegen::Bindings::MediaStreamBinding::MediaStreamMethods; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; use crate::dom::bindings::conversions::ConversionResult; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::num::Finite; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom}; use crate::dom::bindings::str::{DOMString, USVString}; @@ -22,6 +24,8 @@ use crate::dom::element::{AttributeMutation, Element, LayoutElementHelpers}; use crate::dom::globalscope::GlobalScope; use crate::dom::gpucanvascontext::GPUCanvasContext; use crate::dom::htmlelement::HTMLElement; +use crate::dom::mediastream::MediaStream; +use crate::dom::mediastreamtrack::MediaStreamTrack; use crate::dom::node::{window_from_node, Node}; use crate::dom::virtualmethods::VirtualMethods; use crate::dom::webgl2renderingcontext::WebGL2RenderingContext; @@ -41,6 +45,8 @@ use js::rust::HandleValue; use profile_traits::ipc; use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource}; use script_traits::ScriptMsg; +use servo_media::streams::registry::MediaStreamId; +use servo_media::streams::MediaStreamType; use style::attr::{AttrValue, LengthOrPercentageOrAuto}; const DEFAULT_WIDTH: u32 = 300; @@ -429,6 +435,15 @@ impl HTMLCanvasElementMethods for HTMLCanvasElement { base64::encode_config_buf(&png, base64::STANDARD, &mut url); Ok(USVString(url)) } + + /// https://w3c.github.io/mediacapture-fromelement/#dom-htmlcanvaselement-capturestream + fn CaptureStream(&self, _frame_request_rate: Option<Finite<f64>>) -> DomRoot<MediaStream> { + let global = self.global(); + let stream = MediaStream::new(&*global); + let track = MediaStreamTrack::new(&*global, MediaStreamId::new(), MediaStreamType::Video); + stream.AddTrack(&track); + stream + } } impl VirtualMethods for HTMLCanvasElement { diff --git a/components/script/dom/webidls/HTMLCanvasElement.webidl b/components/script/dom/webidls/HTMLCanvasElement.webidl index 650357a905e..5c33aa3532e 100644 --- a/components/script/dom/webidls/HTMLCanvasElement.webidl +++ b/components/script/dom/webidls/HTMLCanvasElement.webidl @@ -23,4 +23,9 @@ interface HTMLCanvasElement : HTMLElement { //OffscreenCanvas transferControlToOffscreen(); }; +partial interface HTMLCanvasElement { + [Pref="dom.canvas_capture.enabled"] + MediaStream captureStream (optional double frameRequestRate); +}; + //callback BlobCallback = void (Blob? blob); diff --git a/resources/prefs.json b/resources/prefs.json index 0b219f7966a..04ecb8f89b7 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -1,6 +1,7 @@ { "dom.bluetooth.enabled": false, "dom.bluetooth.testing.enabled": false, + "dom.canvas_capture.enabled": false, "dom.canvas_text.enabled": true, "dom.compositionevent.enabled": false, "dom.customelements.enabled": true, |