aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/element.rs
diff options
context:
space:
mode:
authorMs2ger <Ms2ger@gmail.com>2015-10-05 11:40:34 +0200
committerMs2ger <Ms2ger@gmail.com>2015-10-05 11:40:37 +0200
commit1552022d96730df14801a5283ee28eb3f5ecb68e (patch)
treeb5190ac05e9dd606d7c545cb0969822f90dddff4 /components/script/dom/element.rs
parent7debfd1f4c30a018f46caa1e6bffa165e1ef7515 (diff)
downloadservo-1552022d96730df14801a5283ee28eb3f5ecb68e.tar.gz
servo-1552022d96730df14801a5283ee28eb3f5ecb68e.zip
Move some methods from RawLayoutElementHelpers to LayoutElementHelpers.
This is part of a long-term plan to ensure layout never has access to unwrapped pointers to DOM objects. The remaining methods on the RawLayoutElementHelpers trait are harder to move, because of the lifetimes in their signatures.
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r--components/script/dom/element.rs140
1 files changed, 75 insertions, 65 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index d1db97128f0..dd4bff543e0 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -163,14 +163,6 @@ pub trait RawLayoutElementHelpers {
unsafe fn get_attr_val_for_layout<'a>(&'a self, namespace: &Namespace, name: &Atom)
-> Option<&'a str>;
unsafe fn get_attr_vals_for_layout<'a>(&'a self, name: &Atom) -> Vec<&'a str>;
- unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &Atom) -> Option<Atom>;
- unsafe fn has_class_for_layout(&self, name: &Atom) -> bool;
- unsafe fn get_classes_for_layout(&self) -> Option<&'static [Atom]>;
-
- unsafe fn synthesize_presentational_hints_for_legacy_attributes<V>(&self, &mut V)
- where V: VecLike<DeclarationBlock<Vec<PropertyDeclaration>>>;
- unsafe fn get_unsigned_integer_attribute_for_layout(&self, attribute: UnsignedIntegerAttribute)
- -> Option<u32>;
}
#[inline]
@@ -215,42 +207,74 @@ impl RawLayoutElementHelpers for Element {
}
}).collect()
}
+}
+
+pub trait LayoutElementHelpers {
+ #[allow(unsafe_code)]
+ unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &Atom) -> Option<Atom>;
+ #[allow(unsafe_code)]
+ unsafe fn has_class_for_layout(&self, name: &Atom) -> bool;
+ #[allow(unsafe_code)]
+ unsafe fn get_classes_for_layout(&self) -> Option<&'static [Atom]>;
+
+ #[allow(unsafe_code)]
+ unsafe fn synthesize_presentational_hints_for_legacy_attributes<V>(&self, &mut V)
+ where V: VecLike<DeclarationBlock<Vec<PropertyDeclaration>>>;
+ #[allow(unsafe_code)]
+ unsafe fn get_unsigned_integer_attribute_for_layout(&self, attribute: UnsignedIntegerAttribute)
+ -> Option<u32>;
+ #[allow(unsafe_code)]
+ unsafe fn html_element_in_html_document_for_layout(&self) -> bool;
+ #[allow(unsafe_code)]
+ unsafe fn has_attr_for_layout(&self, namespace: &Namespace, name: &Atom) -> bool;
+ fn id_attribute(&self) -> *const Option<Atom>;
+ fn style_attribute(&self) -> *const Option<PropertyDeclarationBlock>;
+ fn local_name(&self) -> &Atom;
+ fn namespace(&self) -> &Namespace;
+ fn get_checked_state_for_layout(&self) -> bool;
+ fn get_indeterminate_state_for_layout(&self) -> bool;
+}
+impl LayoutElementHelpers for LayoutJS<Element> {
+ #[allow(unsafe_code)]
#[inline]
unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &Atom)
-> Option<Atom> {
- get_attr_for_layout(self, namespace, name).and_then(|attr| {
+ get_attr_for_layout(&*self.unsafe_get(), namespace, name).and_then(|attr| {
attr.value_atom_forever()
})
}
+ #[allow(unsafe_code)]
#[inline]
unsafe fn has_class_for_layout(&self, name: &Atom) -> bool {
- get_attr_for_layout(self, &ns!(""), &atom!("class")).map_or(false, |attr| {
+ get_attr_for_layout(&*self.unsafe_get(), &ns!(""), &atom!("class")).map_or(false, |attr| {
attr.value_tokens_forever().unwrap().iter().any(|atom| atom == name)
})
}
+ #[allow(unsafe_code)]
#[inline]
unsafe fn get_classes_for_layout(&self) -> Option<&'static [Atom]> {
- get_attr_for_layout(self, &ns!(""), &atom!("class")).map(|attr| {
+ get_attr_for_layout(&*self.unsafe_get(), &ns!(""), &atom!("class")).map(|attr| {
attr.value_tokens_forever().unwrap()
})
}
+ #[allow(unsafe_code)]
unsafe fn synthesize_presentational_hints_for_legacy_attributes<V>(&self, hints: &mut V)
where V: VecLike<DeclarationBlock<Vec<PropertyDeclaration>>>
{
- let bgcolor = if let Some(this) = HTMLBodyElementCast::to_ref(self) {
- this.get_background_color()
- } else if let Some(this) = HTMLTableElementCast::to_ref(self) {
- this.get_background_color()
- } else if let Some(this) = HTMLTableCellElementCast::to_ref(self) {
- this.get_background_color()
- } else if let Some(this) = HTMLTableRowElementCast::to_ref(self) {
- this.get_background_color()
- } else if let Some(this) = HTMLTableSectionElementCast::to_ref(self) {
- this.get_background_color()
+ let bgcolor = if let Some(this) = HTMLBodyElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_background_color()
+ } else if let Some(this) = HTMLTableElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_background_color()
+ } else if let Some(this) = HTMLTableCellElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_background_color()
+ } else if let Some(this) = HTMLTableRowElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_background_color()
+ } else if let Some(this) = HTMLTableSectionElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_background_color()
} else {
None
};
@@ -261,8 +285,8 @@ impl RawLayoutElementHelpers for Element {
CSSColor { parsed: Color::RGBA(color), authored: None }))));
}
- let background = if let Some(this) = HTMLBodyElementCast::to_ref(self) {
- this.get_background()
+ let background = if let Some(this) = HTMLBodyElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_background()
} else {
None
};
@@ -273,8 +297,8 @@ impl RawLayoutElementHelpers for Element {
background_image::SpecifiedValue(Some(specified::Image::Url(url)))))));
}
- let color = if let Some(this) = HTMLFontElementCast::to_ref(self) {
- this.get_color()
+ let color = if let Some(this) = HTMLFontElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_color()
} else {
None
};
@@ -287,8 +311,8 @@ impl RawLayoutElementHelpers for Element {
}))));
}
- let font_family = if let Some(this) = HTMLFontElementCast::to_ref(self) {
- this.get_face()
+ let font_family = if let Some(this) = HTMLFontElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_face()
} else {
None
};
@@ -302,8 +326,8 @@ impl RawLayoutElementHelpers for Element {
font_family)])))));
}
- let font_size = if let Some(this) = HTMLFontElementCast::to_ref(self) {
- this.get_size()
+ let font_size = if let Some(this) = HTMLFontElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_size()
} else {
None
};
@@ -315,8 +339,8 @@ impl RawLayoutElementHelpers for Element {
font_size::SpecifiedValue(font_size)))))
}
- let cellspacing = if let Some(this) = HTMLTableElementCast::to_ref(self) {
- this.get_cellspacing()
+ let cellspacing = if let Some(this) = HTMLTableElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_cellspacing()
} else {
None
};
@@ -332,13 +356,13 @@ impl RawLayoutElementHelpers for Element {
}
- let size = if let Some(this) = HTMLInputElementCast::to_ref(self) {
+ let size = if let Some(this) = HTMLInputElementCast::to_layout_js(self) {
// FIXME(pcwalton): More use of atoms, please!
// FIXME(Ms2ger): this is nonsense! Invalid values also end up as
// a text field
- match self.get_attr_val_for_layout(&ns!(""), &atom!("type")) {
+ match (*self.unsafe_get()).get_attr_val_for_layout(&ns!(""), &atom!("type")) {
Some("text") | Some("password") => {
- match this.get_size_for_layout() {
+ match (*this.unsafe_get()).get_size_for_layout() {
0 => None,
s => Some(s as i32),
}
@@ -358,12 +382,12 @@ impl RawLayoutElementHelpers for Element {
}
- let width = if let Some(this) = HTMLIFrameElementCast::to_ref(self) {
- this.get_width()
- } else if let Some(this) = HTMLTableElementCast::to_ref(self) {
- this.get_width()
- } else if let Some(this) = HTMLTableCellElementCast::to_ref(self) {
- this.get_width()
+ let width = if let Some(this) = HTMLIFrameElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_width()
+ } else if let Some(this) = HTMLTableElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_width()
+ } else if let Some(this) = HTMLTableCellElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_width()
} else {
LengthOrPercentageOrAuto::Auto
};
@@ -385,8 +409,8 @@ impl RawLayoutElementHelpers for Element {
}
- let height = if let Some(this) = HTMLIFrameElementCast::to_ref(self) {
- this.get_height()
+ let height = if let Some(this) = HTMLIFrameElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_height()
} else {
LengthOrPercentageOrAuto::Auto
};
@@ -408,8 +432,8 @@ impl RawLayoutElementHelpers for Element {
}
- let cols = if let Some(this) = HTMLTextAreaElementCast::to_ref(self) {
- match this.get_cols_for_layout() {
+ let cols = if let Some(this) = HTMLTextAreaElementCast::to_layout_js(self) {
+ match (*this.unsafe_get()).get_cols_for_layout() {
0 => None,
c => Some(c as i32),
}
@@ -430,8 +454,8 @@ impl RawLayoutElementHelpers for Element {
}
- let rows = if let Some(this) = HTMLTextAreaElementCast::to_ref(self) {
- match this.get_rows_for_layout() {
+ let rows = if let Some(this) = HTMLTextAreaElementCast::to_layout_js(self) {
+ match (*this.unsafe_get()).get_rows_for_layout() {
0 => None,
r => Some(r as i32),
}
@@ -450,8 +474,8 @@ impl RawLayoutElementHelpers for Element {
}
- let border = if let Some(this) = HTMLTableElementCast::to_ref(self) {
- this.get_border()
+ let border = if let Some(this) = HTMLTableElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_border()
} else {
None
};
@@ -473,13 +497,14 @@ impl RawLayoutElementHelpers for Element {
}
}
+ #[allow(unsafe_code)]
unsafe fn get_unsigned_integer_attribute_for_layout(&self,
attribute: UnsignedIntegerAttribute)
-> Option<u32> {
match attribute {
UnsignedIntegerAttribute::ColSpan => {
- if let Some(this) = HTMLTableCellElementCast::to_ref(self) {
- this.get_colspan()
+ if let Some(this) = HTMLTableCellElementCast::to_layout_js(self) {
+ (*this.unsafe_get()).get_colspan()
} else {
// Don't panic since `display` can cause this to be called on arbitrary
// elements.
@@ -488,22 +513,7 @@ impl RawLayoutElementHelpers for Element {
}
}
}
-}
-pub trait LayoutElementHelpers {
- #[allow(unsafe_code)]
- unsafe fn html_element_in_html_document_for_layout(&self) -> bool;
- #[allow(unsafe_code)]
- unsafe fn has_attr_for_layout(&self, namespace: &Namespace, name: &Atom) -> bool;
- fn id_attribute(&self) -> *const Option<Atom>;
- fn style_attribute(&self) -> *const Option<PropertyDeclarationBlock>;
- fn local_name(&self) -> &Atom;
- fn namespace(&self) -> &Namespace;
- fn get_checked_state_for_layout(&self) -> bool;
- fn get_indeterminate_state_for_layout(&self) -> bool;
-}
-
-impl LayoutElementHelpers for LayoutJS<Element> {
#[inline]
#[allow(unsafe_code)]
unsafe fn html_element_in_html_document_for_layout(&self) -> bool {