@toocoolname/chrome-proxy
v1.1.0
Published
Small helpers for working with Chrome extension APIs in extension and page modes.
Readme
chrome-proxy
Small helpers for working with Chrome extension APIs in extension and page modes.
extension: use the real Chrome APIs when the app runs as an extensionpage: use page-safe shims when the app runs as a normal web page
Storage behavior
createChromeStorage('extension')
- uses the Chrome extension APIs directly
storage.localmaps tochrome.storage.localstorage.sessionmaps tochrome.storage.sessionstorage.syncmaps tochrome.storage.sync
createChromeStorage('page')
- keeps the same API shape for
local,session, andsync - adds
localStorageas a page-friendly alias forlocal - adds
sessionStorageandsyncStorageas page-friendly aliases forsessionandsync - exposes
chrome.localStorage,chrome.sessionStorage, andchrome.syncStorageglobally in page mode for easy local development and testing - persists page-mode
localandsyncvalues through browserlocalStoragewhen available - persists page-mode
sessionvalues through browsersessionStoragewhen available - also exposes the storage shim on
window.__chromeProxyPage.storage
Example
import { createChromeStorage } from '@toocoolname/chrome-proxy';
const storage = createChromeStorage('page');
await storage.localStorage.set('theme', 'dark');
await storage.sessionStorage.set('draft', { id: 1 });
await storage.syncStorage.set('prefs', { compact: true });
const theme = await storage.local.get<string>('theme');
// page mode only
await chrome.localStorage.set('token', 'demo');
await chrome.sessionStorage.set('session-id', 'page-mode');
await chrome.syncStorage.set('settings', { compact: true });
const extensionStorage = createChromeStorage('extension');
await extensionStorage.local.set('theme', 'dark'); // uses chrome.storage.local
await extensionStorage.session.set('draft', { id: 1 }); // uses chrome.storage.session
await extensionStorage.sync.set('prefs', { compact: true }); // uses chrome.storage.syncMessage behavior
createChromeMessage('extension'): useschrome.runtimeandchrome.tabscreateChromeMessage('page'): uses the in-memory page-mode message bus- page mode exposes
window.__chromeProxyPage.message.dispatchLocal(...) - page mode exposes
window.__chromeProxyPage.message.dispatchExternal(...)
Tabs behavior
createChromeTabs('extension'): useschrome.tabscreateChromeTabs('page'): uses an in-memory tab model withquery,get,onUpdated,onRemoved, andonActivated- page mode exposes
window.__chromeProxyPage.tabsfor test control
Playwright / MCP
When your UI is loaded as a normal page, create the page-mode shims in the app and then drive them from Playwright with page.evaluate.
import { createChromeMessage, createChromeStorage, createChromeTabs } from '@toocoolname/chrome-proxy';
const storage = createChromeStorage('page');
const message = createChromeMessage('page');
const tabs = createChromeTabs('page');await page.evaluate(() => {
window.__chromeProxyPage.tabs.set([
{ id: 1, index: 0, windowId: 1, active: true, highlighted: true, pinned: false, selected: true, incognito: false, discarded: false, autoDiscardable: true, frozen: false, groupId: -1, status: 'complete', url: 'https://app.local/', title: 'App' }
]);
});
await page.evaluate(() => {
return window.__chromeProxyPage.message.dispatchLocal({
type: 'PING',
payload: { ok: true }
});
});Useful page-mode test hooks:
window.__chromeProxyPage.storagewindow.__chromeProxyPage.message.dispatchLocal(message, sender?)window.__chromeProxyPage.message.dispatchExternal(message, sender?)window.__chromeProxyPage.tabs.list()window.__chromeProxyPage.tabs.set(tabs)window.__chromeProxyPage.tabs.create(tab)window.__chromeProxyPage.tabs.update(tabId, updates)window.__chromeProxyPage.tabs.activate(tabId)window.__chromeProxyPage.tabs.remove(tabId)window.__chromeProxyPage.tabs.reset()
TypeScript users can also import the page-bridge types directly from the package.
Notes
- Use
chrome.localStorage,chrome.sessionStorage, andchrome.syncStorageonly in page mode. - In extension mode, the actual Chrome APIs are
chrome.storage.local,chrome.storage.session, andchrome.storage.sync.
