Index: tools/dom/src/KeyboardEventController.dart |
diff --git a/tools/dom/src/KeyboardEventController.dart b/tools/dom/src/KeyboardEventController.dart |
index 1e0f97a82c6e8e173783b5827383eef99b6d86ec..73a7602f83b26cdb3e8bdcf09687cd9f40a85922 100644 |
--- a/tools/dom/src/KeyboardEventController.dart |
+++ b/tools/dom/src/KeyboardEventController.dart |
@@ -37,9 +37,8 @@ class KeyboardEventController { |
// The distance to shift from upper case alphabet Roman letters to lower case. |
final int _ROMAN_ALPHABET_OFFSET = "a".charCodes[0] - "A".charCodes[0]; |
- // Instance members referring to the internal event handlers because closures |
- // are not hashable. |
- var _keyUp, _keyDown, _keyPress; |
+ StreamSubscription _keyUpSubscription, _keyDownSubscription, |
+ _keyPressSubscription; |
/** |
* An enumeration of key identifiers currently part of the W3C draft for DOM3 |
@@ -95,9 +94,6 @@ class KeyboardEventController { |
_callbacks = []; |
_type = type; |
_target = target; |
- _keyDown = processKeyDown; |
- _keyUp = processKeyUp; |
- _keyPress = processKeyPress; |
} |
/** |
@@ -106,9 +102,14 @@ class KeyboardEventController { |
*/ |
void _initializeAllEventListeners() { |
_keyDownList = []; |
- _target.on.keyDown.add(_keyDown, true); |
- _target.on.keyPress.add(_keyPress, true); |
- _target.on.keyUp.add(_keyUp, true); |
+ if (_keyDownSubscription == null) { |
+ _keyDownSubscription = Element.keyDownEvent.forTarget( |
+ _target, useCapture: true).listen(processKeyDown); |
+ _keyPressSubscription = Element.keyPressEvent.forTarget( |
+ _target, useCapture: true).listen(processKeyUp); |
+ _keyUpSubscription = Element.keyUpEvent.forTarget( |
+ _target, useCapture: true).listen(processKeyPress); |
+ } |
} |
/** Add a callback that wishes to be notified when a KeyEvent occurs. */ |
@@ -142,9 +143,12 @@ class KeyboardEventController { |
} |
if (_callbacks.length == 0) { |
// If we have no listeners, don't bother keeping track of keypresses. |
- _target.on.keyDown.remove(_keyDown); |
- _target.on.keyPress.remove(_keyPress); |
- _target.on.keyUp.remove(_keyUp); |
+ _keyDownSubscription.cancel(); |
+ _keyDownSubscription = null; |
+ _keyPressSubscription.cancel(); |
+ _keyPressSubscription = null; |
+ _keyUpSubscription.cancel(); |
+ _keyUpSubscription = null; |
} |
} |