Implement the HTML background attribute

This commit is contained in:
Tom Schuster 2015-05-26 14:07:26 +02:00
parent 72ead882c0
commit e44f8f5609
2 changed files with 35 additions and 2 deletions

View file

@ -64,7 +64,7 @@ use style;
use style::legacy::{UnsignedIntegerAttribute, from_declaration}; use style::legacy::{UnsignedIntegerAttribute, from_declaration};
use style::properties::{PropertyDeclarationBlock, PropertyDeclaration, parse_style_attribute}; use style::properties::{PropertyDeclarationBlock, PropertyDeclaration, parse_style_attribute};
use style::properties::DeclaredValue::SpecifiedValue; use style::properties::DeclaredValue::SpecifiedValue;
use style::properties::longhands::{self, border_spacing, height}; use style::properties::longhands::{self, background_image, border_spacing, height};
use style::values::CSSFloat; use style::values::CSSFloat;
use style::values::specified::{self, CSSColor, CSSRGBA}; use style::values::specified::{self, CSSColor, CSSRGBA};
use util::geometry::Au; use util::geometry::Au;
@ -280,6 +280,19 @@ impl RawLayoutElementHelpers for Element {
CSSColor { parsed: Color::RGBA(color), authored: None })))); CSSColor { parsed: Color::RGBA(color), authored: None }))));
} }
let background = if self.is_htmlbodyelement() {
let this: &HTMLBodyElement = mem::transmute(self);
this.get_background()
} else {
None
};
if let Some(url) = background {
hints.push(from_declaration(
PropertyDeclaration::BackgroundImage(SpecifiedValue(
background_image::SpecifiedValue(Some(specified::Image::Url(url)))))));
}
let color = if self.is_htmlfontelement() { let color = if self.is_htmlfontelement() {
let this: &HTMLFontElement = mem::transmute(self); let this: &HTMLFontElement = mem::transmute(self);
this.get_color() this.get_color()

View file

@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::attr::{Attr, AttrHelpers}; use dom::attr::{Attr, AttrHelpers};
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use dom::bindings::codegen::Bindings::HTMLBodyElementBinding::{self, HTMLBodyElementMethods}; use dom::bindings::codegen::Bindings::HTMLBodyElementBinding::{self, HTMLBodyElementMethods};
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
@ -14,7 +15,7 @@ use dom::document::{Document, DocumentHelpers};
use dom::element::ElementTypeId; use dom::element::ElementTypeId;
use dom::eventtarget::{EventTarget, EventTargetTypeId, EventTargetHelpers}; use dom::eventtarget::{EventTarget, EventTargetTypeId, EventTargetHelpers};
use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
use dom::node::{Node, NodeTypeId, window_from_node}; use dom::node::{Node, NodeTypeId, window_from_node, document_from_node};
use dom::virtualmethods::VirtualMethods; use dom::virtualmethods::VirtualMethods;
use dom::window::WindowHelpers; use dom::window::WindowHelpers;
use msg::constellation_msg::ConstellationChan; use msg::constellation_msg::ConstellationChan;
@ -22,6 +23,7 @@ use msg::constellation_msg::Msg as ConstellationMsg;
use cssparser::RGBA; use cssparser::RGBA;
use util::str::{self, DOMString}; use util::str::{self, DOMString};
use url::{Url, UrlParser};
use std::borrow::ToOwned; use std::borrow::ToOwned;
use std::cell::Cell; use std::cell::Cell;
@ -36,6 +38,7 @@ const INITIAL_REFLOW_DELAY: u64 = 200_000_000;
pub struct HTMLBodyElement { pub struct HTMLBodyElement {
htmlelement: HTMLElement, htmlelement: HTMLElement,
background_color: Cell<Option<RGBA>>, background_color: Cell<Option<RGBA>>,
background: DOMRefCell<Option<Url>>
} }
impl HTMLBodyElementDerived for EventTarget { impl HTMLBodyElementDerived for EventTarget {
@ -54,6 +57,7 @@ impl HTMLBodyElement {
prefix, prefix,
document), document),
background_color: Cell::new(None), background_color: Cell::new(None),
background: DOMRefCell::new(None)
} }
} }
@ -84,12 +88,20 @@ impl<'a> HTMLBodyElementMethods for &'a HTMLBodyElement {
pub trait HTMLBodyElementHelpers { pub trait HTMLBodyElementHelpers {
fn get_background_color(self) -> Option<RGBA>; fn get_background_color(self) -> Option<RGBA>;
fn get_background(self) -> Option<Url>;
} }
impl<'a> HTMLBodyElementHelpers for &'a HTMLBodyElement { impl<'a> HTMLBodyElementHelpers for &'a HTMLBodyElement {
fn get_background_color(self) -> Option<RGBA> { fn get_background_color(self) -> Option<RGBA> {
self.background_color.get() self.background_color.get()
} }
#[allow(unsafe_code)]
fn get_background(self) -> Option<Url> {
unsafe {
self.background.borrow_for_layout().clone()
}
}
} }
impl<'a> VirtualMethods for &'a HTMLBodyElement { impl<'a> VirtualMethods for &'a HTMLBodyElement {
@ -146,6 +158,14 @@ impl<'a> VirtualMethods for &'a HTMLBodyElement {
&atom!("bgcolor") => { &atom!("bgcolor") => {
self.background_color.set(str::parse_legacy_color(&attr.value()).ok()) self.background_color.set(str::parse_legacy_color(&attr.value()).ok())
} }
&atom!("background") => {
let doc = document_from_node(*self);
let base = doc.r().url();
if let Ok(url) = UrlParser::new().base_url(&base).parse(&attr.value()) {
*self.background.borrow_mut() = Some(url)
}
}
_ => {} _ => {}
} }
} }