From fd862f5e2871d4034a5cd85b306c7b2bd4cc05e1 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 20 Apr 2017 23:37:04 -0700 Subject: [PATCH] plugin(fix): catch plugin crash at init time --- frontend/apps/filemanager/filemanager.lua | 9 +++++++-- frontend/apps/reader/readerui.lua | 22 ++++++++++++++-------- frontend/pluginloader.lua | 10 ++++++++++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index d2d5e92ca..cd92917b8 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -326,10 +326,15 @@ function FileManager:init() self.loaded_modules = {} -- koreader plugins for _,plugin_module in ipairs(PluginLoader:loadPlugins()) do - logger.info("FM loaded plugin", plugin_module.name, "at", plugin_module.path) if not plugin_module.is_doc_only then + local ok, plugin_or_err = PluginLoader:createPluginInstance( + plugin_module, { ui = self, }) -- Keep references to the modules which do not register into menu. - table.insert(self.loaded_modules, plugin_module:new{ ui = self, }) + if ok then + table.insert(self.loaded_modules, plugin_or_err) + logger.info("FM loaded plugin", plugin_module.name, + "at", plugin_module.path) + end end end diff --git a/frontend/apps/reader/readerui.lua b/frontend/apps/reader/readerui.lua index 7c90eb3f9..f9c1ccfb6 100644 --- a/frontend/apps/reader/readerui.lua +++ b/frontend/apps/reader/readerui.lua @@ -319,14 +319,20 @@ function ReaderUI:init() ui = self, }) -- koreader plugins - for _,plugin_module in ipairs(PluginLoader:loadPlugins()) do - logger.info("RD loaded plugin", plugin_module.name, "at", plugin_module.path) - self:registerModule(plugin_module.name, plugin_module:new{ - dialog = self.dialog, - view = self.view, - ui = self, - document = self.document, - }) + for _, plugin_module in ipairs(PluginLoader:loadPlugins()) do + local ok, plugin_or_err = PluginLoader:createPluginInstance( + plugin_module, + { + dialog = self.dialog, + view = self.view, + ui = self, + document = self.document, + }) + if ok then + self:registerModule(plugin_module.name, plugin_or_err) + logger.info("RD loaded plugin", plugin_module.name, + "at", plugin_module.path) + end end -- we only read settings after all the widgets are initialized diff --git a/frontend/pluginloader.lua b/frontend/pluginloader.lua index 1548e6b70..1ae456f11 100644 --- a/frontend/pluginloader.lua +++ b/frontend/pluginloader.lua @@ -68,4 +68,14 @@ function PluginLoader:loadPlugins() return self.plugins end +function PluginLoader:createPluginInstance(plugin, attr) + local ok, re = pcall(plugin.new, plugin, attr) + if ok then -- re is a plugin instance + return ok, re + else -- re is the error message + logger.err('Failed to initialize', plugin.name, 'plugin: ', re) + return nil, re + end +end + return PluginLoader