diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs index cd03a75d524..6bb83cfc863 100644 --- a/components/script/canvas_state.rs +++ b/components/script/canvas_state.rs @@ -1427,13 +1427,21 @@ impl CanvasState { self.set_font(canvas, CanvasContextState::DEFAULT_FONT_STYLE.into()); } - let (sender, receiver) = ipc::channel::().unwrap(); - self.send_canvas_2d_msg(Canvas2dMsg::MeasureText( - text.into(), - sender, - self.state.borrow().text_options(), - )); - let metrics = receiver.recv().unwrap(); + let metrics = { + if !self.is_paintable() { + CanvasTextMetrics::default() + } else { + let (sender, receiver) = ipc::channel::().unwrap(); + self.send_canvas_2d_msg(Canvas2dMsg::MeasureText( + text.into(), + sender, + self.state.borrow().text_options(), + )); + receiver + .recv() + .expect("Failed to receive response from canvas paint thread") + } + }; TextMetrics::new( global, diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index ebc587f7b93..4825ae0d957 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -8083,7 +8083,14 @@ {} ] ] - } + }, + "text-metrics-for-unpaintable-crash.html": [ + "5acecfd691acec60a155c1ec1ab571e0a8efb471", + [ + null, + {} + ] + ] }, "dom": { "elements": { diff --git a/tests/wpt/tests/html/canvas/text-metrics-for-unpaintable-crash.html b/tests/wpt/tests/html/canvas/text-metrics-for-unpaintable-crash.html new file mode 100644 index 00000000000..5acecfd691a --- /dev/null +++ b/tests/wpt/tests/html/canvas/text-metrics-for-unpaintable-crash.html @@ -0,0 +1,6 @@ + + + +