diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2014-10-14 11:25:29 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2014-10-14 12:44:09 -0700 |
commit | 5f8d3f72d82c3c1b96c0ab9e5b21919f12743d2b (patch) | |
tree | 276c8c5e96c332b6c2c412b3af2e5e21a246d672 /components/script/dom/htmltablecellelement.rs | |
parent | 8077edc0622b04aeb26d42ced86ea285c9cac0e7 (diff) | |
download | servo-5f8d3f72d82c3c1b96c0ab9e5b21919f12743d2b.tar.gz servo-5f8d3f72d82c3c1b96c0ab9e5b21919f12743d2b.zip |
layout: Introduce support for legacy presentational attributes to selector
matching, and use it for `<input size>` and `<td width>`.
This implements a general framework for legacy presentational attributes
to the DOM and style calculation, so that adding more of them later will
be straightforward.
Diffstat (limited to 'components/script/dom/htmltablecellelement.rs')
-rw-r--r-- | components/script/dom/htmltablecellelement.rs | 59 |
1 files changed, 54 insertions, 5 deletions
diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 95bcebf5480..6bd2d735695 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -2,21 +2,28 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::bindings::codegen::InheritTypes::HTMLTableCellElementDerived; +use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLTableCellElementDerived}; use dom::bindings::js::JSRef; use dom::bindings::utils::{Reflectable, Reflector}; use dom::document::Document; -use dom::element::{ElementTypeId, HTMLTableDataCellElementTypeId, HTMLTableHeaderCellElementTypeId}; +use dom::element::{ElementTypeId, HTMLTableDataCellElementTypeId}; +use dom::element::{HTMLTableHeaderCellElementTypeId}; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; use dom::node::ElementNodeTypeId; -use servo_util::str::DOMString; +use dom::virtualmethods::VirtualMethods; + +use servo_util::str::{AutoLpa, DOMString, LengthOrPercentageOrAuto}; +use servo_util::str; +use std::cell::Cell; +use string_cache::Atom; #[jstraceable] #[must_root] #[privatize] pub struct HTMLTableCellElement { htmlelement: HTMLElement, + width: Cell<LengthOrPercentageOrAuto>, } impl HTMLTableCellElementDerived for EventTarget { @@ -32,16 +39,58 @@ impl HTMLTableCellElementDerived for EventTarget { impl HTMLTableCellElement { pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, prefix: Option<DOMString>, document: JSRef<Document>) -> HTMLTableCellElement { HTMLTableCellElement { - htmlelement: HTMLElement::new_inherited(type_id, tag_name, prefix, document) + htmlelement: HTMLElement::new_inherited(type_id, tag_name, prefix, document), + width: Cell::new(AutoLpa) } } #[inline] - pub fn htmlelement<'a>(&'a self) -> &'a HTMLElement { + pub fn htmlelement(&self) -> &HTMLElement { &self.htmlelement } } +pub trait HTMLTableCellElementHelpers { + fn get_width(&self) -> LengthOrPercentageOrAuto; +} + +impl HTMLTableCellElementHelpers for HTMLTableCellElement { + fn get_width(&self) -> LengthOrPercentageOrAuto { + self.width.get() + } +} + +impl<'a> VirtualMethods for JSRef<'a, HTMLTableCellElement> { + fn super_type<'a>(&'a self) -> Option<&'a VirtualMethods> { + let htmlelement: &JSRef<HTMLElement> = HTMLElementCast::from_borrowed_ref(self); + Some(htmlelement as &VirtualMethods) + } + + fn after_set_attr(&self, name: &Atom, value: DOMString) { + match self.super_type() { + Some(ref s) => s.after_set_attr(name, value.clone()), + _ => {} + } + + match name.as_slice() { + "width" => self.width.set(str::parse_length(value.as_slice())), + _ => {} + } + } + + fn before_remove_attr(&self, name: &Atom, value: DOMString) { + match self.super_type() { + Some(ref s) => s.before_remove_attr(name, value), + _ => {} + } + + match name.as_slice() { + "width" => self.width.set(AutoLpa), + _ => {} + } + } +} + impl Reflectable for HTMLTableCellElement { fn reflector<'a>(&'a self) -> &'a Reflector { self.htmlelement.reflector() |