diff --git a/components/canvas/canvas_paint_thread.rs b/components/canvas/canvas_paint_thread.rs index 8fe05d1f6a9..deba49262c8 100644 --- a/components/canvas/canvas_paint_thread.rs +++ b/components/canvas/canvas_paint_thread.rs @@ -133,6 +133,7 @@ impl<'a> CanvasPaintThread<'a> { match msg.unwrap() { CanvasMsg::Canvas2d(message) => { match message { + Canvas2dMsg::FillText(text, x, y, max_width) => painter.fill_text(text, x, y, max_width), Canvas2dMsg::FillRect(ref rect) => painter.fill_rect(rect), Canvas2dMsg::StrokeRect(ref rect) => painter.stroke_rect(rect), Canvas2dMsg::ClearRect(ref rect) => painter.clear_rect(rect), @@ -228,6 +229,10 @@ impl<'a> CanvasPaintThread<'a> { } } + fn fill_text(&self, text: String, x: f64, y: f64, max_width: Option) { + error!("Unimplemented canvas2d.fillText. Values received: {}, {}, {}, {:?}.", text, x, y, max_width); + } + fn fill_rect(&self, rect: &Rect) { if is_zero_size_gradient(&self.state.fill_style) { return; // Paint nothing if gradient size is zero. diff --git a/components/canvas_traits/canvas.rs b/components/canvas_traits/canvas.rs index 92444d03799..400cc601c3c 100644 --- a/components/canvas_traits/canvas.rs +++ b/components/canvas_traits/canvas.rs @@ -43,6 +43,7 @@ pub enum Canvas2dMsg { Clip, ClosePath, Fill, + FillText(String, f64, f64, Option), FillRect(Rect), GetImageData(Rect, Size2D, IpcSender>), IsPointInPath(f64, f64, FillRule, IpcSender), diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index d4fcfae4ab8..db71c10551b 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -800,6 +800,13 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { receiver.recv().unwrap() } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-filltext + fn FillText(&self, text: DOMString, x: f64, y: f64, max_width: Option) { + let parsed_text: String = text.into(); + self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::FillText(parsed_text, x, y, max_width))).unwrap(); + self.mark_as_dirty(); + } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage fn DrawImage(&self, image: CanvasImageSource, diff --git a/components/script/dom/webidls/CanvasRenderingContext2D.webidl b/components/script/dom/webidls/CanvasRenderingContext2D.webidl index b20b2b8ef3a..b77706332d3 100644 --- a/components/script/dom/webidls/CanvasRenderingContext2D.webidl +++ b/components/script/dom/webidls/CanvasRenderingContext2D.webidl @@ -153,8 +153,9 @@ interface CanvasUserInterface { [NoInterfaceObject] interface CanvasText { // text (see also the CanvasDrawingStyles interface) - //void fillText(DOMString text, unrestricted double x, unrestricted double y, - // optional unrestricted double maxWidth); + [Pref="dom.canvas-text.enabled"] + void fillText(DOMString text, unrestricted double x, unrestricted double y, + optional unrestricted double maxWidth); //void strokeText(DOMString text, unrestricted double x, unrestricted double y, // optional unrestricted double maxWidth); //TextMetrics measureText(DOMString text); @@ -264,4 +265,3 @@ interface CanvasPath { // double rotation, double startAngle, double endAngle, // boolean anticlockwise); }; - diff --git a/resources/prefs.json b/resources/prefs.json index f726cb288f4..707bba1768a 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -1,6 +1,7 @@ { "dom.bluetooth.enabled": false, "dom.bluetooth.testing.enabled": false, + "dom.canvas-text.enabled": false, "dom.compositionevent.enabled": false, "dom.customelements.enabled": false, "dom.forcetouch.enabled": false, diff --git a/tests/html/test_canvas_filltext.html b/tests/html/test_canvas_filltext.html new file mode 100644 index 00000000000..1a8783d2003 --- /dev/null +++ b/tests/html/test_canvas_filltext.html @@ -0,0 +1,18 @@ + + + + + + +