Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Unified Diff: lib/html/dart2js/html_dart2js.dart

Side-by-side diff isn't available for this file because of its large size.
Issue 11033007: Revert "Removing ElementList (splitting out removing NodeList into a separate CL)." (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
Download patch
« no previous file with comments | « no previous file | lib/html/dartium/html_dartium.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/html/dart2js/html_dart2js.dart
diff --git a/lib/html/dart2js/html_dart2js.dart b/lib/html/dart2js/html_dart2js.dart
index 5d8ead83c24466f9e463df0ada8f241ca25c5122..dcc8123d38211f738e7a2dad74b09bc63f1e5ce0 100644
--- a/lib/html/dart2js/html_dart2js.dart
+++ b/lib/html/dart2js/html_dart2js.dart
@@ -23,7 +23,7 @@ Document get document() native "return document;";
_DocumentImpl get _document() native "return document;";
Element query(String selector) => _document.query(selector);
-List<Element> queryAll(String selector) => _document.queryAll(selector);
+ElementList queryAll(String selector) => _document.queryAll(selector);
// Workaround for tags like <cite> that lack their own Element subclass --
// Dart issue 1990.
@@ -10420,11 +10420,11 @@ abstract class DocumentFragment extends Element {
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-class _FilteredElementList implements List {
+class FilteredElementList implements ElementList {
final Node _node;
final NodeList _childNodes;
- _FilteredElementList(Node node): _childNodes = node.nodes, _node = node;
+ FilteredElementList(Node node): _childNodes = node.nodes, _node = node;
// We can't memoize this, since it's possible that children will be messed
// with externally to this class.
@@ -10433,6 +10433,16 @@ class _FilteredElementList implements List {
List<Element> get _filtered =>
new List.from(_childNodes.filter((n) => n is Element));
+ // Don't use _filtered.first so we can short-circuit once we find an element.
+ Element get first {
+ for (final node in _childNodes) {
+ if (node is Element) {
+ return node;
+ }
+ }
+ return null;
+ }
+
void forEach(void f(Element element)) {
_filtered.forEach(f);
}
@@ -10543,11 +10553,11 @@ class _FrozenCSSClassSet extends _CssClassSet {
}
class _DocumentFragmentImpl extends _NodeImpl implements DocumentFragment native "*DocumentFragment" {
- List<Element> _elements;
+ ElementList _elements;
- List<Element> get elements {
+ ElementList get elements {
if (_elements == null) {
- _elements = new _FilteredElementList(this);
+ _elements = new FilteredElementList(this);
}
return _elements;
}
@@ -10592,8 +10602,7 @@ class _DocumentFragmentImpl extends _NodeImpl implements DocumentFragment native
case "beforebegin": return null;
case "afterend": return null;
case "afterbegin":
- var first = this.nodes.length > 0 ? this.nodes[0] : null;
- this.insertBefore(node, first);
+ this.insertBefore(node, this.nodes.first);
return node;
case "beforeend":
this.nodes.add(node);
@@ -10642,12 +10651,7 @@ class _DocumentFragmentImpl extends _NodeImpl implements DocumentFragment native
String get tagName => "";
String get webkitdropzone => "";
String get webkitRegionOverflow => "";
- Element get $m_firstElementChild {
- if (elements.length > 0) {
- return elements[0];
- }
- return null;
- }
+ Element get $m_firstElementChild() => elements.first();
Element get $m_lastElementChild() => elements.last();
Element get nextElementSibling => null;
Element get previousElementSibling => null;
@@ -11145,6 +11149,21 @@ class _EXTTextureFilterAnisotropicImpl implements EXTTextureFilterAnisotropic na
// WARNING: Do not edit - generated code.
+// TODO(vsm): Eliminate this type.
+
+// Note, ElementList implements List (instead of List<Element>) so
+// that its implementing classes may be cast to Lists of more specific
+// type such as List<CanvasElement>.
+abstract class ElementList implements List {
+ // TODO(jacobr): add element batch manipulation methods.
+ ElementList filter(bool f(Element element));
+
+ ElementList getRange(int start, int length);
+
+ Element get first;
+ // TODO(jacobr): add insertAt
+}
+
/**
* All your attribute manipulation needs in one place.
* Extends the regular Map interface by automatically coercing non-string
@@ -11201,7 +11220,7 @@ abstract class Element implements Node, NodeSelector {
* @domName childElementCount, firstElementChild, lastElementChild,
* children, Node.nodes.add
*/
- List<Element> get elements;
+ ElementList get elements;
void set elements(Collection<Element> value);
@@ -11550,7 +11569,7 @@ abstract class ElementEvents implements Events {
// TODO(jacobr): use _Lists.dart to remove some of the duplicated
// functionality.
-class _ChildrenElementList implements List {
+class _ChildrenElementList implements ElementList {
// Raw Element.
final _ElementImpl _element;
final _HTMLCollectionImpl _childElements;
@@ -11567,14 +11586,18 @@ class _ChildrenElementList implements List {
return output;
}
+ _ElementImpl get first {
+ return _element.$dom_firstElementChild;
+ }
+
void forEach(void f(Element element)) {
for (_ElementImpl element in _childElements) {
f(element);
}
}
- List<Element> filter(bool f(Element element)) {
- final output = [];
+ ElementList filter(bool f(Element element)) {
+ final output = <Element>[];
forEach((Element element) {
if (f(element)) {
output.add(element);
@@ -11696,7 +11719,7 @@ class _ChildrenElementList implements List {
// 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 implements List {
+class _FrozenElementList implements ElementList {
final List<Node> _nodeList;
_FrozenElementList._wrap(this._nodeList);
@@ -11719,8 +11742,8 @@ class _FrozenElementList implements List {
return out;
}
- List<Element> filter(bool f(Element element)) {
- final out = <Element>[];
+ ElementList filter(bool f(Element element)) {
+ final out = new _ElementList([]);
for (Element el in this) {
if (f(el)) out.add(el);
}
@@ -11789,7 +11812,7 @@ class _FrozenElementList implements List {
throw const UnsupportedOperationException('');
}
- List<Element> getRange(int start, int rangeLength) =>
+ ElementList getRange(int start, int rangeLength) =>
new _FrozenElementList._wrap(_nodeList.getRange(start, rangeLength));
int indexOf(Element element, [int start = 0]) =>
@@ -11833,6 +11856,16 @@ class _FrozenElementListIterator implements Iterator<Element> {
bool hasNext() => _index < _list.length;
}
+class _ElementList extends _ListWrapper<Element> implements ElementList {
+ _ElementList(List<Element> list) : super(list);
+
+ ElementList filter(bool f(Element element)) =>
+ new _ElementList(super.filter(f));
+
+ ElementList getRange(int start, int rangeLength) =>
+ new _ElementList(super.getRange(start, rangeLength));
+}
+
class _ElementAttributeMap implements AttributeMap {
final _ElementImpl _element;
@@ -12220,7 +12253,7 @@ class _ElementImpl extends _NodeImpl implements Element native "*Element" {
elements.addAll(value);
}
- List<Element> get elements => new _ChildrenElementList._wrap(this);
+ ElementList get elements => new _ChildrenElementList._wrap(this);
_ElementImpl query(String selectors) => $dom_querySelector(selectors);
@@ -12319,8 +12352,7 @@ class _ElementImpl extends _NodeImpl implements Element native "*Element" {
this.parent.insertBefore(node, this);
break;
case 'afterbegin':
- var first = this.nodes.length > 0 ? this.nodes[0] : null;
- this.insertBefore(node, first);
+ this.insertBefore(node, this.nodes.first);
break;
case 'beforeend':
this.nodes.add(node);
@@ -12502,7 +12534,7 @@ class _ElementFactoryProvider {
Element element;
if (temp.elements.length == 1) {
- element = temp.elements[0];
+ element = temp.elements.first;
} else if (parentTag == 'html' && temp.elements.length == 2) {
// Work around for edge case in WebKit and possibly other browsers where
// both body and head elements are created even though the inner html
@@ -21120,10 +21152,10 @@ class _ListWrapper<E> implements List<E> {
class _NodeListWrapper extends _ListWrapper<Node> implements NodeList {
_NodeListWrapper(List list) : super(list);
- List<Node> filter(bool f(Node element)) =>
+ NodeList filter(bool f(Node element)) =>
new _NodeListWrapper(_list.filter(f));
- List<Node> getRange(int start, int rangeLength) =>
+ NodeList getRange(int start, int rangeLength) =>
new _NodeListWrapper(_list.getRange(start, rangeLength));
}
@@ -21154,7 +21186,7 @@ class _NodeListImpl implements NodeList, JavaScriptIndexingBehavior native "*Nod
void addAll(Collection<_NodeImpl> collection) {
for (_NodeImpl node in collection) {
- _parent.$dom_appendChild(node);
+ _parent.$dom_appendChild(node);
}
}
@@ -21212,7 +21244,7 @@ class _NodeListImpl implements NodeList, JavaScriptIndexingBehavior native "*Nod
void insertRange(int start, int rangeLength, [Node initialValue]) {
throw new UnsupportedOperationException("Cannot insertRange on immutable List.");
}
- List<Node> getRange(int start, int rangeLength) =>
+ NodeList getRange(int start, int rangeLength) =>
new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
// -- end List<Node> mixins.
@@ -24842,7 +24874,7 @@ class _SVGElementImpl extends _ElementImpl implements SVGElement native "*SVGEle
return _cssClassSet;
}
- List<Element> get elements => new _FilteredElementList(this);
+ ElementList get elements => new FilteredElementList(this);
void set elements(Collection<Element> value) {
final elements = this.elements;
@@ -24869,7 +24901,7 @@ class _SVGElementImpl extends _ElementImpl implements SVGElement native "*SVGEle
// Wrap the SVG string in <svg> so that SVGElements are created, rather than
// HTMLElements.
container.innerHTML = '<svg version="1.1">$svg</svg>';
- this.elements = container.elements[0].elements;
+ this.elements = container.elements.first.elements;
}
« no previous file with comments | « no previous file | lib/html/dartium/html_dartium.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698