aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2014-10-28 11:18:43 -0700
committerPatrick Walton <pcwalton@mimiga.net>2014-10-28 11:18:43 -0700
commit8ab354ac085d8d70d7ccf992b5262e1969e3949a (patch)
tree9d159e9734be2db3bd44348431f370be6d4d5508 /components
parent6a7a96a86cfa676834ac227d8da9a2a7f9870f2e (diff)
downloadservo-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.rs68
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);
+ }
}
}