aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/element.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script/dom/element.rs')
-rw-r--r--src/components/script/dom/element.rs88
1 files changed, 52 insertions, 36 deletions
diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs
index 200ed604777..9e8be904788 100644
--- a/src/components/script/dom/element.rs
+++ b/src/components/script/dom/element.rs
@@ -15,12 +15,12 @@ use dom::bindings::error::{ErrorResult, Fallible, NamespaceError, InvalidCharact
use dom::bindings::utils::{QName, Name, InvalidXMLName, xml_name_type};
use dom::clientrect::ClientRect;
use dom::clientrectlist::ClientRectList;
-use dom::document::Document;
+use dom::document::{Document, DocumentHelpers};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlcollection::HTMLCollection;
use dom::htmlserializer::serialize;
use dom::node::{ElementNodeTypeId, Node, NodeHelpers, NodeIterator, document_from_node};
-use dom::node::window_from_node;
+use dom::node::{window_from_node, LayoutNodeHelpers};
use dom::virtualmethods::{VirtualMethods, vtable_for};
use layout_interface::ContentChangedDocumentDamage;
use layout_interface::MatchSelectorsDocumentDamage;
@@ -157,36 +157,51 @@ impl Element {
let element = Element::new_inherited(ElementTypeId, local_name, namespace, prefix, document.unrooted());
Node::reflect_node(~element, document, ElementBinding::Wrap)
}
+}
- pub fn html_element_in_html_document(&self) -> bool {
- let roots = RootCollection::new();
- self.namespace == namespace::HTML &&
- self.node.owner_doc().root(&roots).is_html_document
+pub trait RawLayoutElementHelpers {
+ unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str) -> Option<&'static str>;
+}
+
+impl RawLayoutElementHelpers for Element {
+ #[inline]
+ unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str)
+ -> Option<&'static str> {
+ self.attrs.iter().find(|attr: & &JS<Attr>| {
+ let attr = attr.unsafe_get();
+ name == (*attr).local_name && (*attr).namespace == *namespace
+ }).map(|attr| {
+ let attr = attr.unsafe_get();
+ cast::transmute((*attr).value.as_slice())
+ })
}
}
-impl Element {
- pub unsafe fn html_element_in_html_document_for_layout(&self) -> bool {
- if self.namespace != namespace::HTML {
+pub trait LayoutElementHelpers {
+ unsafe fn html_element_in_html_document_for_layout(&self) -> bool;
+}
+
+impl LayoutElementHelpers for JS<Element> {
+ unsafe fn html_element_in_html_document_for_layout(&self) -> bool {
+ if (*self.unsafe_get()).namespace != namespace::HTML {
return false
}
- let owner_doc: *JS<Document> = self.node.owner_doc_for_layout();
- let owner_doc: **Document = owner_doc as **Document;
- (**owner_doc).is_html_document
+ let node: JS<Node> = self.transmute_copy();
+ let owner_doc = node.owner_doc_for_layout().unsafe_get();
+ (*owner_doc).is_html_document
}
+}
- #[inline]
- pub unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str)
- -> Option<&'static str> {
- self.attrs.iter().find(|attr: & &JS<Attr>| {
- // unsafely avoid a borrow because this is accessed by many tasks
- // during parallel layout
- let attr: ***Attr = cast::transmute(attr);
- name == (***attr).local_name && (***attr).namespace == *namespace
- }).map(|attr| {
- let attr: **Attr = cast::transmute(attr);
- cast::transmute((**attr).value.as_slice())
- })
+pub trait ElementHelpers {
+ fn html_element_in_html_document(&self) -> bool;
+}
+
+impl<'a> ElementHelpers for JSRef<'a, Element> {
+ fn html_element_in_html_document(&self) -> bool {
+ let roots = RootCollection::new();
+ let is_html = self.namespace == namespace::HTML;
+ let node: &JSRef<Node> = NodeCast::from_ref(self);
+ is_html && node.owner_doc().root(&roots).is_html_document
}
}
@@ -214,7 +229,7 @@ pub trait AttributeHandlers {
impl<'a> AttributeHandlers for JSRef<'a, Element> {
fn get_attribute(&self, namespace: Namespace, name: &str) -> Option<Unrooted<Attr>> {
let roots = RootCollection::new();
- if self.get().html_element_in_html_document() {
+ if self.html_element_in_html_document() {
self.get().attrs.iter().map(|attr| attr.root(&roots)).find(|attr| {
name.to_ascii_lower() == attr.local_name && attr.namespace == namespace
}).map(|x| Unrooted::new_rooted(&*x))
@@ -248,7 +263,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
node.wait_until_safe_to_modify_dom();
let position: |&JSRef<Attr>| -> bool =
- if self.get().html_element_in_html_document() {
+ if self.html_element_in_html_document() {
|attr| attr.get().local_name.eq_ignore_ascii_case(local_name)
} else {
|attr| attr.get().local_name == local_name
@@ -453,7 +468,10 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
Some(ref list) => return Unrooted::new(list.clone()),
}
- let doc = self.node.owner_doc().root(&roots);
+ let doc = {
+ let node: &JSRef<Node> = NodeCast::from_ref(self);
+ node.owner_doc()
+ }.root(&roots);
let window = doc.deref().window.root(&roots);
let list = AttrList::new(&*window, self);
self.attr_list.assign(Some(list));
@@ -463,7 +481,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
// http://dom.spec.whatwg.org/#dom-element-getattribute
fn GetAttribute(&self, name: DOMString) -> Option<DOMString> {
let roots = RootCollection::new();
- let name = if self.get().html_element_in_html_document() {
+ let name = if self.html_element_in_html_document() {
name.to_ascii_lower()
} else {
name
@@ -488,7 +506,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
value: DOMString) -> ErrorResult {
{
let node: &JSRef<Node> = NodeCast::from_ref(self);
- node.get().wait_until_safe_to_modify_dom();
+ node.wait_until_safe_to_modify_dom();
}
// Step 1.
@@ -498,7 +516,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
}
// Step 2.
- let name = if self.get().html_element_in_html_document() {
+ let name = if self.html_element_in_html_document() {
name.to_ascii_lower()
} else {
name
@@ -518,7 +536,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
value: DOMString) -> ErrorResult {
{
let node: &JSRef<Node> = NodeCast::from_ref(self);
- node.get().wait_until_safe_to_modify_dom();
+ node.wait_until_safe_to_modify_dom();
}
// Step 1.
@@ -707,15 +725,14 @@ impl<'a> VirtualMethods for JSRef<'a, Element> {
match name.as_slice() {
"style" => {
let doc = document_from_node(self).root(&roots);
- let base_url = doc.get().url().clone();
+ let base_url = doc.deref().url().clone();
self.get_mut().style_attribute = Some(style::parse_style_attribute(value, &base_url))
}
"id" => {
let node: &JSRef<Node> = NodeCast::from_ref(self);
if node.is_in_doc() {
let mut doc = document_from_node(self).root(&roots);
- let doc_alias = (*doc).clone();
- doc.register_named_element(&doc_alias, self, value.clone());
+ doc.register_named_element(self, value.clone());
}
}
_ => ()
@@ -758,8 +775,7 @@ impl<'a> VirtualMethods for JSRef<'a, Element> {
match self.get_attribute(Null, "id").root(&roots) {
Some(attr) => {
let mut doc = document_from_node(self).root(&roots);
- let doc_alias = (*doc).clone();
- doc.register_named_element(&doc_alias, self, attr.deref().Value());
+ doc.register_named_element(self, attr.deref().Value());
}
_ => ()
}