diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index a728ab4f364..e22e28a886e 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -130,7 +130,7 @@ fn create_html_element(name: QualName, CustomElementCreationMode::Asynchronous => {}, CustomElementCreationMode::Synchronous => { let local_name = name.local.clone(); - return match definition.create_element(document) { + return match definition.create_element(document, prefix.clone()) { Ok(element) => element, Err(error) => { // Step 6. Recovering from exception. diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index 3b151a8f764..94f580f7be9 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -24,7 +24,7 @@ use dom::node::Node; use dom::promise::Promise; use dom::window::Window; use dom_struct::dom_struct; -use html5ever::LocalName; +use html5ever::{LocalName, Prefix}; use js::conversions::ToJSValConvertible; use js::jsapi::{Construct1, IsConstructor, HandleValueArray, HandleObject}; use js::jsapi::{JS_GetProperty, JSAutoCompartment, JSContext}; @@ -281,7 +281,7 @@ impl CustomElementDefinition { /// https://dom.spec.whatwg.org/#concept-create-element Step 6.1 #[allow(unsafe_code)] - pub fn create_element(&self, document: &Document) -> Fallible> { + pub fn create_element(&self, document: &Document, prefix: Option) -> Fallible> { let window = document.window(); let cx = window.get_cx(); // Step 2 @@ -320,6 +320,9 @@ impl CustomElementDefinition { return Err(Error::NotSupported); } + // Step 10 + element.set_prefix(prefix); + // Step 11 // Element's `is` is None by default diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index be54c3e5119..a78520426e0 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -126,7 +126,7 @@ pub struct Element { local_name: LocalName, tag_name: TagName, namespace: Namespace, - prefix: Option, + prefix: DOMRefCell>, attrs: DOMRefCell>>, id_attribute: DOMRefCell>, is: DOMRefCell>, @@ -235,7 +235,7 @@ impl Element { local_name: local_name, tag_name: TagName::new(), namespace: namespace, - prefix: prefix, + prefix: DOMRefCell::new(prefix), attrs: DOMRefCell::new(vec![]), id_attribute: DOMRefCell::new(None), is: DOMRefCell::new(None), @@ -838,8 +838,12 @@ impl Element { &self.namespace } - pub fn prefix(&self) -> Option<&Prefix> { - self.prefix.as_ref() + pub fn prefix(&self) -> Ref> { + self.prefix.borrow() + } + + pub fn set_prefix(&self, prefix: Option) { + *self.prefix.borrow_mut() = prefix; } pub fn attrs(&self) -> Ref<[JS]> { @@ -858,7 +862,9 @@ impl Element { // Steps 3-4. for element in inclusive_ancestor_elements { // Step 1. - if element.namespace() != &ns!() && element.prefix().map(|p| &**p) == prefix.as_ref().map(|p| &**p) { + if element.namespace() != &ns!() && + element.prefix().as_ref().map(|p| &**p) == prefix.as_ref().map(|p| &**p) + { return element.namespace().clone(); } @@ -1436,13 +1442,13 @@ impl ElementMethods for Element { // https://dom.spec.whatwg.org/#dom-element-prefix fn GetPrefix(&self) -> Option { - self.prefix.as_ref().map(|p| DOMString::from(&**p)) + self.prefix.borrow().as_ref().map(|p| DOMString::from(&**p)) } // https://dom.spec.whatwg.org/#dom-element-tagname fn TagName(&self) -> DOMString { let name = self.tag_name.or_init(|| { - let qualified_name = match self.prefix { + let qualified_name = match *self.prefix.borrow() { Some(ref prefix) => { Cow::Owned(format!("{}:{}", &**prefix, &*self.local_name)) }, diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index 814ea766f53..f5c1a6816c1 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -152,7 +152,7 @@ impl HTMLCollection { } fn match_element(elem: &Element, qualified_name: &LocalName) -> bool { - match elem.prefix() { + match elem.prefix().as_ref() { None => elem.local_name() == qualified_name, Some(prefix) => qualified_name.starts_with(&**prefix) && qualified_name.find(":") == Some(prefix.len()) && diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index ab2e3be9f86..2e0152195dd 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1823,7 +1823,7 @@ impl Node { NodeTypeId::Element(..) => { let element = node.downcast::().unwrap(); let name = QualName { - prefix: element.prefix().map(|p| Prefix::from(&**p)), + prefix: element.prefix().as_ref().map(|p| Prefix::from(&**p)), ns: element.namespace().clone(), local: element.local_name().clone() }; @@ -2292,7 +2292,7 @@ impl NodeMethods for Node { let element = node.downcast::().unwrap(); let other_element = other.downcast::().unwrap(); (*element.namespace() == *other_element.namespace()) && - (element.prefix() == other_element.prefix()) && + (*element.prefix() == *other_element.prefix()) && (*element.local_name() == *other_element.local_name()) && (element.attrs().len() == other_element.attrs().len()) } diff --git a/tests/unit/script/size_of.rs b/tests/unit/script/size_of.rs index b357f4605a3..c4d5c939663 100644 --- a/tests/unit/script/size_of.rs +++ b/tests/unit/script/size_of.rs @@ -31,10 +31,10 @@ macro_rules! sizeof_checker ( // Update the sizes here sizeof_checker!(size_event_target, EventTarget, 40); sizeof_checker!(size_node, Node, 184); -sizeof_checker!(size_element, Element, 368); -sizeof_checker!(size_htmlelement, HTMLElement, 384); -sizeof_checker!(size_div, HTMLDivElement, 384); -sizeof_checker!(size_span, HTMLSpanElement, 384); +sizeof_checker!(size_element, Element, 376); +sizeof_checker!(size_htmlelement, HTMLElement, 392); +sizeof_checker!(size_div, HTMLDivElement, 392); +sizeof_checker!(size_span, HTMLSpanElement, 392); sizeof_checker!(size_text, Text, 216); sizeof_checker!(size_characterdata, CharacterData, 216); sizeof_checker!(size_servothreadsafelayoutnode, ServoThreadSafeLayoutNode, 16);