diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2015-05-08 12:55:32 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2015-05-19 16:31:20 -0700 |
commit | 7d9eda916be7b9bd95a34e90c7aef17ce5cb0a17 (patch) | |
tree | 48e521a29b2924056c80d190d22198d37807c459 /components/script/dom | |
parent | c981e9b2e36d4428cd3d55c7f2073f398251e777 (diff) | |
download | servo-7d9eda916be7b9bd95a34e90c7aef17ce5cb0a17.tar.gz servo-7d9eda916be7b9bd95a34e90c7aef17ce5cb0a17.zip |
script: Implement the `color` attribute of the `<font>` element.
Improves Hacker News.
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/element.rs | 20 | ||||
-rw-r--r-- | components/script/dom/htmlfontelement.rs | 62 | ||||
-rw-r--r-- | components/script/dom/virtualmethods.rs | 10 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLFontElement.webidl | 2 |
4 files changed, 86 insertions, 8 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index f0ff55e2e5b..e8ae592e63c 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -17,7 +17,8 @@ use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementM use dom::bindings::codegen::Bindings::NamedNodeMapBinding::NamedNodeMapMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::InheritTypes::{ElementCast, ElementDerived, EventTargetCast}; -use dom::bindings::codegen::InheritTypes::{HTMLBodyElementDerived, HTMLInputElementCast}; +use dom::bindings::codegen::InheritTypes::{HTMLBodyElementDerived, HTMLFontElementDerived}; +use dom::bindings::codegen::InheritTypes::{HTMLInputElementCast}; use dom::bindings::codegen::InheritTypes::{HTMLInputElementDerived, HTMLTableElementCast}; use dom::bindings::codegen::InheritTypes::{HTMLTableElementDerived, HTMLTableCellElementDerived}; use dom::bindings::codegen::InheritTypes::{HTMLTableRowElementDerived, HTMLTextAreaElementDerived}; @@ -45,6 +46,7 @@ use dom::htmlanchorelement::HTMLAnchorElement; use dom::htmlbodyelement::{HTMLBodyElement, HTMLBodyElementHelpers}; use dom::htmlcollection::HTMLCollection; use dom::htmlelement::HTMLElementTypeId; +use dom::htmlfontelement::{HTMLFontElement, HTMLFontElementHelpers}; use dom::htmlinputelement::{HTMLInputElement, RawLayoutHTMLInputElementHelpers, HTMLInputElementHelpers}; use dom::htmltableelement::{HTMLTableElement, HTMLTableElementHelpers}; use dom::htmltablecellelement::{HTMLTableCellElement, HTMLTableCellElementHelpers}; @@ -64,7 +66,7 @@ use style::properties::{PropertyDeclarationBlock, PropertyDeclaration, parse_sty use style::properties::DeclaredValue::SpecifiedValue; use style::properties::longhands::{self, border_spacing}; use style::values::CSSFloat; -use style::values::specified::{self, CSSColor}; +use style::values::specified::{self, CSSColor, CSSRGBA}; use util::geometry::Au; use util::namespace; use util::smallvec::VecLike; @@ -269,6 +271,20 @@ impl RawLayoutElementHelpers for Element { CSSColor { parsed: Color::RGBA(color), authored: None })))); } + let color = if self.is_htmlfontelement() { + let this: &HTMLFontElement = mem::transmute(self); + this.get_color() + } else { + None + }; + + if let Some(color) = color { + hints.push(from_declaration( + PropertyDeclaration::Color(SpecifiedValue(CSSRGBA { + parsed: color, + authored: None, + })))); + } let cellspacing = if self.is_htmltableelement() { let this: &HTMLTableElement = mem::transmute(self); diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs index 2df515cbc83..d2faa87441c 100644 --- a/components/script/dom/htmlfontelement.rs +++ b/components/script/dom/htmlfontelement.rs @@ -2,19 +2,26 @@ * 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::attr::{Attr, AttrHelpers}; use dom::bindings::codegen::Bindings::HTMLFontElementBinding; -use dom::bindings::codegen::InheritTypes::HTMLFontElementDerived; +use dom::bindings::codegen::Bindings::HTMLFontElementBinding::HTMLFontElementMethods; +use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLFontElementDerived}; use dom::bindings::js::{JSRef, Temporary}; use dom::document::Document; use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::element::ElementTypeId; use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; use dom::node::{Node, NodeTypeId}; -use util::str::DOMString; +use dom::virtualmethods::VirtualMethods; +use util::str::{self, DOMString}; + +use cssparser::RGBA; +use std::cell::Cell; #[dom_struct] pub struct HTMLFontElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, + color: Cell<Option<RGBA>>, } impl HTMLFontElementDerived for EventTarget { @@ -26,7 +33,8 @@ impl HTMLFontElementDerived for EventTarget { impl HTMLFontElement { fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: JSRef<Document>) -> HTMLFontElement { HTMLFontElement { - htmlelement: HTMLElement::new_inherited(HTMLElementTypeId::HTMLFontElement, localName, prefix, document) + htmlelement: HTMLElement::new_inherited(HTMLElementTypeId::HTMLFontElement, localName, prefix, document), + color: Cell::new(None), } } @@ -37,3 +45,49 @@ impl HTMLFontElement { } } +impl<'a> HTMLFontElementMethods for JSRef<'a, HTMLFontElement> { + make_getter!(Color, "color"); + make_setter!(SetColor, "color"); +} + +impl<'a> VirtualMethods for JSRef<'a,HTMLFontElement> { + fn super_type<'b>(&'b self) -> Option<&'b VirtualMethods> { + let htmlelement: &JSRef<HTMLElement> = HTMLElementCast::from_borrowed_ref(self); + Some(htmlelement as &VirtualMethods) + } + + fn after_set_attr(&self, attr: JSRef<Attr>) { + if let Some(ref s) = self.super_type() { + s.after_set_attr(attr); + } + + match attr.local_name() { + &atom!("color") => { + self.color.set(str::parse_legacy_color(&attr.value()).ok()) + } + _ => {} + } + } + + fn before_remove_attr(&self, attr: JSRef<Attr>) { + if let Some(ref s) = self.super_type() { + s.before_remove_attr(attr); + } + + match attr.local_name() { + &atom!("color") => self.color.set(None), + _ => () + } + } +} + +pub trait HTMLFontElementHelpers { + fn get_color(&self) -> Option<RGBA>; +} + +impl HTMLFontElementHelpers for HTMLFontElement { + fn get_color(&self) -> Option<RGBA> { + self.color.get() + } +} + diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index 2147ee07c48..a83c801831d 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -12,6 +12,7 @@ use dom::bindings::codegen::InheritTypes::HTMLButtonElementCast; use dom::bindings::codegen::InheritTypes::HTMLCanvasElementCast; use dom::bindings::codegen::InheritTypes::HTMLElementCast; use dom::bindings::codegen::InheritTypes::HTMLFieldSetElementCast; +use dom::bindings::codegen::InheritTypes::HTMLFontElementCast; use dom::bindings::codegen::InheritTypes::HTMLFormElementCast; use dom::bindings::codegen::InheritTypes::HTMLHeadElementCast; use dom::bindings::codegen::InheritTypes::HTMLIFrameElementCast; @@ -42,6 +43,8 @@ use dom::htmlbuttonelement::HTMLButtonElement; use dom::htmlcanvaselement::HTMLCanvasElement; use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; use dom::htmlfieldsetelement::HTMLFieldSetElement; +use dom::htmlfontelement::HTMLFontElement; +use dom::htmlformelement::HTMLFormElement; use dom::htmlheadelement::HTMLHeadElement; use dom::htmliframeelement::HTMLIFrameElement; use dom::htmlimageelement::HTMLImageElement; @@ -169,8 +172,13 @@ pub fn vtable_for<'a>(node: &'a JSRef<'a, Node>) -> &'a (VirtualMethods + 'a) { let element: &'a JSRef<'a, HTMLFieldSetElement> = HTMLFieldSetElementCast::to_borrowed_ref(node).unwrap(); element as &'a (VirtualMethods + 'a) } + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLFontElement)) => { + let element: &'a JSRef<'a, HTMLFontElement> = HTMLFontElementCast::to_borrowed_ref(node).unwrap(); + element as &'a (VirtualMethods + 'a) + } NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLFormElement)) => { - HTMLFormElementCast::to_borrowed_ref(node).unwrap() as &'a (VirtualMethods + 'a) + let element: &'a JSRef<'a, HTMLFormElement> = HTMLFormElementCast::to_borrowed_ref(node).unwrap(); + element as &'a (VirtualMethods + 'a) } NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLHeadElement)) => { let element: &'a JSRef<'a, HTMLHeadElement> = HTMLHeadElementCast::to_borrowed_ref(node).unwrap(); diff --git a/components/script/dom/webidls/HTMLFontElement.webidl b/components/script/dom/webidls/HTMLFontElement.webidl index 9a58672baf5..03b68498db7 100644 --- a/components/script/dom/webidls/HTMLFontElement.webidl +++ b/components/script/dom/webidls/HTMLFontElement.webidl @@ -5,7 +5,7 @@ // https://www.whatwg.org/html/#htmlfontelement interface HTMLFontElement : HTMLElement { - //[TreatNullAs=EmptyString] attribute DOMString color; + [TreatNullAs=EmptyString] attribute DOMString color; // attribute DOMString face; // attribute DOMString size; }; |