Three tied-together fixes:
1) captureTab moves from WebContents.capturePage() to CDP
Page.captureScreenshot for every mode (visible / full / region).
Blank-screenshot symptom: after a toolbar-menu selection, the OS
popup teardown left the tab view marked occluded for a few frames
on some Windows setups, so capturePage() snapshotted a
stale/transparent frame at the correct dimensions — no 0x0, no
retry hit. CDP forces a fresh composite regardless of occlusion
state (same path the "Full page" mode was already using) and
returns a base64 PNG directly; PNG dimensions come out of the
IHDR chunk (bytes 16-24). Attach only when nothing else has, and
detach after only if WE attached, so an open DevTools stays
attached.
2) Editor gets a Discard button. Toolbar picks up an "×" glyph next
to Save/Copy that closes the editor tab and drops the working
screenshot. Top-level Escape now falls through the same path
after unwinding an in-flight text placement or crop rectangle. A
new "addon-tab-close" IPC lets an add-on's own tab close itself
(main matches the sender's webContents id against the tab list,
so a page can only close its own tab); window.silentmode.closeTab()
exposes it from addon-tab-preload.js.
3) Manual update controls in Settings > Extensions. New "Check for
updates" button at the top of the Extensions surface calls the
same signed-update polling the boot timer runs; the result is
surfaced inline ("All extensions are up to date" / "N updates
staged; restart Theseus to apply"). A "Pending updates" box
below lists what's in <userData>/addons-updates-staged/ so the
user knows what will be promoted on next restart.
Toolbar-menu popup settle bumped from 120 ms to 250 ms with an
explicit win.focus() in the popup close callback — the previous
window wasn't enough on slower Windows setups. CDP capture no longer
depends on this delay anyway, but the settle still helps any add-on
that does DOM work in its click handler before capture.
Screenshot add-on bumped 0.2.2 → 0.2.3 (Discard button; capture
fixes come from the host, not the add-on).
20 lines
1.2 KiB
JavaScript
20 lines
1.2 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"),
|
|
});
|