nudge focus shortcut code further to working

pull/21833/head
Matthew Hodgson 2017-04-18 17:12:42 +01:00
parent 9591ad31e6
commit 4fb9635175
1 changed files with 43 additions and 89 deletions

View File

@ -72,10 +72,7 @@ module.exports = React.createClass({
// order of the sublists // order of the sublists
this.listOrder = []; this.listOrder = [];
// this.focusedRoomTileRoomId = null;
this.focusedElement = null; this.focusedElement = null;
// this.focusedPosition = null;
// this.focusMoving = false;
}, },
componentDidMount: function() { componentDidMount: function() {
@ -198,60 +195,58 @@ module.exports = React.createClass({
}, },
_onMoveFocus: function(up) { _onMoveFocus: function(up) {
// cheat and move focus by faking tab/shift-tab. This lets us do things
// like collapse/uncollapse room headers & truncated lists without having
// to reimplement the entirety of the keyboard navigation logic.
//
// this simply doens't work, as for security apparently you can't inject
// UI events any more - c.f. this note from
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
//
// Note: manually firing an event does not generate the default action
// associated with that event. For example, manually firing a key event
// does not cause that letter to appear in a focused text input. In the
// case of UI events, this is important for security reasons, as it
// prevents scripts from simulating user actions that interact with the
// browser itself.
/*
var event = document.createEvent('Event');
event.initEvent('keydown', true, true);
event.keyCode = 9;
event.shiftKey = up ? true : false;
document.dispatchEvent(event);
*/
// alternatively, this is the beginning of moving the focus through the list,
// navigating the pure datastructure of the list contents, but doesn't let
// you navigate through other things
/*
this.focusMoving = true;
if (this.focusPosition) {
if (up) {
this.focusPosition.index++;
if (this.focusPosition.index > this.listsForRoomId[this.focusPosition.list].length) {
// move to the next sublist
}
}
else {
this.focusPosition.index--;
if (this.focusPosition.index < 0) {
// move to the previous sublist
}
}
}
*/
// alternatively, we can just try to manually implementing the focus switch at the DOM level.
// ignores tabindex.
var element = this.focusedElement; var element = this.focusedElement;
if (up) {
element = element.parentElement.previousElementSibling.firstElementChild; // unclear why this isn't needed...
// var descending = (up == this.focusDirection) ? this.focusDescending : !this.focusDescending;
// this.focusDirection = up;
var descending = false;
var classes;
do {
var child = up ? element.lastElementChild : element.firstElementChild;
var sibling = up ? element.previousElementSibling : element.nextElementSibling;
if (descending) {
if (child) {
element = child;
}
else if (sibling) {
element = sibling;
} }
else { else {
element = element.parentElement.nextElementSibling.firstElementChild; descending = false;
element = element.parentElement;
}
}
else {
if (sibling) {
element = sibling;
descending = true;
}
else {
element = element.parentElement;
}
} }
if (element) {
classes = element.classList;
if (classes.contains("mx_LeftPanel")) { // we hit the top
element = up ? element.lastElementChild : element.firstElementChild;
descending = true;
}
}
} while(element && !(
classes.contains("mx_RoomTile") ||
classes.contains("mx_SearchBox_search") ||
classes.contains("mx_RoomSubList_ellipsis")));
if (element) { if (element) {
element.focus(); element.focus();
this.focusedElement = element;
this.focusedDescending = descending;
} }
}, },
@ -275,14 +270,6 @@ module.exports = React.createClass({
constantTimeDispatcher.dispatch("RoomSubList.sort", list, { room: room }); constantTimeDispatcher.dispatch("RoomSubList.sort", list, { room: room });
}); });
} }
/*
if (this.focusPosition && lists.indexOf(this.focusPosition.list) > -1) {
// if we're reordering the list which currently have focus, recalculate
// our focus offset
this.focusPosition = null;
}
*/
}, },
onRoomReceipt: function(receiptEvent, room) { onRoomReceipt: function(receiptEvent, room) {
@ -343,12 +330,6 @@ module.exports = React.createClass({
}, 500), }, 500),
refreshRoomList: function() { refreshRoomList: function() {
/*
// if we're regenerating the list, then the chances are the contents
// or ordering is changing - forget our cached focus position
this.focusPosition = null;
*/
// console.log("DEBUG: Refresh room list delta=%s ms", // console.log("DEBUG: Refresh room list delta=%s ms",
// (!this._lastRefreshRoomListTs ? "-" : (Date.now() - this._lastRefreshRoomListTs)) // (!this._lastRefreshRoomListTs ? "-" : (Date.now() - this._lastRefreshRoomListTs))
// ); // );
@ -641,34 +622,7 @@ module.exports = React.createClass({
}, },
onRoomTileFocus: function(roomId, event) { onRoomTileFocus: function(roomId, event) {
// this.focusedRoomTileRoomId = roomId;
this.focusedElement = event ? event.target : null; this.focusedElement = event ? event.target : null;
/*
if (roomId && !this.focusPosition) {
var list = this.listsForRoomId[roomId];
if (list) {
console.warn("Focused to room " + roomId + " not in a list?!");
}
else {
this.focusPosition = {
list: list,
index: this.state.lists[list].findIndex(room=>{
return room.roomId == roomId;
}),
};
}
}
if (!roomId) {
if (this.focusMoving) {
this.focusMoving = false;
}
else {
this.focusPosition = null;
}
}
*/
}, },
render: function() { render: function() {