mirror of
https://github.com/servo/servo.git
synced 2025-06-17 04:44:28 +00:00
auto merge of #678 : metajack/servo/style-attributes, r=jdm
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:
commit
b017785aad
5 changed files with 30 additions and 15 deletions
|
@ -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| {
|
||||||
|
|
|
@ -18,6 +18,7 @@ use dom::htmlimageelement::HTMLImageElement;
|
||||||
use dom::node::{ElementNodeTypeId, Node, ScriptView, AbstractNode};
|
use dom::node::{ElementNodeTypeId, Node, ScriptView, AbstractNode};
|
||||||
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 js::jsapi::{JSContext, JSObject};
|
use js::jsapi::{JSContext, JSObject};
|
||||||
|
|
||||||
|
@ -34,6 +35,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>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CacheableWrapper for Element {
|
impl CacheableWrapper for Element {
|
||||||
|
@ -206,7 +208,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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -317,6 +317,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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,7 +386,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
|
Loading…
Add table
Add a link
Reference in a new issue