API coverage
What chrome.* looks like inside Caspian, namespace by namespace. Anything not listed answers instead of throwing: unknown functions resolve to undefined, unknown on* members are events that never fire.
| Namespace | Status | Notes |
|---|---|---|
| runtime | Implemented | id, getURL, getManifest, sendMessage (sync/async/promise responses, sender with tab and origin), connect/onConnect ports, onMessage, onInstalled/onStartup, openOptionsPage, reload, getPlatformInfo, lastError. No native messaging. |
| storage | Implemented | local, sync (a second local area), session (memory), managed (empty). get/set/remove/clear/getKeys/getBytesInUse, onChanged globally and per area. |
| tabs | Implemented | query (active, currentWindow, url patterns, status, audible), get, getCurrent, create, update (url, active, muted), remove, reload, duplicate, goBack/goForward, highlight, sendMessage, connect, executeScript/insertCSS (MV2), captureVisibleTab (current tab). onCreated/onUpdated/onActivated/onRemoved/onHighlighted. |
| windows | Partial | getCurrent/getAll/get, create (tabs in the front window), update (focus, minimize), remove. |
| action / browserAction / pageAction | Implemented | setBadgeText, setBadgeBackgroundColor, setTitle, setIcon (paths), setPopup, openPopup, onClicked (fires when there is no popup). |
| scripting | Implemented | executeScript (files, func + args), insertCSS, registerContentScripts / unregisterContentScripts / getRegisteredContentScripts. |
| declarativeNetRequest | Partial | Static rulesets, dynamic (persisted) and session rules. block, allow, allowAllRequests, redirect (url, extensionPath, regexSubstitution, transform), upgradeScheme, modifyHeaders for request headers. Evaluated in Caspian's request interceptor, indexed by urlFilter token. No response-header rules, no matched-rule counts. |
| webRequest | Partial | Observation only: onBeforeRequest fires with urls/types filters honoured. Blocking listeners cannot cancel — the request has already gone out. |
| contextMenus | Implemented | create/update/remove/removeAll with contexts, parents and %s; entries in the page menu, grouped under the extension when it has several. onClicked with Chrome's info. |
| commands | Implemented | Manifest commands become window shortcuts (Caspian's own win a clash). onCommand; _execute_action opens the popup. |
| notifications | Partial | create shows a Caspian toast; onClicked, onClosed. No buttons or progress. |
| alarms | Implemented | In-context timers; the background never sleeps, so they hold. |
| i18n | Implemented | getMessage with placeholders and substitutions, getUILanguage, getAcceptLanguages. |
| offscreen | Implemented | createDocument/closeDocument/hasDocument — a hidden page that receives runtime messages. |
| webNavigation | Partial | onBeforeNavigate, onCommitted, onDOMContentLoaded, onCompleted for the main frame; getAllFrames. |
| permissions | Answers only | contains/request answer true: everything in the manifest is granted. |
| fontSettings | Partial | getFontList returns the system's families; the rest answers with defaults. |
| bookmarks | Partial | getTree, search, create. |
| downloads | Partial | download(url, filename). |
| search, identity | Partial | search.query opens a search; identity.launchWebAuthFlow opens the page in a tab and cannot capture the redirect. |
| history, cookies | Answers only | Answer empty. |
| idle, privacy, management, tabGroups, tts, sidePanel, gcm | Answers only | Sane defaults, no behaviour. |
| devtools, omnibox, userScripts, nativeMessaging | Not available | Not available. |
| caspian | Implemented | Caspian's own: status(text, ms), theme(), version(). |
Manifest keys
Read: name, version, description, icons, action / browser_action / page_action (default_title, default_icon, default_popup), background (service_worker, scripts, page, type module), content_scripts (matches, exclude_matches, js, css, run_at, all_frames, match_about_blank, world), options_ui.page / options_page, permissions, host_permissions, commands, declarative_net_request, default_locale, web_accessible_resources (served regardless), chrome_url_overrides.newtab. Ignored: content_security_policy, devtools_page, side_panel, omnibox, minimum_chrome_version.
Engine-level behaviour
Extension pages fetch their host permissions without CORS through Keel's engine hook (Chromium's own exemption list, the same mechanism Chrome uses). Requests from extension pages carry Origin: chrome-extension://<id>. declarativeNetRequest rules run inside the request interceptor before Caspian's own blocker; a block, redirect or upgrade from any extension decides the request.