summaryrefslogtreecommitdiffstatshomepage
path: root/core/misc/tabbingmanager.js
diff options
context:
space:
mode:
Diffstat (limited to 'core/misc/tabbingmanager.js')
-rw-r--r--core/misc/tabbingmanager.js27
1 files changed, 10 insertions, 17 deletions
diff --git a/core/misc/tabbingmanager.js b/core/misc/tabbingmanager.js
index c912c92684e8..5db64002af38 100644
--- a/core/misc/tabbingmanager.js
+++ b/core/misc/tabbingmanager.js
@@ -13,13 +13,9 @@
function TabbingContext(options) {
$.extend(this, {
level: null,
-
$tabbableElements: $(),
-
$disabledElements: $(),
-
released: false,
-
active: false
}, options);
}
@@ -27,27 +23,24 @@
$.extend(TabbingManager.prototype, {
constrain: function constrain(elements) {
var il = this.stack.length;
+
for (var i = 0; i < il; i++) {
this.stack[i].deactivate();
}
var $elements = $(elements).find(':tabbable').addBack(':tabbable');
-
var tabbingContext = new TabbingContext({
level: this.stack.length,
$tabbableElements: $elements
});
-
this.stack.push(tabbingContext);
-
tabbingContext.activate();
-
$(document).trigger('drupalTabbingConstrained', tabbingContext);
-
return tabbingContext;
},
release: function release() {
var toActivate = this.stack.length - 1;
+
while (toActivate >= 0 && this.stack[toActivate].released) {
toActivate--;
}
@@ -61,29 +54,28 @@
activate: function activate(tabbingContext) {
var $set = tabbingContext.$tabbableElements;
var level = tabbingContext.level;
-
var $disabledSet = $(':tabbable').not($set);
-
tabbingContext.$disabledElements = $disabledSet;
-
var il = $disabledSet.length;
+
for (var i = 0; i < il; i++) {
this.recordTabindex($disabledSet.eq(i), level);
}
$disabledSet.prop('tabindex', -1).prop('autofocus', false);
-
var $hasFocus = $set.filter('[autofocus]').eq(-1);
if ($hasFocus.length === 0) {
$hasFocus = $set.eq(0);
}
+
$hasFocus.trigger('focus');
},
deactivate: function deactivate(tabbingContext) {
var $set = tabbingContext.$disabledElements;
var level = tabbingContext.level;
var il = $set.length;
+
for (var i = 0; i < il; i++) {
this.restoreTabindex($set.eq(i), level);
}
@@ -98,13 +90,16 @@
},
restoreTabindex: function restoreTabindex($el, level) {
var tabInfo = $el.data('drupalOriginalTabIndices');
+
if (tabInfo && tabInfo[level]) {
var data = tabInfo[level];
+
if (data.tabindex) {
$el[0].setAttribute('tabindex', data.tabindex);
} else {
$el[0].removeAttribute('tabindex');
}
+
if (data.autofocus) {
$el[0].setAttribute('autofocus', 'autofocus');
}
@@ -113,23 +108,23 @@
$el.removeData('drupalOriginalTabIndices');
} else {
var levelToDelete = level;
+
while (tabInfo.hasOwnProperty(levelToDelete)) {
delete tabInfo[levelToDelete];
levelToDelete++;
}
+
$el.data('drupalOriginalTabIndices', tabInfo);
}
}
}
});
-
$.extend(TabbingContext.prototype, {
release: function release() {
if (!this.released) {
this.deactivate();
this.released = true;
Drupal.tabbingManager.release(this);
-
$(document).trigger('drupalTabbingContextReleased', this);
}
},
@@ -137,7 +132,6 @@
if (!this.active && !this.released) {
this.active = true;
Drupal.tabbingManager.activate(this);
-
$(document).trigger('drupalTabbingContextActivated', this);
}
},
@@ -145,7 +139,6 @@
if (this.active) {
this.active = false;
Drupal.tabbingManager.deactivate(this);
-
$(document).trigger('drupalTabbingContextDeactivated', this);
}
}