diff options
| author | Johann-S <[email protected]> | 2017-10-10 13:19:39 +0200 |
|---|---|---|
| committer | Johann-S <[email protected]> | 2017-10-10 14:19:22 +0200 |
| commit | 8e7ba02c5cf56bdc5b4c0fff71edec19ade1e3e9 (patch) | |
| tree | bbbf3c650d76e57c38fb51568d40506fdc52b6a5 /js | |
| parent | da22bce2f073d95689a474b294cd16db9ed41862 (diff) | |
| download | bootstrap-8e7ba02c5cf56bdc5b4c0fff71edec19ade1e3e9.tar.xz bootstrap-8e7ba02c5cf56bdc5b4c0fff71edec19ade1e3e9.zip | |
Modal plugin set _isTransitioning after the trigger of hide event
Diffstat (limited to 'js')
| -rw-r--r-- | js/src/modal.js | 12 | ||||
| -rw-r--r-- | js/tests/visual/modal.html | 22 |
2 files changed, 28 insertions, 6 deletions
diff --git a/js/src/modal.js b/js/src/modal.js index 1ea630c41..399adc4c1 100644 --- a/js/src/modal.js +++ b/js/src/modal.js @@ -169,12 +169,6 @@ const Modal = (() => { return } - const transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE) - - if (transition) { - this._isTransitioning = true - } - const hideEvent = $.Event(Event.HIDE) $(this._element).trigger(hideEvent) @@ -185,6 +179,12 @@ const Modal = (() => { this._isShown = false + const transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE) + + if (transition) { + this._isTransitioning = true + } + this._setEscapeEvent() this._setResizeEvent() diff --git a/js/tests/visual/modal.html b/js/tests/visual/modal.html index 6e9f0f710..fcc96035b 100644 --- a/js/tests/visual/modal.html +++ b/js/tests/visual/modal.html @@ -171,6 +171,12 @@ <button type="button" class="btn btn-secondary btn-lg" data-toggle="modal" data-target="<div class="modal fade the-bad" tabindex="-1" role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button><h4 class="modal-title">The Bad Modal</h4></div><div class="modal-body">This modal's HTTML source code is declared inline, inside the data-target attribute of it's show-button</div></div></div></div>"> Modal with an XSS inside the data-target </button> + + <br><br> + + <button type="button" class="btn btn-secondary btn-lg" id="btnPreventModal"> + Launch prevented modal on hide (to see the result open your console) + </button> </div> <script src="../../../assets/js/vendor/jquery-slim.min.js"></script> @@ -203,6 +209,22 @@ $('#firefoxModal').on('focus', reportFirefoxTestResult.bind(false)) $('#ff-bug-input').on('focus', reportFirefoxTestResult.bind(true)) }) + + $('#btnPreventModal').on('click', function () { + $('#firefoxModal').one('shown.bs.modal', function () { + $(this).modal('hide') + }) + .one('hide.bs.modal', function (event) { + event.preventDefault() + if ($(this).data('bs.modal')._isTransitioning) { + console.error('Modal plugin should not set _isTransitioning when hide event is prevented') + } else { + console.log('Test passed') + $(this).modal('hide') // work as expected + } + }) + .modal('show') + }) }) </script> </body> |
