diff --git a/components/script/canvas_context.rs b/components/script/canvas_context.rs index b60a7193a66..1a9235cdf9e 100644 --- a/components/script/canvas_context.rs +++ b/components/script/canvas_context.rs @@ -258,6 +258,7 @@ pub(crate) enum OffscreenRenderingContext { //WebGL2(Dom), //#[cfg(feature = "webgpu")] //WebGPU(Dom), + Detached, } impl CanvasContext for OffscreenRenderingContext { @@ -268,54 +269,63 @@ impl CanvasContext for OffscreenRenderingContext { fn canvas(&self) -> Option { match self { OffscreenRenderingContext::Context2d(context) => context.canvas(), + OffscreenRenderingContext::Detached => None, } } fn resize(&self) { match self { OffscreenRenderingContext::Context2d(context) => context.resize(), + OffscreenRenderingContext::Detached => {}, } } fn reset_bitmap(&self) { match self { OffscreenRenderingContext::Context2d(context) => context.reset_bitmap(), + OffscreenRenderingContext::Detached => {}, } } fn get_image_data(&self) -> Option { match self { OffscreenRenderingContext::Context2d(context) => context.get_image_data(), + OffscreenRenderingContext::Detached => None, } } fn origin_is_clean(&self) -> bool { match self { OffscreenRenderingContext::Context2d(context) => context.origin_is_clean(), + OffscreenRenderingContext::Detached => true, } } fn size(&self) -> Size2D { match self { OffscreenRenderingContext::Context2d(context) => context.size(), + OffscreenRenderingContext::Detached => Size2D::default(), } } fn mark_as_dirty(&self) { match self { OffscreenRenderingContext::Context2d(context) => context.mark_as_dirty(), + OffscreenRenderingContext::Detached => {}, } } fn update_rendering(&self) { match self { OffscreenRenderingContext::Context2d(context) => context.update_rendering(), + OffscreenRenderingContext::Detached => {}, } } fn onscreen(&self) -> bool { match self { OffscreenRenderingContext::Context2d(context) => context.onscreen(), + OffscreenRenderingContext::Detached => false, } } } diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs index 269dba979da..e77b1ddc092 100644 --- a/components/script/canvas_state.rs +++ b/components/script/canvas_state.rs @@ -651,6 +651,7 @@ impl CanvasState { smoothing_enabled, )); }, + OffscreenRenderingContext::Detached => return Err(Error::InvalidState), } } else { self.send_canvas_2d_msg(Canvas2dMsg::DrawEmptyImage( @@ -719,6 +720,7 @@ impl CanvasState { source_rect, smoothing_enabled, )), + OffscreenRenderingContext::Detached => return Err(Error::InvalidState), } }, _ => return Err(Error::InvalidState), diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs index 73974abe714..fc8edb4e334 100644 --- a/components/script/dom/bindings/structuredclone.rs +++ b/components/script/dom/bindings/structuredclone.rs @@ -11,12 +11,12 @@ use std::ptr; use base::id::{ BlobId, DomExceptionId, DomPointId, ImageBitmapId, Index, MessagePortId, NamespaceIndex, - PipelineNamespaceId, + OffscreenCanvasId, PipelineNamespaceId, }; use constellation_traits::{ BlobImpl, DomException, DomPoint, MessagePortImpl, Serializable as SerializableInterface, - SerializableImageBitmap, StructuredSerializedData, Transferrable as TransferrableInterface, - TransformStreamData, + SerializableImageBitmap, StructuredSerializedData, TransferableOffscreenCanvas, + Transferrable as TransferrableInterface, TransformStreamData, }; use js::gc::RootedVec; use js::glue::{ @@ -46,6 +46,7 @@ use crate::dom::dompointreadonly::DOMPointReadOnly; use crate::dom::globalscope::GlobalScope; use crate::dom::imagebitmap::ImageBitmap; use crate::dom::messageport::MessagePort; +use crate::dom::offscreencanvas::OffscreenCanvas; use crate::dom::readablestream::ReadableStream; use crate::dom::types::{DOMException, TransformStream}; use crate::dom::writablestream::WritableStream; @@ -70,6 +71,7 @@ pub(super) enum StructuredCloneTags { WritableStream = 0xFFFF8008, TransformStream = 0xFFFF8009, ImageBitmap = 0xFFFF800A, + OffscreenCanvas = 0xFFFF800B, Max = 0xFFFFFFFF, } @@ -90,6 +92,7 @@ impl From for StructuredCloneTags { match v { TransferrableInterface::ImageBitmap => StructuredCloneTags::ImageBitmap, TransferrableInterface::MessagePort => StructuredCloneTags::MessagePort, + TransferrableInterface::OffscreenCanvas => StructuredCloneTags::OffscreenCanvas, TransferrableInterface::ReadableStream => StructuredCloneTags::ReadableStream, TransferrableInterface::WritableStream => StructuredCloneTags::WritableStream, TransferrableInterface::TransformStream => StructuredCloneTags::TransformStream, @@ -274,6 +277,7 @@ fn receiver_for_type( match val { TransferrableInterface::ImageBitmap => receive_object::, TransferrableInterface::MessagePort => receive_object::, + TransferrableInterface::OffscreenCanvas => receive_object::, TransferrableInterface::ReadableStream => receive_object::, TransferrableInterface::WritableStream => receive_object::, TransferrableInterface::TransformStream => receive_object::, @@ -401,6 +405,7 @@ fn transfer_for_type(val: TransferrableInterface) -> TransferOperation { match val { TransferrableInterface::ImageBitmap => try_transfer::, TransferrableInterface::MessagePort => try_transfer::, + TransferrableInterface::OffscreenCanvas => try_transfer::, TransferrableInterface::ReadableStream => try_transfer::, TransferrableInterface::WritableStream => try_transfer::, TransferrableInterface::TransformStream => try_transfer::, @@ -451,6 +456,7 @@ unsafe fn can_transfer_for_type( match transferable { TransferrableInterface::ImageBitmap => can_transfer::(obj, cx), TransferrableInterface::MessagePort => can_transfer::(obj, cx), + TransferrableInterface::OffscreenCanvas => can_transfer::(obj, cx), TransferrableInterface::ReadableStream => can_transfer::(obj, cx), TransferrableInterface::WritableStream => can_transfer::(obj, cx), TransferrableInterface::TransformStream => can_transfer::(obj, cx), @@ -542,6 +548,8 @@ pub(crate) struct StructuredDataReader<'a> { pub(crate) image_bitmaps: Option>, /// A map of transferred image bitmaps. pub(crate) transferred_image_bitmaps: Option>, + /// A map of transferred offscreen canvases. + pub(crate) offscreen_canvases: Option>, } /// A data holder for transferred and serialized objects. @@ -564,6 +572,8 @@ pub(crate) struct StructuredDataWriter { pub(crate) image_bitmaps: Option>, /// Transferred image bitmaps. pub(crate) transferred_image_bitmaps: Option>, + /// Transferred offscreen canvases. + pub(crate) offscreen_canvases: Option>, } /// Writes a structured clone. Returns a `DataClone` error if that fails. @@ -620,6 +630,7 @@ pub(crate) fn write( blobs: sc_writer.blobs.take(), image_bitmaps: sc_writer.image_bitmaps.take(), transferred_image_bitmaps: sc_writer.transferred_image_bitmaps.take(), + offscreen_canvases: sc_writer.offscreen_canvases.take(), }; Ok(data) @@ -646,6 +657,7 @@ pub(crate) fn read( errors: DOMErrorRecord { message: None }, image_bitmaps: data.image_bitmaps.take(), transferred_image_bitmaps: data.transferred_image_bitmaps.take(), + offscreen_canvases: data.offscreen_canvases.take(), }; let sc_reader_ptr = &mut sc_reader as *mut _; unsafe { diff --git a/components/script/dom/offscreencanvas.rs b/components/script/dom/offscreencanvas.rs index 2a68d20bea7..c88ae5089db 100644 --- a/components/script/dom/offscreencanvas.rs +++ b/components/script/dom/offscreencanvas.rs @@ -3,9 +3,11 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use std::cell::Cell; +use std::collections::HashMap; use std::rc::Rc; -use constellation_traits::BlobImpl; +use base::id::{OffscreenCanvasId, OffscreenCanvasIndex}; +use constellation_traits::{BlobImpl, TransferableOffscreenCanvas}; use dom_struct::dom_struct; use euclid::default::Size2D; use js::rust::{HandleObject, HandleValue}; @@ -23,6 +25,8 @@ use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; use crate::dom::bindings::reflector::{DomGlobal, reflect_dom_object_with_proto}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; +use crate::dom::bindings::structuredclone::StructuredData; +use crate::dom::bindings::transferable::Transferable; use crate::dom::blob::Blob; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; @@ -126,6 +130,7 @@ impl OffscreenCanvas { if let Some(ctx) = self.context() { return match *ctx { OffscreenRenderingContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)), + _ => None, }; } let context = OffscreenCanvasRenderingContext2D::new(&self.global(), self, can_gc); @@ -142,6 +147,86 @@ impl OffscreenCanvas { } } +impl Transferable for OffscreenCanvas { + type Index = OffscreenCanvasIndex; + type Data = TransferableOffscreenCanvas; + + /// + fn transfer(&self) -> Result<(OffscreenCanvasId, TransferableOffscreenCanvas), ()> { + // TODO(#37919) Step 1. If value's context mode is not equal to none, + // then throw an "InvalidStateError" DOMException. + if !self.context.borrow().is_none() { + return Err(()); + } + + // TODO(#37882): Allow to transfer with a placeholder canvas element. + if self.placeholder.is_some() { + return Err(()); + } + + // Step 2. Set value's context mode to detached. + *self.context.borrow_mut() = Some(OffscreenRenderingContext::Detached); + + // Step 3. Let width and height be the dimensions of value's bitmap. + // Step 5. Unset value's bitmap. + let width = self.width.replace(0); + let height = self.height.replace(0); + + // TODO(#37918) Step 4. Let language and direction be the values of + // value's inherited language and inherited direction. + + // Step 6. Set dataHolder.[[Width]] to width and dataHolder.[[Height]] + // to height. + + // TODO(#37918) Step 7. Set dataHolder.[[Language]] to language and + // dataHolder.[[Direction]] to direction. + + // TODO(#37882) Step 8. Set dataHolder.[[PlaceholderCanvas]] to be a + // weak reference to value's placeholder canvas element, if value has + // one, or null if it does not. + let transferred = TransferableOffscreenCanvas { width, height }; + + Ok((OffscreenCanvasId::new(), transferred)) + } + + /// + fn transfer_receive( + owner: &GlobalScope, + _: OffscreenCanvasId, + transferred: TransferableOffscreenCanvas, + ) -> Result, ()> { + // Step 1. Initialize value's bitmap to a rectangular array of + // transparent black pixels with width given by dataHolder.[[Width]] and + // height given by dataHolder.[[Height]]. + + // TODO(#37918) Step 2. Set value's inherited language to + // dataHolder.[[Language]] and its inherited direction to + // dataHolder.[[Direction]]. + + // TODO(#37882) Step 3. If dataHolder.[[PlaceholderCanvas]] is not null, + // set value's placeholder canvas element to + // dataHolder.[[PlaceholderCanvas]] (while maintaining the weak + // reference semantics). + Ok(OffscreenCanvas::new( + owner, + None, + transferred.width, + transferred.height, + None, + CanGc::note(), + )) + } + + fn serialized_storage<'a>( + data: StructuredData<'a, '_>, + ) -> &'a mut Option> { + match data { + StructuredData::Reader(r) => &mut r.offscreen_canvases, + StructuredData::Writer(w) => &mut w.offscreen_canvases, + } + } +} + impl OffscreenCanvasMethods for OffscreenCanvas { /// fn Constructor( @@ -151,8 +236,9 @@ impl OffscreenCanvasMethods for OffscreenCanvas { width: u64, height: u64, ) -> Fallible> { - let offscreencanvas = OffscreenCanvas::new(global, proto, width, height, None, can_gc); - Ok(offscreencanvas) + Ok(OffscreenCanvas::new( + global, proto, width, height, None, can_gc, + )) } /// @@ -163,6 +249,12 @@ impl OffscreenCanvasMethods for OffscreenCanvas { _options: HandleValue, can_gc: CanGc, ) -> Fallible> { + // Step 3. Throw an "InvalidStateError" DOMException if the + // OffscreenCanvas object's context mode is detached. + if let Some(OffscreenRenderingContext::Detached) = *self.context.borrow() { + return Err(Error::InvalidState); + } + match &*id { "2d" => Ok(self .get_or_init_2d_context(can_gc) @@ -217,9 +309,12 @@ impl OffscreenCanvasMethods for OffscreenCanvas { /// fn TransferToImageBitmap(&self, can_gc: CanGc) -> Fallible> { - // TODO Step 1. If the value of this OffscreenCanvas object's - // [[Detached]] internal slot is set to true, then throw an - // "InvalidStateError" DOMException. + // Step 1. If the value of this OffscreenCanvas object's [[Detached]] + // internal slot is set to true, then throw an "InvalidStateError" + // DOMException. + if let Some(OffscreenRenderingContext::Detached) = *self.context.borrow() { + return Err(Error::InvalidState); + } // Step 2. If this OffscreenCanvas object's context mode is set to none, // then throw an "InvalidStateError" DOMException. @@ -255,6 +350,14 @@ impl OffscreenCanvasMethods for OffscreenCanvas { let in_realm_proof = AlreadyInRealm::assert::(); let promise = Promise::new_in_current_realm(InRealm::Already(&in_realm_proof), can_gc); + // Step 1. If the value of this's [[Detached]] internal slot is true, + // then return a promise rejected with an "InvalidStateError" + // DOMException. + if let Some(OffscreenRenderingContext::Detached) = *self.context.borrow() { + promise.reject_error(Error::InvalidState, can_gc); + return promise; + } + // Step 2. If this's context mode is 2d and the rendering context's // output bitmap's origin-clean flag is set to false, then return a // promise rejected with a "SecurityError" DOMException. diff --git a/components/script_bindings/webidls/OffscreenCanvas.webidl b/components/script_bindings/webidls/OffscreenCanvas.webidl index 17e45b4865c..75c936e7437 100644 --- a/components/script_bindings/webidls/OffscreenCanvas.webidl +++ b/components/script_bindings/webidls/OffscreenCanvas.webidl @@ -13,7 +13,7 @@ dictionary ImageEncodeOptions { //enum OffscreenRenderingContextId { "2d", "webgl", "webgl2" }; -[Exposed=(Window,Worker)/*, Transferable*/, Pref="dom_offscreen_canvas_enabled"] +[Exposed=(Window,Worker), Transferable, Pref="dom_offscreen_canvas_enabled"] interface OffscreenCanvas : EventTarget { [Throws] constructor([EnforceRange] unsigned long long width, [EnforceRange] unsigned long long height); attribute [EnforceRange] unsigned long long width; diff --git a/components/shared/base/id.rs b/components/shared/base/id.rs index a091311d237..e52e5d579ac 100644 --- a/components/shared/base/id.rs +++ b/components/shared/base/id.rs @@ -373,6 +373,8 @@ namespace_id! {HistoryStateId, HistoryStateIndex, "HistoryState"} namespace_id! {ImageBitmapId, ImageBitmapIndex, "ImageBitmap"} +namespace_id! {OffscreenCanvasId, OffscreenCanvasIndex, "OffscreenCanvas"} + // We provide ids just for unit testing. pub const TEST_NAMESPACE: PipelineNamespaceId = PipelineNamespaceId(1234); #[allow(unsafe_code)] diff --git a/components/shared/constellation/from_script_message.rs b/components/shared/constellation/from_script_message.rs index b860aa25dd4..a48c8f4eb99 100644 --- a/components/shared/constellation/from_script_message.rs +++ b/components/shared/constellation/from_script_message.rs @@ -214,6 +214,7 @@ pub struct SWManagerSenders { /// Messages sent to Service Worker Manager thread #[derive(Debug, Deserialize, Serialize)] +#[allow(clippy::large_enum_variant)] pub enum ServiceWorkerMsg { /// Timeout message sent by active service workers Timeout(ServoUrl), diff --git a/components/shared/constellation/structured_data/mod.rs b/components/shared/constellation/structured_data/mod.rs index 3ea0d78eaf3..89ca1466bc8 100644 --- a/components/shared/constellation/structured_data/mod.rs +++ b/components/shared/constellation/structured_data/mod.rs @@ -10,7 +10,9 @@ mod transferable; use std::collections::HashMap; -use base::id::{BlobId, DomExceptionId, DomPointId, ImageBitmapId, MessagePortId}; +use base::id::{ + BlobId, DomExceptionId, DomPointId, ImageBitmapId, MessagePortId, OffscreenCanvasId, +}; use log::warn; use malloc_size_of_derive::MallocSizeOf; use serde::{Deserialize, Serialize}; @@ -38,6 +40,8 @@ pub struct StructuredSerializedData { pub image_bitmaps: Option>, /// Transferred image bitmap objects. pub transferred_image_bitmaps: Option>, + /// Transferred offscreen canvas objects. + pub offscreen_canvases: Option>, } impl StructuredSerializedData { @@ -48,6 +52,7 @@ impl StructuredSerializedData { match val { Transferrable::ImageBitmap => is_field_empty(&self.transferred_image_bitmaps), Transferrable::MessagePort => is_field_empty(&self.ports), + Transferrable::OffscreenCanvas => is_field_empty(&self.offscreen_canvases), Transferrable::ReadableStream => is_field_empty(&self.ports), Transferrable::WritableStream => is_field_empty(&self.ports), Transferrable::TransformStream => is_field_empty(&self.ports), diff --git a/components/shared/constellation/structured_data/transferable.rs b/components/shared/constellation/structured_data/transferable.rs index bce10420182..7630a0c7d4b 100644 --- a/components/shared/constellation/structured_data/transferable.rs +++ b/components/shared/constellation/structured_data/transferable.rs @@ -28,6 +28,8 @@ pub enum Transferrable { ImageBitmap, /// The `MessagePort` interface. MessagePort, + /// The `OffscreenCanvas` interface. + OffscreenCanvas, /// The `ReadableStream` interface. ReadableStream, /// The `WritableStream` interface. @@ -185,3 +187,12 @@ impl MessagePortImpl { self.state = MessagePortState::Detached; } } + +#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] +/// A struct supporting the transfer of OffscreenCanvas, which loosely +/// corresponds to the dataHolder in +/// +pub struct TransferableOffscreenCanvas { + pub width: u64, + pub height: u64, +} diff --git a/tests/wpt/meta/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini b/tests/wpt/meta/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini deleted file mode 100644 index 61b88554d0e..00000000000 --- a/tests/wpt/meta/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.drawImage.detachedcanvas.html] - [drawImage with detached OffscreenCanvas as the source should throw exception] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/convert-to-blob/offscreencanvas.convert.to.blob.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/convert-to-blob/offscreencanvas.convert.to.blob.html.ini deleted file mode 100644 index f4b88f25626..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/manual/convert-to-blob/offscreencanvas.convert.to.blob.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[offscreencanvas.convert.to.blob.html] - [Test that call convertToBlob on a detached OffscreenCanvas throws exception] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/convert-to-blob/offscreencanvas.convert.to.blob.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/convert-to-blob/offscreencanvas.convert.to.blob.w.html.ini deleted file mode 100644 index 7f090338c72..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/manual/convert-to-blob/offscreencanvas.convert.to.blob.w.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[offscreencanvas.convert.to.blob.w.html] - expected: ERROR - [Test that call convertToBlob on a detached OffscreenCanvas throws exception in a worker] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html.ini index a5681398739..133118cda99 100644 --- a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html.ini +++ b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html.ini @@ -4,6 +4,3 @@ [Test that transferToImageBitmap returns an ImageBitmap with correct width and height] expected: FAIL - - [Test that call transferToImageBitmap on a detached OffscreenCanvas throws an exception] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html.ini index 648d37373df..b1121da4c45 100644 --- a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html.ini +++ b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html.ini @@ -3,8 +3,5 @@ [Test that transferToImageBitmap returns an ImageBitmap with correct width and height in a worker] expected: FAIL - [Test that call transferToImageBitmap on a detached OffscreenCanvas throws an exception in a worker] - expected: FAIL - [Test that call transferToImageBitmap twice on a alpha-disabled context returns an ImageBitmap with correct color in a worker] expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.html.ini index d441d8d17f7..2269d23a1e8 100644 --- a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.html.ini +++ b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.html.ini @@ -1,18 +1,3 @@ [offscreencanvas.transferrable.html] - [Test that offscreenCanvas's size is correct after being transferred to a worker.] - expected: FAIL - - [Test that calling getContext('webgl') on a detached OffscreenCanvas throws exception.] - expected: FAIL - - [Test that transfer an OffscreenCanvas that has a context throws exception.] - expected: FAIL - - [Test that transfer an OffscreenCanvas twice throws exception.] - expected: FAIL - - [Test that calling getContext('2d') on a detached OffscreenCanvas throws exception.] - expected: FAIL - [Test that transfer an OffscreenCanvas that already have a 2d context throws exception.] expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html.ini index 91232b250b3..bb8c8d6c07c 100644 --- a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html.ini +++ b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html.ini @@ -1,20 +1,10 @@ [offscreencanvas.transferrable.w.html] expected: ERROR - [Test that calling getContext('webgl') on a detached OffscreenCanvas throws exception in a worker.] - expected: FAIL - [Test that transfer an OffscreenCanvas that has a webgl context throws exception in a worker.] expected: FAIL - [Test that transfer an OffscreenCanvas twice throws exception in a worker.] - expected: FAIL - - [Test that calling getContext('2d') on a detached OffscreenCanvas throws exception in a worker.] - expected: FAIL - - [Test that OffscreenCanvas's size is correct after being transferred from a worker.] - expected: FAIL - [Test that transfer an OffscreenCanvas that has a 2d context throws exception in a worker.] expected: FAIL + [Test that transfer an OffscreenCanvas twice throws exception in a worker.] + expected: FAIL diff --git a/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/transfer-errors.window.js.ini b/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/transfer-errors.window.js.ini index 57c984434b8..826d5912b1d 100644 --- a/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/transfer-errors.window.js.ini +++ b/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/transfer-errors.window.js.ini @@ -8,11 +8,5 @@ [Serialize should throw before a detached ImageBitmap is found] expected: FAIL - [Serialize should make the OffscreenCanvas detached, so it cannot be transferred again] - expected: FAIL - [Serialize should throw before a detached OffscreenCanvas is found] expected: FAIL - - [Cannot transfer OffscreenCanvas detached while the message was serialized] - expected: FAIL