diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 06f5107e3dc..9201b9a12e6 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -88,6 +88,7 @@ use dom::touchevent::TouchEvent; use dom::touchlist::TouchList; use dom::treewalker::TreeWalker; use dom::uievent::UIEvent; +use dom::virtualmethods::vtable_for; use dom::webglcontextevent::WebGLContextEvent; use dom::window::{ReflowReason, Window}; use dom::windowproxy::WindowProxy; @@ -2499,10 +2500,7 @@ impl Document { entry.hint.insert(RESTYLE_STYLE_ATTRIBUTE); } - // FIXME(emilio): This should become something like - // element.is_attribute_mapped(attr.local_name()). - if attr.local_name() == &local_name!("width") || - attr.local_name() == &local_name!("height") { + if vtable_for(el.upcast()).attribute_is_mapped(attr) { entry.hint.insert(RESTYLE_SELF); } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index a0c56046df9..7b7af8e7af8 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -2303,6 +2303,16 @@ impl VirtualMethods for Element { Some(self.upcast::() as &VirtualMethods) } + fn attribute_is_mapped(&self, attr: &Attr) -> bool { + // FIXME: This should be more fine-grained, not all elements care about these. + if attr.local_name() == &local_name!("width") || + attr.local_name() == &local_name!("height") { + return true; + } + + self.super_type().unwrap().attribute_is_mapped(attr) + } + fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { self.super_type().unwrap().attribute_mutated(attr, mutation); let node = self.upcast::(); diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs index 618c0d62240..3cd0aceab53 100644 --- a/components/script/dom/htmlfontelement.rs +++ b/components/script/dom/htmlfontelement.rs @@ -3,6 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::RGBA; +use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLFontElementBinding; use dom::bindings::codegen::Bindings::HTMLFontElementBinding::HTMLFontElementMethods; use dom::bindings::inheritance::Castable; @@ -70,6 +71,15 @@ impl VirtualMethods for HTMLFontElement { Some(self.upcast::() as &VirtualMethods) } + fn attribute_is_mapped(&self, attr: &Attr) -> bool { + if attr.local_name() == &local_name!("color") { + return true; + } + + // FIXME: Should also return true for `size` and `face` changes! + self.super_type().unwrap().attribute_is_mapped(attr) + } + fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue { match name { &local_name!("face") => AttrValue::from_atomic(value.into()), diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index ecb4d2ee559..c2ef31ef697 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -70,6 +70,15 @@ pub trait VirtualMethods { } } + /// Returns `true` if given attribute `attr` affects style of the + /// given element. + fn attribute_is_mapped(&self, attr: &Attr) -> bool { + match self.super_type() { + Some(s) => s.attribute_is_mapped(attr), + None => false + } + } + /// Returns the right AttrValue variant for the attribute with name `name` /// on this element. fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue { diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 91dc5cf0e16..0c94ab4a3c7 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -2231,6 +2231,18 @@ {} ] ], + "css/font_color_attribute_change.html": [ + [ + "/_mozilla/css/font_color_attribute_change.html", + [ + [ + "/_mozilla/css/font_color_attribute_change_ref.html", + "==" + ] + ], + {} + ] + ], "css/font_face_attribute.html": [ [ "/_mozilla/css/font_face_attribute.html", @@ -8768,6 +8780,11 @@ {} ] ], + "css/font_color_attribute_change_ref.html": [ + [ + {} + ] + ], "css/font_color_attribute_ref.html": [ [ {} @@ -24031,6 +24048,14 @@ "c26b839b729cae2d01ba7f2588852170bcc0b82e", "reftest" ], + "css/font_color_attribute_change.html": [ + "87c9ff1745eaecbbf2ac61d5d37a9c7e82c729a9", + "reftest" + ], + "css/font_color_attribute_change_ref.html": [ + "0c84fb819c07853ec125e52df465701ad6da7424", + "support" + ], "css/font_color_attribute_ref.html": [ "4a07819ffd7c7629ee13f428cf7243c99f3dfc63", "support" diff --git a/tests/wpt/mozilla/tests/css/font_color_attribute_change.html b/tests/wpt/mozilla/tests/css/font_color_attribute_change.html new file mode 100644 index 00000000000..f6c1df56c39 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/font_color_attribute_change.html @@ -0,0 +1,15 @@ + + + + + + + + + I should be green + + + diff --git a/tests/wpt/mozilla/tests/css/font_color_attribute_change_ref.html b/tests/wpt/mozilla/tests/css/font_color_attribute_change_ref.html new file mode 100644 index 00000000000..9b53db60c6f --- /dev/null +++ b/tests/wpt/mozilla/tests/css/font_color_attribute_change_ref.html @@ -0,0 +1,9 @@ + + + + + + + I should be green + +