From dfe5215b8876fc0f3b4ed01e989ef9b0e129c094 Mon Sep 17 00:00:00 2001 From: lpy Date: Wed, 23 Apr 2014 11:00:03 +0800 Subject: [PATCH] Implement Element.localName.(fixes #2188) --- src/components/main/layout/wrapper.rs | 2 +- src/components/script/dom/document.rs | 14 ++++++------- src/components/script/dom/element.rs | 20 +++++++++++-------- src/components/script/dom/htmlcollection.rs | 4 ++-- .../script/dom/htmldatalistelement.rs | 2 +- .../script/dom/htmlfieldsetelement.rs | 2 +- src/components/script/dom/htmlserializer.rs | 8 ++++---- src/components/script/dom/node.rs | 4 ++-- .../script/dom/webidls/Element.webidl | 2 +- src/components/script/script_task.rs | 2 +- 10 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/components/main/layout/wrapper.rs b/src/components/main/layout/wrapper.rs index b0b8c82c252..51983685966 100644 --- a/src/components/main/layout/wrapper.rs +++ b/src/components/main/layout/wrapper.rs @@ -348,7 +348,7 @@ impl<'le> LayoutElement<'le> { impl<'le> TElement for LayoutElement<'le> { #[inline] fn get_local_name<'a>(&'a self) -> &'a str { - self.element.tag_name.as_slice() + self.element.local_name.as_slice() } #[inline] diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 95298eef358..e49caa84836 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -514,7 +514,7 @@ impl Document { struct ImagesFilter; impl CollectionFilter for ImagesFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().tag_name == ~"img" + elem.get().local_name == ~"img" } } let filter = ~ImagesFilter; @@ -526,7 +526,7 @@ impl Document { struct EmbedsFilter; impl CollectionFilter for EmbedsFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().tag_name == ~"embed" + elem.get().local_name == ~"embed" } } let filter = ~EmbedsFilter; @@ -543,7 +543,7 @@ impl Document { struct LinksFilter; impl CollectionFilter for LinksFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - (elem.get().tag_name == ~"a" || elem.get().tag_name == ~"area") && + (elem.get().local_name == ~"a" || elem.get().local_name == ~"area") && elem.get_attribute(Null, "href").is_some() } } @@ -556,7 +556,7 @@ impl Document { struct FormsFilter; impl CollectionFilter for FormsFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().tag_name == ~"form" + elem.get().local_name == ~"form" } } let filter = ~FormsFilter; @@ -568,7 +568,7 @@ impl Document { struct ScriptsFilter; impl CollectionFilter for ScriptsFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().tag_name == ~"script" + elem.get().local_name == ~"script" } } let filter = ~ScriptsFilter; @@ -580,7 +580,7 @@ impl Document { struct AnchorsFilter; impl CollectionFilter for AnchorsFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().tag_name == ~"a" && elem.get_attribute(Null, "name").is_some() + elem.get().local_name == ~"a" && elem.get_attribute(Null, "name").is_some() } } let filter = ~AnchorsFilter; @@ -592,7 +592,7 @@ impl Document { struct AppletsFilter; impl CollectionFilter for AppletsFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().tag_name == ~"applet" + elem.get().local_name == ~"applet" } } let filter = ~AppletsFilter; diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index ace3f68bccc..70faab44676 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -34,7 +34,7 @@ use std::cast; #[deriving(Encodable)] pub struct Element { node: Node, - tag_name: DOMString, // TODO: This should be an atom, not a DOMString. + local_name: DOMString, // TODO: This should be an atom, not a DOMString. namespace: Namespace, prefix: Option, attrs: ~[JS], @@ -140,10 +140,10 @@ pub enum ElementTypeId { // impl Element { - pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, namespace: Namespace, prefix: Option, document: JS) -> Element { + pub fn new_inherited(type_id: ElementTypeId, local_name: DOMString, namespace: Namespace, prefix: Option, document: JS) -> Element { Element { node: Node::new_inherited(ElementNodeTypeId(type_id), document), - tag_name: tag_name, + local_name: local_name, namespace: namespace, prefix: prefix, attrs: ~[], @@ -152,8 +152,8 @@ impl Element { } } - pub fn new(tag_name: DOMString, namespace: Namespace, prefix: Option, document: &JS) -> JS { - let element = Element::new_inherited(ElementTypeId, tag_name, namespace, prefix, document.clone()); + pub fn new(local_name: DOMString, namespace: Namespace, prefix: Option, document: &JS) -> JS { + let element = Element::new_inherited(ElementTypeId, local_name, namespace, prefix, document.clone()); Node::reflect_node(~element, document, ElementBinding::Wrap) } @@ -440,7 +440,7 @@ impl Element { if self.namespace != namespace::HTML { return false } - match self.tag_name.as_slice() { + match self.local_name.as_slice() { /* List of void elements from http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#html-fragment-serialization-algorithm */ "area" | "base" | "basefont" | "bgsound" | "br" | "col" | "embed" | @@ -457,6 +457,10 @@ impl Element { self.namespace.to_str().to_owned() } + pub fn LocalName(&self) -> DOMString { + self.local_name.clone() + } + // http://dom.spec.whatwg.org/#dom-element-prefix pub fn GetPrefix(&self) -> Option { self.prefix.clone() @@ -466,10 +470,10 @@ impl Element { pub fn TagName(&self) -> DOMString { match self.prefix { None => { - self.tag_name.to_ascii_upper() + self.local_name.to_ascii_upper() } Some(ref prefix_str) => { - (*prefix_str + ":" + self.tag_name).to_ascii_upper() + (*prefix_str + ":" + self.local_name).to_ascii_upper() } } } diff --git a/src/components/script/dom/htmlcollection.rs b/src/components/script/dom/htmlcollection.rs index e88aedd02db..3adcdc4270d 100644 --- a/src/components/script/dom/htmlcollection.rs +++ b/src/components/script/dom/htmlcollection.rs @@ -62,7 +62,7 @@ impl HTMLCollection { } impl CollectionFilter for TagNameFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().tag_name == self.tag + elem.get().local_name == self.tag } } let filter = TagNameFilter { @@ -79,7 +79,7 @@ impl HTMLCollection { } impl CollectionFilter for TagNameNSFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().namespace == self.namespace && elem.get().tag_name == self.tag + elem.get().namespace == self.namespace && elem.get().local_name == self.tag } } let filter = TagNameNSFilter { diff --git a/src/components/script/dom/htmldatalistelement.rs b/src/components/script/dom/htmldatalistelement.rs index 7011a9fe721..bc2c59dcf17 100644 --- a/src/components/script/dom/htmldatalistelement.rs +++ b/src/components/script/dom/htmldatalistelement.rs @@ -45,7 +45,7 @@ impl HTMLDataListElement { struct HTMLDataListOptionsFilter; impl CollectionFilter for HTMLDataListOptionsFilter { fn filter(&self, elem: &JS, _root: &JS) -> bool { - elem.get().tag_name == ~"option" + elem.get().local_name == ~"option" } } let node: JS = NodeCast::from(abstract_self); diff --git a/src/components/script/dom/htmlfieldsetelement.rs b/src/components/script/dom/htmlfieldsetelement.rs index 9474481a6a9..91e24711fee 100644 --- a/src/components/script/dom/htmlfieldsetelement.rs +++ b/src/components/script/dom/htmlfieldsetelement.rs @@ -76,7 +76,7 @@ impl HTMLFieldSetElement { static tag_names: StaticStringVec = &["button", "fieldset", "input", "keygen", "object", "output", "select", "textarea"]; let root: &JS = &ElementCast::to(root).unwrap(); - elem != root && tag_names.iter().any(|&tag_name| tag_name == elem.get().tag_name) + elem != root && tag_names.iter().any(|&tag_name| tag_name == elem.get().local_name) } } let node: JS = NodeCast::from(abstract_self); diff --git a/src/components/script/dom/htmlserializer.rs b/src/components/script/dom/htmlserializer.rs index bfdcdde939e..1c3b50274a6 100644 --- a/src/components/script/dom/htmlserializer.rs +++ b/src/components/script/dom/htmlserializer.rs @@ -72,7 +72,7 @@ fn serialize_text(text: &JS) -> ~str { match text.get().characterdata.node.parent_node { Some(ref parent) if parent.is_element() => { let elem: JS = ElementCast::to(parent).unwrap(); - match elem.get().tag_name.as_slice() { + match elem.get().local_name.as_slice() { "style" | "script" | "xmp" | "iframe" | "noembed" | "noframes" | "plaintext" | "noscript" if elem.get().namespace == namespace::HTML => { @@ -94,12 +94,12 @@ fn serialize_doctype(doctype: &JS) -> ~str { } fn serialize_elem(elem: &JS, open_elements: &mut ~[~str]) -> ~str { - let mut rv = ~"<" + elem.get().tag_name; + let mut rv = ~"<" + elem.get().local_name; for attr in elem.get().attrs.iter() { rv.push_str(serialize_attr(attr)); }; rv.push_str(">"); - match elem.get().tag_name.as_slice() { + match elem.get().local_name.as_slice() { "pre" | "listing" | "textarea" if elem.get().namespace == namespace::HTML => { match elem.get().node.first_child { Some(ref child) if child.is_text() => { @@ -114,7 +114,7 @@ fn serialize_elem(elem: &JS, open_elements: &mut ~[~str]) -> ~str { _ => {} } if !elem.get().is_void() { - open_elements.push(elem.get().tag_name.clone()); + open_elements.push(elem.get().local_name.clone()); } rv } diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 86137fef714..16826633fde 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -1327,7 +1327,7 @@ impl Node { ElementNodeTypeId(..) => { let element: JS = ElementCast::to(node).unwrap(); let element = element.get(); - let element = build_element_from_tag(element.tag_name.clone(), &document); + let element = build_element_from_tag(element.local_name.clone(), &document); NodeCast::from(&element) }, TextNodeTypeId => { @@ -1591,7 +1591,7 @@ impl Node { let other_element: JS = ElementCast::to(other).unwrap(); // FIXME: namespace prefix (element.get().namespace == other_element.get().namespace) && - (element.get().tag_name == other_element.get().tag_name) && + (element.get().local_name == other_element.get().local_name) && (element.get().attrs.len() == other_element.get().attrs.len()) } fn is_equal_processinginstruction(node: &JS, other: &JS) -> bool { diff --git a/src/components/script/dom/webidls/Element.webidl b/src/components/script/dom/webidls/Element.webidl index 1874bfbe651..647ceed51c2 100644 --- a/src/components/script/dom/webidls/Element.webidl +++ b/src/components/script/dom/webidls/Element.webidl @@ -16,7 +16,7 @@ interface Element : Node { readonly attribute DOMString? prefix; - // readonly attribute DOMString localName; + readonly attribute DOMString localName; [Constant] readonly attribute DOMString namespaceURI; diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index f8e7d230420..1dbfea74763 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -1056,7 +1056,7 @@ impl ScriptTask { if node.is_element() { let element: JS = ElementCast::to(&node).unwrap(); - if "a" == element.get().tag_name { + if "a" == element.get().local_name { self.load_url_from_element(page, &element) } }