Enable only remove operation for Document::update_idmap().

This commit is contained in:
Tetsuharu OHZEKI 2014-01-03 02:02:14 +09:00
parent 8dc5fe0fe5
commit fd0dadbddf
3 changed files with 26 additions and 11 deletions

View file

@ -406,24 +406,34 @@ impl Document {
pub fn update_idmap(&mut self, pub fn update_idmap(&mut self,
abstract_self: AbstractNode, abstract_self: AbstractNode,
new_id: DOMString, new_id: Option<DOMString>,
old_id: Option<DOMString>) { old_id: Option<DOMString>) {
// remove old ids if the old ones are not same as the new one. // remove old ids:
// * if the old ones are not same as the new one,
// * OR if the new one is none.
match old_id { match old_id {
Some(ref old_id) if new_id != *old_id => { Some(ref old_id) if new_id.is_none() ||
(*new_id.get_ref() != *old_id) => {
self.idmap.remove(old_id); self.idmap.remove(old_id);
} }
_ => () _ => ()
} }
// TODO: support the case if multiple elements which haves same id are in the same document. match new_id {
self.idmap.mangle(new_id, abstract_self, |_, new_node: AbstractNode| -> AbstractNode { Some(new_id) => {
// TODO: support the case if multiple elements
// which haves same id are in the same document.
self.idmap.mangle(new_id, abstract_self,
|_, new_node: AbstractNode| -> AbstractNode {
new_node new_node
}, },
|_, old_node: &mut AbstractNode, new_node: AbstractNode| { |_, old_node: &mut AbstractNode, new_node: AbstractNode| {
*old_node = new_node; *old_node = new_node;
}); });
} }
None => ()
}
}
} }
#[inline(always)] #[inline(always)]

View file

@ -221,7 +221,7 @@ impl Element {
"id" => { "id" => {
let doc = self.node.owner_doc(); let doc = self.node.owner_doc();
let doc = doc.mut_document(); let doc = doc.mut_document();
doc.update_idmap(abstract_self, value.clone(), old_value); doc.update_idmap(abstract_self, Some(value.clone()), old_value);
} }
_ => () _ => ()
} }

View file

@ -59,6 +59,11 @@
let old = document.getElementById(TEST_ID); let old = document.getElementById(TEST_ID);
is(old, null, "test3-1, the method shouldn't get the element by the old id."); is(old, null, "test3-1, the method shouldn't get the element by the old id.");
// remove id.
test.removeAttribute("id");
let e2 = document.getElementById(UPDATED_ID);
is(e2, null, "test3-2, the method should return null when the passed id is none in document.");
} }
// TODO: // TODO: