Index: tools/dom/src/HtmlStreamController.dart |
diff --git a/tools/dom/src/HtmlStreamController.dart b/tools/dom/src/HtmlStreamController.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..34328264a4b4e1e295d303a32ab13f318248a46f |
--- /dev/null |
+++ b/tools/dom/src/HtmlStreamController.dart |
@@ -0,0 +1,62 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+part of html; |
+ |
+/** |
+ * Adapter for exposing DOM events as Dart streams. |
+ */ |
+class _HtmlStreamController<T extends Event> extends StreamController<T> { |
Jennifer Messerly
2013/01/11 21:57:17
High level question: do we want to subclass Stream
floitsch
2013/01/11 22:46:11
If I'm not wrong we can directly forward the regis
blois
2013/01/11 22:51:30
Will take a look at this now.
Jennifer Messerly
2013/01/11 23:30:14
I hope it works -- that would be awesome :)
|
+ final EventTarget _target; |
+ final String _eventType; |
+ final bool _useCapture; |
+ EventListener _eventHandler; |
+ |
+ _HtmlStreamController(this._target, this._eventType, this._useCapture) { |
+ // Stash reference to the method to allow removeEventListener to function. |
+ _eventHandler = _handleEvent; |
Jennifer Messerly
2013/01/11 21:57:17
Can this just be:
_eventHandler = this.add;
blois
2013/01/11 22:51:30
Unfortunately, this fails in dart2js checked mode.
|
+ } |
+ |
+ void onSubscriptionStateChange() { |
+ super.onSubscriptionStateChange(); |
+ if (hasSubscribers) { |
+ _target.$dom_addEventListener(_eventType, _eventHandler, _useCapture); |
+ } else { |
+ _target.$dom_removeEventListener(_eventType, _eventHandler, _useCapture); |
+ } |
+ } |
+ |
+ void _handleEvent(e) { |
+ this.add(e); |
+ } |
+} |
+ |
+ |
+/** |
+ * A factory to expose DOM events as Streams. |
+ */ |
+class HtmlStreamProvider<T extends Event> { |
+ final String _eventType; |
+ |
+ const HtmlStreamProvider(this._eventType); |
+ |
+ /** |
+ * Gets a [Stream] for this event type, on the specified target. |
+ * |
+ * This may be used to capture DOM events: |
+ * |
+ * Element.keyDownEvent.forTarget(element, useCapture: true).listen(...); |
+ * |
+ * Or for listening to an event which will bubble through the DOM tree: |
+ * |
+ * MediaElement.pauseEvent.forTarget(document.body).listen(...); |
+ * |
+ * See also: |
+ * |
+ * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener) |
+ */ |
+ Stream<T> forTarget(EventTarget e, {bool useCapture: false}) { |
+ return new _HtmlStreamController(e, _eventType, useCapture); |
+ } |
+} |