_keyPress(event) {
    const keyCode = event.keyCode;
    if (!event.metaKey && !event.ctrlKey &&
      keyCode !== KEYS.ENTER &&
      keyCode !== KEYS.TAB &&
      keyCode !== KEYS.BACKSPACE
    ) {
      if (event.charCode !== 0) {
        const newText = String.fromCharCode(event.charCode || event.keyCode);

        this._processChange({
          currentText: this.text(),
          proposedText: replaceStringSelection(newText, this.text(), this.selectedRange()),
          onSuccess: (change, changeTriggeredFormatting) => {
            if (!changeTriggeredFormatting && event instanceof KeyboardEvent) {
              // HACK(JoeTaylor) Use Browser's native input when using the formatter
              // would not make a difference https://code.google.com/p/chromium/issues/detail?id=32865
              if (!this._isDirty) {
                this._valueOnFocus = change.current.text || '';
                this._isDirty = true;
              }
              this.undoManager().proxyFor(this)._applyChangeFromUndoManager(change);
              this._manualCaret = {
                start: change.proposed.selectedRange.start,
                end: change.proposed.selectedRange.start + change.proposed.selectedRange.length
              };
              this._needsKeyUpTextDidChangeTrigger = true;
            } else {
              event.preventDefault();
              this.rollbackInvalidChanges(() => this.insertText(newText));
            }
            this._currentValue = change.proposed.text;
          },
          onFail: () => {
            event.preventDefault();
            this.rollbackInvalidChanges(() => this.insertText(newText));
          }
        });
      } else {
        event.preventDefault();
      }
    }
  }
Handles inserting characters based on the typed key for normal keyboards.

NOTE: Does not fire on some versions of Android, in which case we handle
changes in _keyUp instead.

@param {Event} event
@private