message: Fix handler to use react bubbling rather than a native global onKeyDown
diff: @@ -422,7 +422,7 @@ export default createReactClass({
  }
  this.onResize();
  - document.addEventListener("keydown", this.onKeyDown);
  + document.addEventListener("keydown", this.onNativeKeyDown);
  },
  shouldComponentUpdate: function(nextProps, nextState) {
  @@ -500,7 +500,7 @@ export default createReactClass({
  this.props.resizeNotifier.removeListener("middlePanelResized", this.onResize);
  }
  - document.removeEventListener("keydown", this.onKeyDown);
  + document.removeEventListener("keydown", this.onNativeKeyDown);
  // Remove RoomStore listener
  if (this._roomStoreToken) {
  @@ -542,7 +542,8 @@ export default createReactClass({
  }
  },
  - onKeyDown: function(ev) {
  + // we register global shortcuts here, they *must not conflict* with local shortcuts elsewhere or both will fire
  + onNativeKeyDown: function(ev) {
  let handled = false;
  const ctrlCmdOnly = isOnlyCtrlOrCmdKeyEvent(ev);
  @@ -560,11 +561,24 @@ export default createReactClass({
  handled = true;
  }
  break;
  + }
  +
  + if (handled) {
  + ev.stopPropagation();
  + ev.preventDefault();
  + }
  + },
  + onReactKeyDown: function(ev) {
  + let handled = false;
  +
  + switch (ev.key) {
  case Key.ESCAPE:
  + if (!ev.altKey && !ev.ctrlKey && !ev.shiftKey && !ev.metaKey) {
  this._messagePanel.forgetReadMarker();
  this.jumpToLiveTimeline();
  handled = true;
  + }
  break;
  }
  @@ -2030,9 +2044,13 @@ export default createReactClass({
  mx_RoomView_timeline_rr_enabled: this.state.showReadReceipts,
  });
  + const mainClasses = classNames("mx_RoomView", {
  + mx_RoomView_inCall: inCall,
  + });
  +
  return (
  <RoomContext.Provider value={this.state}>
  - <main className={"mx_RoomView" + (inCall ? " mx_RoomView_inCall" : "")} ref={this._roomView}>
  + <main className={mainClasses} ref={this._roomView} onKeyDown={this.onReactKeyDown}>
  <ErrorBoundary>
  <RoomHeader
  room={this.state.room}
  