e228ca6317
Introduces a plugin architecture, including a PluginManager, plugin loading in main and renderer processes, and a sample plugin demonstrating menu, IPC, and context menu contributions. Adds a Plugins tab to the settings UI for managing plugins (enable/disable, reload), and updates preload.js to load renderer preloads from plugins. Documentation for plugin development is included in README-PLUGINS.md.
44 lines
1.5 KiB
JavaScript
44 lines
1.5 KiB
JavaScript
// Sample main-process side of a plugin
|
|
module.exports.activate = function(ctx) {
|
|
ctx.log('activating');
|
|
|
|
// Add a simple menu item under Help
|
|
try {
|
|
const template = ctx.Menu.getApplicationMenu()?.items?.map(mi => mi);
|
|
if (template) {
|
|
const help = template.find(i => /help/i.test(i.label || ''));
|
|
const insertInto = help || template[template.length - 1];
|
|
if (insertInto && insertInto.submenu) {
|
|
insertInto.submenu.append(new ctx.Menu.MenuItem({
|
|
label: 'Say Hello (Sample Plugin)',
|
|
click: () => {
|
|
const win = ctx.BrowserWindow.getFocusedWindow();
|
|
if (win) win.webContents.send('sample-hello', { msg: 'Hello from plugin!' });
|
|
}
|
|
}));
|
|
ctx.Menu.setApplicationMenu(ctx.Menu.getApplicationMenu());
|
|
}
|
|
}
|
|
} catch (e) { ctx.warn('menu injection skipped', e); }
|
|
|
|
// Simple IPC example
|
|
ctx.registerIPC('sample-hello:ping', async () => ({ pong: true }));
|
|
|
|
// Optional: intercept a request (no-op demo)
|
|
ctx.registerWebRequest({ urls: ['*://*/*'] }, (details) => {
|
|
// Could cancel or redirect here, but we let it pass through
|
|
return { cancel: false };
|
|
});
|
|
|
|
// Context menu contribution example
|
|
ctx.contributeContextMenu?.((template, params, sender) => {
|
|
template.push({ type: 'separator' });
|
|
template.push({
|
|
label: 'Sample: Greet Console',
|
|
click: () => {
|
|
try { (sender.hostWebContents || sender).executeJavaScript("console.log('[Sample Plugin] Hello from context menu')"); } catch {}
|
|
}
|
|
});
|
|
});
|
|
};
|