Handle dynamic font color change

This commit is contained in:
P. Albrecht 2017-09-07 11:24:34 +02:00
parent 54cd23adb8
commit 8161d1931d
7 changed files with 80 additions and 4 deletions

View file

@ -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);
}

View file

@ -2303,6 +2303,16 @@ impl VirtualMethods for Element {
Some(self.upcast::<Node>() 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::<Node>();

View file

@ -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::<HTMLElement>() 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()),

View file

@ -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 {