Index: pkg/third_party/html5lib/lib/dom.dart |
diff --git a/pkg/third_party/html5lib/lib/dom.dart b/pkg/third_party/html5lib/lib/dom.dart |
index b81c1ff64030980f3283ccff0c64be630b23e9b2..973e5ae1bc89c003e39e087275280c39fd0e72f7 100644 |
--- a/pkg/third_party/html5lib/lib/dom.dart |
+++ b/pkg/third_party/html5lib/lib/dom.dart |
@@ -651,7 +651,11 @@ class NodeList extends ListProxy<Node> { |
} |
void add(Node value) { |
- super.add(_setParent(value)); |
+ if (value is DocumentFragment) { |
+ addAll(value.nodes); |
+ } else { |
+ super.add(_setParent(value)); |
+ } |
} |
void addLast(Node value) => add(value); |
@@ -660,17 +664,21 @@ class NodeList extends ListProxy<Node> { |
// Note: we need to be careful if collection is another NodeList. |
// In particular: |
// 1. we need to copy the items before updating their parent pointers, |
+ // _flattenDocFragments does a copy internally. |
// 2. we should update parent pointers in reverse order. That way they |
// are removed from the original NodeList (if any) from the end, which |
// is faster. |
- var list = (collection is NodeList || collection is! List) |
- ? collection.toList() : collection as List; |
+ var list = _flattenDocFragments(collection); |
for (var node in list.reversed) _setParent(node); |
super.addAll(list); |
} |
void insert(int index, Node value) { |
- super.insert(index, _setParent(value)); |
+ if (value is DocumentFragment) { |
+ insertAll(index, value.nodes); |
+ } else { |
+ super.insert(index, _setParent(value)); |
+ } |
} |
Node removeLast() => super.removeLast()..parent = null; |
@@ -683,8 +691,13 @@ class NodeList extends ListProxy<Node> { |
} |
void operator []=(int index, Node value) { |
- this[index].parent = null; |
- super[index] = _setParent(value); |
+ if (value is DocumentFragment) { |
+ removeAt(index); |
+ insertAll(index, value.nodes); |
+ } else { |
+ this[index].parent = null; |
+ super[index] = _setParent(value); |
+ } |
} |
// TODO(jmesserly): These aren't implemented in DOM _NodeListImpl, see |
@@ -698,8 +711,7 @@ class NodeList extends ListProxy<Node> { |
// Note: see comment in [addAll]. We need to be careful about the order of |
// operations if [from] is also a NodeList. |
for (int i = rangeLength - 1; i >= 0; i--) { |
- this[start + i].parent = null; |
- super[start + i] = _setParent(from[startFrom + i]); |
+ this[start + i] = from[startFrom + i]; |
} |
} |
@@ -727,9 +739,26 @@ class NodeList extends ListProxy<Node> { |
super.retainWhere(test); |
} |
- void insertAll(int index, List<Node> nodes) { |
- for (var node in nodes) _setParent(node); |
- super.insertAll(index, nodes); |
+ void insertAll(int index, Iterable<Node> collection) { |
+ // Note: we need to be careful how we copy nodes. See note in addAll. |
+ var list = _flattenDocFragments(collection); |
+ for (var node in list.reversed) _setParent(node); |
+ super.insertAll(index, list); |
+ } |
+ |
+ _flattenDocFragments(Iterable<Node> collection) { |
+ // Note: this function serves two purposes: |
+ // * it flattens document fragments |
+ // * it creates a copy of [collections] when `collection is NodeList`. |
+ var result = []; |
+ for (var node in collection) { |
+ if (node is DocumentFragment) { |
+ result.addAll(node.nodes); |
+ } else { |
+ result.add(node); |
+ } |
+ } |
+ return result; |
} |
} |