@@ -975,36 +975,92 @@ describe('$aria', function() {
975
975
) ;
976
976
977
977
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
+
979
992
compileElement (
980
993
'<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>' +
983
1017
'</section>' ) ;
984
1018
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 ;
988
1026
989
1027
// Using `browserTrigger()`, because it supports event bubbling.
990
1028
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 ) ) ;
995
1034
996
1035
expect ( clickEvents ) . toEqual ( [ 'div(true)' , 'ul(true)' , 'li(true)' ] ) ;
997
1036
1037
+ // Value: "" | Elements are editable.
998
1038
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)' ] ) ;
1000
1045
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 ) ) ;
1005
1052
1006
1053
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
+ } )
1008
1064
) ;
1009
1065
1010
1066
they ( 'should not prevent default keyboard action if an interactive $type element' +
0 commit comments