aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/htmlimageelement.rs
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2014-05-03 14:25:22 -0400
committerbors-servo <release+servo@mozilla.com>2014-05-03 14:25:22 -0400
commit731e66ff132e41cdc49bc5324c0e15be19c46ec2 (patch)
treeccce9b42e8a6c54245e53620082efe0b9840eae1 /src/components/script/dom/htmlimageelement.rs
parent4051a8096d7ba7e7f9c86e76d0b4bffd83e85805 (diff)
parent91278da9dd55582401154e07f9eea34425a332c2 (diff)
downloadservo-731e66ff132e41cdc49bc5324c0e15be19c46ec2.tar.gz
servo-731e66ff132e41cdc49bc5324c0e15be19c46ec2.zip
auto merge of #2101 : jdm/servo/newroot_rebase, r=Ms2ger
As described in #1764, this strategy uses the following properties: * DOM members are `JS<T>` types. These cannot be used with being explicitly rooted, but they are required for compiler-derived trace hooks. * Methods that take DOM type arguments receive `&[mut] JSRef<T>`. These are rooted value references that are cloneable but cannot escape. * Methods that return DOM values use `Unrooted<T>`. These are values that may or may not be rooted elsewhere, but callers must root them in order to interact with them in any way. One unsoundness hole exists - `Unrooted` values must be rooted ASAP, or there exists the danger that JSAPI calls could be made that could cause the underlying JS value to be GCed. * All methods are implemented on `JSRef<T>`, enforcing the requirement that all DOM values are rooted for the duration of a method call (with a few exceptions for layout-related code, which cannot root values and therefore interacts with `JS<T>` and `&T` values - this is safe under the assumption that layout code interacts with DOM nodes that are in the tree, therefore rooted, and does not run concurrently with content code)
Diffstat (limited to 'src/components/script/dom/htmlimageelement.rs')
-rw-r--r--src/components/script/dom/htmlimageelement.rs211
1 files changed, 128 insertions, 83 deletions
diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs
index 6bb7096fcde..c3a60874c6d 100644
--- a/src/components/script/dom/htmlimageelement.rs
+++ b/src/components/script/dom/htmlimageelement.rs
@@ -5,7 +5,7 @@
use dom::bindings::codegen::BindingDeclarations::HTMLImageElementBinding;
use dom::bindings::codegen::InheritTypes::{NodeCast, ElementCast, HTMLElementCast, HTMLImageElementDerived};
use dom::bindings::error::ErrorResult;
-use dom::bindings::js::JS;
+use dom::bindings::js::{JS, JSRef, Temporary};
use dom::bindings::trace::Untraceable;
use dom::document::Document;
use dom::element::{Element, HTMLImageElementTypeId};
@@ -35,31 +35,18 @@ impl HTMLImageElementDerived for EventTarget {
}
}
-impl HTMLImageElement {
- pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLImageElement {
- HTMLImageElement {
- htmlelement: HTMLElement::new_inherited(HTMLImageElementTypeId, localName, document),
- image: Untraceable::new(None),
- }
- }
-
- pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLImageElement> {
- let element = HTMLImageElement::new_inherited(localName, document.clone());
- Node::reflect_node(~element, document, HTMLImageElementBinding::Wrap)
- }
+trait PrivateHTMLImageElementHelpers {
+ fn update_image(&mut self, value: Option<DOMString>, url: Option<Url>);
}
-impl HTMLImageElement {
- pub fn image<'a>(&'a self) -> &'a Option<Url> {
- &*self.image
- }
-
+impl<'a> PrivateHTMLImageElementHelpers for JSRef<'a, HTMLImageElement> {
/// Makes the local `image` member match the status of the `src` attribute and starts
/// prefetching the image. This method must be called after `src` is changed.
fn update_image(&mut self, value: Option<DOMString>, url: Option<Url>) {
- let elem = &mut self.htmlelement.element;
- let document = elem.node.owner_doc();
- let window = document.get().window.get();
+ let self_alias = self.clone();
+ let node_alias: &JSRef<Node> = NodeCast::from_ref(&self_alias);
+ let document = node_alias.owner_doc().root();
+ let window = document.deref().window.root();
let image_cache = &window.image_cache_task;
match value {
None => {
@@ -78,154 +65,212 @@ impl HTMLImageElement {
}
}
}
+}
+
+impl HTMLImageElement {
+ pub fn new_inherited(localName: DOMString, document: &JSRef<Document>) -> HTMLImageElement {
+ HTMLImageElement {
+ htmlelement: HTMLElement::new_inherited(HTMLImageElementTypeId, localName, document),
+ image: Untraceable::new(None),
+ }
+ }
+
+ pub fn new(localName: DOMString, document: &JSRef<Document>) -> Temporary<HTMLImageElement> {
+ let element = HTMLImageElement::new_inherited(localName, document);
+ Node::reflect_node(~element, document, HTMLImageElementBinding::Wrap)
+ }
+}
+
+pub trait LayoutHTMLImageElementHelpers {
+ unsafe fn image<'a>(&'a self) -> &'a Option<Url>;
+}
+
+impl LayoutHTMLImageElementHelpers for JS<HTMLImageElement> {
+ unsafe fn image<'a>(&'a self) -> &'a Option<Url> {
+ &*(*self.unsafe_get()).image
+ }
+}
+
+pub trait HTMLImageElementMethods {
+ fn Alt(&self) -> DOMString;
+ fn SetAlt(&mut self, alt: DOMString);
+ fn Src(&self) -> DOMString;
+ fn SetSrc(&mut self, src: DOMString);
+ fn CrossOrigin(&self) -> DOMString;
+ fn SetCrossOrigin(&mut self, _cross_origin: DOMString) -> ErrorResult;
+ fn UseMap(&self) -> DOMString;
+ fn SetUseMap(&mut self, use_map: DOMString);
+ fn IsMap(&self) -> bool;
+ fn SetIsMap(&mut self, is_map: bool);
+ fn Width(&self) -> u32;
+ fn SetWidth(&mut self, width: u32);
+ fn Height(&self) -> u32;
+ fn SetHeight(&mut self, height: u32);
+ fn NaturalWidth(&self) -> u32;
+ fn NaturalHeight(&self) -> u32;
+ fn Complete(&self) -> bool;
+ fn Name(&self) -> DOMString;
+ fn SetName(&mut self, name: DOMString);
+ fn Align(&self) -> DOMString;
+ fn SetAlign(&mut self, align: DOMString);
+ fn Hspace(&self) -> u32;
+ fn SetHspace(&mut self, hspace: u32);
+ fn Vspace(&self) -> u32;
+ fn SetVspace(&mut self, vspace: u32);
+ fn LongDesc(&self) -> DOMString;
+ fn SetLongDesc(&mut self, longdesc: DOMString);
+ fn Border(&self) -> DOMString;
+ fn SetBorder(&mut self, border: DOMString);
+}
- pub fn Alt(&self, abstract_self: &JS<HTMLImageElement>) -> DOMString {
- let element: JS<Element> = ElementCast::from(abstract_self);
+impl<'a> HTMLImageElementMethods for JSRef<'a, HTMLImageElement> {
+ fn Alt(&self) -> DOMString {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
element.get_string_attribute("alt")
}
- pub fn SetAlt(&mut self, abstract_self: &JS<HTMLImageElement>, alt: DOMString) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetAlt(&mut self, alt: DOMString) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_string_attribute("alt", alt)
}
- pub fn Src(&self, abstract_self: &JS<HTMLImageElement>) -> DOMString {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn Src(&self) -> DOMString {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
element.get_string_attribute("src")
}
- pub fn SetSrc(&mut self, abstract_self: &mut JS<HTMLImageElement>, src: DOMString) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetSrc(&mut self, src: DOMString) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_url_attribute("src", src)
}
- pub fn CrossOrigin(&self) -> DOMString {
+ fn CrossOrigin(&self) -> DOMString {
~""
}
- pub fn SetCrossOrigin(&mut self, _cross_origin: DOMString) -> ErrorResult {
+ fn SetCrossOrigin(&mut self, _cross_origin: DOMString) -> ErrorResult {
Ok(())
}
- pub fn UseMap(&self, abstract_self: &JS<HTMLImageElement>) -> DOMString {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn UseMap(&self) -> DOMString {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
element.get_string_attribute("useMap")
}
- pub fn SetUseMap(&mut self, abstract_self: &mut JS<HTMLImageElement>, use_map: DOMString) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetUseMap(&mut self, use_map: DOMString) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_string_attribute("useMap", use_map)
}
- pub fn IsMap(&self, abstract_self: &JS<HTMLImageElement>) -> bool {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn IsMap(&self) -> bool {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
from_str::<bool>(element.get_string_attribute("hspace")).unwrap()
}
- pub fn SetIsMap(&self, abstract_self: &mut JS<HTMLImageElement>, is_map: bool) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetIsMap(&mut self, is_map: bool) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_string_attribute("isMap", is_map.to_str())
}
- pub fn Width(&self, abstract_self: &JS<HTMLImageElement>) -> u32 {
- let node: JS<Node> = NodeCast::from(abstract_self);
+ fn Width(&self) -> u32 {
+ let node: &JSRef<Node> = NodeCast::from_ref(self);
let rect = node.get_bounding_content_box();
to_px(rect.size.width) as u32
}
- pub fn SetWidth(&mut self, abstract_self: &JS<HTMLImageElement>, width: u32) {
- let mut elem: JS<Element> = ElementCast::from(abstract_self);
+ fn SetWidth(&mut self, width: u32) {
+ let elem: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
elem.set_uint_attribute("width", width)
}
- pub fn Height(&self, abstract_self: &JS<HTMLImageElement>) -> u32 {
- let node: JS<Node> = NodeCast::from(abstract_self);
+ fn Height(&self) -> u32 {
+ let node: &JSRef<Node> = NodeCast::from_ref(self);
let rect = node.get_bounding_content_box();
to_px(rect.size.height) as u32
}
- pub fn SetHeight(&mut self, abstract_self: &JS<HTMLImageElement>, height: u32) {
- let mut elem: JS<Element> = ElementCast::from(abstract_self);
+ fn SetHeight(&mut self, height: u32) {
+ let elem: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
elem.set_uint_attribute("height", height)
}
- pub fn NaturalWidth(&self) -> u32 {
+ fn NaturalWidth(&self) -> u32 {
0
}
- pub fn NaturalHeight(&self) -> u32 {
+ fn NaturalHeight(&self) -> u32 {
0
}
- pub fn Complete(&self) -> bool {
+ fn Complete(&self) -> bool {
false
}
- pub fn Name(&self, abstract_self: &JS<HTMLImageElement>) -> DOMString {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn Name(&self) -> DOMString {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
element.get_string_attribute("name")
}
- pub fn SetName(&mut self, abstract_self: &mut JS<HTMLImageElement>, name: DOMString) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetName(&mut self, name: DOMString) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_string_attribute("name", name)
}
- pub fn Align(&self, abstract_self: &JS<HTMLImageElement>) -> DOMString {
- let element: JS<Element> = ElementCast::from(abstract_self);
- element.get_string_attribute("longdesc")
+ fn Align(&self) -> DOMString {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
+ element.get_string_attribute("align")
}
- pub fn SetAlign(&mut self, abstract_self: &mut JS<HTMLImageElement>, align: DOMString) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetAlign(&mut self, align: DOMString) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_string_attribute("align", align)
}
- pub fn Hspace(&self, abstract_self: &JS<HTMLImageElement>) -> u32 {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn Hspace(&self) -> u32 {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
from_str::<u32>(element.get_string_attribute("hspace")).unwrap()
}
- pub fn SetHspace(&mut self, abstract_self: &mut JS<HTMLImageElement>, hspace: u32) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetHspace(&mut self, hspace: u32) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_uint_attribute("hspace", hspace)
}
- pub fn Vspace(&self, abstract_self: &JS<HTMLImageElement>) -> u32 {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn Vspace(&self) -> u32 {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
from_str::<u32>(element.get_string_attribute("vspace")).unwrap()
}
- pub fn SetVspace(&mut self, abstract_self: &mut JS<HTMLImageElement>, vspace: u32) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetVspace(&mut self, vspace: u32) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_uint_attribute("vspace", vspace)
}
- pub fn LongDesc(&self, abstract_self: &JS<HTMLImageElement>) -> DOMString {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn LongDesc(&self) -> DOMString {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
element.get_string_attribute("longdesc")
}
- pub fn SetLongDesc(&mut self, abstract_self: &mut JS<HTMLImageElement>, longdesc: DOMString) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetLongDesc(&mut self, longdesc: DOMString) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_string_attribute("longdesc", longdesc)
}
- pub fn Border(&self, abstract_self: &JS<HTMLImageElement>) -> DOMString {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn Border(&self) -> DOMString {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
element.get_string_attribute("border")
}
- pub fn SetBorder(&mut self, abstract_self: &mut JS<HTMLImageElement>, border: DOMString) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetBorder(&mut self, border: DOMString) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_string_attribute("border", border)
}
}
-impl VirtualMethods for JS<HTMLImageElement> {
- fn super_type(&self) -> Option<~VirtualMethods:> {
- let htmlelement: JS<HTMLElement> = HTMLElementCast::from(self);
- Some(~htmlelement as ~VirtualMethods:)
+impl<'a> VirtualMethods for JSRef<'a, HTMLImageElement> {
+ fn super_type<'a>(&'a mut self) -> Option<&'a mut VirtualMethods:> {
+ let htmlelement: &mut JSRef<HTMLElement> = HTMLElementCast::from_mut_ref(self);
+ Some(htmlelement as &mut VirtualMethods:)
}
fn after_set_attr(&mut self, name: DOMString, value: DOMString) {
@@ -235,9 +280,9 @@ impl VirtualMethods for JS<HTMLImageElement> {
}
if "src" == name {
- let window = window_from_node(self);
- let url = Some(window.get().get_url());
- self.get_mut().update_image(Some(value), url);
+ let window = window_from_node(self).root();
+ let url = Some(window.deref().get_url());
+ self.update_image(Some(value), url);
}
}
@@ -248,7 +293,7 @@ impl VirtualMethods for JS<HTMLImageElement> {
}
if "src" == name {
- self.get_mut().update_image(None, None);
+ self.update_image(None, None);
}
}
}