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

Unified Diff: sdk/lib/html/dart2js/html_dart2js.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 | « no previous file | sdk/lib/html/dartium/html_dartium.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/html/dart2js/html_dart2js.dart
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 9c9645af31d2d4642b031e922f513f4322cd52c4..fad10705e38c61463d7ba29adb780060e9ed473c 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -26057,107 +26057,6 @@ typedef EventListener(Event event);
// BSD-style license that can be found in the LICENSE file.
-/**
- * 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.
@@ -26186,7 +26085,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;
}
/**
@@ -26212,7 +26126,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 | « no previous file | sdk/lib/html/dartium/html_dartium.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698