- elem = {type: 'keyup', code: 'Unidentified'};
- obj(elem);
- expect(times_called).to.be.equal(4);
- });
- it('should pop matching key event on keyup', function() {
- var times_called = 0;
- var obj = KeyboardUtil.TrackKeyState(function(evt) {
- switch (times_called++) {
- case 0:
- case 1:
- case 2:
- expect(evt.type).to.be.equal('keydown');
- break;
- case 3:
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'KeyB', keysym: 0x62});
- break;
- }
- });
-
- obj({type: 'keydown', code: 'KeyA', keysym: 0x61});
- obj({type: 'keydown', code: 'KeyB', keysym: 0x62});
- obj({type: 'keydown', code: 'KeyC', keysym: 0x63});
- obj({type: 'keyup', code: 'KeyB'});
- expect(times_called).to.equal(4);
- });
- it('should pop the first zero keyevent on keyup with zero code', function() {
- var times_called = 0;
- var obj = KeyboardUtil.TrackKeyState(function(evt) {
- switch (times_called++) {
- case 0:
- case 1:
- case 2:
- expect(evt.type).to.be.equal('keydown');
- break;
- case 3:
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'Unidentified', keysym: 0x61});
- break;
- }
- });
-
- obj({type: 'keydown', code: 'Unidentified', keysym: 0x61});
- obj({type: 'keydown', code: 'Unidentified', keysym: 0x62});
- obj({type: 'keydown', code: 'KeyA', keysym: 0x63});
- obj({type: 'keyup', code: 'Unidentified'});
- expect(times_called).to.equal(4);
- });
- it('should pop the last keyevents keysym if no match is found for code', function() {
- var times_called = 0;
- var obj = KeyboardUtil.TrackKeyState(function(evt) {
- switch (times_called++) {
- case 0:
- case 1:
- case 2:
- expect(evt.type).to.be.equal('keydown');
- break;
- case 3:
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'KeyD', keysym: 0x63});
- break;
- }
- });
-
- obj({type: 'keydown', code: 'KeyA', keysym: 0x61});
- obj({type: 'keydown', code: 'KeyB', keysym: 0x62});
- obj({type: 'keydown', code: 'KeyC', keysym: 0x63});
- obj({type: 'keyup', code: 'KeyD'});
- expect(times_called).to.equal(4);
- });
- describe('Firefox sends keypress even when keydown is suppressed', function() {
- it('should discard the keypress', function() {
- var times_called = 0;
- var obj = KeyboardUtil.TrackKeyState(function(evt) {
- expect(times_called).to.be.equal(0);
- ++times_called;
- });
-
- obj({type: 'keydown', code: 'KeyA', keysym: 0x42});
- expect(times_called).to.be.equal(1);
- obj({type: 'keypress', code: 'KeyA', keysym: 0x43});
- });
- });
- describe('releaseAll', function() {
- it('should do nothing if no keys have been pressed', function() {
- var times_called = 0;
- var obj = KeyboardUtil.TrackKeyState(function(evt) {
- ++times_called;
- });
- obj({type: 'releaseall'});
- expect(times_called).to.be.equal(0);
- });
- it('should release the keys that have been pressed', function() {
- var times_called = 0;
- var obj = KeyboardUtil.TrackKeyState(function(evt) {
- switch (times_called++) {
- case 2:
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'Unidentified', keysym: 0x41});
- break;
- case 3:
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'Unidentified', keysym: 0x42});
- break;
- }
- });
- obj({type: 'keydown', code: 'KeyA', keysym: 0x41});
- obj({type: 'keydown', code: 'KeyB', keysym: 0x42});
- expect(times_called).to.be.equal(2);
- obj({type: 'releaseall'});
- expect(times_called).to.be.equal(4);
- obj({type: 'releaseall'});
- expect(times_called).to.be.equal(4);
- });
- });
-
- });
-
- describe('Escape Modifiers', function() {
- describe('Keydown', function() {
- it('should pass through when a char modifier is not down', function() {
- var times_called = 0;
- KeyboardUtil.EscapeModifiers(function(evt) {
- expect(times_called).to.be.equal(0);
- ++times_called;
- expect(evt).to.be.deep.equal({type: 'keydown', code: 'KeyA', keysym: 0x42});
- })({type: 'keydown', code: 'KeyA', keysym: 0x42});
- expect(times_called).to.be.equal(1);
- });
- it('should generate fake undo/redo events when a char modifier is down', function() {
- var times_called = 0;
- KeyboardUtil.EscapeModifiers(function(evt) {
- switch(times_called++) {
- case 0:
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'Unidentified', keysym: 0xffe9});
- break;
- case 1:
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'Unidentified', keysym: 0xffe3});
- break;
- case 2:
- expect(evt).to.be.deep.equal({type: 'keydown', code: 'KeyA', keysym: 0x42, escape: [0xffe9, 0xffe3]});
- break;
- case 3:
- expect(evt).to.be.deep.equal({type: 'keydown', code: 'Unidentified', keysym: 0xffe9});
- break;
- case 4:
- expect(evt).to.be.deep.equal({type: 'keydown', code: 'Unidentified', keysym: 0xffe3});
- break;
- }
- })({type: 'keydown', code: 'KeyA', keysym: 0x42, escape: [0xffe9, 0xffe3]});
- expect(times_called).to.be.equal(5);
- });
- });
- describe('Keyup', function() {
- it('should pass through when a char modifier is down', function() {
- var times_called = 0;
- KeyboardUtil.EscapeModifiers(function(evt) {
- expect(times_called).to.be.equal(0);
- ++times_called;
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'KeyA', keysym: 0x42, escape: [0xfe03]});
- })({type: 'keyup', code: 'KeyA', keysym: 0x42, escape: [0xfe03]});
- expect(times_called).to.be.equal(1);
- });
- it('should pass through when a char modifier is not down', function() {
- var times_called = 0;
- KeyboardUtil.EscapeModifiers(function(evt) {
- expect(times_called).to.be.equal(0);
- ++times_called;
- expect(evt).to.be.deep.equal({type: 'keyup', code: 'KeyA', keysym: 0x42});
- })({type: 'keyup', code: 'KeyA', keysym: 0x42});
- expect(times_called).to.be.equal(1);
- });