From 790a55d093c6d8be5f020bcdeafa4ff79bec2936 Mon Sep 17 00:00:00 2001
From: ksuprynowicz <ksuprynowicz@post.pl>
Date: Thu, 20 Jul 2023 00:15:00 +0200
Subject: [PATCH] Fixed interface scripts failing to shutdown and removed
 deprecated API signal

---
 interface/src/Application.cpp                  | 18 ++++++++++++------
 .../src/ScriptManagerScriptingInterface.cpp    |  1 -
 .../src/ScriptManagerScriptingInterface.h      |  9 ---------
 3 files changed, 12 insertions(+), 16 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index a797fdf6cf..5f75195f64 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -7550,12 +7550,18 @@ void Application::registerScriptEngineWithApplicationServices(ScriptManagerPoint
     }
     auto scriptingInterface = DependencyManager::get<controller::ScriptingInterface>();
     scriptEngine->registerGlobalObject("Controller", scriptingInterface.data());
-    scriptManager->connect(scriptManager.get(), &ScriptManager::scriptEnding, [scriptManager]() {
-        // Request removal of controller routes with callbacks to a given script engine
-        auto userInputMapper = DependencyManager::get<UserInputMapper>();
-        userInputMapper->scheduleScriptEndpointCleanup(scriptManager->engine().get());
-        // V8TODO: Maybe we should wait until removal is finished if there are still crashes
-    });
+
+    {
+        auto connection = std::make_shared<QMetaObject::Connection>();
+        *connection = scriptManager->connect(scriptManager.get(), &ScriptManager::scriptEnding, [scriptManager, connection]() {
+            // Request removal of controller routes with callbacks to a given script engine
+            auto userInputMapper = DependencyManager::get<UserInputMapper>();
+            userInputMapper->scheduleScriptEndpointCleanup(scriptManager->engine().get());
+            QObject::disconnect(*connection);
+            // V8TODO: Maybe we should wait until removal is finished if there are still crashes
+        });
+    }
+
     UserInputMapper::registerControllerTypes(scriptEngine.get());
 
     auto recordingInterface = DependencyManager::get<RecordingScriptingInterface>();
diff --git a/libraries/script-engine/src/ScriptManagerScriptingInterface.cpp b/libraries/script-engine/src/ScriptManagerScriptingInterface.cpp
index 144b0e413a..1c0edc4889 100644
--- a/libraries/script-engine/src/ScriptManagerScriptingInterface.cpp
+++ b/libraries/script-engine/src/ScriptManagerScriptingInterface.cpp
@@ -32,7 +32,6 @@
     connect(_manager, &ScriptManager::errorLoadingScript, this, &ScriptManagerScriptingInterface::errorLoadingScript);
     connect(_manager, &ScriptManager::update, this, &ScriptManagerScriptingInterface::update);
     connect(_manager, &ScriptManager::scriptEnding, this, &ScriptManagerScriptingInterface::scriptEnding);
-    connect(_manager, &ScriptManager::finished, this, &ScriptManagerScriptingInterface::finished);
     connect(_manager, &ScriptManager::printedMessage, this, &ScriptManagerScriptingInterface::printedMessage);
     connect(_manager, &ScriptManager::errorMessage, this, &ScriptManagerScriptingInterface::errorMessage);
     connect(_manager, &ScriptManager::warningMessage, this, &ScriptManagerScriptingInterface::warningMessage);
diff --git a/libraries/script-engine/src/ScriptManagerScriptingInterface.h b/libraries/script-engine/src/ScriptManagerScriptingInterface.h
index 5620a9fb13..68d9dba794 100644
--- a/libraries/script-engine/src/ScriptManagerScriptingInterface.h
+++ b/libraries/script-engine/src/ScriptManagerScriptingInterface.h
@@ -577,15 +577,6 @@ signals:
      */
     void scriptEnding();
 
-    /*@jsdoc
-     * @function Script.finished
-     * @param {string} filename - File name.
-     * @param {object} engine - Engine.
-     * @returns {Signal}
-     * @deprecated This signal is deprecated and will be removed.
-     */
-    void finished(const QString& fileNameString, ScriptManagerPointer);
-
     /*@jsdoc
      * Triggered when the script prints a message to the program log via {@link  print}, {@link Script.print},
      * {@link console.log}, {@link console.debug}, {@link console.group}, {@link console.groupEnd}, {@link console.time}, or