From 34ed2923a4a9f1a7b3758cdd2106205bfb3e8888 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 18 Sep 2014 09:20:19 -0400 Subject: [PATCH] servo: Revert "script: Use atom comparison in more places, especially for attributes." for persistent test failures. This reverts commit 874db261046d6155b1942efa106d2e0014295d6d. Source-Repo: https://github.com/servo/servo Source-Revision: 9607b468bc50496c0de3706d22efaa6fdc68b089 --- servo/Cargo.lock | 6 - servo/components/layout/Cargo.toml | 9 -- servo/components/layout/construct.rs | 4 +- servo/components/layout/css/matching.rs | 11 +- servo/components/layout/fragment.rs | 9 +- servo/components/layout/lib.rs | 4 - servo/components/layout/wrapper.rs | 38 ++--- servo/components/macros/lib.rs | 4 - servo/components/script/Cargo.toml | 9 -- servo/components/script/dom/attr.rs | 16 +-- .../dom/bindings/codegen/CodegenRust.py | 1 - servo/components/script/dom/document.rs | 3 +- servo/components/script/dom/domtokenlist.rs | 21 ++- servo/components/script/dom/element.rs | 136 ++++++------------ .../script/dom/htmlanchorelement.rs | 2 +- servo/components/script/dom/htmlcollection.rs | 16 +-- .../script/dom/htmliframeelement.rs | 6 +- .../components/script/dom/htmllinkelement.rs | 4 +- .../script/dom/htmlobjectelement.rs | 4 +- .../script/dom/htmlscriptelement.rs | 9 +- servo/components/script/dom/macros.rs | 6 +- servo/components/script/dom/node.rs | 12 +- .../script/html/hubbub_html_parser.rs | 2 +- servo/components/script/lib.rs | 3 - servo/components/script/page.rs | 9 +- servo/components/style/Cargo.toml | 8 -- servo/components/style/lib.rs | 2 - servo/components/style/node.rs | 14 +- servo/components/style/selector_matching.rs | 58 ++++---- servo/components/style/selectors.rs | 8 +- servo/components/util/atom.rs | 7 - servo/ports/cef/Cargo.lock | 6 - 32 files changed, 147 insertions(+), 300 deletions(-) diff --git a/servo/Cargo.lock b/servo/Cargo.lock index c096c14e6ad8..2ec0cc2c2289 100644 --- a/servo/Cargo.lock +++ b/servo/Cargo.lock @@ -265,8 +265,6 @@ dependencies = [ "net 0.0.1", "script 0.0.1", "script_traits 0.0.1", - "string_cache 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#37a5869d4130bf75e2f082bab54767d56d4ba63a)", - "string_cache_macros 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#37a5869d4130bf75e2f082bab54767d56d4ba63a)", "style 0.0.1", "url 0.1.0 (git+https://github.com/servo/rust-url#678bb4d52638b1cfdab78ef8e521566c9240fb1a)", "util 0.0.1", @@ -376,8 +374,6 @@ dependencies = [ "msg 0.0.1", "net 0.0.1", "script_traits 0.0.1", - "string_cache 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#37a5869d4130bf75e2f082bab54767d56d4ba63a)", - "string_cache_macros 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#37a5869d4130bf75e2f082bab54767d56d4ba63a)", "style 0.0.1", "url 0.1.0 (git+https://github.com/servo/rust-url#678bb4d52638b1cfdab78ef8e521566c9240fb1a)", "util 0.0.1", @@ -435,8 +431,6 @@ dependencies = [ "encoding 0.1.0 (git+https://github.com/lifthrasiir/rust-encoding#12b6610adff6eddc060691888c36017cd3ad57f7)", "geom 0.1.0 (git+https://github.com/servo/rust-geom#2982b770db6e5e3270305e0fd6b8068f6f80a489)", "macros 0.0.1", - "string_cache 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#37a5869d4130bf75e2f082bab54767d56d4ba63a)", - "string_cache_macros 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#37a5869d4130bf75e2f082bab54767d56d4ba63a)", "url 0.1.0 (git+https://github.com/servo/rust-url#678bb4d52638b1cfdab78ef8e521566c9240fb1a)", "util 0.0.1", ] diff --git a/servo/components/layout/Cargo.toml b/servo/components/layout/Cargo.toml index 1ecc9ea98f7b..ed1ba4a57400 100644 --- a/servo/components/layout/Cargo.toml +++ b/servo/components/layout/Cargo.toml @@ -39,12 +39,3 @@ git = "https://github.com/servo/rust-geom" [dependencies.url] git = "https://github.com/servo/rust-url" - -[dependencies.string_cache] -git = "https://github.com/servo/string-cache" -branch = "pre-rustup" - -[dependencies.string_cache_macros] -git = "https://github.com/servo/string-cache" -branch = "pre-rustup" - diff --git a/servo/components/layout/construct.rs b/servo/components/layout/construct.rs index 81910a2d915d..a76034c02de0 100644 --- a/servo/components/layout/construct.rs +++ b/servo/components/layout/construct.rs @@ -57,7 +57,6 @@ use script::dom::node::{CommentNodeTypeId, DoctypeNodeTypeId, DocumentFragmentNo use script::dom::node::{DocumentNodeTypeId, ElementNodeTypeId, ProcessingInstructionNodeTypeId}; use script::dom::node::{TextNodeTypeId}; use script::dom::htmlobjectelement::is_image_data; -use servo_util::atom::Atom; use servo_util::namespace; use std::mem; use std::sync::atomics::Relaxed; @@ -1052,8 +1051,7 @@ trait ObjectElement { impl<'ln> ObjectElement for ThreadSafeLayoutNode<'ln> { fn get_type_and_data(&self) -> (Option<&'static str>, Option<&'static str>) { let elem = self.as_element(); - (elem.get_attr(&namespace::Null, &satom!("type")), - elem.get_attr(&namespace::Null, &satom!("data"))) + (elem.get_attr(&namespace::Null, "type"), elem.get_attr(&namespace::Null, "data")) } fn has_object_data(&self) -> bool { diff --git a/servo/components/layout/css/matching.rs b/servo/components/layout/css/matching.rs index b26fe8e409b3..7abc683f4ad6 100644 --- a/servo/components/layout/css/matching.rs +++ b/servo/components/layout/css/matching.rs @@ -223,7 +223,8 @@ impl StyleSharingCandidate { style: style, parent_style: parent_style, local_name: element.get_local_name().clone(), - class: element.get_attr(&Null, &satom!("class")).map(|string| string.to_string()), + class: element.get_attr(&Null, "class") + .map(|string| string.to_string()), }) } @@ -231,7 +232,7 @@ impl StyleSharingCandidate { if *element.get_local_name() != self.local_name { return false } - match (&self.class, element.get_attr(&Null, &satom!("class"))) { + match (&self.class, element.get_attr(&Null, "class")) { (&None, Some(_)) | (&Some(_), None) => return false, (&Some(ref this_class), Some(element_class)) if element_class != this_class.as_slice() => { return false @@ -453,7 +454,7 @@ impl<'ln> MatchMethods for LayoutNode<'ln> { } let ok = { let element = self.as_element(); - element.style_attribute().is_none() && element.get_attr(&Null, &satom!("id")).is_none() + element.style_attribute().is_none() && element.get_attr(&Null, "id").is_none() }; if !ok { return CannotShare(false) @@ -500,7 +501,7 @@ impl<'ln> MatchMethods for LayoutNode<'ln> { // TODO: case-sensitivity depends on the document type and quirks mode element - .get_attr(&Null, &satom!("class")) + .get_attr(&Null, "class") .map(|attr| { for c in attr.split(style::SELECTOR_WHITESPACE) { bf.insert(&c); @@ -519,7 +520,7 @@ impl<'ln> MatchMethods for LayoutNode<'ln> { // TODO: case-sensitivity depends on the document type and quirks mode element - .get_attr(&Null, &satom!("class")) + .get_attr(&Null, "class") .map(|attr| { for c in attr.split(style::SELECTOR_WHITESPACE) { bf.remove(&c); diff --git a/servo/components/layout/fragment.rs b/servo/components/layout/fragment.rs index d423cfc15557..4ff04389836d 100644 --- a/servo/components/layout/fragment.rs +++ b/servo/components/layout/fragment.rs @@ -39,7 +39,6 @@ use serialize::{Encodable, Encoder}; use servo_msg::constellation_msg::{ConstellationChan, FrameRectMsg, PipelineId, SubpageId}; use servo_net::image::holder::ImageHolder; use servo_net::local_image_cache::LocalImageCache; -use servo_util::atom::Atom; use servo_util::geometry::Au; use servo_util::geometry; use servo_util::logical_geometry::{LogicalRect, LogicalSize, LogicalMargin}; @@ -175,7 +174,7 @@ impl ImageFragmentInfo { image_url: Url, local_image_cache: Arc>) -> ImageFragmentInfo { - fn convert_length(node: &ThreadSafeLayoutNode, name: &Atom) -> Option { + fn convert_length(node: &ThreadSafeLayoutNode, name: &str) -> Option { let element = node.as_element(); element.get_attr(&namespace::Null, name).and_then(|string| { let n: Option = FromStr::from_str(string); @@ -184,8 +183,8 @@ impl ImageFragmentInfo { } let is_vertical = node.style().writing_mode.is_vertical(); - let dom_width = convert_length(node, &satom!("width")); - let dom_height = convert_length(node, &satom!("height")); + let dom_width = convert_length(node, "width"); + let dom_height = convert_length(node, "height"); ImageFragmentInfo { image: ImageHolder::new(image_url, local_image_cache), computed_inline_size: None, @@ -338,7 +337,7 @@ impl TableColumnFragmentInfo { pub fn new(node: &ThreadSafeLayoutNode) -> TableColumnFragmentInfo { let span = { let element = node.as_element(); - element.get_attr(&namespace::Null, &satom!("span")).and_then(|string| { + element.get_attr(&namespace::Null, "span").and_then(|string| { let n: Option = FromStr::from_str(string); n }) diff --git a/servo/components/layout/lib.rs b/servo/components/layout/lib.rs index 7aa6edc1b176..171852573c8b 100644 --- a/servo/components/layout/lib.rs +++ b/servo/components/layout/lib.rs @@ -29,10 +29,6 @@ extern crate servo_msg = "msg"; #[phase(plugin, link)] extern crate servo_util = "util"; -#[phase(plugin)] -extern crate string_cache_macros; -extern crate string_cache; - extern crate collections; extern crate encoding; extern crate green; diff --git a/servo/components/layout/wrapper.rs b/servo/components/layout/wrapper.rs index 01fcc4f2f43e..bdabc3b58402 100644 --- a/servo/components/layout/wrapper.rs +++ b/servo/components/layout/wrapper.rs @@ -273,14 +273,15 @@ impl<'ln> TNode> for LayoutNode<'ln> { fn match_attr(&self, attr: &AttrSelector, test: |&str| -> bool) -> bool { assert!(self.is_element()) let name = if self.is_html_element_in_html_document() { - &attr.lower_name + attr.lower_name.as_slice() } else { - &attr.name + attr.name.as_slice() }; match attr.namespace { SpecificNamespace(ref ns) => { let element = self.as_element(); - element.get_attr(ns, name).map_or(false, |attr| test(attr)) + element.get_attr(ns, name) + .map_or(false, |attr| test(attr)) }, // FIXME: https://github.com/mozilla/servo/issues/1558 AnyNamespace => false, @@ -382,7 +383,7 @@ impl<'le> TElement for LayoutElement<'le> { } #[inline] - fn get_attr(&self, namespace: &Namespace, name: &Atom) -> Option<&'static str> { + fn get_attr(&self, namespace: &Namespace, name: &str) -> Option<&'static str> { unsafe { self.element.get_attr_val_for_layout(namespace, name) } } @@ -394,9 +395,7 @@ impl<'le> TElement for LayoutElement<'le> { ElementNodeTypeId(HTMLAnchorElementTypeId) | ElementNodeTypeId(HTMLAreaElementTypeId) | ElementNodeTypeId(HTMLLinkElementTypeId) => { - unsafe { - self.element.get_attr_val_for_layout(&namespace::Null, &satom!("href")) - } + unsafe { self.element.get_attr_val_for_layout(&namespace::Null, "href") } } _ => None, } @@ -410,9 +409,7 @@ impl<'le> TElement for LayoutElement<'le> { #[inline] fn get_id(&self) -> Option { - unsafe { - self.element.get_attr_atom_for_layout(&namespace::Null, &satom!("id")) - } + unsafe { self.element.get_attr_atom_for_layout(&namespace::Null, "id") } } fn get_disabled_state(&self) -> bool { @@ -427,24 +424,11 @@ impl<'le> TElement for LayoutElement<'le> { } } - fn has_class(&self, name: &Atom) -> bool { + fn has_class(&self, name: &str) -> bool { unsafe { self.element.has_class_for_layout(name) } } - - fn each_class(&self, callback: |&Atom|) { - unsafe { - match self.element.get_classes_for_layout() { - None => {} - Some(ref classes) => { - for class in classes.iter() { - callback(class) - } - } - } - } - } } fn get_content(content_list: &content::T) -> String { @@ -774,10 +758,8 @@ pub struct ThreadSafeLayoutElement<'le> { impl<'le> ThreadSafeLayoutElement<'le> { #[inline] - pub fn get_attr(&self, namespace: &Namespace, name: &Atom) -> Option<&'static str> { - unsafe { - self.element.get_attr_val_for_layout(namespace, name) - } + pub fn get_attr(&self, namespace: &Namespace, name: &str) -> Option<&'static str> { + unsafe { self.element.get_attr_val_for_layout(namespace, name) } } } diff --git a/servo/components/macros/lib.rs b/servo/components/macros/lib.rs index d0d35f88e687..1ce4832b19aa 100644 --- a/servo/components/macros/lib.rs +++ b/servo/components/macros/lib.rs @@ -210,10 +210,6 @@ macro_rules! lazy_init( ) ) -#[macro_export] -macro_rules! satom( - ($str:tt) => (Atom::new(atom!($str))) -) #[cfg(test)] mod tests { diff --git a/servo/components/script/Cargo.toml b/servo/components/script/Cargo.toml index 7c3bc88f09d9..1748a57956dc 100644 --- a/servo/components/script/Cargo.toml +++ b/servo/components/script/Cargo.toml @@ -52,14 +52,5 @@ branch = "servo" [dependencies.js] git = "https://github.com/servo/rust-mozjs" -[dependencies.string_cache] -git = "https://github.com/servo/string-cache" -branch = "pre-rustup" - -[dependencies.string_cache_macros] -git = "https://github.com/servo/string-cache" -branch = "pre-rustup" - [dependencies.url] git = "https://github.com/servo/rust-url" - diff --git a/servo/components/script/dom/attr.rs b/servo/components/script/dom/attr.rs index 60b414199e56..be419eb2a616 100644 --- a/servo/components/script/dom/attr.rs +++ b/servo/components/script/dom/attr.rs @@ -13,13 +13,13 @@ use dom::element::{Element, AttributeHandlers}; use dom::node::Node; use dom::window::Window; use dom::virtualmethods::vtable_for; - use servo_util::atom::Atom; use servo_util::namespace; use servo_util::namespace::Namespace; use servo_util::str::{DOMString, split_html_space_chars}; use std::cell::{Ref, RefCell}; use std::mem; +use std::slice::Items; pub enum AttrSettingType { FirstSetAttr, @@ -51,9 +51,9 @@ impl AttrValue { AtomAttrValue(value) } - pub fn tokens<'a>(&'a self) -> Option<&'a [Atom]> { + pub fn tokens<'a>(&'a self) -> Option> { match *self { - TokenListAttrValue(_, ref tokens) => Some(tokens.as_slice()), + TokenListAttrValue(_, ref tokens) => Some(tokens.iter()), _ => None } } @@ -189,19 +189,17 @@ impl<'a> AttrHelpers for JSRef<'a, Attr> { pub trait AttrHelpersForLayout { unsafe fn value_ref_forever(&self) -> &'static str; unsafe fn value_atom_forever(&self) -> Option; - unsafe fn value_tokens_forever(&self) -> Option<&'static [Atom]>; + unsafe fn value_tokens_forever(&self) -> Option>; unsafe fn local_name_atom_forever(&self) -> Atom; } impl AttrHelpersForLayout for Attr { - #[inline] unsafe fn value_ref_forever(&self) -> &'static str { // cast to point to T in RefCell directly let value = mem::transmute::<&RefCell, &AttrValue>(self.value.deref()); value.as_slice() } - #[inline] unsafe fn value_atom_forever(&self) -> Option { // cast to point to T in RefCell directly let value = mem::transmute::<&RefCell, &AttrValue>(self.value.deref()); @@ -211,17 +209,15 @@ impl AttrHelpersForLayout for Attr { } } - #[inline] - unsafe fn value_tokens_forever(&self) -> Option<&'static [Atom]> { + unsafe fn value_tokens_forever(&self) -> Option> { // cast to point to T in RefCell directly let value = mem::transmute::<&RefCell, &AttrValue>(self.value.deref()); match *value { - TokenListAttrValue(_, ref tokens) => Some(tokens.as_slice()), + TokenListAttrValue(_, ref tokens) => Some(tokens.iter()), _ => None, } } - #[inline] unsafe fn local_name_atom_forever(&self) -> Atom { self.local_name.clone() } diff --git a/servo/components/script/dom/bindings/codegen/CodegenRust.py b/servo/components/script/dom/bindings/codegen/CodegenRust.py index 8554132862f1..4d0f8bdb6826 100644 --- a/servo/components/script/dom/bindings/codegen/CodegenRust.py +++ b/servo/components/script/dom/bindings/codegen/CodegenRust.py @@ -5458,7 +5458,6 @@ class GlobalGenRoots(): for protoName in descriptor.prototypeChain[1:-1]: protoDescriptor = config.getDescriptor(protoName) delegate = string.Template('''impl ${selfName} for ${baseName} { - #[inline] fn ${fname}(&self) -> bool { self.${parentName}.${fname}() } diff --git a/servo/components/script/dom/document.rs b/servo/components/script/dom/document.rs index 9b65fa61c41b..5f2661f9e105 100644 --- a/servo/components/script/dom/document.rs +++ b/servo/components/script/dom/document.rs @@ -52,7 +52,6 @@ use dom::window::{Window, WindowHelpers}; use html::hubbub_html_parser::build_element_from_tag; use hubbub::hubbub::{QuirksMode, NoQuirks, LimitedQuirks, FullQuirks}; use layout_interface::{DocumentDamageLevel, ContentChangedDocumentDamage}; -use servo_util::atom::Atom; use servo_util::namespace; use servo_util::namespace::{Namespace, Null}; use servo_util::str::{DOMString, null_str_as_empty_ref, split_html_space_chars}; @@ -731,7 +730,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } let element: &JSRef = ElementCast::to_ref(node).unwrap(); - element.get_attribute(Null, &satom!("name")).root().map_or(false, |attr| { + element.get_attribute(Null, "name").root().map_or(false, |attr| { attr.value().as_slice() == name.as_slice() }) }) diff --git a/servo/components/script/dom/domtokenlist.rs b/servo/components/script/dom/domtokenlist.rs index 5f1e0d7de37b..e57f0310ec58 100644 --- a/servo/components/script/dom/domtokenlist.rs +++ b/servo/components/script/dom/domtokenlist.rs @@ -21,23 +21,24 @@ use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS}; pub struct DOMTokenList { reflector_: Reflector, element: JS, - local_name: Atom, + local_name: &'static str, } impl DOMTokenList { - pub fn new_inherited(element: &JSRef, local_name: &Atom) -> DOMTokenList { + pub fn new_inherited(element: &JSRef, + local_name: &'static str) -> DOMTokenList { DOMTokenList { reflector_: Reflector::new(), element: JS::from_rooted(element), - local_name: local_name.clone(), + local_name: local_name, } } - pub fn new(element: &JSRef, local_name: &Atom) -> Temporary { + pub fn new(element: &JSRef, + local_name: &'static str) -> Temporary { let window = window_from_node(element).root(); reflect_dom_object(box DOMTokenList::new_inherited(element, local_name), - &Window(*window), - DOMTokenListBinding::Wrap) + &Window(*window), DOMTokenListBinding::Wrap) } } @@ -55,7 +56,7 @@ trait PrivateDOMTokenListHelpers { impl<'a> PrivateDOMTokenListHelpers for JSRef<'a, DOMTokenList> { fn attribute(&self) -> Option> { let element = self.element.root(); - element.deref().get_attribute(Null, &self.local_name) + element.deref().get_attribute(Null, self.local_name) } fn check_token_exceptions<'a>(&self, token: &'a str) -> Fallible<&'a str> { @@ -79,9 +80,7 @@ impl<'a> DOMTokenListMethods for JSRef<'a, DOMTokenList> { // http://dom.spec.whatwg.org/#dom-domtokenlist-item fn Item(&self, index: u32) -> Option { self.attribute().root().and_then(|attr| attr.value().tokens().and_then(|mut tokens| { - tokens.iter() - .idx(index as uint) - .map(|token| token.as_slice().to_string()) + tokens.idx(index as uint).map(|token| token.as_slice().to_string()) })) } @@ -96,7 +95,7 @@ impl<'a> DOMTokenListMethods for JSRef<'a, DOMTokenList> { self.check_token_exceptions(token.as_slice()).map(|slice| { self.attribute().root().and_then(|attr| attr.value().tokens().map(|mut tokens| { let atom = Atom::from_slice(slice); - tokens.iter().any(|token| *token == atom) + tokens.any(|token| *token == atom) })).unwrap_or(false) }) } diff --git a/servo/components/script/dom/element.rs b/servo/components/script/dom/element.rs index b6b76f34593e..953036788f40 100644 --- a/servo/components/script/dom/element.rs +++ b/servo/components/script/dom/element.rs @@ -55,7 +55,6 @@ pub struct Element { } impl ElementDerived for EventTarget { - #[inline] fn is_element(&self) -> bool { match self.type_id { NodeTargetTypeId(ElementNodeTypeId(_)) => true, @@ -168,22 +167,21 @@ impl Element { } pub trait RawLayoutElementHelpers { - unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &Atom) -> Option<&'static str>; - unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &Atom) -> Option; - unsafe fn has_class_for_layout(&self, name: &Atom) -> bool; - unsafe fn get_classes_for_layout(&self) -> Option<&'static [Atom]>; + unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str) -> Option<&'static str>; + unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &str) -> Option; + unsafe fn has_class_for_layout(&self, name: &str) -> bool; } impl RawLayoutElementHelpers for Element { #[inline] #[allow(unrooted_must_root)] - unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &Atom) + unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str) -> Option<&'static str> { // cast to point to T in RefCell directly let attrs: *const Vec> = mem::transmute(&self.attrs); (*attrs).iter().find(|attr: & &JS| { let attr = attr.unsafe_get(); - *name == (*attr).local_name_atom_forever() && + name == (*attr).local_name_atom_forever().as_slice() && (*attr).namespace == *namespace }).map(|attr| { let attr = attr.unsafe_get(); @@ -193,13 +191,13 @@ impl RawLayoutElementHelpers for Element { #[inline] #[allow(unrooted_must_root)] - unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &Atom) + unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &str) -> Option { // cast to point to T in RefCell directly let attrs: *const Vec> = mem::transmute(&self.attrs); (*attrs).iter().find(|attr: & &JS| { let attr = attr.unsafe_get(); - *name == (*attr).local_name_atom_forever() && + name == (*attr).local_name_atom_forever().as_slice() && (*attr).namespace == *namespace }).and_then(|attr| { let attr = attr.unsafe_get(); @@ -209,31 +207,16 @@ impl RawLayoutElementHelpers for Element { #[inline] #[allow(unrooted_must_root)] - unsafe fn has_class_for_layout(&self, name: &Atom) -> bool { + unsafe fn has_class_for_layout(&self, name: &str) -> bool { let attrs: *const Vec> = mem::transmute(&self.attrs); (*attrs).iter().find(|attr: & &JS| { let attr = attr.unsafe_get(); - (*attr).local_name_atom_forever() == satom!("class") + (*attr).local_name_atom_forever().as_slice() == "class" }).map_or(false, |attr| { let attr = attr.unsafe_get(); - (*attr).value_tokens_forever().map(|mut tokens| { - tokens.iter().any(|atom| atom == name) - }) + (*attr).value_tokens_forever().map(|mut tokens| { tokens.any(|atom| atom.as_slice() == name) }) }.take().unwrap()) } - - #[inline] - #[allow(unrooted_must_root)] - unsafe fn get_classes_for_layout(&self) -> Option<&'static [Atom]> { - let attrs: *const Vec> = mem::transmute(&self.attrs); - (*attrs).iter().find(|attr: & &JS| { - let attr = attr.unsafe_get(); - (*attr).local_name_atom_forever() == satom!("class") - }).and_then(|attr| { - let attr = attr.unsafe_get(); - (*attr).value_tokens_forever() - }) - } } pub trait LayoutElementHelpers { @@ -242,7 +225,6 @@ pub trait LayoutElementHelpers { impl LayoutElementHelpers for JS { #[allow(unrooted_must_root)] - #[inline] unsafe fn html_element_in_html_document_for_layout(&self) -> bool { if (*self.unsafe_get()).namespace != namespace::HTML { return false @@ -275,11 +257,10 @@ impl<'a> ElementHelpers for JSRef<'a, Element> { } pub trait AttributeHandlers { - /// Returns the attribute with given namespace and case-insensitive local name, if any. - fn get_attribute(&self, namespace: Namespace, local_name: &Atom) -> Option>; - /// Returns the attribute with given namespace and case-sensitive local name, if any. - fn get_case_sensitive_attribute(&self, namespace: Namespace, name: &Atom) - -> Option>; + /// Returns the attribute with given namespace and case-sensitive local + /// name, if any. + fn get_attribute(&self, namespace: Namespace, local_name: &str) + -> Option>; fn set_attribute_from_parser(&self, local_name: Atom, value: DOMString, namespace: Namespace, prefix: Option); @@ -292,38 +273,27 @@ pub trait AttributeHandlers { fn remove_attribute(&self, namespace: Namespace, name: &str); fn notify_attribute_changed(&self, local_name: &Atom); - fn has_class(&self, name: &Atom) -> bool; + fn has_class(&self, name: &str) -> bool; fn set_atomic_attribute(&self, name: &str, value: DOMString); // http://www.whatwg.org/html/#reflecting-content-attributes-in-idl-attributes fn has_attribute(&self, name: &str) -> bool; fn set_bool_attribute(&self, name: &str, value: bool); - fn get_url_attribute(&self, name: &Atom) -> DOMString; + fn get_url_attribute(&self, name: &str) -> DOMString; fn set_url_attribute(&self, name: &str, value: DOMString); - fn get_string_attribute(&self, name: &Atom) -> DOMString; + fn get_string_attribute(&self, name: &str) -> DOMString; fn set_string_attribute(&self, name: &str, value: DOMString); fn set_tokenlist_attribute(&self, name: &str, value: DOMString); - fn get_uint_attribute(&self, name: &Atom) -> u32; + fn get_uint_attribute(&self, name: &str) -> u32; fn set_uint_attribute(&self, name: &str, value: u32); } impl<'a> AttributeHandlers for JSRef<'a, Element> { - fn get_attribute(&self, namespace: Namespace, name: &Atom) -> Option> { - match self.html_element_in_html_document() { - true => { - let local_name = Atom::from_slice(name.as_slice().to_ascii_lower().as_slice()); - self.get_case_sensitive_attribute(namespace, &local_name) - } - false => self.get_case_sensitive_attribute(namespace, name), - } - } - - fn get_case_sensitive_attribute(&self, namespace: Namespace, local_name: &Atom) - -> Option> { - let element: &Element = self.deref(); - element.attrs.borrow().iter().map(|attr| attr.root()).find(|attr| { - attr.local_name() == local_name && attr.namespace == namespace + fn get_attribute(&self, namespace: Namespace, local_name: &str) -> Option> { + let local_name = Atom::from_slice(local_name); + self.attrs.borrow().iter().map(|attr| attr.root()).find(|attr| { + *attr.local_name() == local_name && attr.namespace == namespace }).map(|x| Temporary::from_rooted(&*x)) } @@ -423,12 +393,11 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } } - fn has_class(&self, name: &Atom) -> bool { - self.get_attribute(Null, &satom!("class")).root().map(|attr| { - match attr.deref().value().tokens() { - None => false, - Some(ref atoms) => atoms.iter().any(|atom| atom == name), - } + fn has_class(&self, name: &str) -> bool { + self.get_attribute(Null, "class").root().map(|attr| { + attr.deref().value().tokens().map(|mut tokens| { + tokens.any(|atom| atom.as_slice() == name) + }).unwrap_or(false) }).unwrap_or(false) } @@ -457,7 +426,8 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } } - fn get_url_attribute(&self, name: &Atom) -> DOMString { + fn get_url_attribute(&self, name: &str) -> DOMString { + assert!(name == name.to_ascii_lower().as_slice()); // XXX Resolve URL. self.get_string_attribute(name) } @@ -465,7 +435,8 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { self.set_string_attribute(name, value); } - fn get_string_attribute(&self, name: &Atom) -> DOMString { + fn get_string_attribute(&self, name: &str) -> DOMString { + assert!(name == name.to_ascii_lower().as_slice()); match self.get_attribute(Null, name) { Some(x) => { let x = x.root(); @@ -484,8 +455,8 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { self.set_attribute(name, AttrValue::from_tokenlist(value)); } - fn get_uint_attribute(&self, name: &Atom) -> u32 { - assert!(name.as_slice() == name.as_slice().to_ascii_lower().as_slice()); + fn get_uint_attribute(&self, name: &str) -> u32 { + assert!(name == name.to_ascii_lower().as_slice()); let attribute = self.get_attribute(Null, name).root(); match attribute { Some(attribute) => { @@ -552,7 +523,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { // http://dom.spec.whatwg.org/#dom-element-id fn Id(&self) -> DOMString { - self.get_string_attribute(&satom!("id")) + self.get_string_attribute("id") } // http://dom.spec.whatwg.org/#dom-element-id @@ -562,7 +533,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { // http://dom.spec.whatwg.org/#dom-element-classname fn ClassName(&self) -> DOMString { - self.get_string_attribute(&satom!("class")) + self.get_string_attribute("class") } // http://dom.spec.whatwg.org/#dom-element-classname @@ -575,7 +546,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { match self.class_list.get() { Some(class_list) => Temporary::new(class_list), None => { - let class_list = DOMTokenList::new(self, &satom!("class")).root(); + let class_list = DOMTokenList::new(self, "class").root(); self.class_list.assign(Some(class_list.deref().clone())); Temporary::from_rooted(&*class_list) } @@ -606,7 +577,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { } else { name }; - self.get_attribute(Null, &Atom::from_slice(name.as_slice())).root() + self.get_attribute(Null, name.as_slice()).root() .map(|s| s.deref().Value()) } @@ -615,7 +586,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { namespace: Option, local_name: DOMString) -> Option { let namespace = Namespace::from_str(null_str_as_empty_ref(&namespace)); - self.get_attribute(namespace, &Atom::from_slice(local_name.as_slice())).root() + self.get_attribute(namespace, local_name.as_slice()).root() .map(|attr| attr.deref().Value()) } @@ -925,7 +896,7 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { if !tree_in_doc { return; } - match self.get_attribute(Null, &satom!("id")).root() { + match self.get_attribute(Null, "id").root() { Some(attr) => { let doc = document_from_node(self).root(); let value = attr.deref().Value(); @@ -945,7 +916,7 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { if !tree_in_doc { return; } - match self.get_attribute(Null, &satom!("id")).root() { + match self.get_attribute(Null, "id").root() { Some(attr) => { let doc = document_from_node(self).root(); let value = attr.deref().Value(); @@ -959,8 +930,8 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } impl<'a> style::TElement for JSRef<'a, Element> { - fn get_attr(&self, namespace: &Namespace, attr: &Atom) -> Option<&'static str> { - self.get_case_sensitive_attribute(namespace.clone(), attr).root().map(|attr| { + fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'static str> { + self.get_attribute(namespace.clone(), attr).root().map(|attr| { unsafe { mem::transmute(attr.deref().value().as_slice()) } }) } @@ -972,9 +943,7 @@ impl<'a> style::TElement for JSRef<'a, Element> { // selector-link ElementNodeTypeId(HTMLAnchorElementTypeId) | ElementNodeTypeId(HTMLAreaElementTypeId) | - ElementNodeTypeId(HTMLLinkElementTypeId) => { - self.get_attr(&namespace::Null, &satom!("href")) - } + ElementNodeTypeId(HTMLLinkElementTypeId) => self.get_attr(&namespace::Null, "href"), _ => None, } } @@ -989,7 +958,7 @@ impl<'a> style::TElement for JSRef<'a, Element> { node.get_hover_state() } fn get_id<'a>(&self) -> Option { - self.get_attribute(namespace::Null, &satom!("id")).map(|attr| { + self.get_attribute(namespace::Null, "id").map(|attr| { let attr = attr.root(); match *attr.value() { AtomAttrValue(ref val) => val.clone(), @@ -1005,22 +974,7 @@ impl<'a> style::TElement for JSRef<'a, Element> { let node: &JSRef = NodeCast::from_ref(self); node.get_enabled_state() } - fn has_class(&self, name: &Atom) -> bool { + fn has_class(&self, name: &str) -> bool { (self as &AttributeHandlers).has_class(name) } - fn each_class(&self, callback: |&Atom|) { - match self.get_attribute(Null, &satom!("class")) { - None => {} - Some(ref attr) => { - match attr.root().value().tokens() { - None => {} - Some(ref atoms) => { - for atom in atoms.iter() { - callback(atom); - } - } - } - } - } - } } diff --git a/servo/components/script/dom/htmlanchorelement.rs b/servo/components/script/dom/htmlanchorelement.rs index ea80b3aa1db4..0a8efa158901 100644 --- a/servo/components/script/dom/htmlanchorelement.rs +++ b/servo/components/script/dom/htmlanchorelement.rs @@ -57,7 +57,7 @@ impl<'a> PrivateHTMLAnchorElementHelpers for JSRef<'a, HTMLAnchorElement> { fn handle_event_impl(&self, event: &JSRef) { if "click" == event.Type().as_slice() && !event.DefaultPrevented() { let element: &JSRef = ElementCast::from_ref(self); - let attr = element.get_attribute(Null, &satom!("href")).root(); + let attr = element.get_attribute(Null, "href").root(); match attr { Some(ref href) => { let value = href.Value(); diff --git a/servo/components/script/dom/htmlcollection.rs b/servo/components/script/dom/htmlcollection.rs index 78dd03d98593..bd07b82e53e6 100644 --- a/servo/components/script/dom/htmlcollection.rs +++ b/servo/components/script/dom/htmlcollection.rs @@ -146,17 +146,15 @@ impl HTMLCollection { pub fn by_class_name(window: &JSRef, root: &JSRef, classes: DOMString) -> Temporary { struct ClassNameFilter { - classes: Vec + classes: Vec } impl CollectionFilter for ClassNameFilter { fn filter(&self, elem: &JSRef, _root: &JSRef) -> bool { - self.classes.iter().all(|class| elem.has_class(class)) + self.classes.iter().all(|class| elem.has_class(class.as_slice())) } } let filter = ClassNameFilter { - classes: split_html_space_chars(classes.as_slice()).map(|class| { - Atom::from_slice(class) - }).collect() + classes: split_html_space_chars(classes.as_slice()).map(|class| class.to_string()).collect() }; HTMLCollection::create(window, root, box filter) } @@ -222,8 +220,8 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { Static(ref elems) => elems.iter() .map(|elem| elem.root()) .find(|elem| { - elem.get_string_attribute(&satom!("name")) == key || - elem.get_string_attribute(&satom!("id")) == key }) + elem.get_string_attribute("name") == key || + elem.get_string_attribute("id") == key }) .map(|maybe_elem| Temporary::from_rooted(&*maybe_elem)), Live(ref root, ref filter) => { let root = root.root(); @@ -234,8 +232,8 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { .map(|elem| elem.clone()) }) .find(|elem| { - elem.get_string_attribute(&satom!("name")) == key || - elem.get_string_attribute(&satom!("id")) == key }) + elem.get_string_attribute("name") == key || + elem.get_string_attribute("id") == key }) .map(|maybe_elem| Temporary::from_rooted(&maybe_elem)) } } diff --git a/servo/components/script/dom/htmliframeelement.rs b/servo/components/script/dom/htmliframeelement.rs index 551a36f448e7..a5c83002327a 100644 --- a/servo/components/script/dom/htmliframeelement.rs +++ b/servo/components/script/dom/htmliframeelement.rs @@ -75,7 +75,7 @@ impl<'a> HTMLIFrameElementHelpers for JSRef<'a, HTMLIFrameElement> { fn get_url(&self) -> Option { let element: &JSRef = ElementCast::from_ref(self); - element.get_attribute(Null, &satom!("src")).root().and_then(|src| { + element.get_attribute(Null, "src").root().and_then(|src| { let url = src.deref().value(); if url.as_slice().is_empty() { None @@ -133,7 +133,7 @@ impl HTMLIFrameElement { impl<'a> HTMLIFrameElementMethods for JSRef<'a, HTMLIFrameElement> { fn Src(&self) -> DOMString { let element: &JSRef = ElementCast::from_ref(self); - element.get_string_attribute(&satom!("src")) + element.get_string_attribute("src") } fn SetSrc(&self, src: DOMString) { @@ -143,7 +143,7 @@ impl<'a> HTMLIFrameElementMethods for JSRef<'a, HTMLIFrameElement> { fn Sandbox(&self) -> DOMString { let element: &JSRef = ElementCast::from_ref(self); - element.get_string_attribute(&satom!("sandbox")) + element.get_string_attribute("sandbox") } fn SetSandbox(&self, sandbox: DOMString) { diff --git a/servo/components/script/dom/htmllinkelement.rs b/servo/components/script/dom/htmllinkelement.rs index 4a25be91e73b..3c44a9cba8b8 100644 --- a/servo/components/script/dom/htmllinkelement.rs +++ b/servo/components/script/dom/htmllinkelement.rs @@ -92,11 +92,11 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLLinkElement> { // FIXME: workaround for https://github.com/mozilla/rust/issues/13246; // we get unrooting order failures if these are inside the match. let rel = { - let rel = element.get_attribute(Null, &satom!("rel")).root(); + let rel = element.get_attribute(Null, "rel").root(); rel.map(|rel| rel.deref().value().as_slice().to_string()) }; let href = { - let href = element.get_attribute(Null, &satom!("href")).root(); + let href = element.get_attribute(Null, "href").root(); href.map(|href| href.deref().value().as_slice().to_string()) }; diff --git a/servo/components/script/dom/htmlobjectelement.rs b/servo/components/script/dom/htmlobjectelement.rs index 634051957ea0..a702916d40a5 100644 --- a/servo/components/script/dom/htmlobjectelement.rs +++ b/servo/components/script/dom/htmlobjectelement.rs @@ -63,8 +63,8 @@ impl<'a> ProcessDataURL for JSRef<'a, HTMLObjectElement> { let elem: &JSRef = ElementCast::from_ref(self); // TODO: support other values - match (elem.get_attribute(Null, &satom!("type")).map(|x| x.root().Value()), - elem.get_attribute(Null, &satom!("data")).map(|x| x.root().Value())) { + match (elem.get_attribute(Null, "type").map(|x| x.root().Value()), + elem.get_attribute(Null, "data").map(|x| x.root().Value())) { (None, Some(uri)) => { if is_image_data(uri.as_slice()) { let data_url = Url::parse(uri.as_slice()).unwrap(); diff --git a/servo/components/script/dom/htmlscriptelement.rs b/servo/components/script/dom/htmlscriptelement.rs index 95cbd666920a..29cb155a9848 100644 --- a/servo/components/script/dom/htmlscriptelement.rs +++ b/servo/components/script/dom/htmlscriptelement.rs @@ -16,7 +16,6 @@ use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; use dom::node::{Node, NodeHelpers, ElementNodeTypeId}; -use servo_util::atom::Atom; use servo_util::namespace::Null; use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS, StaticStringVec}; @@ -76,7 +75,7 @@ static SCRIPT_JS_MIMES: StaticStringVec = &[ impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> { fn is_javascript(&self) -> bool { let element: &JSRef = ElementCast::from_ref(self); - match element.get_attribute(Null, &satom!("type")).root().map(|s| s.Value()) { + match element.get_attribute(Null, "type").root().map(|s| s.Value()) { Some(ref s) if s.is_empty() => { // type attr exists, but empty means js debug!("script type empty, inferring js"); @@ -88,9 +87,7 @@ impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> { }, None => { debug!("no script type"); - match element.get_attribute(Null, &satom!("language")) - .root() - .map(|s| s.Value()) { + match element.get_attribute(Null, "language").root().map(|s| s.Value()) { Some(ref s) if s.is_empty() => { debug!("script language empty, inferring js"); true @@ -112,7 +109,7 @@ impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> { impl<'a> HTMLScriptElementMethods for JSRef<'a, HTMLScriptElement> { fn Src(&self) -> DOMString { let element: &JSRef = ElementCast::from_ref(self); - element.get_url_attribute(&satom!("src")) + element.get_url_attribute("src") } // http://www.whatwg.org/html/#dom-script-text diff --git a/servo/components/script/dom/macros.rs b/servo/components/script/dom/macros.rs index 23f65a6b186b..6cfca77593d0 100644 --- a/servo/components/script/dom/macros.rs +++ b/servo/components/script/dom/macros.rs @@ -12,8 +12,7 @@ macro_rules! make_getter( use dom::bindings::codegen::InheritTypes::ElementCast; use std::ascii::StrAsciiExt; let element: &JSRef = ElementCast::from_ref(self); - element.get_string_attribute(&Atom::from_slice(stringify!($attr).to_ascii_lower() - .as_slice())) + element.get_string_attribute(stringify!($attr).to_ascii_lower().as_slice()) } ); ) @@ -39,8 +38,7 @@ macro_rules! make_uint_getter( use dom::bindings::codegen::InheritTypes::ElementCast; use std::ascii::StrAsciiExt; let element: &JSRef = ElementCast::from_ref(self); - element.get_uint_attribute(&Atom::from_slice(stringify!($attr).to_ascii_lower() - .as_slice())) + element.get_uint_attribute(stringify!($attr).to_ascii_lower().as_slice()) } ); ) diff --git a/servo/components/script/dom/node.rs b/servo/components/script/dom/node.rs index 1fb0c52adebc..50af3e637ae2 100644 --- a/servo/components/script/dom/node.rs +++ b/servo/components/script/dom/node.rs @@ -769,19 +769,16 @@ pub trait RawLayoutNodeHelpers { } impl RawLayoutNodeHelpers for Node { - #[inline] unsafe fn get_hover_state_for_layout(&self) -> bool { (*self.unsafe_get_flags()).contains(InHoverState) } - #[inline] unsafe fn get_disabled_state_for_layout(&self) -> bool { (*self.unsafe_get_flags()).contains(InDisabledState) } - #[inline] unsafe fn get_enabled_state_for_layout(&self) -> bool { (*self.unsafe_get_flags()).contains(InEnabledState) } - #[inline] + fn type_id_for_layout(&self) -> NodeTypeId { self.type_id } @@ -1416,7 +1413,6 @@ impl Node { } } - #[inline] pub unsafe fn unsafe_get_flags(&self) -> *const NodeFlags { mem::transmute(&self.flags) } @@ -1991,7 +1987,7 @@ impl<'a> VirtualMethods for JSRef<'a, Node> { } } -impl<'a> style::TNode> for JSRef<'a,Node> { +impl<'a> style::TNode> for JSRef<'a, Node> { fn parent_node(&self) -> Option> { (self as &NodeHelpers).parent_node().map(|node| *node.root()) } @@ -2025,9 +2021,9 @@ impl<'a> style::TNode> for JSRef<'a,Node> { fn match_attr(&self, attr: &style::AttrSelector, test: |&str| -> bool) -> bool { let name = { if self.is_html_element_in_html_document() { - &attr.lower_name + attr.lower_name.as_slice() } else { - &attr.name + attr.name.as_slice() } }; match attr.namespace { diff --git a/servo/components/script/html/hubbub_html_parser.rs b/servo/components/script/html/hubbub_html_parser.rs index 215c36ac3cfe..74dd6ca933bd 100644 --- a/servo/components/script/html/hubbub_html_parser.rs +++ b/servo/components/script/html/hubbub_html_parser.rs @@ -472,7 +472,7 @@ pub fn parse_html(page: &Page, }; let script_element: &JSRef = ElementCast::from_ref(script); - match script_element.get_attribute(Null, &satom!("src")).root() { + match script_element.get_attribute(Null, "src").root() { Some(src) => { debug!("found script: {:s}", src.deref().Value()); let mut url_parser = UrlParser::new(); diff --git a/servo/components/script/lib.rs b/servo/components/script/lib.rs index 69d52df82810..9f3effaa368f 100644 --- a/servo/components/script/lib.rs +++ b/servo/components/script/lib.rs @@ -36,9 +36,6 @@ extern crate servo_macros = "macros"; extern crate servo_net = "net"; extern crate servo_util = "util"; extern crate style; -extern crate string_cache; -#[phase(plugin)] -extern crate string_cache_macros; extern crate sync; extern crate servo_msg = "msg"; extern crate url; diff --git a/servo/components/script/page.rs b/servo/components/script/page.rs index f2e77ac59fb2..247075c5ece9 100644 --- a/servo/components/script/page.rs +++ b/servo/components/script/page.rs @@ -27,7 +27,6 @@ use servo_msg::compositor_msg::ScriptListener; use servo_msg::constellation_msg::{ConstellationChan, WindowSizeData}; use servo_msg::constellation_msg::{PipelineId, SubpageId}; use servo_net::resource_task::ResourceTask; -use servo_util::atom::Atom; use servo_util::namespace::Null; use servo_util::str::DOMString; use std::cell::{Cell, RefCell, Ref, RefMut}; @@ -402,11 +401,9 @@ impl Page { .filter(|node| node.is_anchor_element()); anchors.find(|node| { let elem: &JSRef = ElementCast::to_ref(node).unwrap(); - elem.get_attribute(Null, &satom!("name")) - .root() - .map_or(false, |attr| { - attr.deref().value().as_slice() == fragid.as_slice() - }) + elem.get_attribute(Null, "name").root().map_or(false, |attr| { + attr.deref().value().as_slice() == fragid.as_slice() + }) }).map(|node| Temporary::from_rooted(ElementCast::to_ref(&node).unwrap())) } } diff --git a/servo/components/style/Cargo.toml b/servo/components/style/Cargo.toml index 9f354a6c9fa9..a8ccfc42e35a 100644 --- a/servo/components/style/Cargo.toml +++ b/servo/components/style/Cargo.toml @@ -29,11 +29,3 @@ git = "https://github.com/servo/rust-cssparser" [dependencies.encoding] git = "https://github.com/lifthrasiir/rust-encoding" -[dependencies.string_cache] -git = "https://github.com/servo/string-cache" -branch = "pre-rustup" - -[dependencies.string_cache_macros] -git = "https://github.com/servo/string-cache" -branch = "pre-rustup" - diff --git a/servo/components/style/lib.rs b/servo/components/style/lib.rs index d182c9ffea09..107889cb57a5 100644 --- a/servo/components/style/lib.rs +++ b/servo/components/style/lib.rs @@ -11,14 +11,12 @@ #![feature(phase)] #[phase(plugin, link)] extern crate log; -#[phase(plugin)] extern crate string_cache_macros; extern crate debug; extern crate collections; extern crate geom; extern crate num; extern crate serialize; -extern crate string_cache; extern crate sync; extern crate url; diff --git a/servo/components/style/node.rs b/servo/components/style/node.rs index a4d2ff38e416..bd71aa6fd79e 100644 --- a/servo/components/style/node.rs +++ b/servo/components/style/node.rs @@ -9,7 +9,7 @@ use selectors::AttrSelector; use servo_util::atom::Atom; use servo_util::namespace::Namespace; -// FIXME(pcwalton): When we get associated types in Rust, this can be nicer. + pub trait TNode : Clone { fn parent_node(&self) -> Option; /// Name is prefixed to avoid a conflict with TLayoutNode. @@ -24,7 +24,7 @@ pub trait TNode : Clone { } pub trait TElement { - fn get_attr(&self, namespace: &Namespace, attr: &Atom) -> Option<&'static str>; + fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'static str>; fn get_link(&self) -> Option<&'static str>; fn get_local_name<'a>(&'a self) -> &'a Atom; fn get_namespace<'a>(&'a self) -> &'a Namespace; @@ -32,13 +32,5 @@ pub trait TElement { fn get_id(&self) -> Option; fn get_disabled_state(&self) -> bool; fn get_enabled_state(&self) -> bool; - fn has_class(&self, name: &Atom) -> bool; - - // Ordinarily I wouldn't use callbacks like this, but the alternative is - // really messy, since there is a `JSRef` and a `RefCell` involved. Maybe - // in the future when we have associated types and/or a more convenient - // JS GC story... --pcwalton - fn each_class(&self, callback: |&Atom|); + fn has_class(&self, name: &str) -> bool; } - - diff --git a/servo/components/style/selector_matching.rs b/servo/components/style/selector_matching.rs index 76ff6edae493..a0ddf7dd31d1 100644 --- a/servo/components/style/selector_matching.rs +++ b/servo/components/style/selector_matching.rs @@ -11,6 +11,7 @@ use url::Url; use servo_util::atom::Atom; use servo_util::bloom::BloomFilter; +use servo_util::namespace; use servo_util::smallvec::VecLike; use servo_util::sort; @@ -105,14 +106,20 @@ impl SelectorMap { None => {} } - element.each_class(|class| { - SelectorMap::get_matching_rules_from_hash(node, - parent_bf, - &self.class_hash, - class, - matching_rules_list, - shareable); - }); + match element.get_attr(&namespace::Null, "class") { + Some(ref class_attr) => { + // FIXME: Store classes pre-split as atoms to make the loop below faster. + for class in class_attr.split(SELECTOR_WHITESPACE) { + SelectorMap::get_matching_rules_from_hash(node, + parent_bf, + &self.class_hash, + &Atom::from_slice(class), + matching_rules_list, + shareable); + } + } + None => {} + } let local_name_hash = if node.is_html_element_in_html_document() { &self.lower_local_name_hash @@ -460,12 +467,7 @@ impl DeclarationBlock { } } -pub fn matches>( - selector_list: &SelectorList, - element: &N, - parent_bf: &Option) - -> bool { +pub fn matches>(selector_list: &SelectorList, element: &N, parent_bf: &Option) -> bool { get_selector_list_selectors(selector_list).iter().any(|selector| selector.pseudo_element.is_none() && matches_compound_selector(&*selector.compound_selectors, element, parent_bf, &mut false)) @@ -542,13 +544,11 @@ enum SelectorMatchingResult { /// Quickly figures out whether or not the compound selector is worth doing more /// work on. If the simple selectors don't match, or there's a child selector /// that does not appear in the bloom parent bloom filter, we can exit early. -fn can_fast_reject>( - mut selector: &CompoundSelector, - element: &N, - parent_bf: &Option, - shareable: &mut bool) - -> Option { +fn can_fast_reject>( + mut selector: &CompoundSelector, + element: &N, + parent_bf: &Option, + shareable: &mut bool) -> Option { if !selector.simple_selectors.iter().all(|simple_selector| { matches_simple_selector(simple_selector, element, shareable) }) { return Some(NotMatchedAndRestartFromClosestLaterSibling); @@ -681,11 +681,11 @@ fn matches_compound_selector_internal>( - selector: &SimpleSelector, - element: &N, - shareable: &mut bool) - -> bool { + N:TNode>( + selector: &SimpleSelector, + element: &N, + shareable: &mut bool) + -> bool { match *selector { LocalNameSelector(LocalNameSelector { ref name, ref lower_name }) => { let name = if element.is_html_element_in_html_document() { lower_name } else { name }; @@ -710,7 +710,7 @@ pub fn matches_simple_selector { let element = element.as_element(); - element.has_class(class) + element.has_class(class.as_slice()) } AttrExists(ref attr) => { @@ -854,7 +854,6 @@ pub fn matches_simple_selector bool { // FIXME: implement this. // This function will probably need to take a "session" @@ -863,7 +862,8 @@ fn url_is_visited(_url: &str) -> bool { } #[inline] -fn matches_generic_nth_child>( element: &N, a: i32, diff --git a/servo/components/style/selectors.rs b/servo/components/style/selectors.rs index 50e0659fa6aa..c3ea921bf535 100644 --- a/servo/components/style/selectors.rs +++ b/servo/components/style/selectors.rs @@ -100,8 +100,8 @@ pub struct LocalNameSelector { #[deriving(Eq, PartialEq, Clone, Hash)] pub struct AttrSelector { - pub name: Atom, - pub lower_name: Atom, + pub name: String, + pub lower_name: String, pub namespace: NamespaceConstraint, } @@ -442,8 +442,8 @@ fn parse_attribute_selector(content: Vec, namespaces: &Namespace Some((_, None)) => fail!("Implementation error, this should not happen."), Some((namespace, Some(local_name))) => AttrSelector { namespace: namespace, - lower_name: Atom::from_slice(local_name.as_slice().to_ascii_lower().as_slice()), - name: Atom::from_slice(local_name.as_slice()), + lower_name: local_name.as_slice().to_ascii_lower(), + name: local_name, }, }; skip_whitespace(iter); diff --git a/servo/components/util/atom.rs b/servo/components/util/atom.rs index 14215d665285..49cb047768e5 100644 --- a/servo/components/util/atom.rs +++ b/servo/components/util/atom.rs @@ -17,13 +17,6 @@ pub struct Atom { } impl Atom { - #[inline(always)] - pub fn new(atom: atom::Atom) -> Atom { - Atom { - atom: atom, - } - } - #[inline(always)] pub fn from_slice(slice: &str) -> Atom { Atom { diff --git a/servo/ports/cef/Cargo.lock b/servo/ports/cef/Cargo.lock index dbc8c1b8db14..f95e7e27173c 100644 --- a/servo/ports/cef/Cargo.lock +++ b/servo/ports/cef/Cargo.lock @@ -277,8 +277,6 @@ dependencies = [ "net 0.0.1", "script 0.0.1", "script_traits 0.0.1", - "string_cache 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#df34aaaaed9c4598eef5f4445d28aeb5afac574a)", - "string_cache_macros 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#df34aaaaed9c4598eef5f4445d28aeb5afac574a)", "style 0.0.1", "url 0.1.0 (git+https://github.com/servo/rust-url#678bb4d52638b1cfdab78ef8e521566c9240fb1a)", "util 0.0.1", @@ -388,8 +386,6 @@ dependencies = [ "msg 0.0.1", "net 0.0.1", "script_traits 0.0.1", - "string_cache 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#df34aaaaed9c4598eef5f4445d28aeb5afac574a)", - "string_cache_macros 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#df34aaaaed9c4598eef5f4445d28aeb5afac574a)", "style 0.0.1", "url 0.1.0 (git+https://github.com/servo/rust-url#678bb4d52638b1cfdab78ef8e521566c9240fb1a)", "util 0.0.1", @@ -471,8 +467,6 @@ dependencies = [ "encoding 0.1.0 (git+https://github.com/lifthrasiir/rust-encoding#12b6610adff6eddc060691888c36017cd3ad57f7)", "geom 0.1.0 (git+https://github.com/servo/rust-geom#2982b770db6e5e3270305e0fd6b8068f6f80a489)", "macros 0.0.1", - "string_cache 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#df34aaaaed9c4598eef5f4445d28aeb5afac574a)", - "string_cache_macros 0.0.0 (git+https://github.com/servo/string-cache?ref=pre-rustup#df34aaaaed9c4598eef5f4445d28aeb5afac574a)", "url 0.1.0 (git+https://github.com/servo/rust-url#678bb4d52638b1cfdab78ef8e521566c9240fb1a)", "util 0.0.1", ]