diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2014-10-28 11:18:43 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2014-10-28 11:18:43 -0700 |
commit | 8ab354ac085d8d70d7ccf992b5262e1969e3949a (patch) | |
tree | 9d159e9734be2db3bd44348431f370be6d4d5508 /components | |
parent | 6a7a96a86cfa676834ac227d8da9a2a7f9870f2e (diff) | |
download | servo-8ab354ac085d8d70d7ccf992b5262e1969e3949a.tar.gz servo-8ab354ac085d8d70d7ccf992b5262e1969e3949a.zip |
script: Don't create a temporary vector on the heap when inserting
non-fragment nodes.
Diffstat (limited to 'components')
-rw-r--r-- | components/script/dom/node.rs | 68 |
1 files changed, 39 insertions, 29 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index af27aa9d4c3..ba423715def 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1352,29 +1352,8 @@ impl Node { parent: JSRef<Node>, child: Option<JSRef<Node>>, suppress_observers: SuppressObserver) { - // XXX assert owner_doc - // Step 1-3: ranges. - // Step 4. - let mut nodes = match node.type_id() { - DocumentFragmentNodeTypeId => node.children().collect(), - _ => vec!(node.clone()), - }; - - // Step 5: DocumentFragment, mutation records. - // Step 6: DocumentFragment. - match node.type_id() { - DocumentFragmentNodeTypeId => { - for c in node.children() { - Node::remove(c, node, Suppressed); - } - }, - _ => (), - } - - // Step 7: mutation records. - // Step 8. - for node in nodes.iter_mut() { - parent.add_child(*node, child); + fn do_insert(node: JSRef<Node>, parent: JSRef<Node>, child: Option<JSRef<Node>>) { + parent.add_child(node, child); let is_in_doc = parent.is_in_doc(); for kid in node.traverse_preorder() { let mut flags = kid.flags.get(); @@ -1387,14 +1366,45 @@ impl Node { } } - // Step 9. - match suppress_observers { - Unsuppressed => { - for node in nodes.iter() { - node.node_inserted(); + fn fire_observer_if_necessary(node: JSRef<Node>, suppress_observers: SuppressObserver) { + match suppress_observers { + Unsuppressed => node.node_inserted(), + Suppressed => () + } + } + + // XXX assert owner_doc + // Step 1-3: ranges. + + match node.type_id() { + DocumentFragmentNodeTypeId => { + // Step 4. + // Step 5: DocumentFragment, mutation records. + // Step 6: DocumentFragment. + for c in node.children() { + Node::remove(c, node, Suppressed); + } + + // Step 7: mutation records. + // Step 8. + for node in node.children() { + do_insert(node, parent, child); + } + + for node in node.children() { + fire_observer_if_necessary(node, suppress_observers); } } - Suppressed => () + _ => { + // Step 4. + // Step 5: DocumentFragment, mutation records. + // Step 6: DocumentFragment. + // Step 7: mutation records. + // Step 8. + do_insert(node, parent, child); + // Step 9. + fire_observer_if_necessary(node, suppress_observers); + } } } |