mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
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:
parent
93d234d270
commit
ae69646371
17 changed files with 116 additions and 61 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue