mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Move ID management on binding to and unbinding from tree into Element.
This commit is contained in:
parent
7ff35c0abe
commit
33792db657
3 changed files with 62 additions and 38 deletions
|
@ -478,19 +478,30 @@ impl Document {
|
||||||
self.window.get().wait_until_safe_to_modify_dom();
|
self.window.get().wait_until_safe_to_modify_dom();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn register_nodes_with_id(&mut self, root: &JS<Element>) {
|
|
||||||
foreach_ided_elements(root, |id: &DOMString, abstract_node: &JS<Element>| {
|
/// Remove any existing association between the provided id and any elements in this document.
|
||||||
// TODO: "in tree order, within the context object's tree"
|
pub fn unregister_named_element(&mut self,
|
||||||
// http://dom.spec.whatwg.org/#dom-document-getelementbyid.
|
id: DOMString) {
|
||||||
self.idmap.find_or_insert(id.clone(), abstract_node.clone());
|
self.idmap.remove(&id);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unregister_nodes_with_id(&mut self, root: &JS<Element>) {
|
/// Associate an element present in this document with the provided id.
|
||||||
foreach_ided_elements(root, |id: &DOMString, _| {
|
pub fn register_named_element(&mut self,
|
||||||
// TODO: "in tree order, within the context object's tree"
|
element: &JS<Element>,
|
||||||
// http://dom.spec.whatwg.org/#dom-document-getelementbyid.
|
id: DOMString) {
|
||||||
self.idmap.pop(id);
|
assert!({
|
||||||
|
let node: JS<Node> = NodeCast::from(element);
|
||||||
|
node.is_in_doc()
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: support the case if multiple elements
|
||||||
|
// which haves same id are in the same document.
|
||||||
|
self.idmap.mangle(id, element,
|
||||||
|
|_, new_element: &JS<Element>| -> JS<Element> {
|
||||||
|
new_element.clone()
|
||||||
|
},
|
||||||
|
|_, old_element: &mut JS<Element>, new_element: &JS<Element>| {
|
||||||
|
*old_element = new_element.clone();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -525,21 +536,3 @@ impl Document {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
fn foreach_ided_elements(root: &JS<Element>, callback: |&DOMString, &JS<Element>|) {
|
|
||||||
let root: JS<Node> = NodeCast::from(root);
|
|
||||||
for node in root.traverse_preorder() {
|
|
||||||
if !node.is_element() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let element: JS<Element> = ElementCast::to(&node);
|
|
||||||
match element.get().get_attribute(Null, "id") {
|
|
||||||
Some(id) => {
|
|
||||||
callback(&id.get().Value(), &element);
|
|
||||||
}
|
|
||||||
None => ()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -646,6 +646,33 @@ impl Element {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait IElement {
|
||||||
|
fn bind_to_tree_impl(&self);
|
||||||
|
fn unbind_from_tree_impl(&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IElement for JS<Element> {
|
||||||
|
fn bind_to_tree_impl(&self) {
|
||||||
|
match self.get().get_attribute(Null, "id") {
|
||||||
|
Some(attr) => {
|
||||||
|
let mut doc = self.get().node.owner_doc();
|
||||||
|
doc.get_mut().register_named_element(self, attr.get().Value());
|
||||||
|
}
|
||||||
|
_ => ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unbind_from_tree_impl(&self) {
|
||||||
|
match self.get().get_attribute(Null, "id") {
|
||||||
|
Some(attr) => {
|
||||||
|
let mut doc = self.get().node.owner_doc();
|
||||||
|
doc.get_mut().unregister_named_element(attr.get().Value());
|
||||||
|
}
|
||||||
|
_ => ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn get_attribute_parts(name: DOMString) -> (Option<~str>, ~str) {
|
fn get_attribute_parts(name: DOMString) -> (Option<~str>, ~str) {
|
||||||
//FIXME: Throw for XML-invalid names
|
//FIXME: Throw for XML-invalid names
|
||||||
//FIXME: Throw for XMLNS-invalid names
|
//FIXME: Throw for XMLNS-invalid names
|
||||||
|
|
|
@ -14,7 +14,7 @@ use dom::bindings::utils;
|
||||||
use dom::characterdata::CharacterData;
|
use dom::characterdata::CharacterData;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::documenttype::DocumentType;
|
use dom::documenttype::DocumentType;
|
||||||
use dom::element::{Element, ElementTypeId, HTMLAnchorElementTypeId};
|
use dom::element::{Element, ElementTypeId, HTMLAnchorElementTypeId, IElement};
|
||||||
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
|
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
|
||||||
use dom::nodelist::{NodeList};
|
use dom::nodelist::{NodeList};
|
||||||
use dom::text::Text;
|
use dom::text::Text;
|
||||||
|
@ -396,11 +396,13 @@ impl NodeHelpers for JS<Node> {
|
||||||
// http://dom.spec.whatwg.org/#node-is-inserted
|
// http://dom.spec.whatwg.org/#node-is-inserted
|
||||||
fn node_inserted(&self) {
|
fn node_inserted(&self) {
|
||||||
assert!(self.parent_node().is_some());
|
assert!(self.parent_node().is_some());
|
||||||
let mut document = self.get().owner_doc();
|
let document = self.get().owner_doc();
|
||||||
|
|
||||||
// Register elements having "id" attribute to the owner doc.
|
for node in self.traverse_preorder() {
|
||||||
if self.is_element() {
|
if node.is_element() {
|
||||||
document.get_mut().register_nodes_with_id(&ElementCast::to(self));
|
let element: JS<Element> = ElementCast::to(&node);
|
||||||
|
element.bind_to_tree_impl();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.get().content_changed();
|
document.get().content_changed();
|
||||||
|
@ -409,11 +411,13 @@ impl NodeHelpers for JS<Node> {
|
||||||
// http://dom.spec.whatwg.org/#node-is-removed
|
// http://dom.spec.whatwg.org/#node-is-removed
|
||||||
fn node_removed(&self) {
|
fn node_removed(&self) {
|
||||||
assert!(self.parent_node().is_none());
|
assert!(self.parent_node().is_none());
|
||||||
let mut document = self.get().owner_doc();
|
let document = self.get().owner_doc();
|
||||||
|
|
||||||
// Unregister elements having "id".
|
for node in self.traverse_preorder() {
|
||||||
if self.is_element() {
|
if node.is_element() {
|
||||||
document.get_mut().unregister_nodes_with_id(&ElementCast::to(self));
|
let element: JS<Element> = ElementCast::to(&node);
|
||||||
|
element.unbind_from_tree_impl();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.get().content_changed();
|
document.get().content_changed();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue