[#26488] Moved Droppable code into a separate struct for CanvasRenderingContext2D (#37136)

This is part of incremental implementation of #26488 . The interface
involved in this PR is CanvasRenderingContext2D.

Testing: Test should be just implemented.
Fixes: Partially #26488

Signed-off-by: Domenico Rizzo <domenico.rizzo@gmail.com>
This commit is contained in:
Domenico Rizzo 2025-05-27 17:45:05 +02:00 committed by GitHub
parent 8a20e42de4
commit ce12f37474
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -5,6 +5,7 @@
use canvas_traits::canvas::{Canvas2dMsg, CanvasId, CanvasMsg, FromScriptMsg};
use dom_struct::dom_struct;
use euclid::default::Size2D;
use ipc_channel::ipc::IpcSender;
use profile_traits::ipc;
use script_bindings::inheritance::Castable;
use servo_url::ServoUrl;
@ -36,27 +37,50 @@ use crate::dom::path2d::Path2D;
use crate::dom::textmetrics::TextMetrics;
use crate::script_runtime::CanGc;
#[derive(JSTraceable, MallocSizeOf)]
struct DroppableCanvasRenderingContext2D {
#[no_trace]
ipc_sender: IpcSender<CanvasMsg>,
#[no_trace]
canvas_id: CanvasId,
}
impl Drop for DroppableCanvasRenderingContext2D {
fn drop(&mut self) {
if let Err(err) = self.ipc_sender.send(CanvasMsg::Close(self.canvas_id)) {
warn!("Could not close canvas: {}", err)
}
}
}
// https://html.spec.whatwg.org/multipage/#canvasrenderingcontext2d
#[dom_struct]
pub(crate) struct CanvasRenderingContext2D {
reflector_: Reflector,
canvas: HTMLCanvasElementOrOffscreenCanvas,
canvas_state: CanvasState,
droppable: DroppableCanvasRenderingContext2D,
}
impl CanvasRenderingContext2D {
#[cfg_attr(crown, allow(crown::unrooted_must_root))]
pub(crate) fn new_inherited(
global: &GlobalScope,
canvas: HTMLCanvasElementOrOffscreenCanvas,
size: Size2D<u32>,
) -> CanvasRenderingContext2D {
let canvas_state =
CanvasState::new(global, Size2D::new(size.width as u64, size.height as u64));
let ipc_sender = canvas_state.get_ipc_renderer().clone();
let canvas_id = canvas_state.get_canvas_id();
CanvasRenderingContext2D {
reflector_: Reflector::new(),
canvas,
canvas_state: CanvasState::new(
global,
Size2D::new(size.width as u64, size.height as u64),
),
canvas_state,
droppable: DroppableCanvasRenderingContext2D {
ipc_sender,
canvas_id,
},
}
}
@ -689,15 +713,3 @@ impl CanvasRenderingContext2DMethods<crate::DomTypeHolder> for CanvasRenderingCo
.set_shadow_color(self.canvas.canvas(), value, can_gc)
}
}
impl Drop for CanvasRenderingContext2D {
fn drop(&mut self) {
if let Err(err) = self
.canvas_state
.get_ipc_renderer()
.send(CanvasMsg::Close(self.canvas_state.get_canvas_id()))
{
warn!("Could not close canvas: {}", err)
}
}
}