_onPointerActionEvent(e) {
    this._normalizePointerEvent(e)

    // Handle drop events, in the case they weren't captured by the listeners on `document`
    // e.g. synthetic events dispatched internally
    if (dropEventTypes.indexOf(e.type) > -1) {
      this._onDropEvent(e)
    }

    // Map touch start to mouseover, and disable touch-hold context menu
    if (e.type === 'touchstart') {
      if (e.touches.length === 1) {
        this._onPointerMotionEvent(e)
      }
      this._enableContextMenu(false)
    }

    const eventRegistry = this.eventRegistry
    if (eventRegistry.hasAnyListenersOfType('dragstart') || pointerActionEventTypes.some(eventRegistry.hasAnyListenersOfType)) {
      let hoverInfo = this._findHoverTarget(e)
      let facade = hoverInfo && hoverInfo.facade
      if (facade) {
        const eventState = this._getPointerEventState(e)
        this._firePointerEvent(pointerActionEventTypeMappings[e.type] || e.type, e, facade, null, hoverInfo)

        // touchstart/touchend could be start/end of a tap - map to click
        if (eventRegistry.findBubblingEventTarget(facade, 'click') || eventRegistry.findBubblingEventTarget(facade, 'dblclick')) {
          let tapInfo = eventState.tapInfo
          if (e.type === 'touchstart' && e.touches.length === 1) {
            eventState.tapInfo = {
              facade: facade,
              x: e.touches[0].clientX,
              y: e.touches[0].clientY,
              startTime: Date.now(),
              isDblClick: tapInfo && Date.now() - tapInfo.startTime < TAP_DBLCLICK_MAX_DUR
            }
          } else {
            if (
              tapInfo && tapInfo.facade === facade && e.type === 'touchend' &&
              e.touches.length === 0 && e.changedTouches.length === 1 &&
              Date.now() - tapInfo.startTime < TAP_GESTURE_MAX_DUR
            ) {
              this._firePointerEvent('click', e, facade, null, hoverInfo)
              if (tapInfo.isDblClick) {
                this._firePointerEvent('dblclick', e, facade, null, hoverInfo)
              }
            }
          }
        }

        // mousedown/touchstart could be prepping for drag gesture
        if (e.type === 'mousedown' || e.type === 'touchstart') {
          const dragger = eventRegistry.findBubblingEventTarget(facade, 'dragstart')
          if (dragger) {
            let dragStartEvent = new SyntheticEvent(e, 'dragstart', dragger, null, {intersection: hoverInfo})
            eventState.dragInfo = {
              draggedFacade: dragger,
              dragStartFired: false,
              dragStartEvent: dragStartEvent
            }
            // handle release outside canvas
            this._toggleDropListeners(true)
          }
        }
      }
      e.preventDefault() //prevent e.g. touch scroll
    }

    // Map touch end to mouseout
    if (isTouchEndOrCancel(e)) {
      if (e.changedTouches.length === 1) {
        this._onPointerMotionEvent(e)
      }
      this._enableContextMenu(true)
    }
  }
Entry point for handling events related to pointer motion (e.g. mouse clicks or touch taps).
This will be called by the code that wraps this World facade to bridge native DOM events
into the Troika world.
@param {Event} e