diff --git a/src/ngAria/aria.js b/src/ngAria/aria.js index 036dd42b47de..08a26e73fc7a 100644 --- a/src/ngAria/aria.js +++ b/src/ngAria/aria.js @@ -377,6 +377,25 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) { }); } } + + if (elem[0].nodeName === 'A') { + if ($aria.config('bindRoleForClick') && !attr.href && !attr.xlinkHref && !attr.role) { + elem.attr('role', 'link'); + } + if ($aria.config('bindKeypress')) { + elem.on('keypress', function(event) { + var keyCode = event.which || event.keyCode; + var hasHref = attr.href || attr.xlinkHref; + if ((keyCode === 32 || keyCode === 13) && !hasHref && !attr.ngKeypress) { + scope.$apply(callback); + } + + function callback() { + fn(scope, { $event: event }); + } + }); + } + } }; } }; diff --git a/test/ngAria/ariaSpec.js b/test/ngAria/ariaSpec.js index 73b015f710c3..e547f8bd30cc 100644 --- a/test/ngAria/ariaSpec.js +++ b/test/ngAria/ariaSpec.js @@ -755,6 +755,38 @@ describe('$aria', function() { element.triggerHandler({ type: 'keypress', keyCode: 13 }); expect(element.text()).toBe(''); }); + + it('should apply role to anchor elements without href ', function() { + compileElement('{{event.type}}{{event.keyCode}}'); + expect(element.attr('role')).toBe('link'); + }); + + it('should bind keypress to anchor elements when href is falsy', function() { + compileElement('{{event.type}}{{event.keyCode}}'); + expect(element.text()).toBe(''); + element.triggerHandler({ type: 'keypress', keyCode: 32 }); + expect(element.text()).toBe('keypress32'); + element.triggerHandler({ type: 'keypress', keyCode: 13 }); + expect(element.text()).toBe('keypress13'); + }); + + it('should not bind keypress to anchor elements when keypress is not falsy', function() { + compileElement('{{event.type}}{{event.keyCode}}'); + expect(element.text()).toBe(''); + element.triggerHandler({ type: 'keypress', keyCode: 32 }); + expect(element.text()).toBe(''); + element.triggerHandler({ type: 'keypress', keyCode: 13 }); + expect(element.text()).toBe(''); + }); + + it('should not bind keypress to anchor elements when href is not falsy', function() { + compileElement('{{event.type}}{{event.keyCode}}'); + expect(element.text()).toBe(''); + element.triggerHandler({ type: 'keypress', keyCode: 32 }); + expect(element.text()).toBe(''); + element.triggerHandler({ type: 'keypress', keyCode: 13 }); + expect(element.text()).toBe(''); + }); }); describe('actions when bindRoleForClick is set to false', function() {