Implement support for style attributes.

If a style attribute is given for a node, it is parsed and attached to the
Element. When selector matching runs on the Element, the style attribute's
stylesheet is passed in.

Fixes #86.
This commit is contained in:
Jack Moffitt 2013-08-06 14:40:30 -06:00
parent 1337583878
commit 4d71918366
5 changed files with 30 additions and 15 deletions

View file

@ -28,18 +28,24 @@ impl MatchMethods for AbstractNode<LayoutView> {
fn restyle_subtree(&self, select_ctx: &SelectCtx) { fn restyle_subtree(&self, select_ctx: &SelectCtx) {
// Only elements have styles // Only elements have styles
if self.is_element() { if self.is_element() {
let select_handler = NodeSelectHandler { node: *self }; do self.with_imm_element |elem| {
let incomplete_results = select_ctx.select_style(self, &select_handler); let inline_style = match elem.style_attribute {
// Combine this node's results with its parent's to resolve all inherited values None => None,
let complete_results = compose_results(*self, incomplete_results); Some(ref sheet) => Some(sheet),
};
let select_handler = NodeSelectHandler { node: *self };
let incomplete_results = select_ctx.select_style(self, inline_style, &select_handler);
// Combine this node's results with its parent's to resolve all inherited values
let complete_results = compose_results(*self, incomplete_results);
// If there was an existing style, compute the damage that // If there was an existing style, compute the damage that
// incremental layout will need to fix. // incremental layout will need to fix.
if self.have_css_select_results() { if self.have_css_select_results() {
let damage = incremental::compute_damage(self, self.get_css_select_results(), &complete_results); let damage = incremental::compute_damage(self, self.get_css_select_results(), &complete_results);
self.set_restyle_damage(damage); self.set_restyle_damage(damage);
} }
self.set_css_select_results(complete_results); self.set_css_select_results(complete_results);
};
} }
for self.each_child |kid| { for self.each_child |kid| {

View file

@ -10,6 +10,7 @@ use dom::clientrectlist::ClientRectList;
use dom::node::{ElementNodeTypeId, Node, ScriptView}; use dom::node::{ElementNodeTypeId, Node, ScriptView};
use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery}; use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery};
use layout_interface::{ContentBoxesResponse}; use layout_interface::{ContentBoxesResponse};
use newcss::stylesheet::Stylesheet;
use std::cell::Cell; use std::cell::Cell;
use std::comm::ChanOne; use std::comm::ChanOne;
@ -24,6 +25,7 @@ pub struct Element {
parent: Node<ScriptView>, parent: Node<ScriptView>,
tag_name: ~str, // TODO: This should be an atom, not a ~str. tag_name: ~str, // TODO: This should be an atom, not a ~str.
attrs: ~[Attr], attrs: ~[Attr],
style_attribute: Option<Stylesheet>,
} }
#[deriving(Eq)] #[deriving(Eq)]
@ -132,7 +134,8 @@ impl<'self> Element {
Element { Element {
parent: Node::new(ElementNodeTypeId(type_id)), parent: Node::new(ElementNodeTypeId(type_id)),
tag_name: tag_name, tag_name: tag_name,
attrs: ~[] attrs: ~[],
style_attribute: None,
} }
} }

View file

@ -314,6 +314,13 @@ pub fn parse_html(cx: *JSContext,
do node.as_mut_element |element| { do node.as_mut_element |element| {
for tag.attributes.iter().advance |attr| { for tag.attributes.iter().advance |attr| {
element.attrs.push(Attr::new(attr.name.clone(), attr.value.clone())); element.attrs.push(Attr::new(attr.name.clone(), attr.value.clone()));
if "style" == attr.name {
element.style_attribute = Some(
Stylesheet::from_attribute(
url::from_str("http://www.example.com/").unwrap(),
attr.value));
}
} }
} }
@ -374,7 +381,6 @@ pub fn parse_html(cx: *JSContext,
} }
} }
//TODO (Issue #86): handle inline styles ('style' attr)
_ => {} _ => {}
} }

@ -1 +1 @@
Subproject commit 55884aac7f9780a7915936169565101cbf4f1723 Subproject commit 789c7a43e28629ea0b568ce7d9a7ca8a0a975d34

@ -1 +1 @@
Subproject commit e6866a5684b403350768da0fcba11b21e3d60973 Subproject commit d72f06f51220083111487940f19ad36d6ae17bd2