From e157e67c0d5406033969cebf43fe6593c362920b Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Tue, 13 Aug 2019 18:44:07 +0200 Subject: [PATCH] handle crash on plugin unload --- frontend-js/src/main/js/plugin/Plugin.js | 6 +++++ frontend-js/src/test/js/plugin/Plugin-test.js | 12 ++++++++++ ...ster.js&version=0.0.1&token=MOCK_TOKEN_ID& | 8 +++++++ .../plugin-invalid/crash-unregister.js | 23 +++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 frontend-js/testFiles/apiCalls/plugins/POST_hash=dac1c83fdedde144a3c09424f88c9804&isPublic=false&name=high%20test&url=.%2FtestFiles%2Fplugin-invalid%2Fcrash-unregister.js&version=0.0.1&token=MOCK_TOKEN_ID& create mode 100644 frontend-js/testFiles/plugin-invalid/crash-unregister.js diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js index e1c97d61db..1a7fe201a5 100644 --- a/frontend-js/src/main/js/plugin/Plugin.js +++ b/frontend-js/src/main/js/plugin/Plugin.js @@ -7,6 +7,7 @@ var Promise = require("bluebird"); var logger = require('../logger'); var Functions = require('../Functions'); +var GuiConnector = require('../GuiConnector'); var PluginData = require('../map/data/PluginData'); var pluginId = 0; @@ -226,6 +227,11 @@ Plugin.prototype.unload = function () { if (validPlugin) { return self.getLoadedPluginData().unregister(); } + }).catch(function (e) { + GuiConnector.warn("Plugin crashed on upload."); + if (typeof self.getLoadedPluginData().notifyError === "function") { + self.getLoadedPluginData().notifyError({error: error}); + } }).then(function () { if (validPlugin) { var removedListeners = self.getMinervaPluginProxy().project.map.removeAllListeners(); diff --git a/frontend-js/src/test/js/plugin/Plugin-test.js b/frontend-js/src/test/js/plugin/Plugin-test.js index 9c754a212c..527ed43eb0 100644 --- a/frontend-js/src/test/js/plugin/Plugin-test.js +++ b/frontend-js/src/test/js/plugin/Plugin-test.js @@ -110,6 +110,18 @@ describe('Plugin', function () { assert.equal(1, logger.getWarnings().length); }); }); + it('plugin crashed during unload', function () { + var map = helper.createCustomMap(); + helper.createSearchDbOverlay(map); + + var plugin = createPlugin("./testFiles/plugin-invalid/crash-unregister.js", map); + return plugin.load().then(function () { + assert.equal(0, logger.getWarnings().length); + return plugin.unload(); + }).then(function () { + assert.equal(2, logger.getWarnings().length); + }); + }); }); it('plugin listener crash', function () { var map = helper.createCustomMap(); diff --git a/frontend-js/testFiles/apiCalls/plugins/POST_hash=dac1c83fdedde144a3c09424f88c9804&isPublic=false&name=high%20test&url=.%2FtestFiles%2Fplugin-invalid%2Fcrash-unregister.js&version=0.0.1&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/plugins/POST_hash=dac1c83fdedde144a3c09424f88c9804&isPublic=false&name=high%20test&url=.%2FtestFiles%2Fplugin-invalid%2Fcrash-unregister.js&version=0.0.1&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000..f7a0f04fa8 --- /dev/null +++ b/frontend-js/testFiles/apiCalls/plugins/POST_hash=dac1c83fdedde144a3c09424f88c9804&isPublic=false&name=high%20test&url=.%2FtestFiles%2Fplugin-invalid%2Fcrash-unregister.js&version=0.0.1&token=MOCK_TOKEN_ID& @@ -0,0 +1,8 @@ +{ + "hash": "dac1c83fdedde144a3c09424f88c9804", + "name": "test plugin", + "urls": [ + "./testFiles/plugin-invalid/crash-unregister.js" + ], + "version": "0.0.1" +} \ No newline at end of file diff --git a/frontend-js/testFiles/plugin-invalid/crash-unregister.js b/frontend-js/testFiles/plugin-invalid/crash-unregister.js new file mode 100644 index 0000000000..602ee8f112 --- /dev/null +++ b/frontend-js/testFiles/plugin-invalid/crash-unregister.js @@ -0,0 +1,23 @@ +minervaDefine(function () { + return { + register: function (minervaObject) { + var options = { + dbOverlayName: "search", + type: "onSearch", + callback: function (elements) { + console.log("hi there"); + } + }; + minervaObject.project.map.addListener(options); + }, + unregister: function () { + throw new Error("ups") + }, + getName: function () { + return "high test"; + }, + getVersion: function () { + return "0.0.1"; + } + }; +}); \ No newline at end of file -- GitLab