in src/Clients/Web/winjs/js/winjs.js [63262:63316]
_keyDownHandler: function hub_keyDownHandler(ev) {
var leftKey = this._rtl ? Key.rightArrow : Key.leftArrow;
var rightKey = this._rtl ? Key.leftArrow : Key.rightArrow;
if (ev.keyCode === Key.upArrow || ev.keyCode === Key.downArrow || ev.keyCode === Key.leftArrow || ev.keyCode === Key.rightArrow || ev.keyCode === Key.pageUp || ev.keyCode === Key.pageDown) {
var headerTabStopElement = this._findHeaderTabStop(ev.target);
if (headerTabStopElement && !this._isHeaderInteractive(ev.target)) {
var currentSection = this.sections.indexOf(headerTabStopElement.parentElement.parentElement.winControl);
var targetSectionIndex;
var useEnsureVisible = false;
// Page up/down go to the next/previous header and line it up with the app header. Up/Right/Down/Left
// move focus to the next/previous header and move it on screen (app header distance from either edge).
if (ev.keyCode === Key.pageDown ||
(this.orientation === _UI.Orientation.horizontal && ev.keyCode === rightKey) ||
(this.orientation === _UI.Orientation.vertical && ev.keyCode === Key.downArrow)) {
// Do not include hidden headers.
for (var i = currentSection + 1; i < this.sections.length; i++) {
if (this._tryFocus(i)) {
targetSectionIndex = i;
break;
}
}
} else if (ev.keyCode === Key.pageUp ||
(this.orientation === _UI.Orientation.horizontal && ev.keyCode === leftKey) ||
(this.orientation === _UI.Orientation.vertical && ev.keyCode === Key.upArrow)) {
// Do not include hidden headers.
for (var i = currentSection - 1; i >= 0; i--) {
if (this._tryFocus(i)) {
targetSectionIndex = i;
break;
}
}
}
if (ev.keyCode === Key.upArrow || ev.keyCode === Key.downArrow || ev.keyCode === Key.leftArrow || ev.keyCode === Key.rightArrow) {
useEnsureVisible = true;
}
if (+targetSectionIndex === targetSectionIndex) {
if (useEnsureVisible) {
this._ensureVisible(targetSectionIndex, true);
} else {
this._scrollToSection(targetSectionIndex, true);
}
}
ev.preventDefault();
}
} else if (ev.keyCode === Key.home || ev.keyCode === Key.end) {
// Home/End scroll to start/end and leave focus where it is.
this._measure();
var maxScrollPos = Math.max(0, this._scrollLength - this._viewportSize);
this._scrollTo(ev.keyCode === Key.home ? 0 : maxScrollPos, true);
ev.preventDefault();
}
},