Chromium Code Reviews| Index: sdk/lib/html/src/dart2js_KeyEvent.dart |
| diff --git a/sdk/lib/html/src/dart2js_KeyEvent.dart b/sdk/lib/html/src/dart2js_KeyEvent.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..35a9fa7e76769ff6da080c6c5d78f1f2d5828bc9 |
| --- /dev/null |
| +++ b/sdk/lib/html/src/dart2js_KeyEvent.dart |
| @@ -0,0 +1,104 @@ |
| +/** |
| + * A custom KeyboardEvent that attempts to eliminate cross-browser |
| + * inconsistencies, and also provide both keyCode and charCode information |
| + * for all key events (when such information can be determined). |
| + * |
| + * This class is very much a work in progress, and we'd love to get information |
| + * on how we can make this class work with as many international keyboards as |
| + * possible. Bugs welcome! |
| + */ |
| +class KeyEvent implements KeyboardEvent { |
| + /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */ |
| + KeyboardEvent _parent; |
| + |
| + /** The "fixed" value of whether the alt key is being pressed. */ |
| + bool _shadowAltKey; |
| + |
| + /** Caculated value of what the estimated charCode is for this event. */ |
| + int _shadowCharCode; |
| + |
| + /** Caculated value of what the estimated keyCode is for this event. */ |
| + int _shadowKeyCode; |
| + |
| + /** Caculated value of what the estimated keyCode is for this event. */ |
| + int get keyCode => _shadowKeyCode; |
| + |
| + /** Caculated value of what the estimated charCode is for this event. */ |
| + int get charCode => this.type == 'keypress' ? _shadowCharCode : 0; |
| + |
| + /** Caculated value of whether the alt key is pressed is for this event. */ |
| + bool get altKey => _shadowAltKey; |
| + |
| + /** Caculated value of what the estimated keyCode is for this event. */ |
| + int get which => keyCode; |
| + |
| + /** Accessor to the underlying keyCode value is the parent event. */ |
| + int get _realKeyCode => JS('int', '#.keyCode', _parent); |
| + |
| + /** Accessor to the underlying charCode value is the parent event. */ |
| + int get _realCharCode => JS('int', '#.charCode', _parent); |
| + |
| + /** Accessor to the underlying altKey value is the parent event. */ |
| + bool get _realAltKey => JS('int', '#.altKey', _parent); |
| + |
| + /** Construct a KeyEvent with [parent] as event we're emulating. */ |
| + KeyEvent(KeyboardEvent parent) { |
| + _parent = parent; |
| + _shadowAltKey = _realAltKey; |
| + _shadowCharCode = _realCharCode; |
| + _shadowKeyCode = _realKeyCode; |
| + } |
| + |
| + /** |
| + * Catch-all to behave for all other methods not defined here just like the |
| + * _parent. |
| + */ |
| + void noSuchMethod(InvocationMirror invocation) { |
|
blois
2012/11/29 00:03:12
Are there performance implications of this? Might
Emily Fortuna
2012/11/29 01:10:37
Yep. Removed.
|
| + invocation.invokeOn(_parent); |
| + } |
| + |
| + // ----------------------------------------------------------------------- |
| + // This code duplication is unfortunate... It's like this because dart2js |
| + // generates code accessing fields like KeyEvent.bubbles as |
| + // KeyEvent.get$bubbles, which without these getters, would hit noSuchMethod, |
| + // and try to call get$bubbles on KeyBoardEvent, which just has a bubbles |
| + // field, not a get$bubbles. |
| + /** True if the altGraphKey is pressed during this event. */ |
| + bool get altGraphKey => _parent.altGraphKey; |
| + bool get bubbles => _parent.bubbles; |
| + /** True if this event can be cancelled. */ |
| + bool get cancelable => _parent.cancelable; |
| + bool get cancelBubble => _parent.cancelBubble; |
| + /** Accessor to the clipboardData available for this event. */ |
| + Clipboard get clipboardData => _parent.clipboardData; |
| + /** True if the ctrl key is pressed during this event. */ |
| + bool get ctrlKey => _parent.ctrlKey; |
| + /** Accessor to the target this event is listening to for changes. */ |
| + EventTarget get currentTarget => _parent.currentTarget; |
| + bool get defaultPrevented => _parent.defaultPrevented; |
| + int get detail => _parent.detail; |
| + int get eventPhase => _parent.eventPhase; |
| + /** |
| + * Accessor to the part of the keyboard that the key was pressed from (one of |
| + * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT, |
| + * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK). |
| + */ |
| + int get keyLocation => _parent.keyLocation; |
| + int get layerX => _parent.layerX; |
| + int get layerY => _parent.layerY; |
| + /** True if the Meta (or Mac command) key is pressed during this event. */ |
| + bool get metaKey => _parent.metaKey; |
| + int get pageX => _parent.pageX; |
| + int get pageY => _parent.pageY; |
| + bool get returnValue => _parent.returnValue; |
| + /** True if the shift key was pressed during this event. */ |
| + bool get shiftKey => _parent.shiftKey; |
| + int get timeStamp => _parent.timeStamp; |
| + /** |
| + * The type of key event that occurred. One of "keydown", "keyup", or |
| + * "keypress". |
| + */ |
| + String get type => _parent.type; |
| + Window get view => _parent.view; |
| + String get _shadowKeyIdentifier => JS('String', '#.keyIdentifier', _parent); |
| +} |