From 35f03089cdfc40c8fb204b0efce21dcf59cb337b Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Wed, 28 Nov 2018 18:24:43 +0200 Subject: [PATCH] fixup! fix(aria/ngClick): check if element is `contenteditable` before blocking spacebar --- test/ngAria/ariaSpec.js | 84 ++++++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 14 deletions(-) diff --git a/test/ngAria/ariaSpec.js b/test/ngAria/ariaSpec.js index 76dee0906675..faa3755b0bd3 100644 --- a/test/ngAria/ariaSpec.js +++ b/test/ngAria/ariaSpec.js @@ -976,34 +976,90 @@ describe('$aria', function() { it('should not prevent default keyboard action if the target element has editable content', function() { + // Note: + // `contenteditable` is an enumarated (not a boolean) attribute (see + // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/contenteditable). + // We need to check the following conditions: + // - No attribute. + // - Value: "" + // - Value: "true" + // - Value: "false" + + function eventFor(keyCode) { + return {bubbles: true, cancelable: true, keyCode: keyCode}; + } + compileElement( '
' + - '
' + - '' + + // No attribute. + '
' + + '
' + + '
' + + '
' + + + // Value: "" + '
' + + '
' + + '
' + + '
' + + + // Value: "true" + '
' + + '
' + + '
' + + '
' + + + // Value: "false" + '
' + + '
' + + '
' + + '
' + '
'); - var divElement = element.find('div'); - var ulElement = element.find('ul'); - var liElement = element.find('li'); + // Support: Safari 11-12+ + // Attach to DOM, because otherwise Safari will not update the `isContentEditable` property + // based on the `contenteditable` attribute. + document.body.appendChild(element[0]); + + var containers = element.children(); + var container; // Using `browserTrigger()`, because it supports event bubbling. - // Element are not editable yet. - browserTrigger(divElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 13}); - browserTrigger(ulElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 32}); - browserTrigger(liElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 13}); + // No attribute | Elements are not editable. + container = containers.eq(0); + browserTrigger(container.find('div'), 'keydown', eventFor(13)); + browserTrigger(container.find('ul'), 'keydown', eventFor(32)); + browserTrigger(container.find('li'), 'keydown', eventFor(13)); expect(clickEvents).toEqual(['div(true)', 'ul(true)', 'li(true)']); + // Value: "" | Elements are editable. clickEvents = []; - scope.$apply('edit = true'); + container = containers.eq(1); + browserTrigger(container.find('div'), 'keydown', eventFor(32)); + browserTrigger(container.find('ul'), 'keydown', eventFor(13)); + browserTrigger(container.find('li'), 'keydown', eventFor(32)); + + expect(clickEvents).toEqual(['div(false)', 'ul(true)', 'li(false)']); - // Element are now editable. - browserTrigger(divElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 32}); - browserTrigger(ulElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 13}); - browserTrigger(liElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 32}); + // Value: "true" | Elements are editable. + clickEvents = []; + container = containers.eq(2); + browserTrigger(container.find('div'), 'keydown', eventFor(13)); + browserTrigger(container.find('ul'), 'keydown', eventFor(32)); + browserTrigger(container.find('li'), 'keydown', eventFor(13)); expect(clickEvents).toEqual(['div(false)', 'ul(true)', 'li(false)']); + + // Value: "false" | Elements are not editable. + clickEvents = []; + container = containers.eq(3); + browserTrigger(container.find('div'), 'keydown', eventFor(32)); + browserTrigger(container.find('ul'), 'keydown', eventFor(13)); + browserTrigger(container.find('li'), 'keydown', eventFor(32)); + + expect(clickEvents).toEqual(['div(true)', 'ul(true)', 'li(true)']); } );