From eadda9411bafec6f551c22b4cb48a29b356d3c82 Mon Sep 17 00:00:00 2001 From: Ilyong Cho Date: Mon, 12 Aug 2013 14:04:11 +0900 Subject: [PATCH 1/3] Add get_ref() method to DOMString --- src/components/script/dom/bindings/utils.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 47d02a3c944..728c1eb112e 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -105,6 +105,13 @@ impl DOMString { null_string => ~"" } } + + pub fn get_ref<'a>(&'a self) -> &'a str { + match *self { + str(ref s) => s.as_slice(), + null_string => &'a "", + } + } } pub struct rust_box { From 2ad350531a233b14c7c146fa4c5f32fc9686b013 Mon Sep 17 00:00:00 2001 From: Ilyong Cho Date: Mon, 12 Aug 2013 14:09:26 +0900 Subject: [PATCH 2/3] Handle style attributes in element setter instead of html parser --- src/components/script/dom/element.rs | 13 ++++++++++--- src/components/script/html/hubbub_html_parser.rs | 12 +++--------- src/test/html/color-change-text.html | 3 ++- src/test/html/color-change-text.js | 1 + 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 5628cb03314..e6ac799f4c7 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -47,6 +47,7 @@ use js::jsapi::{JSContext, JSObject}; use std::cell::Cell; use std::comm; use std::str::eq_slice; +use extra::net::url; pub struct Element { parent: Node, @@ -262,8 +263,7 @@ impl<'self> Element { pub fn set_attr(&mut self, name: &DOMString, value: &DOMString) { let name = name.to_str(); - let value = value.to_str(); - let value_cell = Cell::new(value); + let value_cell = Cell::new(value.to_str()); let mut found = false; for self.attrs.mut_iter().advance |attr| { if eq_slice(attr.name, name) { @@ -276,6 +276,13 @@ impl<'self> Element { self.attrs.push(Attr::new(name.to_str(), value_cell.take().clone())); } + if "style" == name { + self.style_attribute = Some( + Stylesheet::from_attribute( + url::from_str("http://www.example.com/").unwrap(), + value.get_ref())); + } + match self.parent.owner_doc { Some(owner) => do owner.with_base |owner| { owner.content_changed() }, None => {} @@ -312,7 +319,7 @@ impl Element { null_string } - pub fn SetAttribute(&self, _name: &DOMString, _value: &DOMString, _rv: &mut ErrorResult) { + pub fn SetAttribute(&mut self, _name: &DOMString, _value: &DOMString, _rv: &mut ErrorResult) { } pub fn SetAttributeNS(&self, _namespace: &DOMString, _localname: &DOMString, _value: &DOMString, _rv: &mut ErrorResult) { diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 19885aafdd2..779cd85a71e 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -42,10 +42,11 @@ use dom::htmltablesectionelement::HTMLTableSectionElement; use dom::htmltextareaelement::HTMLTextAreaElement; use dom::htmltitleelement::HTMLTitleElement; use dom::htmlulistelement::HTMLUListElement; -use dom::element::{Element, Attr}; +use dom::element::Element; use dom::htmlelement::HTMLElement; use dom::node::{AbstractNode, Comment, Doctype, ElementNodeTypeId, Node, ScriptView}; use dom::node::{Text}; +use dom::bindings::utils::str; use html::cssparse::{InlineProvenance, StylesheetProvenance, UrlProvenance, spawn_css_parser}; use js::jsapi::JSContext; use newcss::stylesheet::Stylesheet; @@ -343,14 +344,7 @@ pub fn parse_html(cx: *JSContext, debug!("-- attach attrs"); do node.as_mut_element |element| { for tag.attributes.iter().advance |attr| { - 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)); - } + element.set_attr(&str(attr.name.clone()), &str(attr.value.clone())); } } diff --git a/src/test/html/color-change-text.html b/src/test/html/color-change-text.html index 87288890501..12a8a5a4581 100644 --- a/src/test/html/color-change-text.html +++ b/src/test/html/color-change-text.html @@ -9,6 +9,7 @@ -
Hello, World!
+
Hello, World!
+
Hello, Servo!
diff --git a/src/test/html/color-change-text.js b/src/test/html/color-change-text.js index 41b9e3881cf..a8923d34c9a 100644 --- a/src/test/html/color-change-text.js +++ b/src/test/html/color-change-text.js @@ -1,3 +1,4 @@ window.setTimeout(function () { window.document.getElementsByTagName('div')[0].setAttribute('class', 'blue'); + window.document.getElementsByTagName('div')[1].setAttribute('style', 'color:red;'); }, 1000); From cba0caf7a504b067ec4acaac9a0c53b6fa32f40f Mon Sep 17 00:00:00 2001 From: Ilyong Cho Date: Mon, 12 Aug 2013 14:13:06 +0900 Subject: [PATCH 3/3] Call old Element::{get, set}_attr() from new Element::{Get, Set}Attribute() --- src/components/script/dom/element.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index e6ac799f4c7..4d775577367 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -311,15 +311,19 @@ impl Element { pub fn SetId(&self, _id: &DOMString) { } - pub fn GetAttribute(&self, _name: &DOMString) -> DOMString { - null_string + pub fn GetAttribute(&self, name: &DOMString) -> DOMString { + match self.get_attr(name.get_ref()) { + Some(val) => str(val.to_owned()), + None => null_string + } } pub fn GetAttributeNS(&self, _namespace: &DOMString, _localname: &DOMString) -> DOMString { null_string } - pub fn SetAttribute(&mut self, _name: &DOMString, _value: &DOMString, _rv: &mut ErrorResult) { + pub fn SetAttribute(&mut self, name: &DOMString, value: &DOMString, _rv: &mut ErrorResult) { + self.set_attr(name, value); } pub fn SetAttributeNS(&self, _namespace: &DOMString, _localname: &DOMString, _value: &DOMString, _rv: &mut ErrorResult) {