auto merge of #1582 : saneyuki/servo/1569, r=Ms2ger

retry: #1581

this will fix #1569
This commit is contained in:
bors-servo 2014-01-29 04:53:07 -08:00
commit 6c63de1c03

View file

@ -111,6 +111,14 @@ impl Drop for Node {
} }
} }
/// suppress observers flag
/// http://dom.spec.whatwg.org/#concept-node-insert
/// http://dom.spec.whatwg.org/#concept-node-remove
enum SuppressObserver {
Suppressed,
Unsuppressed
}
/// Encapsulates the abstract layout data. /// Encapsulates the abstract layout data.
pub struct LayoutData { pub struct LayoutData {
priv chan: Option<LayoutChan>, priv chan: Option<LayoutChan>,
@ -1040,7 +1048,7 @@ impl Node {
fn adopt(node: AbstractNode, document: AbstractDocument) { fn adopt(node: AbstractNode, document: AbstractDocument) {
// Step 1. // Step 1.
match node.parent_node() { match node.parent_node() {
Some(parent) => Node::remove(node, parent, false), Some(parent) => Node::remove(node, parent, Unsuppressed),
None => (), None => (),
} }
@ -1186,7 +1194,7 @@ impl Node {
Node::adopt(node, parent.node().owner_doc()); Node::adopt(node, parent.node().owner_doc());
// Step 10. // Step 10.
Node::insert(node, parent, referenceChild, false); Node::insert(node, parent, referenceChild, Unsuppressed);
// Step 11. // Step 11.
return Ok(node) return Ok(node)
@ -1196,7 +1204,7 @@ impl Node {
fn insert(node: AbstractNode, fn insert(node: AbstractNode,
parent: AbstractNode, parent: AbstractNode,
child: Option<AbstractNode>, child: Option<AbstractNode>,
suppress_observers: bool) { suppress_observers: SuppressObserver) {
// XXX assert owner_doc // XXX assert owner_doc
// Step 1-3: ranges. // Step 1-3: ranges.
// Step 4. // Step 4.
@ -1210,7 +1218,7 @@ impl Node {
match node.type_id() { match node.type_id() {
DocumentFragmentNodeTypeId => { DocumentFragmentNodeTypeId => {
for c in node.children() { for c in node.children() {
Node::remove(c, node, true); Node::remove(c, node, Suppressed);
} }
}, },
_ => (), _ => (),
@ -1224,11 +1232,14 @@ impl Node {
} }
// Step 9. // Step 9.
if !suppress_observers { match suppress_observers {
Unsuppressed => {
for node in nodes.iter() { for node in nodes.iter() {
node.node_inserted(); node.node_inserted();
} }
} }
Suppressed => ()
}
} }
// http://dom.spec.whatwg.org/#concept-node-replace-all // http://dom.spec.whatwg.org/#concept-node-replace-all
@ -1253,12 +1264,12 @@ impl Node {
// Step 4. // Step 4.
for child in parent.children() { for child in parent.children() {
Node::remove(child, parent, true); Node::remove(child, parent, Suppressed);
} }
// Step 5. // Step 5.
match node { match node {
Some(node) => Node::insert(node, parent, None, true), Some(node) => Node::insert(node, parent, None, Suppressed),
None => (), None => (),
} }
@ -1281,14 +1292,14 @@ impl Node {
} }
// Step 2. // Step 2.
Node::remove(child, parent, false); Node::remove(child, parent, Unsuppressed);
// Step 3. // Step 3.
Ok(child) Ok(child)
} }
// http://dom.spec.whatwg.org/#concept-node-remove // http://dom.spec.whatwg.org/#concept-node-remove
fn remove(node: AbstractNode, parent: AbstractNode, suppress_observers: bool) { fn remove(node: AbstractNode, parent: AbstractNode, suppress_observers: SuppressObserver) {
assert!(node.parent_node() == Some(parent)); assert!(node.parent_node() == Some(parent));
// Step 1-5: ranges. // Step 1-5: ranges.
@ -1298,8 +1309,9 @@ impl Node {
node.mut_node().flags.set_is_in_doc(false); node.mut_node().flags.set_is_in_doc(false);
// Step 9. // Step 9.
if !suppress_observers { match suppress_observers {
node.node_removed(); Suppressed => (),
Unsuppressed => node.node_removed(),
} }
} }
@ -1455,13 +1467,11 @@ impl Node {
Node::adopt(node, parent.node().owner_doc()); Node::adopt(node, parent.node().owner_doc());
{ {
let suppress_observers = true;
// Step 10. // Step 10.
Node::remove(child, parent, suppress_observers); Node::remove(child, parent, Suppressed);
// Step 11. // Step 11.
Node::insert(node, parent, reference_child, suppress_observers); Node::insert(node, parent, reference_child, Suppressed);
} }
// Step 12-14. // Step 12-14.