diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js index e1c97d61db3396a0f2ec89db3d53fd8efbcbe871..1a7fe201a53b32503634a4e7f935ee146fc1a504 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 9c754a212c255c3d5813fdb5cc1e76962f857f9c..527ed43eb005b1b00cb734b7a1ba4bbec4ca9b0a 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 0000000000000000000000000000000000000000..f7a0f04fa86cb3b632310846ba479a5e56adc5c4 --- /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 0000000000000000000000000000000000000000..602ee8f11281e2f2c68847986eec0cc496a264a7 --- /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