| Index: tests/html/keyboard_event_test.dart | 
| diff --git a/tests/html/keyboard_event_test.dart b/tests/html/keyboard_event_test.dart | 
| index f7427351fda8d0cc4e5e40d7ceafd66b322f7534..b84ef68389d76567ec930246a1bd569215566dd5 100644 | 
| --- a/tests/html/keyboard_event_test.dart | 
| +++ b/tests/html/keyboard_event_test.dart | 
| @@ -23,10 +23,69 @@ main() { | 
| // values (a KeyboardEvent can be "init"-ed but not all the information can | 
| // be programmatically populated. It exists as an example for how to use | 
| // KeyboardEventController more than anything else. | 
| -    KeyboardEventStream.onKeyDown(document.body).listen( | 
| +    var subscription = KeyboardEventStream.onKeyDown(document.body).listen( | 
| keydownHandlerTest); | 
| -    KeyEvent.keyDownEvent.forTarget(document.body).listen(keydownHandlerTest); | 
| -    document.body.onKeyDown.listen((e) => print('regular listener')); | 
| +    var subscription2 = KeyEvent.keyDownEvent.forTarget(document.body).listen( | 
| +        keydownHandlerTest); | 
| +    var subscription3 = document.body.onKeyDown.listen( | 
| +        (e) => print('regular listener')); | 
| +    subscription.cancel(); | 
| +    subscription2.cancel(); | 
| +    subscription3.cancel(); | 
| +  }); | 
| + | 
| +  test('constructKeyEvent', () { | 
| +    var stream = KeyEvent.keyPressEvent.forTarget(document.body); | 
| +    var subscription = stream.listen((keyEvent) { | 
| +      expect(keyEvent.charCode, 97); | 
| +      expect(keyEvent.keyCode, 65); | 
| +    }); | 
| +    var k = new KeyEvent('keypress', keyCode: 65, charCode: 97); | 
| +    stream.add(k); | 
| +    subscription.cancel(); | 
| +    // Capital "A": | 
| +    stream.add(new KeyEvent('keydown', keyCode: 16, charCode: 0)); | 
| + | 
| +    subscription = stream.listen((keyEvent) { | 
| +      expect(keyEvent.charCode, 65); | 
| +      expect(keyEvent.keyCode, 65); | 
| +    }); | 
| +    stream.add(new KeyEvent('keypress', keyCode: 65, charCode: 65)); | 
| +    subscription.cancel(); | 
| +  }); | 
| + | 
| +  test('KeyEventSequence', () { | 
| +    // Press "?" by simulating "shift" and then the key that has "/" and "?" on | 
| +    // it. | 
| +    var streamDown = KeyEvent.keyDownEvent.forTarget(document.body); | 
| +    var streamPress = KeyEvent.keyPressEvent.forTarget(document.body); | 
| +    var streamUp = KeyEvent.keyUpEvent.forTarget(document.body); | 
| + | 
| +    var subscription = streamDown.listen((keyEvent) { | 
| +      expect(keyEvent.keyCode, isIn([16, 191])); | 
| +      expect(keyEvent.charCode, 0); | 
| +    }); | 
| + | 
| +    var subscription2 = streamPress.listen((keyEvent) { | 
| +      expect(keyEvent.keyCode, 23); | 
| +      expect(keyEvent.charCode, 63); | 
| +    }); | 
| + | 
| +    var subscription3 = streamUp.listen((keyEvent) { | 
| +      expect(keyEvent.keyCode, isIn([16, 191])); | 
| +      expect(keyEvent.charCode, 0); | 
| +    }); | 
| + | 
| +    streamDown.add(new KeyEvent('keydown', keyCode: 16, charCode: 0)); | 
| +    streamDown.add(new KeyEvent('keydown', keyCode: 191, charCode: 0)); | 
| + | 
| +    streamPress.add(new KeyEvent('keypress', keyCode: 23, charCode: 63)); | 
| + | 
| +    streamUp.add(new KeyEvent('keyup', keyCode: 191, charCode: 0)); | 
| +    streamUp.add(new KeyEvent('keyup', keyCode: 16, charCode: 0)); | 
| +    subscription.cancel(); | 
| +    subscription2.cancel(); | 
| +    subscription3.cancel(); | 
| }); | 
| } | 
|  | 
|  |