]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Add tests main-lmp-modal-dispose-fix 38857/head
authorlouismaximepiton <louismaxime.piton@orange.com>
Mon, 17 Jul 2023 09:46:23 +0000 (11:46 +0200)
committerlouismaximepiton <louismaxime.piton@orange.com>
Mon, 17 Jul 2023 09:46:23 +0000 (11:46 +0200)
js/src/modal.js
js/tests/unit/modal.spec.js

index 33e525d235dc698ecfc7ece3ef8885c1ac476e67..0c02431fe814e163dc5b491f3fe326d1975bf15b 100644 (file)
@@ -139,11 +139,11 @@ class Modal extends BaseComponent {
   }
 
   dispose() {
-    this._element.addEventListener(EVENT_HIDDEN, () => {
+    EventHandler.on(this._element, EVENT_HIDDEN, () => {
       EventHandler.off(window, EVENT_KEY)
       EventHandler.off(this._dialog, EVENT_KEY)
 
-      this._backdrop.dispose()
+      this._backdrop?.dispose()
       this._focustrap.deactivate()
 
       super.dispose()
index 6434d8b3cca2b6904b4bedccc1a0fcee009e40c2..3e6a0d46ab58b3e1e8e25e3bd599931d8a0b0c3f 100644 (file)
@@ -1,3 +1,4 @@
+import BaseComponent from '../../src/base-component.js'
 import EventHandler from '../../src/dom/event-handler.js'
 import Modal from '../../src/modal.js'
 import ScrollBarHelper from '../../src/util/scrollbar.js'
@@ -846,18 +847,48 @@ describe('Modal', () => {
 
       const modalEl = fixtureEl.querySelector('.modal')
       const modal = new Modal(modalEl)
-      const focustrap = modal._focustrap
-      const spyDeactivate = spyOn(focustrap, 'deactivate').and.callThrough()
-
-      expect(Modal.getInstance(modalEl)).toEqual(modal)
-
+      const spyHideModal = spyOn(modal, '_hideModal').and.callThrough()
+      const spyDeactivate = spyOn(modal._focustrap, 'deactivate')
+      const spyBackdropDispose = spyOn(modal._backdrop, 'dispose')
+      const spySuperDispose = spyOn(BaseComponent.prototype, 'dispose')
       const spyOff = spyOn(EventHandler, 'off')
 
       modal.dispose()
 
-      expect(Modal.getInstance(modalEl)).toBeNull()
-      expect(spyOff).toHaveBeenCalledTimes(3)
+      expect(spyHideModal).toHaveBeenCalled()
+      expect(spyOff).toHaveBeenCalledTimes(2)
       expect(spyDeactivate).toHaveBeenCalled()
+      expect(spyBackdropDispose).toHaveBeenCalled()
+      expect(spySuperDispose).toHaveBeenCalled()
+    })
+
+    it('should dispose a shown modal', () => {
+      return new Promise(resolve => {
+        fixtureEl.innerHTML = '<div id="exampleModal" class="modal"><div class="modal-dialog"></div></div>'
+
+        const modalEl = fixtureEl.querySelector('.modal')
+        const modal = new Modal(modalEl)
+
+        modal.show()
+
+        const spyHideModal = spyOn(modal, '_hideModal').and.callThrough()
+        const spyDeactivate = spyOn(modal._focustrap, 'deactivate')
+        const spyBackdropDispose = spyOn(modal._backdrop, 'dispose')
+        const spySuperDispose = spyOn(BaseComponent.prototype, 'dispose')
+        const spyOff = spyOn(EventHandler, 'off')
+
+        modal.dispose()
+
+        expect(spyHideModal).toHaveBeenCalled()
+
+        setTimeout(() => {
+          expect(spyOff).toHaveBeenCalledTimes(2)
+          expect(spyDeactivate).toHaveBeenCalled()
+          expect(spyBackdropDispose).toHaveBeenCalled()
+          expect(spySuperDispose).toHaveBeenCalled()
+          resolve()
+        }, 20)
+      })
     })
   })