         guard core.isFullscreen else { return }
         core.trigger(InternalEvent.willExitFullscreen.rawValue)
         core.isFullscreen = false
-        core.parentView?.addSubviewMatchingConstraints(core)
-        core.fullscreenController?.dismiss(animated: false, completion: nil)
+        handleExit()
         core.trigger(InternalEvent.didExitFullscreen.rawValue)
         core.trigger(InternalEvent.userRequestExitFullscreen.rawValue)
     }
+
+    private func handleExit() {
+        core.parentView?.addSubviewMatchingConstraints(core)
+        core.fullscreenController?.dismiss(animated: false, completion: nil)
+    }
+
+    func destroy() {
+        guard core.isFullscreen else { return }
+        handleExit()
+    }
 }

    func set(fullscreen: Bool)
    func enterInFullscreen()
    func exitFullscreen()
}

struct FullscreenByApp: FullscreenStateHandler {

        guard core.isFullscreen else { return }
        core.trigger(InternalEvent.userRequestExitFullscreen.rawValue)
    }

    func destroy() { }
}

struct FullscreenByPlayer: FullscreenStateHandler {
