diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2015-11-09 12:25:34 -0800 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2015-11-09 12:27:16 -0800 |
commit | 4b68fc18c32e889c1726e17bdcf7c0b1bac02b05 (patch) | |
tree | d95b28633c207c8489c17bf020cc8b9edc39203c /components/script/dom | |
parent | d8df028197505ca439363cdb05bed58fe9b4b726 (diff) | |
download | servo-4b68fc18c32e889c1726e17bdcf7c0b1bac02b05.tar.gz servo-4b68fc18c32e889c1726e17bdcf7c0b1bac02b05.zip |
Move storage of bgcolor for `<tr>` and `<tbody>`.
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/element.rs | 26 | ||||
-rw-r--r-- | components/script/dom/htmltablerowelement.rs | 47 | ||||
-rw-r--r-- | components/script/dom/htmltablesectionelement.rs | 45 | ||||
-rw-r--r-- | components/script/dom/macros.rs | 1 |
4 files changed, 56 insertions, 63 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 9c625dde32e..829383a4a62 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -48,8 +48,8 @@ use dom::htmllegendelement::HTMLLegendElement; use dom::htmloptgroupelement::HTMLOptGroupElement; use dom::htmltablecellelement::{HTMLTableCellElement, HTMLTableCellElementLayoutHelpers}; use dom::htmltableelement::{HTMLTableElement, HTMLTableElementLayoutHelpers}; -use dom::htmltablerowelement::HTMLTableRowElement; -use dom::htmltablesectionelement::HTMLTableSectionElement; +use dom::htmltablerowelement::{HTMLTableRowElement, HTMLTableRowElementLayoutHelpers}; +use dom::htmltablesectionelement::{HTMLTableSectionElement, HTMLTableSectionElementLayoutHelpers}; use dom::htmltemplateelement::HTMLTemplateElement; use dom::htmltextareaelement::{HTMLTextAreaElement, RawLayoutHTMLTextAreaElementHelpers}; use dom::namednodemap::NamedNodeMap; @@ -217,8 +217,6 @@ impl RawLayoutElementHelpers for Element { 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]>; @@ -231,8 +229,6 @@ pub trait LayoutElementHelpers { -> 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; @@ -246,15 +242,6 @@ pub trait LayoutElementHelpers { 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.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.unsafe_get(), &ns!(""), &atom!("class")).map_or(false, |attr| { attr.value_tokens_forever().unwrap().iter().any(|atom| atom == name) @@ -280,9 +267,9 @@ impl LayoutElementHelpers for LayoutJS<Element> { } else if let Some(this) = self.downcast::<HTMLTableCellElement>() { this.get_background_color() } else if let Some(this) = self.downcast::<HTMLTableRowElement>() { - (*this.unsafe_get()).get_background_color() + this.get_background_color() } else if let Some(this) = self.downcast::<HTMLTableSectionElement>() { - (*this.unsafe_get()).get_background_color() + this.get_background_color() } else { None }; @@ -539,11 +526,6 @@ impl LayoutElementHelpers for LayoutJS<Element> { } #[allow(unsafe_code)] - unsafe fn has_attr_for_layout(&self, namespace: &Namespace, name: &Atom) -> bool { - get_attr_for_layout(&*self.unsafe_get(), namespace, name).is_some() - } - - #[allow(unsafe_code)] fn id_attribute(&self) -> *const Option<Atom> { unsafe { (*self.unsafe_get()).id_attribute.borrow_for_layout() diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index aa14c9064a0..044c7df8183 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -3,22 +3,22 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::Attr; +use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLTableRowElementBinding::{self, HTMLTableRowElementMethods}; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::inheritance::Castable; -use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; +use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root, RootedReference}; use dom::document::Document; -use dom::element::{AttributeMutation, Element}; +use dom::element::{Element, RawLayoutElementHelpers}; use dom::htmlcollection::{CollectionFilter, HTMLCollection}; use dom::htmlelement::HTMLElement; use dom::htmltabledatacellelement::HTMLTableDataCellElement; use dom::htmltableheadercellelement::HTMLTableHeaderCellElement; use dom::node::{Node, window_from_node}; use dom::virtualmethods::VirtualMethods; -use std::cell::Cell; -use util::str::{self, DOMString}; +use string_cache::Atom; +use util::str::DOMString; #[derive(JSTraceable)] @@ -34,7 +34,6 @@ impl CollectionFilter for CellsFilter { pub struct HTMLTableRowElement { htmlelement: HTMLElement, cells: MutNullableHeap<JS<HTMLCollection>>, - background_color: Cell<Option<RGBA>>, } impl HTMLTableRowElement { @@ -43,7 +42,6 @@ impl HTMLTableRowElement { HTMLTableRowElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), cells: Default::default(), - background_color: Cell::new(None), } } @@ -54,10 +52,6 @@ impl HTMLTableRowElement { document, HTMLTableRowElementBinding::Wrap) } - - pub fn get_background_color(&self) -> Option<RGBA> { - self.background_color.get() - } } impl HTMLTableRowElementMethods for HTMLTableRowElement { @@ -65,7 +59,7 @@ impl HTMLTableRowElementMethods for HTMLTableRowElement { make_getter!(BgColor); // https://html.spec.whatwg.org/multipage/#dom-tr-bgcolor - make_setter!(SetBgColor, "bgcolor"); + make_legacy_color_setter!(SetBgColor, "bgcolor"); // https://html.spec.whatwg.org/multipage/#dom-tr-cells fn Cells(&self) -> Root<HTMLCollection> { @@ -95,20 +89,31 @@ impl HTMLTableRowElementMethods for HTMLTableRowElement { } } +pub trait HTMLTableRowElementLayoutHelpers { + fn get_background_color(&self) -> Option<RGBA>; +} + +#[allow(unsafe_code)] +impl HTMLTableRowElementLayoutHelpers for LayoutJS<HTMLTableRowElement> { + fn get_background_color(&self) -> Option<RGBA> { + unsafe { + (&*self.upcast::<Element>().unsafe_get()) + .get_attr_for_layout(&ns!(""), &atom!("bgcolor")) + .and_then(AttrValue::as_color) + .cloned() + } + } +} + impl VirtualMethods for HTMLTableRowElement { fn super_type(&self) -> Option<&VirtualMethods> { Some(self.upcast::<HTMLElement>() as &VirtualMethods) } - fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { - self.super_type().unwrap().attribute_mutated(attr, mutation); - match *attr.local_name() { - atom!(bgcolor) => { - self.background_color.set(mutation.new_value(attr).and_then(|value| { - str::parse_legacy_color(&value).ok() - })); - }, - _ => {}, + fn parse_plain_attribute(&self, local_name: &Atom, value: DOMString) -> AttrValue { + match *local_name { + atom!("bgcolor") => AttrValue::from_legacy_color(value), + _ => self.super_type().unwrap().parse_plain_attribute(local_name, value), } } } diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs index 296d1c93dbe..94010724ded 100644 --- a/components/script/dom/htmltablesectionelement.rs +++ b/components/script/dom/htmltablesectionelement.rs @@ -3,26 +3,25 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; -use dom::attr::Attr; +use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLTableSectionElementBinding::{self, HTMLTableSectionElementMethods}; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::inheritance::Castable; -use dom::bindings::js::{Root, RootedReference}; +use dom::bindings::js::{LayoutJS, Root, RootedReference}; use dom::document::Document; -use dom::element::{AttributeMutation, Element}; +use dom::element::{Element, RawLayoutElementHelpers}; use dom::htmlcollection::{CollectionFilter, HTMLCollection}; use dom::htmlelement::HTMLElement; use dom::htmltablerowelement::HTMLTableRowElement; use dom::node::{Node, window_from_node}; use dom::virtualmethods::VirtualMethods; -use std::cell::Cell; -use util::str::{self, DOMString}; +use string_cache::Atom; +use util::str::DOMString; #[dom_struct] pub struct HTMLTableSectionElement { htmlelement: HTMLElement, - background_color: Cell<Option<RGBA>>, } impl HTMLTableSectionElement { @@ -30,7 +29,6 @@ impl HTMLTableSectionElement { -> HTMLTableSectionElement { HTMLTableSectionElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), - background_color: Cell::new(None), } } @@ -40,10 +38,6 @@ impl HTMLTableSectionElement { let element = HTMLTableSectionElement::new_inherited(localName, prefix, document); Node::reflect_node(box element, document, HTMLTableSectionElementBinding::Wrap) } - - pub fn get_background_color(&self) -> Option<RGBA> { - self.background_color.get() - } } #[derive(JSTraceable)] @@ -80,20 +74,31 @@ impl HTMLTableSectionElementMethods for HTMLTableSectionElement { } } +pub trait HTMLTableSectionElementLayoutHelpers { + fn get_background_color(&self) -> Option<RGBA>; +} + +#[allow(unsafe_code)] +impl HTMLTableSectionElementLayoutHelpers for LayoutJS<HTMLTableSectionElement> { + fn get_background_color(&self) -> Option<RGBA> { + unsafe { + (&*self.upcast::<Element>().unsafe_get()) + .get_attr_for_layout(&ns!(""), &atom!("bgcolor")) + .and_then(AttrValue::as_color) + .cloned() + } + } +} + impl VirtualMethods for HTMLTableSectionElement { fn super_type(&self) -> Option<&VirtualMethods> { Some(self.upcast::<HTMLElement>() as &VirtualMethods) } - fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { - self.super_type().unwrap().attribute_mutated(attr, mutation); - match *attr.local_name() { - atom!(bgcolor) => { - self.background_color.set(mutation.new_value(attr).and_then(|value| { - str::parse_legacy_color(&value).ok() - })); - }, - _ => {}, + fn parse_plain_attribute(&self, local_name: &Atom, value: DOMString) -> AttrValue { + match *local_name { + atom!("bgcolor") => AttrValue::from_legacy_color(value), + _ => self.super_type().unwrap().parse_plain_attribute(local_name, value), } } } diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index d230bec5404..f02ffab5b07 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -219,6 +219,7 @@ macro_rules! make_atomic_setter( macro_rules! make_legacy_color_setter( ( $attr:ident, $htmlname:expr ) => ( fn $attr(&self, value: DOMString) { + use dom::attr::AttrValue; use dom::bindings::inheritance::Castable; use dom::element::Element; use string_cache::Atom; |