handleKeyDown(event, focusTreeId, componentId, options = {}) {
    const key = getKeyName(event);

    if (this.focusTree.isNewerThan(focusTreeId)) {
      this.logger.logIgnoredKeyEvent(
        event, key, KeyEventType.keydown,
        `it had an old focus tree id: ${focusTreeId}`,
        componentId
      );

      this.eventPropagator.ignoreEvent(event);

      return true;

    } else if (this._isIgnoringRepeatedEvent(event, key, KeyEventType.keydown, componentId)) {
      return false;
    }

    if (this.eventPropagator.startNewPropagationStep(componentId, event, key, KeyEventType.keydown)) {
      const responseAction = this._howToHandleKeyEvent(
        event, focusTreeId, componentId, key, options, KeyEventType.keydown
      );

      if (responseAction === EventResponse.handled) {
        this._recordKeyDown(event, key, componentId);

        this._callHandlerIfActionNotHandled(event, key, KeyEventType.keydown, componentId, focusTreeId);
      }

      this._simulator.handleKeyPressSimulation({event, key, focusTreeId, componentId, options});

      this.eventPropagator.finishPropagationStep();
    }

    return false;
  }
Records a keydown keyboard event and matches it against the list of pre-registered
event handlers, calling the first matching handler with the highest priority if
one exists.

This method is called many times as a keyboard event bubbles up through the React
render tree. The event is only registered the first time it is seen and results
of some calculations are cached. The event is matched against the handlers registered
at each component level, to ensure the proper handler declaration scoping.
@param {SyntheticKeyboardEvent} event - Event containing the key name and state
@param {FocusTreeId} focusTreeId - Id of focus tree component thinks it's apart of
@param {ComponentId} componentId - The id of the component that is currently handling
       the keyboard event as it bubbles towards the document root.
@param {Object} options - Hash of options that configure how the event is handled.
@returns {boolean} Whether the event was discarded because it was part of an old focus tree