@@ -66,9 +66,9 @@ class DomDocument {}
6666extension DomDocumentExtension on DomDocument {
6767 external DomElement ? get documentElement;
6868 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]));
7272 DomElement createElement (String name, [Object ? options]) =>
7373 js_util.callMethod (this , 'createElement' ,
7474 < Object > [name, if (options != null ) options]) as DomElement ;
@@ -172,8 +172,8 @@ class DomElement extends DomNode {}
172172DomElement createDomElement (String tag) => domDocument.createElement (tag);
173173
174174extension 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' ));
177177 external int get clientHeight;
178178 external int get clientWidth;
179179 external String get id;
@@ -188,9 +188,9 @@ extension DomElementExtension on DomElement {
188188 external DomRect getBoundingClientRect ();
189189 external void prepend (DomNode node);
190190 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]));
194194 external void remove ();
195195 external void setAttribute (String name, Object value);
196196 void appendText (String text) => append (createDomText (text));
@@ -207,16 +207,14 @@ extension DomCSSStyleDeclarationExtension on DomCSSStyleDeclaration {
207207 set clip (String value) => setProperty ('clip' , value);
208208 set clipPath (String value) => setProperty ('clip-path' , value);
209209 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);
212211 set opacity (String value) => setProperty ('opacity' , value);
213212 set color (String value) => setProperty ('color' , value);
214213 set top (String value) => setProperty ('top' , value);
215214 set left (String value) => setProperty ('left' , value);
216215 set right (String value) => setProperty ('right' , value);
217216 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);
220218 set pointerEvents (String value) => setProperty ('pointer-events' , value);
221219 set filter (String value) => setProperty ('filter' , value);
222220 set zIndex (String value) => setProperty ('z-index' , value);
@@ -251,8 +249,7 @@ extension DomCSSStyleDeclarationExtension on DomCSSStyleDeclaration {
251249 set borderRadius (String value) => setProperty ('border-radius' , value);
252250 set perspective (String value) => setProperty ('perspective' , value);
253251 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);
256253 set border (String value) => setProperty ('border' , value);
257254 set mixBlendMode (String value) => setProperty ('mix-blend-mode' , value);
258255 set backgroundSize (String value) => setProperty ('background-size' , value);
@@ -655,11 +652,11 @@ extension DomHTMLTextAreaElementExtension on DomHTMLTextAreaElement {
655652class DomClipboard extends DomEventTarget {}
656653
657654extension 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 > []));
660657
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]));
663660}
664661
665662extension DomResponseExtension on DomResponse {
@@ -694,6 +691,57 @@ extension DomKeyboardEventExtension on DomKeyboardEvent {
694691 external bool getModifierState (String keyArg);
695692}
696693
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+
697745Object ? domGetConstructor (String constructorName) =>
698746 js_util.getProperty (domWindow, constructorName);
699747
0 commit comments