Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit d2621e3

Browse files
AndriIushchukwesleycho
authored andcommitted
fix(modal): ensure shift+tab is trapped in modal
- Fixes where shift+tab keystrokes are not causing focus to remain trapped in modal Closes #5294 Fixes #5229
1 parent b1ad080 commit d2621e3

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

src/modal/modal.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap'])
404404
$modalStack.loadFocusElementList(modal);
405405
var focusChanged = false;
406406
if (evt.shiftKey) {
407-
if ($modalStack.isFocusInFirstItem(evt)) {
407+
if ($modalStack.isFocusInFirstItem(evt) || $modalStack.isModalFocused(evt, modal)) {
408408
focusChanged = $modalStack.focusLastFocusableElement();
409409
}
410410
} else {
@@ -547,6 +547,16 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap'])
547547
return false;
548548
};
549549

550+
$modalStack.isModalFocused = function(evt, modalWindow) {
551+
if (evt && modalWindow) {
552+
var modalDomEl = modalWindow.value.modalDomEl;
553+
if (modalDomEl && modalDomEl.length) {
554+
return (evt.target || evt.srcElement) === modalDomEl[0];
555+
}
556+
}
557+
return false;
558+
};
559+
550560
$modalStack.isFocusInFirstItem = function(evt) {
551561
if (focusableElementList.length > 0) {
552562
return (evt.target || evt.srcElement) === focusableElementList[0];

src/modal/test/modal.spec.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -620,11 +620,15 @@ describe('$uibModal', function() {
620620
template:'<a href="#" id="tab-focus-link"><input type="text" id="tab-focus-input1"/><input type="text" id="tab-focus-input2"/>' +
621621
'<button id="tab-focus-button">Open me!</button>'
622622
});
623+
$rootScope.$digest();
623624
expect($document).toHaveModalsOpen(1);
624625

626+
triggerKeyDown(angular.element(document.activeElement), 9, true);
627+
expect(document.activeElement.getAttribute('id')).toBe('tab-focus-button');
628+
625629
var lastElement = angular.element(document.getElementById('tab-focus-link'));
626630
lastElement.focus();
627-
triggerKeyDown(lastElement, 9, true);
631+
triggerKeyDown(angular.element(document.activeElement), 9, true);
628632
expect(document.activeElement.getAttribute('id')).toBe('tab-focus-button');
629633

630634
initialPage.remove();
@@ -660,11 +664,15 @@ describe('$uibModal', function() {
660664
'<button id="tab-focus-button">Open me!</button>',
661665
keyboard: false
662666
});
667+
$rootScope.$digest();
663668
expect($document).toHaveModalsOpen(1);
664669

670+
triggerKeyDown(angular.element(document.activeElement), 9, true);
671+
expect(document.activeElement.getAttribute('id')).toBe('tab-focus-button');
672+
665673
var lastElement = angular.element(document.getElementById('tab-focus-link'));
666674
lastElement.focus();
667-
triggerKeyDown(lastElement, 9, true);
675+
triggerKeyDown(angular.element(document.activeElement), 9, true);
668676
expect(document.activeElement.getAttribute('id')).toBe('tab-focus-button');
669677

670678
initialPage.remove();

0 commit comments

Comments
 (0)