| Index: tools/dom/src/EventStreamProvider.dart
|
| diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
|
| index 3b41f51821892c5817fb99dd891d2ecc94af24e2..76bed572735ed5c939c762b06c5cc56276a9e3e0 100644
|
| --- a/tools/dom/src/EventStreamProvider.dart
|
| +++ b/tools/dom/src/EventStreamProvider.dart
|
| @@ -34,7 +34,7 @@ class EventStreamProvider<T extends Event> {
|
| * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
|
| */
|
| Stream<T> forTarget(EventTarget e, {bool useCapture: false}) =>
|
| - new _EventStream(e, _eventType, useCapture);
|
| + new _EventStream<T>(e, _eventType, useCapture);
|
|
|
| /**
|
| * Gets an [ElementEventStream] for this event type, on the specified element.
|
| @@ -58,7 +58,7 @@ class EventStreamProvider<T extends Event> {
|
| * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
|
| */
|
| ElementStream<T> forElement(Element e, {bool useCapture: false}) {
|
| - return new _ElementEventStreamImpl(e, _eventType, useCapture);
|
| + return new _ElementEventStreamImpl<T>(e, _eventType, useCapture);
|
| }
|
|
|
| /**
|
| @@ -129,8 +129,8 @@ class _EventStream<T extends Event> extends Stream<T> {
|
| _EventStream(this._target, this._eventType, this._useCapture);
|
|
|
| // DOM events are inherently multi-subscribers.
|
| - Stream<T> asBroadcastStream({void onListen(StreamSubscription subscription),
|
| - void onCancel(StreamSubscription subscription)})
|
| + Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
|
| + void onCancel(StreamSubscription<T> subscription)})
|
| => this;
|
| bool get isBroadcast => true;
|
|
|
| @@ -144,6 +144,11 @@ class _EventStream<T extends Event> extends Stream<T> {
|
| }
|
| }
|
|
|
| +bool _matchesWithAncestors(Event event, String selector) {
|
| + var target = event.target;
|
| + return target is Element ? target.matchesWithAncestors(selector) : false;
|
| +}
|
| +
|
| /**
|
| * Adapter for exposing DOM Element events as streams, while also allowing
|
| * event delegation.
|
| @@ -154,7 +159,7 @@ class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
|
| super(target, eventType, useCapture);
|
|
|
| Stream<T> matches(String selector) => this.where(
|
| - (event) => event.target.matchesWithAncestors(selector)).map((e) {
|
| + (event) => _matchesWithAncestors(event, selector)).map((e) {
|
| e._selector = selector;
|
| return e;
|
| });
|
| @@ -178,7 +183,7 @@ class _ElementListEventStreamImpl<T extends Event> extends Stream<T>
|
| this._targetList, this._eventType, this._useCapture);
|
|
|
| Stream<T> matches(String selector) => this.where(
|
| - (event) => event.target.matchesWithAncestors(selector)).map((e) {
|
| + (event) => _matchesWithAncestors(event, selector)).map((e) {
|
| e._selector = selector;
|
| return e;
|
| });
|
| @@ -188,37 +193,46 @@ class _ElementListEventStreamImpl<T extends Event> extends Stream<T>
|
| { Function onError,
|
| void onDone(),
|
| bool cancelOnError}) {
|
| - var pool = new _StreamPool.broadcast();
|
| + var pool = new _StreamPool<T>.broadcast();
|
| for (var target in _targetList) {
|
| - pool.add(new _EventStream(target, _eventType, _useCapture));
|
| + pool.add(new _EventStream<T>(target, _eventType, _useCapture));
|
| }
|
| return pool.stream.listen(onData, onError: onError, onDone: onDone,
|
| cancelOnError: cancelOnError);
|
| }
|
|
|
| StreamSubscription<T> capture(void onData(T event)) {
|
| - var pool = new _StreamPool.broadcast();
|
| + var pool = new _StreamPool<T>.broadcast();
|
| for (var target in _targetList) {
|
| - pool.add(new _EventStream(target, _eventType, true));
|
| + pool.add(new _EventStream<T>(target, _eventType, true));
|
| }
|
| return pool.stream.listen(onData);
|
| }
|
|
|
| - Stream<T> asBroadcastStream({void onListen(StreamSubscription subscription),
|
| - void onCancel(StreamSubscription subscription)})
|
| + Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
|
| + void onCancel(StreamSubscription<T> subscription)})
|
| => this;
|
| bool get isBroadcast => true;
|
| }
|
|
|
| +// We would like this to just be EventListener<T> but that typdef cannot
|
| +// use generics until dartbug/26276 is fixed.
|
| +typedef _EventListener<T extends Event>(T event);
|
| +
|
| class _EventStreamSubscription<T extends Event> extends StreamSubscription<T> {
|
| int _pauseCount = 0;
|
| EventTarget _target;
|
| final String _eventType;
|
| - var _onData;
|
| + EventListener _onData;
|
| final bool _useCapture;
|
|
|
| - _EventStreamSubscription(this._target, this._eventType, onData,
|
| - this._useCapture) : _onData = _wrapZone(onData) {
|
| + // TODO(jacobr): for full strong mode correctness we should write
|
| + // _onData = onData == null ? null : _wrapZone/*<Event, dynamic>*/((e) => onData(e as T))
|
| + // but that breaks 114 co19 tests as well as multiple html tests as it is reasonable
|
| + // to pass the wrong type of event object to an event listener as part of a
|
| + // test.
|
| + _EventStreamSubscription(this._target, this._eventType, void onData(T event),
|
| + this._useCapture) : _onData = _wrapZone/*<Event, dynamic>*/(onData) {
|
| _tryResume();
|
| }
|
|
|
| @@ -240,8 +254,7 @@ class _EventStreamSubscription<T extends Event> extends StreamSubscription<T> {
|
| }
|
| // Remove current event listener.
|
| _unlisten();
|
| -
|
| - _onData = _wrapZone(handleData);
|
| + _onData = _wrapZone/*<Event, dynamic>*/(handleData);
|
| _tryResume();
|
| }
|
|
|
| @@ -320,8 +333,8 @@ class _CustomEventStreamImpl<T extends Event> extends Stream<T>
|
| onDone: onDone, cancelOnError: cancelOnError);
|
| }
|
|
|
| - Stream<T> asBroadcastStream({void onListen(StreamSubscription subscription),
|
| - void onCancel(StreamSubscription subscription)})
|
| + Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
|
| + void onCancel(StreamSubscription<T> subscription)})
|
| => _streamController.stream;
|
|
|
| bool get isBroadcast => true;
|
| @@ -412,16 +425,16 @@ class _CustomEventStreamProvider<T extends Event>
|
| const _CustomEventStreamProvider(this._eventTypeGetter);
|
|
|
| Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
|
| - return new _EventStream(e, _eventTypeGetter(e), useCapture);
|
| + return new _EventStream<T>(e, _eventTypeGetter(e), useCapture);
|
| }
|
|
|
| ElementStream<T> forElement(Element e, {bool useCapture: false}) {
|
| - return new _ElementEventStreamImpl(e, _eventTypeGetter(e), useCapture);
|
| + return new _ElementEventStreamImpl<T>(e, _eventTypeGetter(e), useCapture);
|
| }
|
|
|
| ElementStream<T> _forElementList(ElementList e,
|
| {bool useCapture: false}) {
|
| - return new _ElementListEventStreamImpl(e, _eventTypeGetter(e), useCapture);
|
| + return new _ElementListEventStreamImpl<T>(e, _eventTypeGetter(e), useCapture);
|
| }
|
|
|
| String getEventType(EventTarget target) {
|
|
|