canvas: Make 2D context state creation failable and use dom_canvas_backend pref for backend selection (#38310)

Before script just crashed in those cases because IPCSender was dropped,
now we send `None` to tell script about the failure and fail getContext
or registerPainter accordingly.
This PR also unifies `dom_canvas_{backends}_enabled` prefs into
`dom_canvas_backend` which is more flexible in multi-backends scenarios.

Reviewable per commit.

Testing: Added servo specific WPT test.

---------

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
sagudev 2025-07-28 11:13:07 +02:00 committed by GitHub
parent 93d234d270
commit ae69646371
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 116 additions and 61 deletions

View file

@ -4368,24 +4368,32 @@ where
fn handle_create_canvas_paint_thread_msg(
&mut self,
size: UntypedSize2D<u64>,
response_sender: IpcSender<(IpcSender<CanvasMsg>, CanvasId, ImageKey)>,
response_sender: IpcSender<Option<(IpcSender<CanvasMsg>, CanvasId, ImageKey)>>,
) {
let (canvas_data_sender, canvas_data_receiver) = unbounded();
let (canvas_sender, canvas_ipc_sender) = self
.canvas
.get_or_init(|| self.create_canvas_paint_thread());
if let Err(e) = canvas_sender.send(ConstellationCanvasMsg::Create {
let response = if let Err(e) = canvas_sender.send(ConstellationCanvasMsg::Create {
sender: canvas_data_sender,
size,
}) {
return warn!("Create canvas paint thread failed ({})", e);
}
let (canvas_id, image_key) = match canvas_data_receiver.recv() {
Ok(canvas_data) => canvas_data,
Err(e) => return warn!("Create canvas paint thread id response failed ({})", e),
warn!("Create canvas paint thread failed ({})", e);
None
} else {
match canvas_data_receiver.recv() {
Ok(Some((canvas_id, image_key))) => {
Some((canvas_ipc_sender.clone(), canvas_id, image_key))
},
Ok(None) => None,
Err(e) => {
warn!("Create canvas paint thread id response failed ({})", e);
None
},
}
};
if let Err(e) = response_sender.send((canvas_ipc_sender.clone(), canvas_id, image_key)) {
if let Err(e) = response_sender.send(response) {
warn!("Create canvas paint thread response failed ({})", e);
}
}