diff options
-rw-r--r-- | src/components/main/layout/wrapper.rs | 8 | ||||
-rw-r--r-- | src/components/script/dom/attr.rs | 4 | ||||
-rw-r--r-- | src/components/script/dom/document.rs | 6 | ||||
-rw-r--r-- | src/components/script/dom/element.rs | 26 | ||||
-rw-r--r-- | src/components/script/dom/htmldocument.rs | 5 | ||||
-rw-r--r-- | src/components/script/dom/htmlimageelement.rs | 3 | ||||
-rw-r--r-- | src/components/script/html/hubbub_html_parser.rs | 18 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 12 | ||||
-rw-r--r-- | src/components/style/node.rs | 2 |
9 files changed, 50 insertions, 34 deletions
diff --git a/src/components/main/layout/wrapper.rs b/src/components/main/layout/wrapper.rs index d8225ab5078..ffd5d76721c 100644 --- a/src/components/main/layout/wrapper.rs +++ b/src/components/main/layout/wrapper.rs @@ -385,9 +385,9 @@ impl<'le> TElement for LayoutElement<'le> { self.element.namespace.to_str().unwrap_or("") } - fn get_attr(&self, ns_url: Option<~str>, name: &str) -> Option<~str> { + fn get_attr(&self, ns_url: Option<~str>, name: &str) -> Option<&'static str> { let namespace = Namespace::from_str(ns_url); - self.element.get_attr(namespace, name) + unsafe { self.element.get_attr_val_for_layout(namespace, name) } } fn get_link(&self) -> Option<~str> { @@ -397,7 +397,9 @@ impl<'le> TElement for LayoutElement<'le> { // selector-link ElementNodeTypeId(HTMLAnchorElementTypeId) | ElementNodeTypeId(HTMLAreaElementTypeId) | - ElementNodeTypeId(HTMLLinkElementTypeId) => self.get_attr(None, "href"), + ElementNodeTypeId(HTMLLinkElementTypeId) => { + self.get_attr(None, "href").map(|val| val.to_owned()) + } _ => None, } } diff --git a/src/components/script/dom/attr.rs b/src/components/script/dom/attr.rs index 045855728b0..3903e2d891d 100644 --- a/src/components/script/dom/attr.rs +++ b/src/components/script/dom/attr.rs @@ -65,6 +65,10 @@ impl Attr { util::swap(&mut self.value, &mut value); value } + + pub fn value_ref<'a>(&'a self) -> &'a str { + self.value.as_slice() + } } impl Attr { diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index aa9a0baa7ce..4f6cc39d080 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -366,7 +366,7 @@ impl Document { pub fn GetElementsByName(&self, name: DOMString) -> @mut HTMLCollection { self.createHTMLCollection(|elem| - elem.get_attr(Null, "name").is_some() && eq_slice(elem.get_attr(Null, "name").unwrap(), name)) + elem.get_attribute(Null, "name").is_some() && eq_slice(elem.get_attribute(Null, "name").unwrap().value_ref(), name)) } pub fn createHTMLCollection(&self, callback: |elem: &Element| -> bool) -> @mut HTMLCollection { @@ -456,9 +456,9 @@ fn foreach_ided_elements(root: &AbstractNode, callback: |&DOMString, &AbstractNo } node.with_imm_element(|element| { - match element.get_attr(Null, "id") { + match element.get_attribute(Null, "id") { Some(id) => { - callback(&id.to_str(), &node); + callback(&id.Value(), &node); } None => () } diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index c4196b9fab4..309204ee7a9 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -23,8 +23,10 @@ use layout_interface::{ContentBoxesResponse, ContentChangedDocumentDamage}; use layout_interface::{MatchSelectorsDocumentDamage}; use style; -use std::str::eq; use std::ascii::StrAsciiExt; +use std::cast; +use std::str::eq; +use std::unstable::raw::Box; pub struct Element { node: Node, @@ -155,9 +157,19 @@ impl Element { }).map(|&x| x) } - // FIXME(pcwalton): This is kind of confusingly named relative to the above... - pub fn get_attr(&self, namespace: Namespace, name: &str) -> Option<~str> { - self.get_attribute(namespace, name).map(|attr| attr.value.clone()) + pub unsafe fn get_attr_val_for_layout(&self, namespace: Namespace, name: &str) + -> Option<&'static str> { + // FIXME: only case-insensitive in the HTML namespace (as opposed to SVG, etc.) + let name = name.to_ascii_lower(); + self.attrs.iter().find(|attr: & &@mut Attr| { + // unsafely avoid a borrow because this is accessed by many tasks + // during parallel layout + let attr: ***Box<Attr> = cast::transmute(attr); + name == (***attr).data.local_name && (***attr).data.namespace == namespace + }).map(|attr| { + let attr: **Box<Attr> = cast::transmute(attr); + cast::transmute((**attr).data.value.as_slice()) + }) } pub fn set_attr(&mut self, abstract_self: AbstractNode, name: DOMString, value: DOMString) @@ -352,8 +364,8 @@ impl Element { } pub fn get_string_attribute(&self, name: &str) -> DOMString { - match self.get_attr(Null, name) { - Some(x) => x, + match self.get_attribute(Null, name) { + Some(x) => x.Value(), None => ~"" } } @@ -390,7 +402,7 @@ impl Element { } pub fn GetAttribute(&self, name: DOMString) -> Option<DOMString> { - self.get_attr(Null, name).map(|s| s.to_owned()) + self.get_attribute(Null, name).map(|s| s.Value()) } pub fn GetAttributeNS(&self, namespace: Option<DOMString>, local_name: DOMString) -> Option<DOMString> { diff --git a/src/components/script/dom/htmldocument.rs b/src/components/script/dom/htmldocument.rs index 4a8ac7d8158..f9994782cda 100644 --- a/src/components/script/dom/htmldocument.rs +++ b/src/components/script/dom/htmldocument.rs @@ -11,7 +11,6 @@ use dom::window::Window; use js::jsapi::JSTracer; use std::str::eq_slice; -use style::TElement; pub struct HTMLDocument { parent: Document @@ -46,7 +45,7 @@ impl HTMLDocument { pub fn Links(&self) -> @mut HTMLCollection { self.parent.createHTMLCollection(|elem| (eq_slice(elem.tag_name, "a") || eq_slice(elem.tag_name, "area")) - && elem.get_attr(Null, "href").is_some()) + && elem.get_attribute(Null, "href").is_some()) } pub fn Forms(&self) -> @mut HTMLCollection { @@ -59,7 +58,7 @@ impl HTMLDocument { pub fn Anchors(&self) -> @mut HTMLCollection { self.parent.createHTMLCollection(|elem| - eq_slice(elem.tag_name, "a") && elem.get_attr(Null, "name").is_some()) + eq_slice(elem.tag_name, "a") && elem.get_attribute(Null, "name").is_some()) } pub fn Applets(&self) -> @mut HTMLCollection { diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs index 1966289e7e2..2939de9e43a 100644 --- a/src/components/script/dom/htmlimageelement.rs +++ b/src/components/script/dom/htmlimageelement.rs @@ -15,7 +15,6 @@ use layout_interface::{ContentBoxQuery, ContentBoxResponse}; use servo_net::image_cache_task; use servo_net::image_cache_task::ImageCacheTask; use servo_util::url::make_url; -use style::TElement; pub struct HTMLImageElement { htmlelement: HTMLElement, @@ -41,7 +40,7 @@ impl HTMLImageElement { /// prefetching the image. This method must be called after `src` is changed. pub fn update_image(&mut self, image_cache: ImageCacheTask, url: Option<Url>) { let elem = &mut self.htmlelement.element; - let src_opt = elem.get_attr(Null, "src").map(|x| x.to_str()); + let src_opt = elem.get_attribute(Null, "src").map(|x| x.Value()); match src_opt { None => {} Some(src) => { diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 776f5a480f8..7724dc80e30 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -28,7 +28,7 @@ use std::comm::{Port, SharedChan}; use std::from_str::FromStr; use std::str::eq_slice; use std::str; -use style::{Stylesheet, TElement}; +use style::Stylesheet; macro_rules! handle_element( ($document: expr, @@ -339,11 +339,11 @@ pub fn parse_html(cx: *JSContext, // Handle CSS style sheets from <link> elements ElementNodeTypeId(HTMLLinkElementTypeId) => { node.with_imm_element(|element| { - match (element.get_attr(Null, "rel"), element.get_attr(Null, "href")) { + match (element.get_attribute(Null, "rel"), element.get_attribute(Null, "href")) { (Some(rel), Some(href)) => { - if "stylesheet" == rel { - debug!("found CSS stylesheet: {:s}", href); - let url = make_url(href.to_str(), Some(url2.clone())); + if "stylesheet" == rel.value_ref() { + debug!("found CSS stylesheet: {:s}", href.value_ref()); + let url = make_url(href.Value(), Some(url2.clone())); css_chan2.send(CSSTaskNewFile(UrlProvenance(url))); } } @@ -357,7 +357,7 @@ pub fn parse_html(cx: *JSContext, node.with_mut_iframe_element(|iframe_element| { let sandboxed = iframe_element.is_sandboxed(); let elem = &mut iframe_element.htmlelement.element; - let src_opt = elem.get_attr(Null, "src").map(|x| x.to_str()); + let src_opt = elem.get_attribute(Null, "src").map(|x| x.Value()); for src in src_opt.iter() { let iframe_url = make_url(src.clone(), Some(url2.clone())); iframe_element.frame = Some(iframe_url.clone()); @@ -453,10 +453,10 @@ pub fn parse_html(cx: *JSContext, unsafe { let scriptnode: AbstractNode = NodeWrapping::from_hubbub_node(script); scriptnode.with_imm_element(|script| { - match script.get_attr(Null, "src") { + match script.get_attribute(Null, "src") { Some(src) => { - debug!("found script: {:s}", src); - let new_url = make_url(src.to_str(), Some(url3.clone())); + debug!("found script: {:s}", src.Value()); + let new_url = make_url(src.Value(), Some(url3.clone())); js_chan2.send(JSTaskNewFile(new_url)); } None => { diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 8034822e9d9..362bdc9fc87 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -786,8 +786,8 @@ impl ScriptTask { let mut anchors = doc_node.traverse_preorder().filter(|node| node.is_anchor_element()); anchors.find(|node| { node.with_imm_element(|elem| { - match elem.get_attr(Null, "name") { - Some(name) => eq_slice(name, fragid), + match elem.get_attribute(Null, "name") { + Some(name) => eq_slice(name.value_ref(), fragid), None => false } }) @@ -885,15 +885,15 @@ impl ScriptTask { fn load_url_from_element(&self, page: @mut Page, element: &Element) { // if the node's element is "a," load url from href attr - let attr = element.get_attr(Null, "href"); + let attr = element.get_attribute(Null, "href"); for href in attr.iter() { - debug!("ScriptTask: clicked on link to {:s}", *href); - let click_frag = href.starts_with("#"); + debug!("ScriptTask: clicked on link to {:s}", href.Value()); + let click_frag = href.value_ref().starts_with("#"); let current_url = page.url.as_ref().map(|&(ref url, _)| { url.clone() }); debug!("ScriptTask: current url is {:?}", current_url); - let url = make_url(href.to_owned(), current_url); + let url = make_url(href.Value(), current_url); if click_frag { match self.find_fragment_node(page, url.fragment.unwrap()) { diff --git a/src/components/style/node.rs b/src/components/style/node.rs index 546ef329795..df136a97be2 100644 --- a/src/components/style/node.rs +++ b/src/components/style/node.rs @@ -18,7 +18,7 @@ pub trait TNode<E:TElement> : Clone { } pub trait TElement { - fn get_attr(&self, namespace: Option<~str>, attr: &str) -> Option<~str>; + fn get_attr(&self, namespace: Option<~str>, attr: &str) -> Option<&'static str>; fn get_link(&self) -> Option<~str>; fn get_local_name<'a>(&'a self) -> &'a str; fn get_namespace_url<'a>(&'a self) -> &'a str; |