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

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

Issue 16123029: Switching DOM events over to using StreamController. Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 6 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 | « tests/html/streams_test.dart ('k') | no next file » | 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 d19ab14e47ff6389df13a2d04ecd5ca6caca4885..b0b15f674f955c6b6395170c9786613f57e8a3aa 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -4,107 +4,6 @@
part of html;
-/**
- * Adapter for exposing DOM events as Dart streams.
- */
-class _EventStream<T extends Event> extends Stream<T> {
- final EventTarget _target;
- final String _eventType;
- final bool _useCapture;
-
- _EventStream(this._target, this._eventType, this._useCapture);
-
- // DOM events are inherently multi-subscribers.
- Stream<T> asBroadcastStream() => this;
- bool get isBroadcast => true;
-
- StreamSubscription<T> listen(void onData(T event),
- { void onError(error),
- void onDone(),
- bool cancelOnError}) {
-
- return new _EventStreamSubscription<T>(
- this._target, this._eventType, onData, this._useCapture);
- }
-}
-
-class _EventStreamSubscription<T extends Event> extends StreamSubscription<T> {
- int _pauseCount = 0;
- EventTarget _target;
- final String _eventType;
- var _onData;
- final bool _useCapture;
-
- _EventStreamSubscription(this._target, this._eventType, this._onData,
- this._useCapture) {
- _tryResume();
- }
-
- void cancel() {
- if (_canceled) return;
-
- _unlisten();
- // Clear out the target to indicate this is complete.
- _target = null;
- _onData = null;
- }
-
- bool get _canceled => _target == null;
-
- void onData(void handleData(T event)) {
- if (_canceled) {
- throw new StateError("Subscription has been canceled.");
- }
- // Remove current event listener.
- _unlisten();
-
- _onData = handleData;
- _tryResume();
- }
-
- /// Has no effect.
- void onError(void handleError(error)) {}
-
- /// Has no effect.
- void onDone(void handleDone()) {}
-
- void pause([Future resumeSignal]) {
- if (_canceled) return;
- ++_pauseCount;
- _unlisten();
-
- if (resumeSignal != null) {
- resumeSignal.whenComplete(resume);
- }
- }
-
- bool get isPaused => _pauseCount > 0;
-
- void resume() {
- if (_canceled || !isPaused) return;
- --_pauseCount;
- _tryResume();
- }
-
- void _tryResume() {
- if (_onData != null && !isPaused) {
- _target.$dom_addEventListener(_eventType, _onData, _useCapture);
- }
- }
-
- void _unlisten() {
- if (_onData != null) {
- _target.$dom_removeEventListener(_eventType, _onData, _useCapture);
- }
- }
-
- Future asFuture([var futureValue]) {
- // We just need a future that will never succeed or fail.
- Completer completer = new Completer();
- return completer.future;
- }
-}
-
/**
* A factory to expose DOM events as Streams.
@@ -133,7 +32,22 @@ class EventStreamProvider<T extends Event> {
* [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
*/
Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
- return new _EventStream(e, _eventType, useCapture);
+ var controller;
+
+ void onData(data) {
+ controller.add(data);
+ }
+
+ controller = new StreamController<T>(
+ onListen: () {
+ e.$dom_addEventListener(_eventType, onData, useCapture);
+ },
+ onCancel: () {
+ e.$dom_removeEventListener(_eventType, onData, useCapture);
+ },
+ sync: true);
+
+ return controller.stream;
}
/**
@@ -159,7 +73,24 @@ class _CustomEventStreamProvider<T extends Event>
const _CustomEventStreamProvider(this._eventTypeGetter);
Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
- return new _EventStream(e, _eventTypeGetter(e), useCapture);
+ var controller;
+
+ var eventType = _eventTypeGetter(e);
+
+ void onData(data) {
+ controller.add(data);
+ }
+
+ controller = new StreamController<T>(
+ onListen: () {
+ e.$dom_addEventListener(eventType, onData, useCapture);
+ },
+ onCancel: () {
+ e.$dom_removeEventListener(eventType, onData, useCapture);
+ },
+ sync: true);
+
+ return controller.stream;
}
String getEventType(EventTarget target) {
« no previous file with comments | « tests/html/streams_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698