From 6b835a6f5940c376ce2b52f897b99913cdd4ec6f Mon Sep 17 00:00:00 2001 From: Andrew Austin Date: Mon, 16 Mar 2015 22:14:01 -0400 Subject: [PATCH] fix(ngAria): change accessibility keypress event to use event.which if it is provided In Firefox, keyboard events for printable characters (e.g. space) do not use event.keyCode. Use event.which if it is provided before falling back to event.keyCode. --- src/ngAria/aria.js | 3 ++- test/ngAria/ariaSpec.js | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/ngAria/aria.js b/src/ngAria/aria.js index 91a96979d985..44522df72361 100644 --- a/src/ngAria/aria.js +++ b/src/ngAria/aria.js @@ -334,7 +334,8 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) { if ($aria.config('bindKeypress') && !attr.ngKeypress && !isNodeOneOf(elem, nodeBlackList)) { elem.on('keypress', function(event) { - if (event.keyCode === 32 || event.keyCode === 13) { + var keyCode = event.which || event.keyCode; + if (keyCode === 32 || keyCode === 13) { scope.$apply(callback); } diff --git a/test/ngAria/ariaSpec.js b/test/ngAria/ariaSpec.js index 8da1f83c7611..5ba258a52e31 100644 --- a/test/ngAria/ariaSpec.js +++ b/test/ngAria/ariaSpec.js @@ -586,7 +586,7 @@ describe('$aria', function() { var clickFn; - it('should a trigger click from the keyboard', function() { + it('should trigger click from the keyboard', function() { scope.someAction = function() {}; var elements = $compile('
' + @@ -608,6 +608,28 @@ describe('$aria', function() { expect(clickFn).toHaveBeenCalledWith('li'); }); + it('should trigger click in some browsers that provide event.which instead event.keyCode', function() { + scope.someAction = function() {}; + + var elements = $compile('
' + + '
' + + '
' + + '
')(scope); + + scope.$digest(); + + clickFn = spyOn(scope, 'someAction'); + + var divElement = elements.find('div'); + var liElement = elements.find('li'); + + divElement.triggerHandler({type: 'keypress', which: 32}); + liElement.triggerHandler({type: 'keypress', which: 32}); + + expect(clickFn).toHaveBeenCalledWith('div'); + expect(clickFn).toHaveBeenCalledWith('li'); + }); + it('should not override existing ng-keypress', function() { scope.someOtherAction = function() {}; var keypressFn = spyOn(scope, 'someOtherAction');