@opentabs-dev/browser-extension 0.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/background-log-state.d.ts +10 -0
- package/dist/background-log-state.d.ts.map +1 -0
- package/dist/background-log-state.js +11 -0
- package/dist/background-log-state.js.map +1 -0
- package/dist/background-message-handlers.d.ts +41 -0
- package/dist/background-message-handlers.d.ts.map +1 -0
- package/dist/background-message-handlers.js +214 -0
- package/dist/background-message-handlers.js.map +1 -0
- package/dist/background.d.ts +2 -0
- package/dist/background.d.ts.map +1 -0
- package/dist/background.js +3780 -0
- package/dist/background.js.map +1 -0
- package/dist/bg-log-state.d.ts +10 -0
- package/dist/bg-log-state.d.ts.map +1 -0
- package/dist/bg-log-state.js +11 -0
- package/dist/bg-log-state.js.map +1 -0
- package/dist/browser-commands/content-commands.d.ts +25 -0
- package/dist/browser-commands/content-commands.d.ts.map +1 -0
- package/dist/browser-commands/content-commands.js +166 -0
- package/dist/browser-commands/content-commands.js.map +1 -0
- package/dist/browser-commands/cookie-commands.d.ts +14 -0
- package/dist/browser-commands/cookie-commands.d.ts.map +1 -0
- package/dist/browser-commands/cookie-commands.js +99 -0
- package/dist/browser-commands/cookie-commands.js.map +1 -0
- package/dist/browser-commands/extension-commands.d.ts +12 -0
- package/dist/browser-commands/extension-commands.d.ts.map +1 -0
- package/dist/browser-commands/extension-commands.js +386 -0
- package/dist/browser-commands/extension-commands.js.map +1 -0
- package/dist/browser-commands/helpers.d.ts +35 -0
- package/dist/browser-commands/helpers.d.ts.map +1 -0
- package/dist/browser-commands/helpers.js +121 -0
- package/dist/browser-commands/helpers.js.map +1 -0
- package/dist/browser-commands/index.d.ts +11 -0
- package/dist/browser-commands/index.d.ts.map +1 -0
- package/dist/browser-commands/index.js +10 -0
- package/dist/browser-commands/index.js.map +1 -0
- package/dist/browser-commands/interaction-commands.d.ts +23 -0
- package/dist/browser-commands/interaction-commands.d.ts.map +1 -0
- package/dist/browser-commands/interaction-commands.js +353 -0
- package/dist/browser-commands/interaction-commands.js.map +1 -0
- package/dist/browser-commands/key-press-command.d.ts +2 -0
- package/dist/browser-commands/key-press-command.d.ts.map +1 -0
- package/dist/browser-commands/key-press-command.js +144 -0
- package/dist/browser-commands/key-press-command.js.map +1 -0
- package/dist/browser-commands/network-commands.d.ts +6 -0
- package/dist/browser-commands/network-commands.d.ts.map +1 -0
- package/dist/browser-commands/network-commands.js +69 -0
- package/dist/browser-commands/network-commands.js.map +1 -0
- package/dist/browser-commands/resource-commands.d.ts +37 -0
- package/dist/browser-commands/resource-commands.d.ts.map +1 -0
- package/dist/browser-commands/resource-commands.js +153 -0
- package/dist/browser-commands/resource-commands.js.map +1 -0
- package/dist/browser-commands/scroll-command.d.ts +2 -0
- package/dist/browser-commands/scroll-command.d.ts.map +1 -0
- package/dist/browser-commands/scroll-command.js +133 -0
- package/dist/browser-commands/scroll-command.js.map +1 -0
- package/dist/browser-commands/tab-commands.d.ts +33 -0
- package/dist/browser-commands/tab-commands.d.ts.map +1 -0
- package/dist/browser-commands/tab-commands.js +121 -0
- package/dist/browser-commands/tab-commands.js.map +1 -0
- package/dist/browser-commands.d.ts +36 -0
- package/dist/browser-commands.d.ts.map +1 -0
- package/dist/browser-commands.js +1931 -0
- package/dist/browser-commands.js.map +1 -0
- package/dist/confirmation-badge.d.ts +17 -0
- package/dist/confirmation-badge.d.ts.map +1 -0
- package/dist/confirmation-badge.js +64 -0
- package/dist/confirmation-badge.js.map +1 -0
- package/dist/constants.d.ts +79 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +79 -0
- package/dist/constants.js.map +1 -0
- package/dist/dispatch-helpers.d.ts +61 -0
- package/dist/dispatch-helpers.d.ts.map +1 -0
- package/dist/dispatch-helpers.js +149 -0
- package/dist/dispatch-helpers.js.map +1 -0
- package/dist/extension-messages.d.ts +146 -0
- package/dist/extension-messages.d.ts.map +1 -0
- package/dist/extension-messages.js +2 -0
- package/dist/extension-messages.js.map +1 -0
- package/dist/iife-injection.d.ts +55 -0
- package/dist/iife-injection.d.ts.map +1 -0
- package/dist/iife-injection.js +474 -0
- package/dist/iife-injection.js.map +1 -0
- package/dist/json-rpc-errors.d.ts +8 -0
- package/dist/json-rpc-errors.d.ts.map +1 -0
- package/dist/json-rpc-errors.js +8 -0
- package/dist/json-rpc-errors.js.map +1 -0
- package/dist/known-methods.d.ts +19 -0
- package/dist/known-methods.d.ts.map +1 -0
- package/dist/known-methods.js +68 -0
- package/dist/known-methods.js.map +1 -0
- package/dist/log-collector.d.ts +45 -0
- package/dist/log-collector.d.ts.map +1 -0
- package/dist/log-collector.js +99 -0
- package/dist/log-collector.js.map +1 -0
- package/dist/message-router.d.ts +28 -0
- package/dist/message-router.d.ts.map +1 -0
- package/dist/message-router.js +367 -0
- package/dist/message-router.js.map +1 -0
- package/dist/messaging.d.ts +15 -0
- package/dist/messaging.d.ts.map +1 -0
- package/dist/messaging.js +41 -0
- package/dist/messaging.js.map +1 -0
- package/dist/network-capture.d.ts +56 -0
- package/dist/network-capture.d.ts.map +1 -0
- package/dist/network-capture.js +374 -0
- package/dist/network-capture.js.map +1 -0
- package/dist/offscreen/index.d.ts +16 -0
- package/dist/offscreen/index.d.ts.map +1 -0
- package/dist/offscreen/index.js +549 -0
- package/dist/offscreen/index.js.map +1 -0
- package/dist/plugin-storage.d.ts +19 -0
- package/dist/plugin-storage.d.ts.map +1 -0
- package/dist/plugin-storage.js +100 -0
- package/dist/plugin-storage.js.map +1 -0
- package/dist/rate-limiter.d.ts +18 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +53 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/resource-prompt-dispatch.d.ts +14 -0
- package/dist/resource-prompt-dispatch.d.ts.map +1 -0
- package/dist/resource-prompt-dispatch.js +195 -0
- package/dist/resource-prompt-dispatch.js.map +1 -0
- package/dist/sanitize-error.d.ts +8 -0
- package/dist/sanitize-error.d.ts.map +1 -0
- package/dist/sanitize-error.js +25 -0
- package/dist/sanitize-error.js.map +1 -0
- package/dist/sanitize-svg.d.ts +20 -0
- package/dist/sanitize-svg.d.ts.map +1 -0
- package/dist/sanitize-svg.js +296 -0
- package/dist/sanitize-svg.js.map +1 -0
- package/dist/side-panel/App.d.ts +3 -0
- package/dist/side-panel/App.d.ts.map +1 -0
- package/dist/side-panel/App.js +147 -0
- package/dist/side-panel/App.js.map +1 -0
- package/dist/side-panel/bridge.d.ts +50 -0
- package/dist/side-panel/bridge.d.ts.map +1 -0
- package/dist/side-panel/bridge.js +113 -0
- package/dist/side-panel/bridge.js.map +1 -0
- package/dist/side-panel/components/ConfirmationDialog.d.ts +16 -0
- package/dist/side-panel/components/ConfirmationDialog.d.ts.map +1 -0
- package/dist/side-panel/components/ConfirmationDialog.js +39 -0
- package/dist/side-panel/components/ConfirmationDialog.js.map +1 -0
- package/dist/side-panel/components/EmptyStates.d.ts +8 -0
- package/dist/side-panel/components/EmptyStates.d.ts.map +1 -0
- package/dist/side-panel/components/EmptyStates.js +40 -0
- package/dist/side-panel/components/EmptyStates.js.map +1 -0
- package/dist/side-panel/components/ErrorBoundary.d.ts +23 -0
- package/dist/side-panel/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/side-panel/components/ErrorBoundary.js +28 -0
- package/dist/side-panel/components/ErrorBoundary.js.map +1 -0
- package/dist/side-panel/components/FailedPluginCard.d.ts +6 -0
- package/dist/side-panel/components/FailedPluginCard.d.ts.map +1 -0
- package/dist/side-panel/components/FailedPluginCard.js +9 -0
- package/dist/side-panel/components/FailedPluginCard.js.map +1 -0
- package/dist/side-panel/components/Footer.d.ts +3 -0
- package/dist/side-panel/components/Footer.d.ts.map +1 -0
- package/dist/side-panel/components/Footer.js +32 -0
- package/dist/side-panel/components/Footer.js.map +1 -0
- package/dist/side-panel/components/Header.d.ts +5 -0
- package/dist/side-panel/components/Header.d.ts.map +1 -0
- package/dist/side-panel/components/Header.js +6 -0
- package/dist/side-panel/components/Header.js.map +1 -0
- package/dist/side-panel/components/PluginCard.d.ts +10 -0
- package/dist/side-panel/components/PluginCard.d.ts.map +1 -0
- package/dist/side-panel/components/PluginCard.js +50 -0
- package/dist/side-panel/components/PluginCard.js.map +1 -0
- package/dist/side-panel/components/PluginIcon.d.ts +21 -0
- package/dist/side-panel/components/PluginIcon.d.ts.map +1 -0
- package/dist/side-panel/components/PluginIcon.js +48 -0
- package/dist/side-panel/components/PluginIcon.js.map +1 -0
- package/dist/side-panel/components/PluginList.d.ts +11 -0
- package/dist/side-panel/components/PluginList.d.ts.map +1 -0
- package/dist/side-panel/components/PluginList.js +17 -0
- package/dist/side-panel/components/PluginList.js.map +1 -0
- package/dist/side-panel/components/ToolIcon.d.ts +7 -0
- package/dist/side-panel/components/ToolIcon.d.ts.map +1 -0
- package/dist/side-panel/components/ToolIcon.js +8 -0
- package/dist/side-panel/components/ToolIcon.js.map +1 -0
- package/dist/side-panel/components/ToolRow.d.ts +11 -0
- package/dist/side-panel/components/ToolRow.d.ts.map +1 -0
- package/dist/side-panel/components/ToolRow.js +8 -0
- package/dist/side-panel/components/ToolRow.js.map +1 -0
- package/dist/side-panel/components/VersionMismatchBanner.d.ts +3 -0
- package/dist/side-panel/components/VersionMismatchBanner.d.ts.map +1 -0
- package/dist/side-panel/components/VersionMismatchBanner.js +5 -0
- package/dist/side-panel/components/VersionMismatchBanner.js.map +1 -0
- package/dist/side-panel/components/retro/Accordion.d.ts +8 -0
- package/dist/side-panel/components/retro/Accordion.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Accordion.js +15 -0
- package/dist/side-panel/components/retro/Accordion.js.map +1 -0
- package/dist/side-panel/components/retro/Alert.d.ts +25 -0
- package/dist/side-panel/components/retro/Alert.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Alert.js +33 -0
- package/dist/side-panel/components/retro/Alert.js.map +1 -0
- package/dist/side-panel/components/retro/Badge.d.ts +15 -0
- package/dist/side-panel/components/retro/Badge.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Badge.js +23 -0
- package/dist/side-panel/components/retro/Badge.js.map +1 -0
- package/dist/side-panel/components/retro/Button.d.ts +13 -0
- package/dist/side-panel/components/retro/Button.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Button.js +33 -0
- package/dist/side-panel/components/retro/Button.js.map +1 -0
- package/dist/side-panel/components/retro/Empty.d.ts +31 -0
- package/dist/side-panel/components/retro/Empty.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Empty.js +25 -0
- package/dist/side-panel/components/retro/Empty.js.map +1 -0
- package/dist/side-panel/components/retro/Input.d.ts +8 -0
- package/dist/side-panel/components/retro/Input.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Input.js +7 -0
- package/dist/side-panel/components/retro/Input.js.map +1 -0
- package/dist/side-panel/components/retro/Loader.d.ts +14 -0
- package/dist/side-panel/components/retro/Loader.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Loader.js +30 -0
- package/dist/side-panel/components/retro/Loader.js.map +1 -0
- package/dist/side-panel/components/retro/Menu.d.ts +9 -0
- package/dist/side-panel/components/retro/Menu.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Menu.js +17 -0
- package/dist/side-panel/components/retro/Menu.js.map +1 -0
- package/dist/side-panel/components/retro/NumberStepper.d.ts +18 -0
- package/dist/side-panel/components/retro/NumberStepper.d.ts.map +1 -0
- package/dist/side-panel/components/retro/NumberStepper.js +38 -0
- package/dist/side-panel/components/retro/NumberStepper.js.map +1 -0
- package/dist/side-panel/components/retro/Progress.d.ts +9 -0
- package/dist/side-panel/components/retro/Progress.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Progress.js +6 -0
- package/dist/side-panel/components/retro/Progress.js.map +1 -0
- package/dist/side-panel/components/retro/Switch.d.ts +4 -0
- package/dist/side-panel/components/retro/Switch.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Switch.js +6 -0
- package/dist/side-panel/components/retro/Switch.js.map +1 -0
- package/dist/side-panel/components/retro/Text.d.ts +11 -0
- package/dist/side-panel/components/retro/Text.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Text.js +28 -0
- package/dist/side-panel/components/retro/Text.js.map +1 -0
- package/dist/side-panel/components/retro/Tooltip.d.ts +12 -0
- package/dist/side-panel/components/retro/Tooltip.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Tooltip.js +32 -0
- package/dist/side-panel/components/retro/Tooltip.js.map +1 -0
- package/dist/side-panel/constants.d.ts +5 -0
- package/dist/side-panel/constants.d.ts.map +1 -0
- package/dist/side-panel/constants.js +5 -0
- package/dist/side-panel/constants.js.map +1 -0
- package/dist/side-panel/hooks/useServerNotifications.d.ts +21 -0
- package/dist/side-panel/hooks/useServerNotifications.d.ts.map +1 -0
- package/dist/side-panel/hooks/useServerNotifications.js +93 -0
- package/dist/side-panel/hooks/useServerNotifications.js.map +1 -0
- package/dist/side-panel/hooks/useTheme.d.ts +8 -0
- package/dist/side-panel/hooks/useTheme.d.ts.map +1 -0
- package/dist/side-panel/hooks/useTheme.js +30 -0
- package/dist/side-panel/hooks/useTheme.js.map +1 -0
- package/dist/side-panel/index.d.ts +2 -0
- package/dist/side-panel/index.d.ts.map +1 -0
- package/dist/side-panel/index.js +12 -0
- package/dist/side-panel/index.js.map +1 -0
- package/dist/side-panel/lib/cn.d.ts +3 -0
- package/dist/side-panel/lib/cn.d.ts.map +1 -0
- package/dist/side-panel/lib/cn.js +4 -0
- package/dist/side-panel/lib/cn.js.map +1 -0
- package/dist/side-panel/lib/utils.d.ts +3 -0
- package/dist/side-panel/lib/utils.d.ts.map +1 -0
- package/dist/side-panel/lib/utils.js +4 -0
- package/dist/side-panel/lib/utils.js.map +1 -0
- package/dist/side-panel/side-panel.js +78034 -0
- package/dist/side-panel/styles.css +2 -0
- package/dist/side-panel-state.d.ts +11 -0
- package/dist/side-panel-state.d.ts.map +1 -0
- package/dist/side-panel-state.js +38 -0
- package/dist/side-panel-state.js.map +1 -0
- package/dist/side-panel-toggle.d.ts +3 -0
- package/dist/side-panel-toggle.d.ts.map +1 -0
- package/dist/side-panel-toggle.js +31 -0
- package/dist/side-panel-toggle.js.map +1 -0
- package/dist/tab-matching.d.ts +51 -0
- package/dist/tab-matching.d.ts.map +1 -0
- package/dist/tab-matching.js +160 -0
- package/dist/tab-matching.js.map +1 -0
- package/dist/tab-state.d.ts +56 -0
- package/dist/tab-state.d.ts.map +1 -0
- package/dist/tab-state.js +282 -0
- package/dist/tab-state.js.map +1 -0
- package/dist/tool-dispatch.d.ts +19 -0
- package/dist/tool-dispatch.d.ts.map +1 -0
- package/dist/tool-dispatch.js +336 -0
- package/dist/tool-dispatch.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/icons/icon-128.png +0 -0
- package/icons/icon-16.png +0 -0
- package/icons/icon-32.png +0 -0
- package/icons/icon-48.png +0 -0
- package/icons/icon.svg +6 -0
- package/manifest.json +38 -0
- package/offscreen/offscreen.html +10 -0
- package/package.json +49 -0
- package/side-panel/dark-mode.js +29 -0
- package/side-panel/fonts/archivo-black-latin.woff2 +0 -0
- package/side-panel/fonts/space-grotesk-latin.woff2 +0 -0
- package/side-panel/fonts/space-mono-400-latin.woff2 +0 -0
- package/side-panel/fonts/space-mono-700-latin.woff2 +0 -0
- package/side-panel/fonts.css +34 -0
- package/side-panel/side-panel.html +16 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { INJECTION_RETRY_DELAY_MS, isValidPluginName } from './constants.js';
|
|
2
|
+
import { getAllPluginMeta } from './plugin-storage.js';
|
|
3
|
+
import { urlMatchesPatterns } from './tab-matching.js';
|
|
4
|
+
import { toErrorMessage } from '@opentabs-dev/shared';
|
|
5
|
+
/** Names reserved for platform use — rejected at the injection layer as defense-in-depth */
|
|
6
|
+
const RESERVED_NAMES = new Set(['system', 'browser', 'opentabs', 'extension', 'config', 'plugin', 'tool', 'mcp']);
|
|
7
|
+
const isSafePluginName = (name) => isValidPluginName(name) && !RESERVED_NAMES.has(name);
|
|
8
|
+
/** Check if an adapter for the given plugin is already injected in a tab */
|
|
9
|
+
const isAdapterPresent = async (tabId, pluginName) => {
|
|
10
|
+
try {
|
|
11
|
+
const results = await chrome.scripting.executeScript({
|
|
12
|
+
target: { tabId },
|
|
13
|
+
world: 'MAIN',
|
|
14
|
+
func: (pName) => {
|
|
15
|
+
const ot = globalThis.__openTabs;
|
|
16
|
+
return ot?.adapters?.[pName] !== undefined;
|
|
17
|
+
},
|
|
18
|
+
args: [pluginName],
|
|
19
|
+
});
|
|
20
|
+
const first = results[0];
|
|
21
|
+
return first?.result === true;
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.warn(`[opentabs] isAdapterPresent failed for tab ${String(tabId)}, plugin ${pluginName}:`, err);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Verify that the injected adapter reports the expected version.
|
|
30
|
+
* Returns true if versions match, false on mismatch or failure.
|
|
31
|
+
* Logs a warning on mismatch so the injection pipeline continues.
|
|
32
|
+
*/
|
|
33
|
+
const verifyAdapterVersion = async (tabId, pluginName, expectedVersion) => {
|
|
34
|
+
try {
|
|
35
|
+
const results = await chrome.scripting.executeScript({
|
|
36
|
+
target: { tabId },
|
|
37
|
+
world: 'MAIN',
|
|
38
|
+
func: (pName) => {
|
|
39
|
+
const ot = globalThis.__openTabs;
|
|
40
|
+
return ot?.adapters?.[pName]?.version;
|
|
41
|
+
},
|
|
42
|
+
args: [pluginName],
|
|
43
|
+
});
|
|
44
|
+
const first = results[0];
|
|
45
|
+
const version = first?.result;
|
|
46
|
+
if (version !== expectedVersion) {
|
|
47
|
+
console.warn(`[opentabs] Adapter version mismatch for ${pluginName}: expected ${expectedVersion}, got ${String(version)}`);
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
console.warn(`[opentabs] Failed to verify adapter version for ${pluginName}`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/** Read the adapter hash from the page for a given plugin. Returns undefined on failure. */
|
|
58
|
+
const readAdapterHash = async (tabId, pluginName) => {
|
|
59
|
+
try {
|
|
60
|
+
const results = await chrome.scripting.executeScript({
|
|
61
|
+
target: { tabId },
|
|
62
|
+
world: 'MAIN',
|
|
63
|
+
func: (pName) => {
|
|
64
|
+
const ot = globalThis.__openTabs;
|
|
65
|
+
return ot?.adapters?.[pName]?.__adapterHash;
|
|
66
|
+
},
|
|
67
|
+
args: [pluginName],
|
|
68
|
+
});
|
|
69
|
+
const first = results[0];
|
|
70
|
+
return typeof first?.result === 'string' ? first.result : undefined;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Verify that the injected adapter's content hash matches the expected hash.
|
|
78
|
+
* Returns true if hashes match, false otherwise. Does not throw.
|
|
79
|
+
*/
|
|
80
|
+
const verifyAdapterHash = async (tabId, pluginName, expectedHash) => {
|
|
81
|
+
const hash = await readAdapterHash(tabId, pluginName);
|
|
82
|
+
return hash === expectedHash;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Inject a log relay listener into a tab's ISOLATED world.
|
|
86
|
+
* Listens for 'opentabs:plugin-logs' postMessages from the MAIN world adapter
|
|
87
|
+
* and forwards batched log entries to the background via chrome.runtime.sendMessage.
|
|
88
|
+
*
|
|
89
|
+
* A per-tab cryptographic nonce prevents malicious page scripts from spoofing
|
|
90
|
+
* log entries. The nonce is generated here and shared with both worlds:
|
|
91
|
+
* - ISOLATED world: validates `data.nonce` on every received postMessage
|
|
92
|
+
* - MAIN world: stored on `globalThis.__openTabs._logNonce`, read by the
|
|
93
|
+
* adapter IIFE's flushLogs() and included in every postMessage call
|
|
94
|
+
*/
|
|
95
|
+
const injectLogRelay = async (tabId) => {
|
|
96
|
+
const nonce = crypto.randomUUID();
|
|
97
|
+
try {
|
|
98
|
+
// 1. Install the ISOLATED world listener with the nonce for validation
|
|
99
|
+
await chrome.scripting.executeScript({
|
|
100
|
+
target: { tabId },
|
|
101
|
+
world: 'ISOLATED',
|
|
102
|
+
func: (n) => {
|
|
103
|
+
// Idempotent guard: only register the listener once per tab.
|
|
104
|
+
// When re-invoked (e.g., on re-injection), the existing listener
|
|
105
|
+
// stays in place — the new nonce is injected into MAIN world so
|
|
106
|
+
// the adapter picks it up, and the ISOLATED listener accepts
|
|
107
|
+
// messages with ANY previously registered nonce via a Set.
|
|
108
|
+
const guard = '__opentabs_log_relay';
|
|
109
|
+
const win = window;
|
|
110
|
+
if (win[guard]) {
|
|
111
|
+
// Add the new nonce to the accepted set
|
|
112
|
+
const nonceSet = win.__opentabs_log_nonces;
|
|
113
|
+
if (nonceSet)
|
|
114
|
+
nonceSet.add(n);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
win[guard] = true;
|
|
118
|
+
const nonces = new Set([n]);
|
|
119
|
+
win.__opentabs_log_nonces = nonces;
|
|
120
|
+
window.addEventListener('message', event => {
|
|
121
|
+
if (event.source !== window)
|
|
122
|
+
return;
|
|
123
|
+
const data = event.data;
|
|
124
|
+
if (!data || data.type !== 'opentabs:plugin-logs')
|
|
125
|
+
return;
|
|
126
|
+
if (typeof data.nonce !== 'string' || !nonces.has(data.nonce))
|
|
127
|
+
return;
|
|
128
|
+
const plugin = data.plugin;
|
|
129
|
+
const entries = data.entries;
|
|
130
|
+
if (typeof plugin !== 'string' || !Array.isArray(entries) || entries.length === 0)
|
|
131
|
+
return;
|
|
132
|
+
chrome.runtime.sendMessage({ type: 'plugin:logs', plugin, entries }).catch(() => {
|
|
133
|
+
// Background may not be listening — drop silently
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
},
|
|
137
|
+
args: [nonce],
|
|
138
|
+
});
|
|
139
|
+
// 2. Inject the nonce into MAIN world on globalThis.__openTabs._logNonce.
|
|
140
|
+
// The adapter IIFE reads this value in its flushLogs() function and
|
|
141
|
+
// includes it in every postMessage call. On re-injection, the nonce is
|
|
142
|
+
// updated so the adapter picks up the new value on the next flush.
|
|
143
|
+
await chrome.scripting.executeScript({
|
|
144
|
+
target: { tabId },
|
|
145
|
+
world: 'MAIN',
|
|
146
|
+
func: (n) => {
|
|
147
|
+
const ot = (globalThis.__openTabs ?? {});
|
|
148
|
+
globalThis.__openTabs = ot;
|
|
149
|
+
ot._logNonce = n;
|
|
150
|
+
},
|
|
151
|
+
args: [nonce],
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
console.warn(`[opentabs] injectLogRelay failed for tab ${String(tabId)}:`, err);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Inject an adapter file into a single tab via chrome.scripting.executeScript.
|
|
160
|
+
*
|
|
161
|
+
* Uses content-hashed filenames so each adapter version gets a unique path,
|
|
162
|
+
* bypassing Chrome's aggressive caching of executeScript({ files }) content.
|
|
163
|
+
* The `files` option bypasses all page CSP restrictions because file-based
|
|
164
|
+
* injection is not subject to page CSP.
|
|
165
|
+
*/
|
|
166
|
+
const injectAdapterFile = async (tabId, pluginName, version, adapterHash, adapterFilePath) => {
|
|
167
|
+
// Inject the log relay in ISOLATED world before the adapter IIFE (MAIN world)
|
|
168
|
+
// so postMessage listeners are in place when the adapter starts logging.
|
|
169
|
+
await injectLogRelay(tabId);
|
|
170
|
+
const adapterFile = adapterFilePath ?? `adapters/${pluginName}.js`;
|
|
171
|
+
try {
|
|
172
|
+
await chrome.scripting.executeScript({
|
|
173
|
+
target: { tabId },
|
|
174
|
+
world: 'MAIN',
|
|
175
|
+
files: [adapterFile],
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
throw new Error(`Failed to inject adapter file '${adapterFile}' into tab ${String(tabId)}: ${toErrorMessage(err)}`);
|
|
180
|
+
}
|
|
181
|
+
if (version) {
|
|
182
|
+
await verifyAdapterVersion(tabId, pluginName, version);
|
|
183
|
+
}
|
|
184
|
+
if (adapterHash) {
|
|
185
|
+
const hashMatched = await verifyAdapterHash(tabId, pluginName, adapterHash);
|
|
186
|
+
if (!hashMatched) {
|
|
187
|
+
// Retry once after a short delay — the file may have been partially written
|
|
188
|
+
await new Promise(resolve => setTimeout(resolve, INJECTION_RETRY_DELAY_MS));
|
|
189
|
+
try {
|
|
190
|
+
await chrome.scripting.executeScript({
|
|
191
|
+
target: { tabId },
|
|
192
|
+
world: 'MAIN',
|
|
193
|
+
files: [adapterFile],
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
throw new Error(`Failed to re-inject adapter file '${adapterFile}' into tab ${String(tabId)}: ${toErrorMessage(err)}`);
|
|
198
|
+
}
|
|
199
|
+
if (version) {
|
|
200
|
+
await verifyAdapterVersion(tabId, pluginName, version);
|
|
201
|
+
}
|
|
202
|
+
const retryMatched = await verifyAdapterHash(tabId, pluginName, adapterHash);
|
|
203
|
+
if (!retryMatched) {
|
|
204
|
+
const actualHash = await readAdapterHash(tabId, pluginName);
|
|
205
|
+
throw new Error(`Adapter hash mismatch for ${pluginName} after retry: expected ${adapterHash}, got ${String(actualHash)}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* Collect all unique tab IDs matching the given URL patterns.
|
|
212
|
+
* Queries each pattern independently and deduplicates by tab ID.
|
|
213
|
+
*/
|
|
214
|
+
const queryMatchingTabIds = async (urlPatterns) => {
|
|
215
|
+
const tabIds = new Set();
|
|
216
|
+
for (const pattern of urlPatterns) {
|
|
217
|
+
try {
|
|
218
|
+
const tabs = await chrome.tabs.query({ url: pattern });
|
|
219
|
+
for (const tab of tabs) {
|
|
220
|
+
if (tab.id !== undefined) {
|
|
221
|
+
tabIds.add(tab.id);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
console.warn(`[opentabs] chrome.tabs.query failed for pattern ${pattern}:`, err);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return Array.from(tabIds);
|
|
230
|
+
};
|
|
231
|
+
/**
|
|
232
|
+
* Call an adapter's teardown() function in a tab via chrome.scripting.executeScript.
|
|
233
|
+
* Swallows errors — the injection pipeline continues regardless of teardown outcome.
|
|
234
|
+
*/
|
|
235
|
+
const teardownAdapterInTab = async (tabId, pluginName) => {
|
|
236
|
+
await chrome.scripting
|
|
237
|
+
.executeScript({
|
|
238
|
+
target: { tabId },
|
|
239
|
+
world: 'MAIN',
|
|
240
|
+
func: (pName) => {
|
|
241
|
+
const ot = globalThis.__openTabs;
|
|
242
|
+
const adapter = ot?.adapters?.[pName];
|
|
243
|
+
if (adapter && typeof adapter.teardown === 'function') {
|
|
244
|
+
try {
|
|
245
|
+
adapter.teardown();
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
console.warn('[opentabs] teardown error:', e);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
args: [pluginName],
|
|
253
|
+
})
|
|
254
|
+
.catch((err) => {
|
|
255
|
+
console.warn(`[opentabs] adapter teardown script failed for ${pluginName}:`, err);
|
|
256
|
+
});
|
|
257
|
+
};
|
|
258
|
+
/**
|
|
259
|
+
* Replace a tab's frozen `__openTabs` container with a mutable copy,
|
|
260
|
+
* preserving all adapter entries (including the one about to be re-injected).
|
|
261
|
+
*
|
|
262
|
+
* The `hashAndFreeze` snippet (appended by the plugin build) makes
|
|
263
|
+
* `__openTabs.adapters` non-writable and `adapters[pluginName]` non-configurable.
|
|
264
|
+
* When the adapter IIFE runs during re-injection, its entry code
|
|
265
|
+
* (`globalThis.__openTabs.adapters = globalThis.__openTabs.adapters || {}`)
|
|
266
|
+
* throws `TypeError: Cannot assign to read only property 'adapters'` in
|
|
267
|
+
* strict mode. This function rebuilds `__openTabs` and `adapters` as fresh
|
|
268
|
+
* mutable objects so the IIFE can initialize without errors.
|
|
269
|
+
*
|
|
270
|
+
* The target plugin's adapter entry is preserved (as a writable property) so
|
|
271
|
+
* the IIFE wrapper's own teardown logic can find the existing adapter, call
|
|
272
|
+
* `onDeactivate()` and `teardown()`, then replace it — maintaining the correct
|
|
273
|
+
* lifecycle hook ordering (constructor clears stale markers, then teardown sets
|
|
274
|
+
* fresh markers).
|
|
275
|
+
*/
|
|
276
|
+
const prepareForReinjection = async (tabId) => {
|
|
277
|
+
await chrome.scripting
|
|
278
|
+
.executeScript({
|
|
279
|
+
target: { tabId },
|
|
280
|
+
world: 'MAIN',
|
|
281
|
+
func: () => {
|
|
282
|
+
const ot = globalThis.__openTabs;
|
|
283
|
+
if (!ot)
|
|
284
|
+
return;
|
|
285
|
+
const adapters = ot.adapters;
|
|
286
|
+
if (!adapters)
|
|
287
|
+
return;
|
|
288
|
+
// Build a new adapters object preserving all entries. Each adapter's
|
|
289
|
+
// value is copied directly (the frozen adapter object stays frozen for
|
|
290
|
+
// integrity), but the PROPERTY on the new container is writable +
|
|
291
|
+
// configurable so the IIFE wrapper can delete/replace it.
|
|
292
|
+
const newAdapters = {};
|
|
293
|
+
for (const key of Object.keys(adapters)) {
|
|
294
|
+
newAdapters[key] = adapters[key];
|
|
295
|
+
}
|
|
296
|
+
// Build a new __openTabs object, copying all non-adapters properties.
|
|
297
|
+
const newOt = {};
|
|
298
|
+
for (const key of Object.keys(ot)) {
|
|
299
|
+
if (key === 'adapters')
|
|
300
|
+
continue;
|
|
301
|
+
const desc = Object.getOwnPropertyDescriptor(ot, key);
|
|
302
|
+
if (desc)
|
|
303
|
+
Object.defineProperty(newOt, key, desc);
|
|
304
|
+
}
|
|
305
|
+
newOt.adapters = newAdapters;
|
|
306
|
+
// Replace globalThis.__openTabs with the new mutable container
|
|
307
|
+
globalThis.__openTabs = newOt;
|
|
308
|
+
},
|
|
309
|
+
args: [],
|
|
310
|
+
})
|
|
311
|
+
.catch((err) => {
|
|
312
|
+
console.warn(`[opentabs] prepareForReinjection failed:`, err);
|
|
313
|
+
});
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* Injects a plugin's adapter IIFE into all tabs matching its URL patterns.
|
|
317
|
+
*
|
|
318
|
+
* @param pluginName - The plugin's unique name (validated against reserved names)
|
|
319
|
+
* @param urlPatterns - Chrome match patterns identifying which tabs to inject into
|
|
320
|
+
* @param forceReinject - When `true`, re-inject even if the adapter is already
|
|
321
|
+
* present (used by plugin.update to overwrite stale adapter code). When `false`
|
|
322
|
+
* (default), tabs that already have the adapter are skipped.
|
|
323
|
+
* @param version - Expected adapter version string for post-injection verification
|
|
324
|
+
* @param adapterHash - Expected content hash for post-injection integrity check
|
|
325
|
+
* @param adapterFile - Relative path to the content-hashed adapter file (e.g., "adapters/my-plugin-a1b2c3d4.js")
|
|
326
|
+
* @returns Tab IDs where injection succeeded
|
|
327
|
+
*/
|
|
328
|
+
const injectPluginIntoMatchingTabs = async (pluginName, urlPatterns, forceReinject = false, version, adapterHash, adapterFile) => {
|
|
329
|
+
if (!isSafePluginName(pluginName)) {
|
|
330
|
+
console.warn(`[opentabs] Skipping injection for unsafe plugin name: ${pluginName}`);
|
|
331
|
+
return [];
|
|
332
|
+
}
|
|
333
|
+
const tabIds = await queryMatchingTabIds(urlPatterns);
|
|
334
|
+
// Process all tabs in parallel: check presence + inject
|
|
335
|
+
const results = await Promise.allSettled(tabIds.map(async (tabId) => {
|
|
336
|
+
if (!forceReinject && (await isAdapterPresent(tabId, pluginName))) {
|
|
337
|
+
return tabId;
|
|
338
|
+
}
|
|
339
|
+
// Replace frozen __openTabs/adapters with mutable copies so the new
|
|
340
|
+
// IIFE can initialize. The IIFE wrapper handles its own teardown
|
|
341
|
+
// lifecycle (onDeactivate → teardown → delete → install new adapter)
|
|
342
|
+
// in the correct order, so we do NOT call teardownAdapterInTab here.
|
|
343
|
+
if (forceReinject) {
|
|
344
|
+
await prepareForReinjection(tabId);
|
|
345
|
+
}
|
|
346
|
+
await injectAdapterFile(tabId, pluginName, version, adapterHash, adapterFile);
|
|
347
|
+
return tabId;
|
|
348
|
+
}));
|
|
349
|
+
const injectedTabIds = [];
|
|
350
|
+
for (const result of results) {
|
|
351
|
+
if (result.status === 'fulfilled') {
|
|
352
|
+
injectedTabIds.push(result.value);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return injectedTabIds;
|
|
356
|
+
};
|
|
357
|
+
/**
|
|
358
|
+
* Injects all stored plugins whose URL patterns match the given tab.
|
|
359
|
+
* Called on `chrome.tabs.onUpdated` (status=complete) so that tabs opened
|
|
360
|
+
* after `sync.full` still get their adapter files.
|
|
361
|
+
*
|
|
362
|
+
* @param tabId - The Chrome tab ID to inject adapters into
|
|
363
|
+
* @param tabUrl - The tab's current URL, used to filter plugins by URL pattern match
|
|
364
|
+
*/
|
|
365
|
+
const injectPluginsIntoTab = async (tabId, tabUrl) => {
|
|
366
|
+
const index = await getAllPluginMeta();
|
|
367
|
+
const plugins = Object.values(index);
|
|
368
|
+
if (plugins.length === 0)
|
|
369
|
+
return;
|
|
370
|
+
// Filter to plugins whose URL patterns match this tab and have safe names
|
|
371
|
+
const matching = plugins.filter(p => isSafePluginName(p.name) && urlMatchesPatterns(tabUrl, p.urlPatterns));
|
|
372
|
+
if (matching.length === 0)
|
|
373
|
+
return;
|
|
374
|
+
// Check presence for all matching plugins in parallel
|
|
375
|
+
const presenceResults = await Promise.allSettled(matching.map(async (plugin) => ({
|
|
376
|
+
plugin,
|
|
377
|
+
present: await isAdapterPresent(tabId, plugin.name),
|
|
378
|
+
})));
|
|
379
|
+
const needsInjection = presenceResults
|
|
380
|
+
.filter((r) => r.status === 'fulfilled' && !r.value.present)
|
|
381
|
+
.map(r => r.value.plugin);
|
|
382
|
+
if (needsInjection.length === 0)
|
|
383
|
+
return;
|
|
384
|
+
// Inject all needed plugins in parallel
|
|
385
|
+
await Promise.allSettled(needsInjection.map(async (plugin) => {
|
|
386
|
+
try {
|
|
387
|
+
await injectAdapterFile(tabId, plugin.name, plugin.version, plugin.adapterHash, plugin.adapterFile);
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
console.warn(`[opentabs] Injection failed for tab ${String(tabId)}, plugin ${plugin.name}:`, err);
|
|
391
|
+
}
|
|
392
|
+
}));
|
|
393
|
+
};
|
|
394
|
+
/**
|
|
395
|
+
* Removes an injected adapter from all tabs matching the plugin's URL patterns.
|
|
396
|
+
* Calls the adapter's `teardown()` function and deletes it from `__openTabs.adapters`.
|
|
397
|
+
*
|
|
398
|
+
* @param pluginName - The plugin whose adapter should be removed
|
|
399
|
+
* @param urlPatterns - Chrome match patterns identifying which tabs to clean up
|
|
400
|
+
*/
|
|
401
|
+
const cleanupAdaptersInMatchingTabs = async (pluginName, urlPatterns) => {
|
|
402
|
+
if (!isSafePluginName(pluginName)) {
|
|
403
|
+
console.warn(`[opentabs] Skipping cleanup for unsafe plugin name: ${pluginName}`);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
const tabIds = await queryMatchingTabIds(urlPatterns);
|
|
407
|
+
// Run cleanup scripts in parallel across all matching tabs
|
|
408
|
+
await Promise.allSettled(tabIds.map(async (tabId) => {
|
|
409
|
+
try {
|
|
410
|
+
await chrome.scripting.executeScript({
|
|
411
|
+
target: { tabId },
|
|
412
|
+
world: 'MAIN',
|
|
413
|
+
func: (pName) => {
|
|
414
|
+
const ot = globalThis.__openTabs;
|
|
415
|
+
const adapters = ot?.adapters;
|
|
416
|
+
if (!adapters)
|
|
417
|
+
return;
|
|
418
|
+
const adapter = adapters[pName];
|
|
419
|
+
if (adapter) {
|
|
420
|
+
if (typeof adapter.teardown === 'function') {
|
|
421
|
+
try {
|
|
422
|
+
adapter.teardown();
|
|
423
|
+
}
|
|
424
|
+
catch (e) {
|
|
425
|
+
console.warn('[opentabs] teardown error:', e);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// Attempt deletion; if the property is non-configurable (locked
|
|
429
|
+
// by hashAndFreeze), rebuild the adapters container without the
|
|
430
|
+
// removed plugin and replace __openTabs on globalThis.
|
|
431
|
+
if (!Reflect.deleteProperty(adapters, pName)) {
|
|
432
|
+
const newAdapters = {};
|
|
433
|
+
for (const key of Object.keys(adapters)) {
|
|
434
|
+
if (key !== pName) {
|
|
435
|
+
const desc = Object.getOwnPropertyDescriptor(adapters, key);
|
|
436
|
+
if (desc)
|
|
437
|
+
Object.defineProperty(newAdapters, key, desc);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
delete globalThis.__openTabs;
|
|
441
|
+
globalThis.__openTabs = Object.assign({}, ot, {
|
|
442
|
+
adapters: newAdapters,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
args: [pluginName],
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
catch (err) {
|
|
451
|
+
console.warn(`[opentabs] Cleanup failed for tab ${String(tabId)}, plugin ${pluginName}:`, err);
|
|
452
|
+
}
|
|
453
|
+
}));
|
|
454
|
+
};
|
|
455
|
+
/**
|
|
456
|
+
* Re-injects all stored plugins into their matching tabs on extension startup.
|
|
457
|
+
* Runs all plugin injections in parallel, logging warnings for any failures.
|
|
458
|
+
*/
|
|
459
|
+
const reinjectStoredPlugins = async () => {
|
|
460
|
+
const index = await getAllPluginMeta();
|
|
461
|
+
const plugins = Object.values(index);
|
|
462
|
+
if (plugins.length === 0)
|
|
463
|
+
return;
|
|
464
|
+
const results = await Promise.allSettled(plugins.map(plugin => injectPluginIntoMatchingTabs(plugin.name, plugin.urlPatterns, false, plugin.version, plugin.adapterHash, plugin.adapterFile)));
|
|
465
|
+
for (let i = 0; i < results.length; i++) {
|
|
466
|
+
const result = results[i];
|
|
467
|
+
if (result && result.status === 'rejected') {
|
|
468
|
+
const plugin = plugins[i];
|
|
469
|
+
console.warn(`[opentabs] Failed to reinject stored plugin ${plugin?.name ?? 'unknown'}:`, result.reason);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
};
|
|
473
|
+
export { cleanupAdaptersInMatchingTabs, injectPluginIntoMatchingTabs, injectPluginsIntoTab, isSafePluginName, queryMatchingTabIds, reinjectStoredPlugins, teardownAdapterInTab, verifyAdapterVersion, };
|
|
474
|
+
//# sourceMappingURL=iife-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iife-injection.js","sourceRoot":"","sources":["../src/iife-injection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** JSON-RPC 2.0 standard error codes */
|
|
2
|
+
export declare const JSONRPC_METHOD_NOT_FOUND = -32601;
|
|
3
|
+
export declare const JSONRPC_INVALID_PARAMS = -32602;
|
|
4
|
+
export declare const JSONRPC_INTERNAL_ERROR = -32603;
|
|
5
|
+
/** Application-defined JSON-RPC error codes (reserved range -32000 to -32099) */
|
|
6
|
+
export declare const JSONRPC_NO_USABLE_TAB = -32001;
|
|
7
|
+
export declare const JSONRPC_ADAPTER_NOT_READY = -32002;
|
|
8
|
+
//# sourceMappingURL=json-rpc-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc-errors.d.ts","sourceRoot":"","sources":["../src/json-rpc-errors.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAE7C,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAC5C,eAAO,MAAM,yBAAyB,SAAS,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** JSON-RPC 2.0 standard error codes */
|
|
2
|
+
export const JSONRPC_METHOD_NOT_FOUND = -32601;
|
|
3
|
+
export const JSONRPC_INVALID_PARAMS = -32602;
|
|
4
|
+
export const JSONRPC_INTERNAL_ERROR = -32603;
|
|
5
|
+
/** Application-defined JSON-RPC error codes (reserved range -32000 to -32099) */
|
|
6
|
+
export const JSONRPC_NO_USABLE_TAB = -32001;
|
|
7
|
+
export const JSONRPC_ADAPTER_NOT_READY = -32002;
|
|
8
|
+
//# sourceMappingURL=json-rpc-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc-errors.js","sourceRoot":"","sources":["../src/json-rpc-errors.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,CAAC;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAK,CAAC;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAK,CAAC;AAE7C,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,CAAC;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAK,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical list of JSON-RPC methods the browser extension handles.
|
|
3
|
+
*
|
|
4
|
+
* Both the offscreen document's ALLOWED_METHODS allowlist and the background
|
|
5
|
+
* script's methodHandlers dispatch table derive from these constants, ensuring
|
|
6
|
+
* they stay in sync. A unit test verifies the invariant.
|
|
7
|
+
*/
|
|
8
|
+
/** Methods routed to handlers in the background script's dispatch table */
|
|
9
|
+
export declare const DISPATCH_METHODS: readonly ["sync.full", "plugin.update", "plugin.uninstall", "tool.dispatch", "resource.read", "prompt.get", "browser.listTabs", "browser.openTab", "browser.closeTab", "browser.navigateTab", "browser.focusTab", "browser.getTabInfo", "browser.screenshotTab", "browser.getTabContent", "browser.getPageHtml", "browser.getStorage", "browser.clickElement", "browser.typeText", "browser.selectOption", "browser.waitForElement", "browser.queryElements", "browser.getCookies", "browser.setCookie", "browser.deleteCookies", "browser.enableNetworkCapture", "browser.getNetworkRequests", "browser.disableNetworkCapture", "browser.getConsoleLogs", "browser.clearConsoleLogs", "browser.executeScript", "browser.listResources", "browser.getResourceContent", "browser.pressKey", "browser.scroll", "browser.hoverElement", "browser.handleDialog", "extension.reload", "extension.getState", "extension.getLogs", "extension.getSidePanel", "extension.checkAdapter", "extension.forceReconnect"];
|
|
10
|
+
/**
|
|
11
|
+
* Methods allowed through the offscreen WebSocket filter but NOT routed to
|
|
12
|
+
* a handler in methodHandlers. These are either:
|
|
13
|
+
* - handled directly by the offscreen document (pong)
|
|
14
|
+
* - forwarded to the side panel without a dispatch handler (invocation events)
|
|
15
|
+
*/
|
|
16
|
+
export declare const PASSTHROUGH_METHODS: readonly ["pong", "tool.invocationStart", "tool.invocationEnd", "confirmation.request", "plugins.changed"];
|
|
17
|
+
/** All methods the offscreen document allows through the WebSocket filter */
|
|
18
|
+
export declare const ALL_ALLOWED_METHODS: readonly ["sync.full", "plugin.update", "plugin.uninstall", "tool.dispatch", "resource.read", "prompt.get", "browser.listTabs", "browser.openTab", "browser.closeTab", "browser.navigateTab", "browser.focusTab", "browser.getTabInfo", "browser.screenshotTab", "browser.getTabContent", "browser.getPageHtml", "browser.getStorage", "browser.clickElement", "browser.typeText", "browser.selectOption", "browser.waitForElement", "browser.queryElements", "browser.getCookies", "browser.setCookie", "browser.deleteCookies", "browser.enableNetworkCapture", "browser.getNetworkRequests", "browser.disableNetworkCapture", "browser.getConsoleLogs", "browser.clearConsoleLogs", "browser.executeScript", "browser.listResources", "browser.getResourceContent", "browser.pressKey", "browser.scroll", "browser.hoverElement", "browser.handleDialog", "extension.reload", "extension.getState", "extension.getLogs", "extension.getSidePanel", "extension.checkAdapter", "extension.forceReconnect", "pong", "tool.invocationStart", "tool.invocationEnd", "confirmation.request", "plugins.changed"];
|
|
19
|
+
//# sourceMappingURL=known-methods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-methods.d.ts","sourceRoot":"","sources":["../src/known-methods.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,68BA2CnB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,4GAMtB,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,8iCAAyD,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical list of JSON-RPC methods the browser extension handles.
|
|
3
|
+
*
|
|
4
|
+
* Both the offscreen document's ALLOWED_METHODS allowlist and the background
|
|
5
|
+
* script's methodHandlers dispatch table derive from these constants, ensuring
|
|
6
|
+
* they stay in sync. A unit test verifies the invariant.
|
|
7
|
+
*/
|
|
8
|
+
/** Methods routed to handlers in the background script's dispatch table */
|
|
9
|
+
export const DISPATCH_METHODS = [
|
|
10
|
+
'sync.full',
|
|
11
|
+
'plugin.update',
|
|
12
|
+
'plugin.uninstall',
|
|
13
|
+
'tool.dispatch',
|
|
14
|
+
'resource.read',
|
|
15
|
+
'prompt.get',
|
|
16
|
+
'browser.listTabs',
|
|
17
|
+
'browser.openTab',
|
|
18
|
+
'browser.closeTab',
|
|
19
|
+
'browser.navigateTab',
|
|
20
|
+
'browser.focusTab',
|
|
21
|
+
'browser.getTabInfo',
|
|
22
|
+
'browser.screenshotTab',
|
|
23
|
+
'browser.getTabContent',
|
|
24
|
+
'browser.getPageHtml',
|
|
25
|
+
'browser.getStorage',
|
|
26
|
+
'browser.clickElement',
|
|
27
|
+
'browser.typeText',
|
|
28
|
+
'browser.selectOption',
|
|
29
|
+
'browser.waitForElement',
|
|
30
|
+
'browser.queryElements',
|
|
31
|
+
'browser.getCookies',
|
|
32
|
+
'browser.setCookie',
|
|
33
|
+
'browser.deleteCookies',
|
|
34
|
+
'browser.enableNetworkCapture',
|
|
35
|
+
'browser.getNetworkRequests',
|
|
36
|
+
'browser.disableNetworkCapture',
|
|
37
|
+
'browser.getConsoleLogs',
|
|
38
|
+
'browser.clearConsoleLogs',
|
|
39
|
+
'browser.executeScript',
|
|
40
|
+
'browser.listResources',
|
|
41
|
+
'browser.getResourceContent',
|
|
42
|
+
'browser.pressKey',
|
|
43
|
+
'browser.scroll',
|
|
44
|
+
'browser.hoverElement',
|
|
45
|
+
'browser.handleDialog',
|
|
46
|
+
'extension.reload',
|
|
47
|
+
'extension.getState',
|
|
48
|
+
'extension.getLogs',
|
|
49
|
+
'extension.getSidePanel',
|
|
50
|
+
'extension.checkAdapter',
|
|
51
|
+
'extension.forceReconnect',
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Methods allowed through the offscreen WebSocket filter but NOT routed to
|
|
55
|
+
* a handler in methodHandlers. These are either:
|
|
56
|
+
* - handled directly by the offscreen document (pong)
|
|
57
|
+
* - forwarded to the side panel without a dispatch handler (invocation events)
|
|
58
|
+
*/
|
|
59
|
+
export const PASSTHROUGH_METHODS = [
|
|
60
|
+
'pong',
|
|
61
|
+
'tool.invocationStart',
|
|
62
|
+
'tool.invocationEnd',
|
|
63
|
+
'confirmation.request',
|
|
64
|
+
'plugins.changed',
|
|
65
|
+
];
|
|
66
|
+
/** All methods the offscreen document allows through the WebSocket filter */
|
|
67
|
+
export const ALL_ALLOWED_METHODS = [...DISPATCH_METHODS, ...PASSTHROUGH_METHODS];
|
|
68
|
+
//# sourceMappingURL=known-methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-methods.js","sourceRoot":"","sources":["../src/known-methods.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB;IAClB,oBAAoB;IACpB,uBAAuB;IACvB,uBAAuB;IACvB,qBAAqB;IACrB,oBAAoB;IACpB,sBAAsB;IACtB,kBAAkB;IAClB,sBAAsB;IACtB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,8BAA8B;IAC9B,4BAA4B;IAC5B,+BAA+B;IAC/B,wBAAwB;IACxB,0BAA0B;IAC1B,uBAAuB;IACvB,uBAAuB;IACvB,4BAA4B;IAC5B,kBAAkB;IAClB,gBAAgB;IAChB,sBAAsB;IACtB,sBAAsB;IACtB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,wBAAwB;IACxB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM;IACN,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;IACtB,iBAAiB;CACT,CAAC;AAEX,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,mBAAmB,CAAU,CAAC"}
|