api.emit() only ever reached the sidebar, even though addon-tab-preload has always exposed silentmode.on() — so an add-on could hear from its panel but had no way to tell its own editor tab anything. An add-on that wants a second document to land in the editor already open, instead of a third tab full of ribbon, needs exactly that. Two small pieces: - emitToPanel now also delivers to every tab owned by the same add-on. The sidebar keeps its existing condition; tabs are additional, not instead. - addon-tab-focus, the counterpart of addon-tab-close: a page asking for its own tab to be fronted. Needed because the click that hands an open page something new usually happens somewhere else — the sidebar — and the result would otherwise appear in a tab nobody is looking at. Both derive the tab from the sender's webContents, the way the close handler already does, so a page can only front or close the tab it is itself in.
23 lines
1.4 KiB
JavaScript
23 lines
1.4 KiB
JavaScript
// Preload for full-tab pages opened by api.openTab("<file>", {query}) — the
|
|
// "open-tab" capability. Same window.silentmode surface as the sidebar
|
|
// preload (storage / invoke / on) but WITHOUT the sidebar's picker strip and
|
|
// resize grip, which have no place in a normal tab. Main derives the add-on
|
|
// identity from the sender's file:// URL, so a page hosted anywhere else
|
|
// gets nothing back from these handlers.
|
|
const { contextBridge, ipcRenderer } = require("electron");
|
|
contextBridge.exposeInMainWorld("silentmode", {
|
|
storage: {
|
|
get: (key, fallback = null) => ipcRenderer.invoke("addon-storage-get", key, fallback),
|
|
set: (key, value) => ipcRenderer.invoke("addon-storage-set", key, value),
|
|
all: () => ipcRenderer.invoke("addon-storage-all"),
|
|
},
|
|
invoke: (msg, payload) => ipcRenderer.invoke("addon-msg", String(msg), payload),
|
|
on: (msg, cb) => ipcRenderer.on("addon-event", (_e, name, payload) => { if (name === msg) cb(payload); }),
|
|
// Close the tab this page lives in. Used by editor "Discard" and by
|
|
// Escape. Main derives the tab from the sender's webContents id so an
|
|
// add-on page can only close its own tab, never anyone else's.
|
|
closeTab: () => ipcRenderer.invoke("addon-tab-close"),
|
|
// Bring this page's own tab to the front. Main derives the tab from the
|
|
// sender, so a page can only front itself.
|
|
focusTab: () => ipcRenderer.invoke("addon-tab-focus"),
|
|
});
|