diff options
author | Daniel Adams <70986246+msub2@users.noreply.github.com> | 2024-09-22 11:55:31 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-22 11:55:31 +0000 |
commit | 3a0d27b2312c6396e85178615290ac2ec3592ce1 (patch) | |
tree | 176d477ddbcda90e0c1ed1041868b67b28f92fbf /components/script/dom | |
parent | 8276673bae999c3e74d71c81ca84842ed1365c89 (diff) | |
download | servo-3a0d27b2312c6396e85178615290ac2ec3592ce1.tar.gz servo-3a0d27b2312c6396e85178615290ac2ec3592ce1.zip |
webgl: Update IDL exposed members (#33509)
* Update IDLs to expose on Workers
Signed-off-by: Daniel Adams <msub2official@gmail.com>
* Update usage of Canvas/OffscreenCanvas union, add label
Signed-off-by: Daniel Adams <msub2official@gmail.com>
* Update WPT expectations
Signed-off-by: Daniel Adams <msub2official@gmail.com>
* Fix match arm
Signed-off-by: Daniel Adams <msub2official@gmail.com>
* Add missing spec links
Signed-off-by: Daniel Adams <msub2official@gmail.com>
* Update expectations
Signed-off-by: Daniel Adams <msub2official@gmail.com>
* Update interfaces.worker.js
Signed-off-by: Daniel Adams <msub2official@gmail.com>
---------
Signed-off-by: Daniel Adams <msub2official@gmail.com>
Diffstat (limited to 'components/script/dom')
16 files changed, 101 insertions, 41 deletions
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 00f53fef782..f58acb028ee 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -26,6 +26,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::{ }; use crate::dom::bindings::codegen::Bindings::MediaStreamBinding::MediaStreamMethods; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; +use crate::dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrOffscreenCanvas; use crate::dom::bindings::conversions::ConversionResult; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; @@ -206,7 +207,9 @@ impl HTMLCanvasElement { let window = window_from_node(self); let size = self.get_size(); let attrs = Self::get_gl_attributes(cx, options)?; - let context = WebGLRenderingContext::new(&window, self, WebGLVersion::WebGL1, size, attrs)?; + let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self)); + let context = + WebGLRenderingContext::new(&window, &canvas, WebGLVersion::WebGL1, size, attrs)?; *self.context.borrow_mut() = Some(CanvasContext::WebGL(Dom::from_ref(&*context))); Some(context) } @@ -229,7 +232,8 @@ impl HTMLCanvasElement { let window = window_from_node(self); let size = self.get_size(); let attrs = Self::get_gl_attributes(cx, options)?; - let context = WebGL2RenderingContext::new(&window, self, size, attrs)?; + let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self)); + let context = WebGL2RenderingContext::new(&window, &canvas, size, attrs)?; *self.context.borrow_mut() = Some(CanvasContext::WebGL2(Dom::from_ref(&*context))); Some(context) } diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index eb608afe946..b2e7874567f 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -34,6 +34,7 @@ use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{ }; use crate::dom::bindings::codegen::UnionTypes::{ ArrayBufferViewOrArrayBuffer, Float32ArrayOrUnrestrictedFloatSequence, + HTMLCanvasElementOrOffscreenCanvas, ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, Int32ArrayOrLongSequence, Uint32ArrayOrUnsignedLongSequence, }; @@ -42,7 +43,7 @@ use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; -use crate::dom::htmlcanvaselement::{HTMLCanvasElement, LayoutCanvasRenderingContextHelpers}; +use crate::dom::htmlcanvaselement::LayoutCanvasRenderingContextHelpers; use crate::dom::promise::Promise; use crate::dom::webgl_validations::tex_image_2d::{ TexImage2DValidator, TexImage2DValidatorResult, TexStorageValidator, TexStorageValidatorResult, @@ -139,7 +140,7 @@ struct ReadPixelsSizes { impl WebGL2RenderingContext { fn new_inherited( window: &Window, - canvas: &HTMLCanvasElement, + canvas: &HTMLCanvasElementOrOffscreenCanvas, size: Size2D<u32>, attrs: GLContextAttributes, ) -> Option<WebGL2RenderingContext> { @@ -186,7 +187,7 @@ impl WebGL2RenderingContext { #[allow(crown::unrooted_must_root)] pub fn new( window: &Window, - canvas: &HTMLCanvasElement, + canvas: &HTMLCanvasElementOrOffscreenCanvas, size: Size2D<u32>, attrs: GLContextAttributes, ) -> Option<DomRoot<WebGL2RenderingContext>> { @@ -902,7 +903,7 @@ impl WebGL2RenderingContext { impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// <https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1> - fn Canvas(&self) -> DomRoot<HTMLCanvasElement> { + fn Canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas { self.base.Canvas() } diff --git a/components/script/dom/webglobject.rs b/components/script/dom/webglobject.rs index fd6fe082c08..919bfc5cda7 100644 --- a/components/script/dom/webglobject.rs +++ b/components/script/dom/webglobject.rs @@ -5,14 +5,18 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use dom_struct::dom_struct; +use crate::dom::bindings::cell::DomRefCell; +use crate::dom::bindings::codegen::Bindings::WebGLObjectBinding::WebGLObjectMethods; use crate::dom::bindings::reflector::Reflector; use crate::dom::bindings::root::Dom; +use crate::dom::bindings::str::USVString; use crate::dom::webglrenderingcontext::WebGLRenderingContext; #[dom_struct] pub struct WebGLObject { reflector_: Reflector, context: Dom<WebGLRenderingContext>, + label: DomRefCell<USVString>, } impl WebGLObject { @@ -20,6 +24,7 @@ impl WebGLObject { WebGLObject { reflector_: Reflector::new(), context: Dom::from_ref(context), + label: DomRefCell::new(USVString::default()), } } @@ -27,3 +32,15 @@ impl WebGLObject { &self.context } } + +impl WebGLObjectMethods for WebGLObject { + /// <https://registry.khronos.org/webgl/specs/latest/1.0/#5.3> + fn Label(&self) -> USVString { + self.label.borrow().clone() + } + + /// <https://registry.khronos.org/webgl/specs/latest/1.0/#5.3> + fn SetLabel(&self, value: USVString) { + *self.label.borrow_mut() = value; + } +} diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 5af828fe628..19175cdeb5c 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -48,19 +48,18 @@ use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{ WebGLRenderingContextMethods, }; use crate::dom::bindings::codegen::UnionTypes::{ - ArrayBufferViewOrArrayBuffer, Float32ArrayOrUnrestrictedFloatSequence, Int32ArrayOrLongSequence, + ArrayBufferViewOrArrayBuffer, Float32ArrayOrUnrestrictedFloatSequence, + HTMLCanvasElementOrOffscreenCanvas, Int32ArrayOrLongSequence, }; use crate::dom::bindings::conversions::{DerivedFrom, ToJSValConvertible}; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; -use crate::dom::bindings::root::{Dom, DomOnceCell, DomRoot, LayoutDom, MutNullableDom}; +use crate::dom::bindings::root::{DomOnceCell, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::element::cors_setting_for_element; use crate::dom::event::{Event, EventBubbles, EventCancelable}; -use crate::dom::htmlcanvaselement::{ - utils as canvas_utils, HTMLCanvasElement, LayoutCanvasRenderingContextHelpers, -}; +use crate::dom::htmlcanvaselement::{utils as canvas_utils, LayoutCanvasRenderingContextHelpers}; use crate::dom::node::{document_from_node, window_from_node, Node, NodeDamage}; use crate::dom::promise::Promise; use crate::dom::vertexarrayobject::VertexAttribData; @@ -182,7 +181,7 @@ pub struct WebGLRenderingContext { #[ignore_malloc_size_of = "Defined in surfman"] #[no_trace] limits: GLLimits, - canvas: Dom<HTMLCanvasElement>, + canvas: HTMLCanvasElementOrOffscreenCanvas, #[ignore_malloc_size_of = "Defined in canvas_traits"] #[no_trace] last_error: Cell<Option<WebGLError>>, @@ -218,7 +217,7 @@ pub struct WebGLRenderingContext { impl WebGLRenderingContext { pub fn new_inherited( window: &Window, - canvas: &HTMLCanvasElement, + canvas: &HTMLCanvasElementOrOffscreenCanvas, webgl_version: WebGLVersion, size: Size2D<u32>, attrs: GLContextAttributes, @@ -248,7 +247,7 @@ impl WebGLRenderingContext { webgl_version, glsl_version: ctx_data.glsl_version, limits: ctx_data.limits, - canvas: Dom::from_ref(canvas), + canvas: canvas.clone(), last_error: Cell::new(None), texture_packing_alignment: Cell::new(4), texture_unpacking_settings: Cell::new(TextureUnpacking::CONVERT_COLORSPACE), @@ -285,7 +284,7 @@ impl WebGLRenderingContext { #[allow(crown::unrooted_must_root)] pub fn new( window: &Window, - canvas: &HTMLCanvasElement, + canvas: &HTMLCanvasElementOrOffscreenCanvas, webgl_version: WebGLVersion, size: Size2D<u32>, attrs: GLContextAttributes, @@ -301,7 +300,14 @@ impl WebGLRenderingContext { EventCancelable::Cancelable, DOMString::from(msg), ); - event.upcast::<Event>().fire(canvas.upcast()); + match canvas { + HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(canvas) => { + event.upcast::<Event>().fire(canvas.upcast()); + }, + HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(canvas) => { + event.upcast::<Event>().fire(canvas.upcast()); + }, + } None }, } @@ -395,7 +401,12 @@ impl WebGLRenderingContext { } pub fn onscreen(&self) -> bool { - self.canvas.upcast::<Node>().is_connected() + match self.canvas { + HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => { + canvas.upcast::<Node>().is_connected() + }, + HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => false, + } } #[inline] @@ -535,12 +546,14 @@ impl WebGLRenderingContext { return; } - self.canvas - .upcast::<Node>() - .dirty(NodeDamage::OtherNodeDamage); - - let document = document_from_node(&*self.canvas); - document.add_dirty_webgl_canvas(self); + match self.canvas { + HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => { + canvas.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); + let document = document_from_node(&**canvas); + document.add_dirty_webgl_canvas(self); + }, + HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => {}, + } } fn vertex_attrib(&self, indx: u32, x: f32, y: f32, z: f32, w: f32) { @@ -648,7 +661,15 @@ impl WebGLRenderingContext { false, ), TexImageSource::HTMLImageElement(image) => { - let document = document_from_node(&*self.canvas); + let document = match self.canvas { + HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => { + document_from_node(&**canvas) + }, + HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(ref canvas) => { + // TODO: Support retrieving image pixels here for OffscreenCanvas + return Ok(None); + }, + }; if !image.same_origin(document.origin()) { return Err(Error::Security); } @@ -658,7 +679,13 @@ impl WebGLRenderingContext { None => return Ok(None), }; - let window = window_from_node(&*self.canvas); + let window = match self.canvas { + HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => { + window_from_node(&**canvas) + }, + // This is marked as unreachable as we should have returned already + HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => unreachable!(), + }; let cors_setting = cors_setting_for_element(image.upcast()); let img = @@ -1959,8 +1986,8 @@ impl Drop for WebGLRenderingContext { impl WebGLRenderingContextMethods for WebGLRenderingContext { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1 - fn Canvas(&self) -> DomRoot<HTMLCanvasElement> { - DomRoot::from_ref(&*self.canvas) + fn Canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas { + self.canvas.clone() } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 diff --git a/components/script/dom/webidls/WebGLActiveInfo.webidl b/components/script/dom/webidls/WebGLActiveInfo.webidl index 42e703db088..eedfd8c35b3 100644 --- a/components/script/dom/webidls/WebGLActiveInfo.webidl +++ b/components/script/dom/webidls/WebGLActiveInfo.webidl @@ -6,7 +6,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.7 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLActiveInfo { readonly attribute GLint size; readonly attribute GLenum type; diff --git a/components/script/dom/webidls/WebGLBuffer.webidl b/components/script/dom/webidls/WebGLBuffer.webidl index c182be1415d..a8ad5a103d2 100644 --- a/components/script/dom/webidls/WebGLBuffer.webidl +++ b/components/script/dom/webidls/WebGLBuffer.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.4 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLBuffer : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLFramebuffer.webidl b/components/script/dom/webidls/WebGLFramebuffer.webidl index b036b752161..e557542bfb0 100644 --- a/components/script/dom/webidls/WebGLFramebuffer.webidl +++ b/components/script/dom/webidls/WebGLFramebuffer.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.7 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLFramebuffer : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLObject.webidl b/components/script/dom/webidls/WebGLObject.webidl index 90feba0ab6a..6bfcf4d647b 100644 --- a/components/script/dom/webidls/WebGLObject.webidl +++ b/components/script/dom/webidls/WebGLObject.webidl @@ -6,6 +6,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.3 // -[Abstract, Exposed=Window] +[Abstract, Exposed=(Window,Worker)] interface WebGLObject { + attribute USVString label; }; diff --git a/components/script/dom/webidls/WebGLProgram.webidl b/components/script/dom/webidls/WebGLProgram.webidl index 29125b57b84..1246b222acd 100644 --- a/components/script/dom/webidls/WebGLProgram.webidl +++ b/components/script/dom/webidls/WebGLProgram.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.6 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLProgram : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLRenderbuffer.webidl b/components/script/dom/webidls/WebGLRenderbuffer.webidl index 465f193aaac..91a437039fb 100644 --- a/components/script/dom/webidls/WebGLRenderbuffer.webidl +++ b/components/script/dom/webidls/WebGLRenderbuffer.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.5 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLRenderbuffer : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl index fcd3f9752ae..6938e547cce 100644 --- a/components/script/dom/webidls/WebGLRenderingContext.webidl +++ b/components/script/dom/webidls/WebGLRenderingContext.webidl @@ -43,7 +43,7 @@ dictionary WebGLContextAttributes { GLboolean failIfMajorPerformanceCaveat = false; }; -[Exposed=Window] +[Exposed=(Window,Worker)] interface mixin WebGLRenderingContextBase { @@ -465,7 +465,7 @@ interface mixin WebGLRenderingContextBase const GLenum UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243; const GLenum BROWSER_DEFAULT_WEBGL = 0x9244; - readonly attribute HTMLCanvasElement canvas; + readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas; readonly attribute GLsizei drawingBufferWidth; readonly attribute GLsizei drawingBufferHeight; @@ -680,7 +680,7 @@ interface mixin WebGLRenderingContextOverloads undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value); }; -[Exposed=(Window)] +[Exposed=(Window,Worker)] interface WebGLRenderingContext { }; diff --git a/components/script/dom/webidls/WebGLShader.webidl b/components/script/dom/webidls/WebGLShader.webidl index af5f375dd99..4a0fe299a52 100644 --- a/components/script/dom/webidls/WebGLShader.webidl +++ b/components/script/dom/webidls/WebGLShader.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.8 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLShader : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLShaderPrecisionFormat.webidl b/components/script/dom/webidls/WebGLShaderPrecisionFormat.webidl index 10fed47b558..e2ed4821d11 100644 --- a/components/script/dom/webidls/WebGLShaderPrecisionFormat.webidl +++ b/components/script/dom/webidls/WebGLShaderPrecisionFormat.webidl @@ -6,7 +6,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.7 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLShaderPrecisionFormat { readonly attribute GLint rangeMin; readonly attribute GLint rangeMax; diff --git a/components/script/dom/webidls/WebGLTexture.webidl b/components/script/dom/webidls/WebGLTexture.webidl index 384cea6644a..4afad31fde7 100644 --- a/components/script/dom/webidls/WebGLTexture.webidl +++ b/components/script/dom/webidls/WebGLTexture.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/#5.9 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLTexture : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLUniformLocation.webidl b/components/script/dom/webidls/WebGLUniformLocation.webidl index 4cf09e42da4..3db0333177c 100644 --- a/components/script/dom/webidls/WebGLUniformLocation.webidl +++ b/components/script/dom/webidls/WebGLUniformLocation.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.10 // -[Exposed=Window] +[Exposed=(Window,Worker)] interface WebGLUniformLocation { }; diff --git a/components/script/dom/xrwebgllayer.rs b/components/script/dom/xrwebgllayer.rs index 28048f4cf77..bced737a045 100644 --- a/components/script/dom/xrwebgllayer.rs +++ b/components/script/dom/xrwebgllayer.rs @@ -15,6 +15,7 @@ use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGL use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::{ XRWebGLLayerInit, XRWebGLLayerMethods, XRWebGLRenderingContext, }; +use crate::dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrOffscreenCanvas; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; @@ -189,7 +190,16 @@ impl XRWebGLLayer { size.1.try_into().unwrap_or(0), ) } else { - let size = self.context().Canvas().get_size(); + let size = match self.context().Canvas() { + HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(canvas) => canvas.get_size(), + HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(canvas) => { + let size = canvas.get_size(); + Size2D::new( + size.width.try_into().unwrap_or(0), + size.height.try_into().unwrap_or(0), + ) + }, + }; Size2D::from_untyped(size) } } |