@@ -66,9 +66,9 @@ class DomDocument {}
66
66
extension DomDocumentExtension on DomDocument {
67
67
external DomElement ? get documentElement;
68
68
external DomElement ? querySelector (String selectors);
69
- List <DomElement > querySelectorAll (String selectors) =>
70
- js_util.callMethod <List < Object ?> >(
71
- this , 'querySelectorAll' , < Object > [selectors]). cast < DomElement >( );
69
+ Iterable <DomElement > querySelectorAll (String selectors) =>
70
+ _DomElementListWrapper . create ( js_util.callMethod <_DomElementList >(
71
+ this , 'querySelectorAll' , < Object > [selectors]));
72
72
DomElement createElement (String name, [Object ? options]) =>
73
73
js_util.callMethod (this , 'createElement' ,
74
74
< Object > [name, if (options != null ) options]) as DomElement ;
@@ -172,8 +172,8 @@ class DomElement extends DomNode {}
172
172
DomElement createDomElement (String tag) => domDocument.createElement (tag);
173
173
174
174
extension DomElementExtension on DomElement {
175
- List <DomElement > get children =>
176
- js_util.getProperty <List < Object ?>> (this , 'children' ). cast < DomElement >( );
175
+ Iterable <DomElement > get children => _DomElementListWrapper . create (
176
+ js_util.getProperty <_DomElementList > (this , 'children' ));
177
177
external int get clientHeight;
178
178
external int get clientWidth;
179
179
external String get id;
@@ -188,9 +188,9 @@ extension DomElementExtension on DomElement {
188
188
external DomRect getBoundingClientRect ();
189
189
external void prepend (DomNode node);
190
190
external DomElement ? querySelector (String selectors);
191
- List <DomElement > querySelectorAll (String selectors) =>
192
- js_util.callMethod <List < Object ?> >(
193
- this , 'querySelectorAll' , < Object > [selectors]). cast < DomElement >( );
191
+ Iterable <DomElement > querySelectorAll (String selectors) =>
192
+ _DomElementListWrapper . create ( js_util.callMethod <_DomElementList >(
193
+ this , 'querySelectorAll' , < Object > [selectors]));
194
194
external void remove ();
195
195
external void setAttribute (String name, Object value);
196
196
void appendText (String text) => append (createDomText (text));
@@ -207,16 +207,14 @@ extension DomCSSStyleDeclarationExtension on DomCSSStyleDeclaration {
207
207
set clip (String value) => setProperty ('clip' , value);
208
208
set clipPath (String value) => setProperty ('clip-path' , value);
209
209
set transform (String value) => setProperty ('transform' , value);
210
- set transformOrigin (String value) =>
211
- setProperty ('transform-origin' , value);
210
+ set transformOrigin (String value) => setProperty ('transform-origin' , value);
212
211
set opacity (String value) => setProperty ('opacity' , value);
213
212
set color (String value) => setProperty ('color' , value);
214
213
set top (String value) => setProperty ('top' , value);
215
214
set left (String value) => setProperty ('left' , value);
216
215
set right (String value) => setProperty ('right' , value);
217
216
set bottom (String value) => setProperty ('bottom' , value);
218
- set backgroundColor (String value) =>
219
- setProperty ('background-color' , value);
217
+ set backgroundColor (String value) => setProperty ('background-color' , value);
220
218
set pointerEvents (String value) => setProperty ('pointer-events' , value);
221
219
set filter (String value) => setProperty ('filter' , value);
222
220
set zIndex (String value) => setProperty ('z-index' , value);
@@ -251,8 +249,7 @@ extension DomCSSStyleDeclarationExtension on DomCSSStyleDeclaration {
251
249
set borderRadius (String value) => setProperty ('border-radius' , value);
252
250
set perspective (String value) => setProperty ('perspective' , value);
253
251
set padding (String value) => setProperty ('padding' , value);
254
- set backgroundImage (String value) =>
255
- setProperty ('background-image' , value);
252
+ set backgroundImage (String value) => setProperty ('background-image' , value);
256
253
set border (String value) => setProperty ('border' , value);
257
254
set mixBlendMode (String value) => setProperty ('mix-blend-mode' , value);
258
255
set backgroundSize (String value) => setProperty ('background-size' , value);
@@ -655,11 +652,11 @@ extension DomHTMLTextAreaElementExtension on DomHTMLTextAreaElement {
655
652
class DomClipboard extends DomEventTarget {}
656
653
657
654
extension DomClipboardExtension on DomClipboard {
658
- Future <String > readText () =>
659
- js_util.promiseToFuture < String >(js_util. callMethod (this , 'readText' , < Object > []));
655
+ Future <String > readText () => js_util. promiseToFuture < String >(
656
+ js_util.callMethod (this , 'readText' , < Object > []));
660
657
661
- Future <dynamic > writeText (String data) =>
662
- js_util .promiseToFuture (js_util.callMethod (this , 'readText' , < Object > [data]));
658
+ Future <dynamic > writeText (String data) => js_util
659
+ .promiseToFuture (js_util.callMethod (this , 'readText' , < Object > [data]));
663
660
}
664
661
665
662
extension DomResponseExtension on DomResponse {
@@ -694,6 +691,57 @@ extension DomKeyboardEventExtension on DomKeyboardEvent {
694
691
external bool getModifierState (String keyArg);
695
692
}
696
693
694
+ /// [_DomElementList] is the shared interface for APIs that return either
695
+ /// `NodeList` or `HTMLCollection` . Do *not* add any API to this class that
696
+ /// isn't support by both JS objects. Furthermore, this is an internal class and
697
+ /// should only be returned as a wrapped object to Dart.
698
+ @JS ()
699
+ @staticInterop
700
+ class _DomElementList {}
701
+
702
+ extension DomElementListExtension on _DomElementList {
703
+ external int get length;
704
+ DomElement item (int index) =>
705
+ js_util.callMethod <DomElement >(this , 'item' , < Object > [index]);
706
+ }
707
+
708
+ class _DomElementListIterator extends Iterator <DomElement > {
709
+ final _DomElementList elementList;
710
+ int index = - 1 ;
711
+
712
+ _DomElementListIterator (this .elementList);
713
+
714
+ @override
715
+ bool moveNext () {
716
+ index++ ;
717
+ if (index > elementList.length) {
718
+ throw 'Iterator out of bounds' ;
719
+ }
720
+ return index < elementList.length;
721
+ }
722
+
723
+ @override
724
+ DomElement get current => elementList.item (index);
725
+ }
726
+
727
+ class _DomElementListWrapper extends Iterable <DomElement > {
728
+ final _DomElementList elementList;
729
+
730
+ _DomElementListWrapper ._(this .elementList);
731
+
732
+ /// This is a work around for a `TypeError` which can be triggered by calling
733
+ /// `toList` on the `Iterable` .
734
+ static Iterable <DomElement > create (_DomElementList elementList) =>
735
+ _DomElementListWrapper ._(elementList).cast <DomElement >();
736
+
737
+ @override
738
+ Iterator <DomElement > get iterator => _DomElementListIterator (elementList);
739
+
740
+ /// Override the length to avoid iterating through the whole collection.
741
+ @override
742
+ int get length => elementList.length;
743
+ }
744
+
697
745
Object ? domGetConstructor (String constructorName) =>
698
746
js_util.getProperty (domWindow, constructorName);
699
747
0 commit comments