diff options
author | bors-servo <release+servo@mozilla.com> | 2014-06-13 11:41:13 -0400 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2014-06-13 11:41:13 -0400 |
commit | da668f53d9df3cc21e708d4521aef458ea5bf231 (patch) | |
tree | 984e965eaa61da6fb5b0701d098206a336958b39 /src/components/script/dom/attr.rs | |
parent | 58b776e0b559cd08db9ecb44dd0b1bbea731af57 (diff) | |
parent | b012c99e05ce6eb2bb4b55ebb3d5c1a5a3bd48f7 (diff) | |
download | servo-da668f53d9df3cc21e708d4521aef458ea5bf231.tar.gz servo-da668f53d9df3cc21e708d4521aef458ea5bf231.zip |
auto merge of #2616 : Ms2ger/servo/attrvalue, r=jdm
Obsoletes #2073.
Diffstat (limited to 'src/components/script/dom/attr.rs')
-rw-r--r-- | src/components/script/dom/attr.rs | 59 |
1 files changed, 50 insertions, 9 deletions
diff --git a/src/components/script/dom/attr.rs b/src/components/script/dom/attr.rs index 741c5592732..c8e5ad88527 100644 --- a/src/components/script/dom/attr.rs +++ b/src/components/script/dom/attr.rs @@ -6,13 +6,13 @@ use dom::bindings::codegen::Bindings::AttrBinding; use dom::bindings::codegen::InheritTypes::NodeCast; use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; -use dom::element::Element; +use dom::element::{Element, AttributeHandlers}; use dom::node::Node; use dom::window::Window; use dom::virtualmethods::vtable_for; use servo_util::namespace; use servo_util::namespace::Namespace; -use servo_util::str::DOMString; +use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS}; use std::cell::Cell; pub enum AttrSettingType { @@ -20,11 +20,45 @@ pub enum AttrSettingType { ReplacedAttr, } +#[deriving(Eq, Clone, Encodable)] +pub enum AttrValue { + StringAttrValue(DOMString), + TokenListAttrValue(DOMString, Vec<(uint, uint)>), + UIntAttrValue(DOMString, u32), +} + +impl AttrValue { + pub fn from_tokenlist(list: DOMString) -> AttrValue { + let mut indexes = vec![]; + let mut last_index: uint = 0; + for (index, ch) in list.as_slice().char_indices() { + if HTML_SPACE_CHARACTERS.iter().any(|&space| space == ch) { + indexes.push((last_index, index)); + last_index = index + 1; + } + } + return TokenListAttrValue(list, indexes); + } + + pub fn from_u32(string: DOMString, default: u32) -> AttrValue { + let result: u32 = from_str(string.as_slice()).unwrap_or(default); + UIntAttrValue(string, result) + } + + pub fn as_slice<'a>(&'a self) -> &'a str { + match *self { + StringAttrValue(ref value) | + TokenListAttrValue(ref value, _) | + UIntAttrValue(ref value, _) => value.as_slice(), + } + } +} + #[deriving(Encodable)] pub struct Attr { pub reflector_: Reflector, pub local_name: DOMString, - pub value: DOMString, + value: AttrValue, pub name: DOMString, pub namespace: Namespace, pub prefix: Option<DOMString>, @@ -44,7 +78,7 @@ impl Reflectable for Attr { } impl Attr { - fn new_inherited(local_name: DOMString, value: DOMString, + fn new_inherited(local_name: DOMString, value: AttrValue, name: DOMString, namespace: Namespace, prefix: Option<DOMString>, owner: &JSRef<Element>) -> Attr { Attr { @@ -58,14 +92,14 @@ impl Attr { } } - pub fn new(window: &JSRef<Window>, local_name: DOMString, value: DOMString, + pub fn new(window: &JSRef<Window>, local_name: DOMString, value: AttrValue, name: DOMString, namespace: Namespace, prefix: Option<DOMString>, owner: &JSRef<Element>) -> Temporary<Attr> { let attr = Attr::new_inherited(local_name, value, name, namespace, prefix, owner); reflect_dom_object(box attr, window, AttrBinding::Wrap) } - pub fn set_value(&mut self, set_type: AttrSettingType, value: DOMString) { + pub fn set_value(&mut self, set_type: AttrSettingType, value: AttrValue) { let owner = self.owner.get().root(); let node: &JSRef<Node> = NodeCast::from_ref(&*owner); let namespace_is_null = self.namespace == namespace::Null; @@ -73,7 +107,7 @@ impl Attr { match set_type { ReplacedAttr => { if namespace_is_null { - vtable_for(node).before_remove_attr(self.local_name.clone(), self.value.clone()); + vtable_for(node).before_remove_attr(self.local_name.clone(), self.value.as_slice().to_string()); } } FirstSetAttr => {} @@ -82,10 +116,14 @@ impl Attr { self.value = value; if namespace_is_null { - vtable_for(node).after_set_attr(self.local_name.clone(), self.value.clone()); + vtable_for(node).after_set_attr(self.local_name.clone(), self.value.as_slice().to_string()); } } + pub fn value<'a>(&'a self) -> &'a AttrValue { + &self.value + } + pub fn value_ref<'a>(&'a self) -> &'a str { self.value.as_slice() } @@ -106,10 +144,13 @@ impl<'a> AttrMethods for JSRef<'a, Attr> { } fn Value(&self) -> DOMString { - self.value.clone() + self.value.as_slice().to_string() } fn SetValue(&mut self, value: DOMString) { + let owner = self.owner.get().root(); + let value = owner.deref().parse_attribute( + &self.namespace, self.deref().local_name.as_slice(), value); self.set_value(ReplacedAttr, value); } |