* Return the character from the event key code. * If the KeyboardEvent does not represent a printable character, then the key name is used (ie. 'Meta', 'Shift', 'F1', etc.) * @example character(50) => '2' * * @param {KeyboardEvent} event * @returns {string}
(event)
| 359 | * @returns {string} |
| 360 | */ |
| 361 | static character(event) { |
| 362 | let result; |
| 363 | if (event.key === 'Unidentified' || event.key === void(0) || this.isSeleniumBot()) { |
| 364 | //XXX The selenium geckodriver does not understand `event.key`, hence when using it, we need to rely on the old deprecated `keyCode` attribute, cf. upstream issue https://github.com/mozilla/geckodriver/issues/440 |
| 365 | // Use the old deprecated keyCode property, if the new `key` one is not supported |
| 366 | const keyCode = this.keyCodeNumber(event); |
| 367 | if (keyCode === 229) { // Android Chrome returns the same keycode number 229 for all keys pressed |
| 368 | return AutoNumericEnum.keyName.AndroidDefault; |
| 369 | } |
| 370 | |
| 371 | const potentialResult = AutoNumericEnum.fromCharCodeKeyCode[keyCode]; |
| 372 | if (!AutoNumericHelper.isUndefinedOrNullOrEmpty(potentialResult)) { |
| 373 | // Since `String.fromCharCode` do not return named keys for some keys ('Escape' and 'Enter' for instance), we convert the characters to the key names |
| 374 | result = potentialResult; |
| 375 | } else { |
| 376 | result = String.fromCharCode(keyCode); |
| 377 | } |
| 378 | } else { |
| 379 | switch (event.key) { |
| 380 | // Manages all the special cases for obsolete browsers that return the non-standard names |
| 381 | case 'Add': |
| 382 | result = AutoNumericEnum.keyName.NumpadPlus; |
| 383 | break; |
| 384 | case 'Apps': |
| 385 | result = AutoNumericEnum.keyName.ContextMenu; |
| 386 | break; |
| 387 | case 'Crsel': |
| 388 | result = AutoNumericEnum.keyName.CrSel; |
| 389 | break; |
| 390 | case 'Decimal': |
| 391 | if (event.char) { |
| 392 | // this fixes #602 |
| 393 | result = event.char; |
| 394 | } else { |
| 395 | result = AutoNumericEnum.keyName.NumpadDot; |
| 396 | } |
| 397 | break; |
| 398 | case 'Del': |
| 399 | result = AutoNumericEnum.keyName.Delete; |
| 400 | break; |
| 401 | case 'Divide': |
| 402 | result = AutoNumericEnum.keyName.NumpadSlash; |
| 403 | break; |
| 404 | case 'Down': |
| 405 | result = AutoNumericEnum.keyName.DownArrow; |
| 406 | break; |
| 407 | case 'Esc': |
| 408 | result = AutoNumericEnum.keyName.Esc; |
| 409 | break; |
| 410 | case 'Exsel': |
| 411 | result = AutoNumericEnum.keyName.ExSel; |
| 412 | break; |
| 413 | case 'Left': |
| 414 | result = AutoNumericEnum.keyName.LeftArrow; |
| 415 | break; |
| 416 | case 'Meta': |
| 417 | case 'Super': |
| 418 | result = AutoNumericEnum.keyName.OSLeft; |
no test coverage detected