Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 2ed73c8

Browse files
committed
fixup! fix(aria/ngClick): check if element is contenteditable before blocking spacebar
1 parent 628bd59 commit 2ed73c8

File tree

1 file changed

+72
-16
lines changed

1 file changed

+72
-16
lines changed

test/ngAria/ariaSpec.js

+72-16
Original file line numberDiff line numberDiff line change
@@ -975,36 +975,92 @@ describe('$aria', function() {
975975
);
976976

977977
it('should not prevent default keyboard action if the target element has editable content',
978-
function() {
978+
inject(function($document) {
979+
// Note:
980+
// `contenteditable` is an enumarated (not a boolean) attribute (see
981+
// https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/contenteditable).
982+
// We need to check the following conditions:
983+
// - No attribute.
984+
// - Value: ""
985+
// - Value: "true"
986+
// - Value: "false"
987+
988+
function eventFor(keyCode) {
989+
return {bubbles: true, cancelable: true, keyCode: keyCode};
990+
}
991+
979992
compileElement(
980993
'<section>' +
981-
'<div ng-click="onClick($event)" ng-attr-contenteditable="{{ edit }}"></div>' +
982-
'<ul ng-click="onClick($event)"><li ng-attr-contenteditable="{{ edit }}"></li></ul>' +
994+
// No attribute.
995+
'<div id="no-attribute">' +
996+
'<div ng-click="onClick($event)"></div>' +
997+
'<ul ng-click="onClick($event)"><li></li></ul>' +
998+
'</div>' +
999+
1000+
// Value: ""
1001+
'<div id="value-empty">' +
1002+
'<div ng-click="onClick($event)" contenteditable=""></div>' +
1003+
'<ul ng-click="onClick($event)"><li contenteditable=""></li></ul>' +
1004+
'</div>' +
1005+
1006+
// Value: "true"
1007+
'<div id="value-true">' +
1008+
'<div ng-click="onClick($event)" contenteditable="true"></div>' +
1009+
'<ul ng-click="onClick($event)"><li contenteditable="true"></li></ul>' +
1010+
'</div>' +
1011+
1012+
// Value: "false"
1013+
'<div id="value-false">' +
1014+
'<div ng-click="onClick($event)" contenteditable="false"></div>' +
1015+
'<ul ng-click="onClick($event)"><li contenteditable="false"></li></ul>' +
1016+
'</div>' +
9831017
'</section>');
9841018

985-
var divElement = element.find('div');
986-
var ulElement = element.find('ul');
987-
var liElement = element.find('li');
1019+
// Support: Safari 11-12+
1020+
// Attach to DOM, because otherwise Safari will not update the `isContentEditable` property
1021+
// based on the `contenteditable` attribute.
1022+
$document.find('body').append(element);
1023+
1024+
var containers = element.children();
1025+
var container;
9881026

9891027
// Using `browserTrigger()`, because it supports event bubbling.
9901028

991-
// Element are not editable yet.
992-
browserTrigger(divElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 13});
993-
browserTrigger(ulElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 32});
994-
browserTrigger(liElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 13});
1029+
// No attribute | Elements are not editable.
1030+
container = containers.eq(0);
1031+
browserTrigger(container.find('div'), 'keydown', eventFor(13));
1032+
browserTrigger(container.find('ul'), 'keydown', eventFor(32));
1033+
browserTrigger(container.find('li'), 'keydown', eventFor(13));
9951034

9961035
expect(clickEvents).toEqual(['div(true)', 'ul(true)', 'li(true)']);
9971036

1037+
// Value: "" | Elements are editable.
9981038
clickEvents = [];
999-
scope.$apply('edit = true');
1039+
container = containers.eq(1);
1040+
browserTrigger(container.find('div'), 'keydown', eventFor(32));
1041+
browserTrigger(container.find('ul'), 'keydown', eventFor(13));
1042+
browserTrigger(container.find('li'), 'keydown', eventFor(32));
1043+
1044+
expect(clickEvents).toEqual(['div(false)', 'ul(true)', 'li(false)']);
10001045

1001-
// Element are now editable.
1002-
browserTrigger(divElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 32});
1003-
browserTrigger(ulElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 13});
1004-
browserTrigger(liElement, 'keydown', {bubbles: true, cancelable: true, keyCode: 32});
1046+
// Value: "true" | Elements are editable.
1047+
clickEvents = [];
1048+
container = containers.eq(2);
1049+
browserTrigger(container.find('div'), 'keydown', eventFor(13));
1050+
browserTrigger(container.find('ul'), 'keydown', eventFor(32));
1051+
browserTrigger(container.find('li'), 'keydown', eventFor(13));
10051052

10061053
expect(clickEvents).toEqual(['div(false)', 'ul(true)', 'li(false)']);
1007-
}
1054+
1055+
// Value: "false" | Elements are not editable.
1056+
clickEvents = [];
1057+
container = containers.eq(3);
1058+
browserTrigger(container.find('div'), 'keydown', eventFor(32));
1059+
browserTrigger(container.find('ul'), 'keydown', eventFor(13));
1060+
browserTrigger(container.find('li'), 'keydown', eventFor(32));
1061+
1062+
expect(clickEvents).toEqual(['div(true)', 'ul(true)', 'li(true)']);
1063+
})
10081064
);
10091065

10101066
they('should not prevent default keyboard action if an interactive $type element' +

0 commit comments

Comments
 (0)