summaryrefslogtreecommitdiffstats
path: root/trunk/etherpad
diff options
context:
space:
mode:
authorEgil Moeller <egil.moller@freecode.no>2010-03-13 01:34:20 +0100
committerEgil Moeller <egil.moller@freecode.no>2010-03-13 01:34:20 +0100
commitf60fc17c398721a83b93c65a29cb263f6912bfdf (patch)
treed3ef307ac4ad641d05622cf81b20a277b6bb6dcc /trunk/etherpad
parentdbd40f035d765cfa442a0731229d31a9113d8d11 (diff)
downloadetherpad-f60fc17c398721a83b93c65a29cb263f6912bfdf.tar.gz
etherpad-f60fc17c398721a83b93c65a29cb263f6912bfdf.tar.bz2
etherpad-f60fc17c398721a83b93c65a29cb263f6912bfdf.zip
Made the plugin manager a bit more robust against problems in a plugin
Diffstat (limited to 'trunk/etherpad')
-rw-r--r--trunk/etherpad/src/etherpad/admin/plugins.js39
1 files changed, 16 insertions, 23 deletions
diff --git a/trunk/etherpad/src/etherpad/admin/plugins.js b/trunk/etherpad/src/etherpad/admin/plugins.js
index af66833..8500acb 100644
--- a/trunk/etherpad/src/etherpad/admin/plugins.js
+++ b/trunk/etherpad/src/etherpad/admin/plugins.js
@@ -123,22 +123,18 @@ function registerHook(pluginName, hookName, originalHook) {
sqlobj.insert("plugin_hook", {plugin_id:plugin.id, hook_id:hook.id, original_name:originalHook});
}
-function unregisterHook(pluginName, hookName) {
- plugins[pluginName] = plugins[pluginName].filter(function (hook) { return hook.hookName != hookName; });
- hooks[hookName] = hooks[hookName].filter(function (plugin) { return plugin.pluginName != pluginName; });
- if (hooks[hookName].length == 0)
- delete hooks[hookName];
-
- var conditions = {};
- if (pluginName != undefined) {
- var plugin = sqlobj.selectSingle('plugin', {name:pluginName});
- conditions['plugin_id'] = plugin.id;
- }
- if (hookName != undefined) {
- var hook = sqlobj.selectSingle('hook', {name:hookName});
- conditions['hook_id'] = hook.id;
+function unregisterHooks(pluginName) {
+ delete plugins[pluginName];
+
+ for (hookName in hooks) {
+ hooks[hookName] = hooks[hookName].filter(function (plugin) { return plugin.pluginName != pluginName; });
+ if (hooks[hookName].length == 0)
+ delete hooks[hookName];
}
- sqlobj.deleteRows('plugin_hook', conditions);
+
+ var plugin = sqlobj.selectSingle('plugin', {name:pluginName});
+ if (plugin != undefined)
+ sqlobj.deleteRows('plugin_hook', {plugin_id:plugin.id});
}
/* User API */
@@ -150,8 +146,10 @@ function enablePlugin(pluginName) {
throw new Error ("Atempting to reenable the already enabled plugin " + pluginName);
sqlobj.insert("plugin", {name:pluginName});
plugins[pluginName] = [];
- for (var i = 0; i < pluginModules[pluginName].hooks.length; i++)
- registerHook(pluginName, pluginModules[pluginName].hooks[i]);
+ var pluginHooks = pluginModules[pluginName].hooks || [];
+ pluginHooks = pluginHooks.concat(pluginModules[pluginName].hooksShared || []);
+ for (var i = 0; i < pluginHooks.length; i++)
+ registerHook(pluginName, pluginHooks[i]);
pluginModules[pluginName].install();
}
@@ -163,12 +161,7 @@ function disablePlugin(pluginName) {
} catch (e) {
log.info({errorUninstallingPlugin:exceptionutils.getStackTracePlain(e)});
}
- if (plugins[pluginName] != undefined) {
- var pluginHooks = plugins[pluginName].map(function (x) { return x; }); // copy array
-
- for (pluginHook in pluginHooks)
- unregisterHook(pluginName, pluginHooks[pluginHook].hookName);
- }
+ unregisterHooks(pluginName);
delete plugins[pluginName];
sqlobj.deleteRows("plugin", {name:pluginName});
}