aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralpadev <[email protected]>2021-07-25 19:36:11 +0200
committerGitHub <[email protected]>2021-07-25 20:36:11 +0300
commitb010a6f9f4ea3dda08a4792e1367730ddcf8752d (patch)
tree5b5c3138413244e028259b951de4d0128b4f0190
parent5d24fef741944c168ad0ca9cabd1509d5803e441 (diff)
downloadbootstrap-b010a6f9f4ea3dda08a4792e1367730ddcf8752d.tar.xz
bootstrap-b010a6f9f4ea3dda08a4792e1367730ddcf8752d.zip
fix(modal): change the order we return from show() method (#34087)
In case of a modal with fading enabled, a prevented show event can cause show to not showing the modal anymore. See #34055 Co-authored-by: XhmikosR <[email protected]>
-rw-r--r--js/src/modal.js10
-rw-r--r--js/tests/unit/modal.js26
2 files changed, 31 insertions, 5 deletions
diff --git a/js/src/modal.js b/js/src/modal.js
index 2e3017024..a23bfc1ba 100644
--- a/js/src/modal.js
+++ b/js/src/modal.js
@@ -104,22 +104,22 @@ class Modal {
return
}
- if ($(this._element).hasClass(CLASS_NAME_FADE)) {
- this._isTransitioning = true
- }
-
const showEvent = $.Event(EVENT_SHOW, {
relatedTarget
})
$(this._element).trigger(showEvent)
- if (this._isShown || showEvent.isDefaultPrevented()) {
+ if (showEvent.isDefaultPrevented()) {
return
}
this._isShown = true
+ if ($(this._element).hasClass(CLASS_NAME_FADE)) {
+ this._isTransitioning = true
+ }
+
this._checkScrollbar()
this._setScrollbar()
diff --git a/js/tests/unit/modal.js b/js/tests/unit/modal.js
index a46b3d2de..f2c60684b 100644
--- a/js/tests/unit/modal.js
+++ b/js/tests/unit/modal.js
@@ -102,6 +102,32 @@ $(function () {
.bootstrapModal('show')
})
+ QUnit.test('should be shown after the first call to show() has been prevented while fading is enabled', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $el = $('<div class="modal fade"><div class="modal-dialog" style="transition-duration: 20ms;"/></div>').appendTo('#qunit-fixture')
+
+ var prevented = false
+ $el
+ .on('show.bs.modal', function (e) {
+ if (!prevented) {
+ e.preventDefault()
+ prevented = true
+
+ setTimeout(function () {
+ $el.bootstrapModal('show')
+ })
+ }
+ })
+ .on('shown.bs.modal', function () {
+ assert.ok(prevented, 'show prevented')
+ assert.ok($el.hasClass('fade'))
+ done()
+ })
+ .bootstrapModal('show')
+ })
+
QUnit.test('should hide modal when hide is called', function (assert) {
assert.expect(3)
var done = assert.async()