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

Unified Diff: tools/dom/src/EventStreamProvider.dart

Issue 1894713002: Strong html (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: ptal Created 4 years, 8 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:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/dom/src/CssRectangle.dart ('k') | tools/dom/src/KeyboardEventStream.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « tools/dom/src/CssRectangle.dart ('k') | tools/dom/src/KeyboardEventStream.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698