From e1d9b8c87493d87b09be12fed4b57615cc9a5163 Mon Sep 17 00:00:00 2001 From: am0 Date: Mon, 8 Sep 2025 10:50:09 +0200 Subject: [PATCH] =?UTF-8?q?feat(lib/browser-api):=20dodaj=20warstw=C4=99?= =?UTF-8?q?=20abstrakcji=20Browser=20API=20dla=20wsparcia=20Chrome=20i=20F?= =?UTF-8?q?irefox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wprowadza infrastrukturę umożliwiającą budowanie rozszerzenia dla Chrome i Firefox z jednej bazy kodu. Mapuje różnice w API między przeglądarkami na ujednolicone interfejsy. ZMIANY: * lib/browser-api/types.ts - typy oparte na analizie rzeczywistego użycia API w kodzie * lib/browser-api/firefox.ts - adapter mapujący browser.* na BrowserAPI * lib/browser-api/chrome.ts - adapter mapujący chrome.* na BrowserAPI * lib/browser-api/index.ts - build-time selection adaptera na podstawie TARGET KLUCZOWE RÓŻNICE OBSŁUŻONE: - Firefox: browser.browserAction.* vs Chrome: chrome.action.* - Firefox: browser.tabs.* vs Chrome: chrome.tabs.* - Firefox: browser.cookies.* vs Chrome: chrome.cookies.* - Firefox: browser.webRequest.* vs Chrome: chrome.webRequest.* TYPY OPARTE NA FAKTYCZNYM UŻYCIU: Przeanalizowano 4 pliki używające browser API: - memory.ts: badge, webRequest, cookies, extension API - toolbar.tsx: tabs.query, tabs.onUpdated, windows.WINDOW_ID_CURRENT - tab-dropdown.tsx: tabs.query - util.ts: tabs.query STATUS: Preparatory change - istniejący kod pozostaje niezmieniony. Kolejne commity będą refaktorować pliki do używania nowej abstrakcji. TARGET: Umożliwienie > rentgen@0.1.10 build:firefox > TARGET=firefox node esbuild.config.js Add-on was built i > rentgen@0.1.10 build:chrome > TARGET=chrome node esbuild.config.js Add-on was built --- .gitignore | 7 +++ lib/browser-api/chrome.ts | 54 ++++++++++++++++ lib/browser-api/firefox.ts | 54 ++++++++++++++++ lib/browser-api/index.ts | 27 ++++++++ lib/browser-api/types.ts | 124 +++++++++++++++++++++++++++++++++++++ 5 files changed, 266 insertions(+) create mode 100644 lib/browser-api/chrome.ts create mode 100644 lib/browser-api/firefox.ts create mode 100644 lib/browser-api/index.ts create mode 100644 lib/browser-api/types.ts diff --git a/.gitignore b/.gitignore index dc0131f..88a0e70 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,10 @@ sidebar.js lib/* /yarn-error.log /rentgen.zip + +# Generated PNG icons (build artifacts) +/assets/icons/*.png +/assets/icon-addon-*.png + +# Exception: do not ignore the `browser-api` directory inside `lib` +!/lib/browser-api/ \ No newline at end of file diff --git a/lib/browser-api/chrome.ts b/lib/browser-api/chrome.ts new file mode 100644 index 0000000..5431819 --- /dev/null +++ b/lib/browser-api/chrome.ts @@ -0,0 +1,54 @@ +/** + * Chrome Browser API Implementation + * + * Mapuje Chrome chrome.* API na nasze ujednolicone BrowserAPI + */ + +import type { BrowserAPI } from './types'; + +// Chrome używa globalnego obiektu `chrome` +declare const chrome: any; + +export const chromeAPI: BrowserAPI = { + // Tabs API - chrome.tabs.* → tabs.* + tabs: { + query: chrome.tabs.query, + onUpdated: { + addListener: chrome.tabs.onUpdated.addListener, + removeListener: chrome.tabs.onUpdated.removeListener, + }, + }, + + // Badge API - Chrome używa action (nie browserAction) + badge: { + setBadgeText: chrome.action.setBadgeText, + setTitle: chrome.action.setTitle, + setBadgeBackgroundColor: chrome.action.setBadgeBackgroundColor, + }, + + // WebRequest API - chrome.webRequest.* → webRequest.* + webRequest: { + onBeforeRequest: { + addListener: chrome.webRequest.onBeforeRequest.addListener, + }, + onBeforeSendHeaders: { + addListener: chrome.webRequest.onBeforeSendHeaders.addListener, + }, + }, + + // Cookies API - chrome.cookies.* → cookies.* + cookies: { + getAll: chrome.cookies.getAll, + remove: chrome.cookies.remove, + }, + + // Extension API - chrome.extension.* → extension.* + extension: { + getBackgroundPage: chrome.extension.getBackgroundPage, + }, + + // Windows API - chrome.windows.* → windows.* + windows: { + WINDOW_ID_CURRENT: chrome.windows.WINDOW_ID_CURRENT, + }, +}; \ No newline at end of file diff --git a/lib/browser-api/firefox.ts b/lib/browser-api/firefox.ts new file mode 100644 index 0000000..911f0a7 --- /dev/null +++ b/lib/browser-api/firefox.ts @@ -0,0 +1,54 @@ +/** + * Firefox Browser API Implementation + * + * Mapuje Firefox browser.* API na nasze ujednolicone BrowserAPI + */ + +import type { BrowserAPI } from './types'; + +// Firefox używa globalnego obiektu `browser` +declare const browser: any; + +export const firefoxAPI: BrowserAPI = { + // Tabs API - direct mapping + tabs: { + query: browser.tabs.query, + onUpdated: { + addListener: browser.tabs.onUpdated.addListener, + removeListener: browser.tabs.onUpdated.removeListener, + }, + }, + + // Badge API - Firefox używa browserAction + badge: { + setBadgeText: browser.browserAction.setBadgeText, + setTitle: browser.browserAction.setTitle, + setBadgeBackgroundColor: browser.browserAction.setBadgeBackgroundColor, + }, + + // WebRequest API - direct mapping + webRequest: { + onBeforeRequest: { + addListener: browser.webRequest.onBeforeRequest.addListener, + }, + onBeforeSendHeaders: { + addListener: browser.webRequest.onBeforeSendHeaders.addListener, + }, + }, + + // Cookies API - direct mapping + cookies: { + getAll: browser.cookies.getAll, + remove: browser.cookies.remove, + }, + + // Extension API - direct mapping + extension: { + getBackgroundPage: browser.extension.getBackgroundPage, + }, + + // Windows API - direct mapping + windows: { + WINDOW_ID_CURRENT: browser.windows.WINDOW_ID_CURRENT, + }, +}; \ No newline at end of file diff --git a/lib/browser-api/index.ts b/lib/browser-api/index.ts new file mode 100644 index 0000000..119d6c1 --- /dev/null +++ b/lib/browser-api/index.ts @@ -0,0 +1,27 @@ +/** + * Browser API Abstraction - Main Export + * + * Eksportuje właściwą implementację na podstawie TARGET build variable + */ + +import type { BrowserAPI } from './types'; + +// Build-time selection of browser API implementation +let browserApi: BrowserAPI; + +// TARGET jest ustawiane przez esbuild.config.js na podstawie npm script +if (process.env.TARGET === 'chrome') { + // Chrome build - używamy chrome adapter + const { chromeAPI } = require('./chrome'); + browserApi = chromeAPI; +} else { + // Firefox build (default) - używamy firefox adapter + const { firefoxAPI } = require('./firefox'); + browserApi = firefoxAPI; +} + +// Eksportuj jako default export +export default browserApi; + +// Re-export typów dla wygody +export * from './types'; \ No newline at end of file diff --git a/lib/browser-api/types.ts b/lib/browser-api/types.ts new file mode 100644 index 0000000..8e7cf41 --- /dev/null +++ b/lib/browser-api/types.ts @@ -0,0 +1,124 @@ +/** + * Browser API Abstraction - Typy na podstawie faktycznego użycia w kodzie + * + * Przeanalizowane pliki: + * - util.ts: tabs.query, Tab.id + * - tab-dropdown.tsx: tabs.query, Tab.id, Tab.title + * - toolbar.tsx: tabs.query, tabs.onUpdated, Tab.url, windows.WINDOW_ID_CURRENT + * - memory.ts: browserAction.*, webRequest.*, cookies.*, extension.* + */ + +// === Tab API (util.ts, tab-dropdown.tsx, toolbar.tsx) === +export interface Tab { + id?: number; // util.ts: tab.id, tab-dropdown.tsx: tab.id + title?: string; // tab-dropdown.tsx: tab.title + url?: string; // toolbar.tsx: tab.url +} + +export interface TabQuery { + currentWindow?: boolean; // util.ts, tab-dropdown.tsx + active?: boolean; // toolbar.tsx + windowId?: number; // toolbar.tsx +} + +// === Badge/BrowserAction API (memory.ts) === +export interface BadgeTextDetails { + text: string; // memory.ts: setBadgeText + tabId?: number; // memory.ts: setBadgeText (optional) +} + +export interface BadgeTitleDetails { + title: string; // memory.ts: setTitle + tabId?: number; // memory.ts: setTitle (optional) +} + +export interface BadgeColorDetails { + color: string; // memory.ts: setBadgeBackgroundColor +} + +// === WebRequest API (memory.ts) === +export interface RequestDetails { + requestId: string; // memory.ts: request.requestId + requestHeaders?: RequestHeader[]; // memory.ts: request.requestHeaders + // Note: ExtendedRequest konstruktor używa więcej pól, + // ale tu skupiamy się na tym co bezpośrednio używa browser API +} + +export interface RequestHeader { + name: string; + value?: string; +} + +export interface RequestFilter { + urls: string[]; // memory.ts: { urls: [''] } +} + +export type RequestListener = (details: RequestDetails) => void; + +// === Cookies API (memory.ts) === +export interface Cookie { + name: string; // memory.ts: cookie.name + domain: string; // memory.ts: cookie.domain +} + +export interface CookieQuery { + domain?: string; // memory.ts: { domain: shorthost } +} + +export interface CookieRemove { + name: string; // memory.ts: { name: cookie.name, url: ... } + url: string; // memory.ts: { url: `https://${cookie.domain}` } +} + +// === Main Browser API Interface === +export interface BrowserAPI { + // Tabs API + tabs: { + query(queryInfo: TabQuery): Promise; + onUpdated: { + addListener(listener: (tabId: number, changeInfo: any, tab: Tab) => void): void; + removeListener(listener: (tabId: number, changeInfo: any, tab: Tab) => void): void; + }; + }; + + // Badge API (Firefox: browserAction, Chrome: action) + badge: { + setBadgeText(details: BadgeTextDetails): void; + setTitle(details: BadgeTitleDetails): void; + setBadgeBackgroundColor(details: BadgeColorDetails): void; + }; + + // WebRequest API + webRequest: { + onBeforeRequest: { + addListener( + listener: RequestListener, + filter: RequestFilter, + extraInfoSpec?: string[] + ): void; + }; + onBeforeSendHeaders: { + addListener( + listener: RequestListener, + filter: RequestFilter, + extraInfoSpec?: string[] + ): void; + }; + }; + + // Cookies API + cookies: { + getAll(details: CookieQuery): Promise; + remove(details: CookieRemove): Promise; + }; + + // Extension API + extension: { + getBackgroundPage(): Window | null; + }; + + // Windows API + windows: { + WINDOW_ID_CURRENT: number; + }; +} \ No newline at end of file