diff --git a/src/ngAria/aria.js b/src/ngAria/aria.js index 570eff31401e..bf82141b2123 100644 --- a/src/ngAria/aria.js +++ b/src/ngAria/aria.js @@ -224,7 +224,10 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) { .directive('ngModel', ['$aria', function($aria) { function shouldAttachAttr(attr, normalizedAttr, elem, allowBlacklistEls) { - return $aria.config(normalizedAttr) && !elem.attr(attr) && (allowBlacklistEls || !isNodeOneOf(elem, nodeBlackList)); + return $aria.config(normalizedAttr) && + !elem.attr(attr) && + (allowBlacklistEls || !isNodeOneOf(elem, nodeBlackList)) && + (elem.attr('type') !== 'hidden' || elem[0].nodeName !== 'INPUT'); } function shouldAttachRole(role, elem) { diff --git a/test/ngAria/ariaSpec.js b/test/ngAria/ariaSpec.js index 9f7edaa2e9c0..201608498961 100644 --- a/test/ngAria/ariaSpec.js +++ b/test/ngAria/ariaSpec.js @@ -420,6 +420,21 @@ describe('$aria', function() { scope.$apply('txtInput=\'LTten\''); expect(element.attr('aria-invalid')).toBe('userSetValue'); }); + + it('should not attach if input is type="hidden"', function() { + compileElement(''); + expect(element.attr('aria-invalid')).toBeUndefined(); + }); + + + it('should attach aria-invalid to custom control that is type="hidden"', function() { + compileElement('
'); + scope.$apply('txtInput=\'LTten\''); + expect(element.attr('aria-invalid')).toBe('true'); + + scope.$apply('txtInput=\'morethantencharacters\''); + expect(element.attr('aria-invalid')).toBe('false'); + }); }); describe('aria-invalid when disabled', function() {