1111const utils = require ( '../utils' )
1212
1313const SYSTEM_MODIFIERS = new Set ( [ 'ctrl' , 'shift' , 'alt' , 'meta' ] )
14+ const GLOBAL_MODIFIERS = new Set ( [ 'stop' , 'prevent' , 'capture' , 'self' , 'once' , 'passive' , 'native' ] )
1415
1516// ------------------------------------------------------------------------------
1617// Helpers
@@ -36,6 +37,16 @@ function getEventDirectives (attributes, sourceCode) {
3637 } ) )
3738}
3839
40+ /**
41+ * Checks whether given modifier is key modifier
42+ *
43+ * @param {string } modifier
44+ * @returns {boolean }
45+ */
46+ function isKeyModifier ( modifier ) {
47+ return ! GLOBAL_MODIFIERS . has ( modifier ) && ! SYSTEM_MODIFIERS . has ( modifier )
48+ }
49+
3950/**
4051 * Checks whether given modifier is system one
4152 *
@@ -86,6 +97,16 @@ function getSystemModifiersString (modifiers) {
8697 return modifiers . filter ( isSystemModifier ) . sort ( ) . join ( ',' )
8798}
8899
100+ /**
101+ * Creates alphabetically sorted string with key modifiers
102+ *
103+ * @param {array[string] } modifiers
104+ * @returns {string } e.g. "enter,tab"
105+ */
106+ function getKeyModifiersString ( modifiers ) {
107+ return modifiers . filter ( isKeyModifier ) . sort ( ) . join ( ',' )
108+ }
109+
89110/**
90111 * Compares two events based on their modifiers
91112 * to detect possible event leakeage
@@ -100,13 +121,21 @@ function hasConflictedModifiers (baseEvent, event) {
100121 event . modifiers . includes ( 'exact' )
101122 ) return false
102123
103- const eventModifiers = getSystemModifiersString ( event . modifiers )
104- const baseEventModifiers = getSystemModifiersString ( baseEvent . modifiers )
124+ const eventKeyModifiers = getKeyModifiersString ( event . modifiers )
125+ const baseEventKeyModifiers = getKeyModifiersString ( baseEvent . modifiers )
126+
127+ if (
128+ eventKeyModifiers && baseEventKeyModifiers &&
129+ eventKeyModifiers !== baseEventKeyModifiers
130+ ) return false
131+
132+ const eventSystemModifiers = getSystemModifiersString ( event . modifiers )
133+ const baseEventSystemModifiers = getSystemModifiersString ( baseEvent . modifiers )
105134
106135 return (
107136 baseEvent . modifiers . length >= 1 &&
108- baseEventModifiers !== eventModifiers &&
109- baseEventModifiers . indexOf ( eventModifiers ) > - 1
137+ baseEventSystemModifiers !== eventSystemModifiers &&
138+ baseEventSystemModifiers . indexOf ( eventSystemModifiers ) > - 1
110139 )
111140}
112141
0 commit comments