aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/element.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r--components/script/dom/element.rs54
1 files changed, 43 insertions, 11 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 524502e36d6..4eb2f2a2609 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -1177,6 +1177,10 @@ impl Element {
ns!()
}
+ pub fn name_attribute(&self) -> Option<Atom> {
+ self.rare_data().as_ref()?.name_attribute.clone()
+ }
+
pub fn style_attribute(&self) -> &DomRefCell<Option<Arc<Locked<PropertyDeclarationBlock>>>> {
&self.style_attribute
}
@@ -2803,25 +2807,25 @@ impl VirtualMethods for Element {
if let Some(old_value) = old_value {
let old_value = old_value.as_atom().clone();
if let Some(ref shadow_root) = containing_shadow_root {
- shadow_root.unregister_named_element(self, old_value);
+ shadow_root.unregister_element_id(self, old_value);
} else {
- doc.unregister_named_element(self, old_value);
+ doc.unregister_element_id(self, old_value);
}
}
if value != atom!("") {
if let Some(ref shadow_root) = containing_shadow_root {
- shadow_root.register_named_element(self, value);
+ shadow_root.register_element_id(self, value);
} else {
- doc.register_named_element(self, value);
+ doc.register_element_id(self, value);
}
}
},
AttributeMutation::Removed => {
if value != atom!("") {
if let Some(ref shadow_root) = containing_shadow_root {
- shadow_root.unregister_named_element(self, value);
+ shadow_root.unregister_element_id(self, value);
} else {
- doc.unregister_named_element(self, value);
+ doc.unregister_element_id(self, value);
}
}
},
@@ -2839,8 +2843,27 @@ impl VirtualMethods for Element {
None
}
});
- // TODO: notify the document about the name change
- // once it has a name_map (#25548)
+ // Keep the document name_map up to date
+ // (if we're not in shadow DOM)
+ if node.is_connected() && node.containing_shadow_root().is_none() {
+ let value = attr.value().as_atom().clone();
+ match mutation {
+ AttributeMutation::Set(old_value) => {
+ if let Some(old_value) = old_value {
+ let old_value = old_value.as_atom().clone();
+ doc.unregister_element_name(self, old_value);
+ }
+ if value != atom!("") {
+ doc.register_element_name(self, value);
+ }
+ },
+ AttributeMutation::Removed => {
+ if value != atom!("") {
+ doc.unregister_element_name(self, value);
+ }
+ },
+ }
+ }
},
_ => {
// FIXME(emilio): This is pretty dubious, and should be done in
@@ -2896,11 +2919,17 @@ impl VirtualMethods for Element {
if let Some(ref value) = *self.id_attribute.borrow() {
if let Some(shadow_root) = self.upcast::<Node>().containing_shadow_root() {
- shadow_root.register_named_element(self, value.clone());
+ shadow_root.register_element_id(self, value.clone());
} else {
- doc.register_named_element(self, value.clone());
+ doc.register_element_id(self, value.clone());
+ }
+ }
+ if let Some(ref value) = self.name_attribute() {
+ if self.upcast::<Node>().containing_shadow_root().is_none() {
+ doc.register_element_name(self, value.clone());
}
}
+
// This is used for layout optimization.
doc.increment_dom_count();
}
@@ -2933,7 +2962,10 @@ impl VirtualMethods for Element {
doc.exit_fullscreen();
}
if let Some(ref value) = *self.id_attribute.borrow() {
- doc.unregister_named_element(self, value.clone());
+ doc.unregister_element_id(self, value.clone());
+ }
+ if let Some(ref value) = self.name_attribute() {
+ doc.unregister_element_name(self, value.clone());
}
// This is used for layout optimization.
doc.decrement_dom_count();