From 09ff0ed8a46ffc0be3761ce5667b610648050ac1 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Fri, 14 Sep 2018 16:39:28 +0200 Subject: [PATCH] when plugin is not loaded properly plugin tab is not shown; the same happens after unloading all plugin --- frontend-js/src/main/js/plugin/Plugin.js | 17 ++++-- .../src/main/js/plugin/PluginManager.js | 59 +++++++++++-------- .../src/test/js/plugin/PluginManager-test.js | 20 +++++++ 3 files changed, 67 insertions(+), 29 deletions(-) diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js index c097c0c4fa..e2c9f99dd9 100644 --- a/frontend-js/src/main/js/plugin/Plugin.js +++ b/frontend-js/src/main/js/plugin/Plugin.js @@ -181,12 +181,21 @@ Plugin.prototype.getMinWidth = function () { */ Plugin.prototype.unload = function () { var self = this; + var validPlugin = true; + if (self.getLoadedPluginData() === undefined) { + validPlugin = false; + logger.warn("Plugin wasn't loaded properly"); + } return Promise.resolve().then(function () { - return self.getLoadedPluginData().unregister(); + if (validPlugin) { + return self.getLoadedPluginData().unregister(); + } }).then(function () { - var removedListeners = self.getMinervaPluginProxy().project.map.removeAllListeners(); - if (removedListeners.length > 0) { - logger.warn("'" + self.getLoadedPluginData().getName() + "' plugin didn't remove all registered listeners"); + if (validPlugin) { + var removedListeners = self.getMinervaPluginProxy().project.map.removeAllListeners(); + if (removedListeners.length > 0) { + logger.warn("'" + self.getLoadedPluginData().getName() + "' plugin didn't remove all registered listeners"); + } } return self.callListeners("onUnload"); }).then(function () { diff --git a/frontend-js/src/main/js/plugin/PluginManager.js b/frontend-js/src/main/js/plugin/PluginManager.js index 064259bd8f..f3f4a59a7f 100644 --- a/frontend-js/src/main/js/plugin/PluginManager.js +++ b/frontend-js/src/main/js/plugin/PluginManager.js @@ -70,8 +70,8 @@ PluginManager.prototype.getGuiUtils = function () { */ PluginManager.prototype.addPlugin = function (options) { var self = this; + $(self.getElement()).show(); if (self._panels === undefined) { - $(self.getElement()).show(); self.getGuiUtils().initTabContent(self); } var element = Functions.createElement({type: "div"}); @@ -79,31 +79,36 @@ PluginManager.prototype.addPlugin = function (options) { self.getGuiUtils().addTab(self, {name: "PLUGIN", content: element}); var plugin; - if (options instanceof Plugin) { - plugin = options; - plugin.setOptions({ - element: element, - configuration: self.getConfiguration(), - map: self.getMap(), - serverConnector: self.getServerConnector() - }); - } else { - if (!self.isValidUrl(options.url)) { - return Promise.reject(new InvalidArgumentError("url: '" + options.url + "' is invalid")); + return Promise.resolve().then(function () { + if (options instanceof Plugin) { + plugin = options; + plugin.setOptions({ + element: element, + configuration: self.getConfiguration(), + map: self.getMap(), + serverConnector: self.getServerConnector() + }); + } else { + plugin = new Plugin({ + url: options.url, + element: element, + configuration: self.getConfiguration(), + map: self.getMap(), + serverConnector: self.getServerConnector() + }); + plugin.addListener("onUnload", function () { + self.getGuiUtils().hideTab(self, element); + if ($("li", self.getElement()).children(':visible').length === 0) { + $(self.getElement()).hide(); + } + }); + if (!self.isValidUrl(options.url)) { + return Promise.reject(new InvalidArgumentError("url: '" + options.url + "' is invalid")); + } } - plugin = new Plugin({ - url: options.url, - element: element, - configuration: self.getConfiguration(), - map: self.getMap(), - serverConnector: self.getServerConnector() - }); - plugin.addListener("onUnload", function () { - self.getGuiUtils().hideTab(self, element); - }); - } - self._plugins.push(plugin); - return plugin.load().then(function () { + self._plugins.push(plugin); + return plugin.load(); + }).then(function () { $("a[href='#" + element.parentNode.id + "']", $(self.getElement()))[0].innerHTML = plugin.getName(); var tab = $(element.parentNode); var adjustHeight = function () { @@ -120,6 +125,10 @@ PluginManager.prototype.addPlugin = function (options) { } }).then(function () { return plugin; + }).catch(function (e) { + return plugin.unload().then(function () { + GuiConnector.alert("Problem with loading plugin:<br/>" + e.message); + }); }); }; diff --git a/frontend-js/src/test/js/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js index 4f76d3cde9..e251c7d48b 100644 --- a/frontend-js/src/test/js/plugin/PluginManager-test.js +++ b/frontend-js/src/test/js/plugin/PluginManager-test.js @@ -77,6 +77,26 @@ describe('PluginManager', function () { }); }); + it('with error', function () { + var manager = createPluginManager(); + return manager.addPlugin({url: "./invalid.js"}).then(function (plugin) { + assert.notOk("Expected error"); + }).catch(function (e) { + assert.ok(e.message.indexOf("Problem with loading plugin") >= 0) + }); + }); + it('with invalid url', function () { + var manager = createPluginManager(); + manager.isValidUrl = function () { + return false; + }; + return manager.addPlugin({url: "xx"}).then(function (plugin) { + assert.notOk("Expected error"); + }).catch(function (e) { + assert.ok(e.message.indexOf("Problem with loading plugin") >= 0) + }); + }); + }); -- GitLab