aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/canvas_state.rs11
-rw-r--r--components/script/dom/bindings/codegen/Bindings.conf8
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs24
-rw-r--r--components/script/dom/imagedata.rs12
-rw-r--r--components/script/dom/offscreencanvasrenderingcontext2d.rs34
5 files changed, 65 insertions, 24 deletions
diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs
index a19b8fc2424..ea3962ad34d 100644
--- a/components/script/canvas_state.rs
+++ b/components/script/canvas_state.rs
@@ -57,6 +57,7 @@ use crate::dom::node::{window_from_node, Node, NodeDamage};
use crate::dom::offscreencanvas::{OffscreenCanvas, OffscreenCanvasContext};
use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope;
use crate::dom::textmetrics::TextMetrics;
+use crate::script_runtime::CanGc;
use crate::unpremultiplytable::UNPREMULTIPLY_TABLE;
#[crown::unrooted_must_root_lint::must_root]
@@ -1232,11 +1233,12 @@ impl CanvasState {
global: &GlobalScope,
sw: i32,
sh: i32,
+ can_gc: CanGc,
) -> Fallible<DomRoot<ImageData>> {
if sw == 0 || sh == 0 {
return Err(Error::IndexSize);
}
- ImageData::new(global, sw.unsigned_abs(), sh.unsigned_abs(), None)
+ ImageData::new(global, sw.unsigned_abs(), sh.unsigned_abs(), None, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata
@@ -1244,8 +1246,9 @@ impl CanvasState {
&self,
global: &GlobalScope,
imagedata: &ImageData,
+ can_gc: CanGc,
) -> Fallible<DomRoot<ImageData>> {
- ImageData::new(global, imagedata.Width(), imagedata.Height(), None)
+ ImageData::new(global, imagedata.Width(), imagedata.Height(), None, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-getimagedata
@@ -1257,6 +1260,7 @@ impl CanvasState {
sy: i32,
sw: i32,
sh: i32,
+ can_gc: CanGc,
) -> Fallible<DomRoot<ImageData>> {
// FIXME(nox): There are many arithmetic operations here that can
// overflow or underflow, this should probably be audited.
@@ -1274,7 +1278,7 @@ impl CanvasState {
Some(rect) => rect,
None => {
// All the pixels are outside the canvas surface.
- return ImageData::new(global, size.width, size.height, None);
+ return ImageData::new(global, size.width, size.height, None, can_gc);
},
};
@@ -1283,6 +1287,7 @@ impl CanvasState {
size.width,
size.height,
Some(self.get_rect(canvas_size, read_rect)),
+ can_gc,
)
}
diff --git a/components/script/dom/bindings/codegen/Bindings.conf b/components/script/dom/bindings/codegen/Bindings.conf
index 14a5a1c2905..3553583b53c 100644
--- a/components/script/dom/bindings/codegen/Bindings.conf
+++ b/components/script/dom/bindings/codegen/Bindings.conf
@@ -54,6 +54,10 @@ DOMInterfaces = {
'inRealms': ['WhenDefined'],
},
+'CanvasRenderingContext2D': {
+ 'canGc': ['CreateImageData', 'CreateImageData_', 'GetImageData'],
+},
+
'DOMImplementation': {
'canGc': ['CreateDocument', 'CreateHTMLDocument'],
},
@@ -145,6 +149,10 @@ DOMInterfaces = {
'inRealms': ['StartRendering'],
},
+'OffscreenCanvasRenderingContext2D': {
+ 'canGc': ['CreateImageData', 'CreateImageData_', 'GetImageData'],
+},
+
'Promise': {
'spiderMonkeyInterface': True,
},
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 5aac664e480..e1124facaa4 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -26,6 +26,7 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::imagedata::ImageData;
use crate::dom::textmetrics::TextMetrics;
+use crate::script_runtime::CanGc;
// https://html.spec.whatwg.org/multipage/#canvasrenderingcontext2d
#[dom_struct]
@@ -467,18 +468,30 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata
- fn CreateImageData(&self, sw: i32, sh: i32) -> Fallible<DomRoot<ImageData>> {
- self.canvas_state.create_image_data(&self.global(), sw, sh)
+ fn CreateImageData(&self, sw: i32, sh: i32, can_gc: CanGc) -> Fallible<DomRoot<ImageData>> {
+ self.canvas_state
+ .create_image_data(&self.global(), sw, sh, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata
- fn CreateImageData_(&self, imagedata: &ImageData) -> Fallible<DomRoot<ImageData>> {
+ fn CreateImageData_(
+ &self,
+ imagedata: &ImageData,
+ can_gc: CanGc,
+ ) -> Fallible<DomRoot<ImageData>> {
self.canvas_state
- .create_image_data_(&self.global(), imagedata)
+ .create_image_data_(&self.global(), imagedata, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-getimagedata
- fn GetImageData(&self, sx: i32, sy: i32, sw: i32, sh: i32) -> Fallible<DomRoot<ImageData>> {
+ fn GetImageData(
+ &self,
+ sx: i32,
+ sy: i32,
+ sw: i32,
+ sh: i32,
+ can_gc: CanGc,
+ ) -> Fallible<DomRoot<ImageData>> {
self.canvas_state.get_image_data(
self.canvas
.as_ref()
@@ -488,6 +501,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
sy,
sw,
sh,
+ can_gc,
)
}
diff --git a/components/script/dom/imagedata.rs b/components/script/dom/imagedata.rs
index 116ce8de99b..22b67650072 100644
--- a/components/script/dom/imagedata.rs
+++ b/components/script/dom/imagedata.rs
@@ -39,6 +39,7 @@ impl ImageData {
width: u32,
height: u32,
mut data: Option<Vec<u8>>,
+ can_gc: CanGc,
) -> Fallible<DomRoot<ImageData>> {
let len = width * height * 4;
unsafe {
@@ -48,16 +49,9 @@ impl ImageData {
d.resize(len as usize, 0);
let data = CreateWith::Slice(&d[..]);
Uint8ClampedArray::create(*cx, data, js_object.handle_mut()).unwrap();
- Self::new_with_jsobject(
- global,
- None,
- width,
- Some(height),
- js_object.get(),
- CanGc::note(),
- )
+ Self::new_with_jsobject(global, None, width, Some(height), js_object.get(), can_gc)
} else {
- Self::new_without_jsobject(global, None, width, height, CanGc::note())
+ Self::new_without_jsobject(global, None, width, height, can_gc)
}
}
}
diff --git a/components/script/dom/offscreencanvasrenderingcontext2d.rs b/components/script/dom/offscreencanvasrenderingcontext2d.rs
index a71d3158297..34c2e5eb944 100644
--- a/components/script/dom/offscreencanvasrenderingcontext2d.rs
+++ b/components/script/dom/offscreencanvasrenderingcontext2d.rs
@@ -27,6 +27,7 @@ use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::imagedata::ImageData;
use crate::dom::offscreencanvas::OffscreenCanvas;
use crate::dom::textmetrics::TextMetrics;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct OffscreenCanvasRenderingContext2D {
@@ -342,20 +343,39 @@ impl OffscreenCanvasRenderingContext2DMethods for OffscreenCanvasRenderingContex
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata
- fn CreateImageData(&self, sw: i32, sh: i32) -> Fallible<DomRoot<ImageData>> {
- self.canvas_state.create_image_data(&self.global(), sw, sh)
+ fn CreateImageData(&self, sw: i32, sh: i32, can_gc: CanGc) -> Fallible<DomRoot<ImageData>> {
+ self.canvas_state
+ .create_image_data(&self.global(), sw, sh, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata
- fn CreateImageData_(&self, imagedata: &ImageData) -> Fallible<DomRoot<ImageData>> {
+ fn CreateImageData_(
+ &self,
+ imagedata: &ImageData,
+ can_gc: CanGc,
+ ) -> Fallible<DomRoot<ImageData>> {
self.canvas_state
- .create_image_data_(&self.global(), imagedata)
+ .create_image_data_(&self.global(), imagedata, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-getimagedata
- fn GetImageData(&self, sx: i32, sy: i32, sw: i32, sh: i32) -> Fallible<DomRoot<ImageData>> {
- self.canvas_state
- .get_image_data(self.canvas.get_size(), &self.global(), sx, sy, sw, sh)
+ fn GetImageData(
+ &self,
+ sx: i32,
+ sy: i32,
+ sw: i32,
+ sh: i32,
+ can_gc: CanGc,
+ ) -> Fallible<DomRoot<ImageData>> {
+ self.canvas_state.get_image_data(
+ self.canvas.get_size(),
+ &self.global(),
+ sx,
+ sy,
+ sw,
+ sh,
+ can_gc,
+ )
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata