Index: tools/dom/templates/html/impl/impl_Element.darttemplate |
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate |
index 04f51e1e03ab1f3c21c0857454de9de2621df23c..0fe41b01dc0cfcce5b96a9947e736582a0d02eb5 100644 |
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate |
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate |
@@ -253,19 +253,17 @@ abstract class ElementList<T extends Element> extends ListBase<T> { |
$!STREAM_GETTER_SIGNATURES |
} |
-// TODO(jacobr): this is an inefficient implementation but it is hard to see |
-// a better option given that we cannot quite force NodeList to be an |
-// ElementList as there are valid cases where a NodeList JavaScript object |
-// contains Node objects that are not Elements. |
-class _FrozenElementList<T extends Element> extends ListBase<T> |
- implements ElementList<T>, NodeListWrapper { |
+// Wrapper over an immutable NodeList to make it implement ElementList. |
+// |
+// Clients are {`Document`, `DocumentFragment`}.`querySelectorAll` which are |
+// declared to return `ElementList`. This provides all the static analysis |
+// benefit so there is no need for this class have a constrained type parameter. |
+// |
+class _FrozenElementList extends ListBase |
+ implements ElementList, NodeListWrapper { |
final List<Node> _nodeList; |
- // The subset of _nodeList that are Elements. |
- List<Element> _elementList; |
- _FrozenElementList._wrap(this._nodeList) { |
- _elementList = _nodeList.where((e) => e is Element).toList(); |
- } |
+ _FrozenElementList._wrap(this._nodeList); |
int get length => _nodeList.length; |
@@ -293,22 +291,22 @@ class _FrozenElementList<T extends Element> extends ListBase<T> |
Element get single => _nodeList.single; |
- CssClassSet get classes => new _MultiElementCssClassSet(_elementList); |
+ CssClassSet get classes => new _MultiElementCssClassSet(this); |
CssStyleDeclarationBase get style => |
- new _CssStyleDeclarationSet(_elementList); |
+ new _CssStyleDeclarationSet(this); |
void set classes(Iterable<String> value) { |
- _elementList.forEach((e) => e.classes = value); |
+ _nodeList.forEach((e) => e.classes = value); |
} |
- CssRect get contentEdge => new _ContentCssListRect(_elementList); |
+ CssRect get contentEdge => new _ContentCssListRect(this); |
- CssRect get paddingEdge => _elementList.first.paddingEdge; |
+ CssRect get paddingEdge => this.first.paddingEdge; |
- CssRect get borderEdge => _elementList.first.borderEdge; |
+ CssRect get borderEdge => this.first.borderEdge; |
- CssRect get marginEdge => _elementList.first.marginEdge; |
+ CssRect get marginEdge => this.first.marginEdge; |
List<Node> get rawList => _nodeList; |