From 58d5438670866896d8e236db11367bc645d50432 Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Wed, 6 Aug 2014 22:02:47 +0900 Subject: [PATCH] Implement CanvasRenderingContext2D.canvas. --- .../script/dom/canvasrenderingcontext2d.rs | 15 +++++++++++---- src/components/script/dom/htmlcanvaselement.rs | 2 +- .../dom/webidls/CanvasRenderingContext2D.webidl | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/components/script/dom/canvasrenderingcontext2d.rs b/src/components/script/dom/canvasrenderingcontext2d.rs index d448425ef54..e1e30d3a4df 100644 --- a/src/components/script/dom/canvasrenderingcontext2d.rs +++ b/src/components/script/dom/canvasrenderingcontext2d.rs @@ -5,9 +5,10 @@ use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding; use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods; use dom::bindings::global::{GlobalRef, GlobalField}; -use dom::bindings::js::{JSRef, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::trace::Untraceable; use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object}; +use dom::htmlcanvaselement::HTMLCanvasElement; use geom::point::Point2D; use geom::rect::Rect; @@ -20,19 +21,21 @@ pub struct CanvasRenderingContext2D { reflector_: Reflector, global: GlobalField, renderer: Untraceable>, + canvas: JS, } impl CanvasRenderingContext2D { - pub fn new_inherited(global: &GlobalRef, size: Size2D) -> CanvasRenderingContext2D { + pub fn new_inherited(global: &GlobalRef, canvas: &JSRef, size: Size2D) -> CanvasRenderingContext2D { CanvasRenderingContext2D { reflector_: Reflector::new(), global: GlobalField::from_rooted(global), renderer: Untraceable::new(CanvasRenderTask::start(size)), + canvas: JS::from_rooted(canvas), } } - pub fn new(global: &GlobalRef, size: Size2D) -> Temporary { - reflect_dom_object(box CanvasRenderingContext2D::new_inherited(global, size), + pub fn new(global: &GlobalRef, canvas: &JSRef, size: Size2D) -> Temporary { + reflect_dom_object(box CanvasRenderingContext2D::new_inherited(global, canvas, size), global, CanvasRenderingContext2DBinding::Wrap) } @@ -42,6 +45,10 @@ impl CanvasRenderingContext2D { } impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> { + fn Canvas(&self) -> Temporary { + Temporary::new(self.canvas) + } + fn FillRect(&self, x: f64, y: f64, width: f64, height: f64) { let rect = Rect(Point2D(x as f32, y as f32), Size2D(width as f32, height as f32)); self.renderer.send(FillRect(rect)); diff --git a/src/components/script/dom/htmlcanvaselement.rs b/src/components/script/dom/htmlcanvaselement.rs index 509d246848e..4267a5df452 100644 --- a/src/components/script/dom/htmlcanvaselement.rs +++ b/src/components/script/dom/htmlcanvaselement.rs @@ -85,7 +85,7 @@ impl<'a> HTMLCanvasElementMethods for JSRef<'a, HTMLCanvasElement> { if self.context.get().is_none() { let window = window_from_node(self).root(); let (w, h) = (self.width.get() as i32, self.height.get() as i32); - let context = CanvasRenderingContext2D::new(&Window(*window), Size2D(w, h)); + let context = CanvasRenderingContext2D::new(&Window(*window), self, Size2D(w, h)); self.context.assign(Some(context)); } self.context.get().map(|context| Temporary::new(context)) diff --git a/src/components/script/dom/webidls/CanvasRenderingContext2D.webidl b/src/components/script/dom/webidls/CanvasRenderingContext2D.webidl index a465afc97b1..2043347bfd2 100644 --- a/src/components/script/dom/webidls/CanvasRenderingContext2D.webidl +++ b/src/components/script/dom/webidls/CanvasRenderingContext2D.webidl @@ -8,7 +8,7 @@ interface CanvasRenderingContext2D { // back-reference to the canvas - //readonly attribute HTMLCanvasElement canvas; + readonly attribute HTMLCanvasElement canvas; // canvas dimensions // attribute unsigned long width;