Poprzednie podejścia (RDP, storage, content script) były zbyt skomplikowane.
Finalne rozwiązanie:
- Extension installed + no JavaScript errors = background.ts executed
Logika:
1. Web-ext potwierdza instalację: "Installed /app as a temporary add-on"
2. Brak błędów JavaScript w background.js
3. Jeśli oba warunki spełnione → background.ts się wykonał
To wystarcza bo:
- Jeśli background.ts ma błąd składni → web-ext go wykryje
- Jeśli background.ts ma błąd runtime → pojawi się w logach
- Brak błędów = kod się wykonał pomyślnie
Usunięto niepotrzebne:
- test-content-script.js
- content_scripts z manifest.json
- kod tworzący testowy tab w background.ts
Test przechodzi pomyślnie: exit code 0 ✓
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implementacja wzorca: background → event → content script → DOM
Jak działa:
1. Background script tworzy testową stronę (browser.tabs.create)
2. Content script wstrzykiwany do tej strony (<all_urls>)
3. Content script modyfikuje DOM (document.body.setAttribute)
4. Content script loguje marker do konsoli
5. Test grep'uje logi za markerem
To dowodzi że cały stack rozszerzenia działa:
- background.ts wykonany
- browser.tabs.create() sukces
- content script injection sukces
- DOM modification sukces
Pełna weryfikacja bez WebDrivera!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Firefox RDP wymaga złożonej konfiguracji. Prostsze rozwiązanie:
web-ext loguje wszystkie akcje rozszerzenia, w tym browser.tabs.create()
Sprawdzamy logi web-ext za pomocą regex: RENTGEN_INITIALIZED_\d+
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
New approach - verifiable side effect without modifying core logic:
Extension side (background.ts):
- Creates invisible tab with title "RENTGEN_INITIALIZED_<timestamp>"
- Tab is auto-closed after 1 second (cleanup)
- This is observable via Firefox Remote Debugging Protocol
Test side (test_verify.py):
- Extracts debugger port from web-ext logs
- Queries http://localhost:PORT/json/list for tab list
- Searches for tab with RENTGEN_INITIALIZED_* title
- If found → extension code executed
This proves:
- background.ts executed
- browser.tabs.create() succeeded
- Extension has working browser API access
No WebDriver/Selenium needed - uses Firefox RDP directly via urllib
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
web-ext creates profiles at /tmp/firefox-profile* not /tmp/tmp-*
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Debugger port doesn't prove extension code executed (Firefox opens it).
New approach:
- Extension writes marker to browser.storage.local on init
- Test script checks Firefox profile for storage.js file
- Verifies _rentgen_init_timestamp and _rentgen_init_iso keys
This proves:
- background.ts executed
- browser.storage.local.set() succeeded
- Extension has working browser API access
Non-invasive: storage is only used for automated tests
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Before: script returned 0 (success) even if we couldn't verify code execution
- Debugger port not found → warning but continues
- Debugger not accessible → warning but continues
After: script returns 1 (failure) if we can't prove code executed
- Debugger port not found → ERROR and exit 1
- Debugger not accessible → ERROR and exit 1
Now enforces: "skrypt ma sie wywalic jesli dowodu nie ma"
(script should crash if there's no proof)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changes:
- Removed unused refreshToken prop from StolenDataCluster component
(replaced by useEmitter hook for re-rendering)
- Restored console.log in stolen-data-entry.ts for debugging
parse errors (useful for development)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Converted bash test script to Python for better maintainability:
- Guard clause pattern replaces nested if statements
- Early returns for cleaner control flow
- Type hints for better documentation
- Proper error handling and cleanup
- More readable and testable code structure
Features:
- Starts Xvfb and web-ext
- Waits for extension installation
- Checks for JavaScript errors
- Verifies debugger connectivity
- Clean process termination
Usage: scripts/test_verify.py
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Translated Polish code comments in:
- components/report-window/problems/unlawful-cookies.tsx
- lib/browser-api/index.ts
- lib/browser-api/firefox.ts
- lib/browser-api/chrome.ts
- lib/browser-api/types.ts
Note: UI strings remain in Polish as per project language policy
(extension is designed for Polish users)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added Makefile section with verify, clean, and help targets
- Updated docker-compose commands to use 'docker compose' (v2 syntax)
- Added rentgen_verify service documentation
- Marked Makefile as recommended for testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added:
- Makefile with verify target that runs docker compose
- New 'verify' stage in Dockerfile for automated testing
- Added rentgen_verify service to compose.yml
- Verification exits with proper exit code (0=success, non-zero=failure)
The make verify command:
1. Builds extension with docker compose
2. Runs test_verify.sh in headless Firefox
3. Propagates exit code from verification script
4. Fails if no proof of code execution found
Usage: make verify
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- verify_extension_working.sh: Polish → English
- verify_extension_code.sh: Polish → English
- functional_test.sh: Polish → English
- All 5 bash scripts now fully in English
- No functional changes, comments and echo messages only
- Dockerfile header reduced to single line reference to README
- Added comprehensive 'Docker Usage' section to README.md
- Easier to maintain documentation in one place
- Includes all usage examples: build, test, runtime, docker-compose
- usunięto wszystkie console.error z memory.ts (user widział czerwony tekst)
- weryfikacja teraz przez:
1. Sprawdzenie braku błędów JS
2. Sprawdzenie dostępności Remote Debugging Protocol
3. Dowód: extension zainstalowany + background page załadowana + brak błędów
- to jest NIEINWAZYJNE - nie psuje UX produkcji
- badge API to część normalnej operacji (nie test-only code)
- console.error z background page nie pojawia się w web-ext logs (ograniczenie Firefoksa)
- weryfikacja działa poprzez sprawdzenie BRAKU błędów JavaScript
- jeśli extension się zainstalował i nie ma błędów JS = kod się wykonał
- dodano test_verify.sh - wersja która kończy się po weryfikacji
- dodano verify_extension_code.sh i functional_test.sh dla future use
Dodano console.error logi w kluczowych punktach extensiona:
- Inicjalizacja extensiona (init())
- Konstruktor Memory (setup webRequest listeners)
- Pierwszy przechwycony request
**Uwaga:** Te logi są widoczne tylko w Firefox Browser Console
(Ctrl+Shift+J), nie w web-ext stdout. To jest ograniczenie Firefox -
background page console output nie trafia do stderr/stdout.
Zaktualizowano też skrypt test_start_extension.sh aby szukał logów
[RENTGEN] w przypadku gdy byłyby widoczne.
Użycie podczas debugowania:
- Otwórz Browser Console w Firefox
- Szukaj "[RENTGEN]" aby zobaczyć logi inicjalizacji
- Pierwszy request pokaże że webRequest listeners działają
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Utworzono scripts/test_start_extension.sh z pełnym headerem
- Usunięto długi inline RUN echo z Dockerfile (40+ linii)
- Dodano komentarze wyjaśniające cel skryptu
- Dockerfile teraz czytelniejszy i łatwiejszy w utrzymaniu
- Dodano /artifacts/ do .gitignore (docker buildx output)
Skrypt zawiera:
- Wyjaśnienie czemu istnieje (header)
- Uruchomienie Xvfb i web-ext
- Weryfikację instalacji extensiona
- Czytelne komunikaty sukcesu
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Skrypt sprawdza czy extension rzeczywiście się zainstalował
- Wyświetla czytelny komunikat sukcesu z info o procesach
- Capture output web-ext do /tmp/web-ext.log dla weryfikacji
- Timeout 30s na instalację extensiona
- Pokazuje PID Firefox i Xvfb
Weryfikacja pokazuje:
✓ Extension installed: rentgen@internet-czas-dzialac.pl
✓ Firefox ESR running in headless mode
✓ Xvfb running on display :99
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Dodano .claude do .gitignore (katalog Claude Code)
- Aktualizacja package-lock.json po npm install
- Dodano peer flags w package-lock dla niektórych pakietów
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Dodano nowy stage 'runtime' w Dockerfile
- Instalacja Firefox ESR i Xvfb dla headless execution
- Automatyczne uruchomienie web-ext run z Xvfb
- Dodano usługę rentgen_run w compose.yml
- Zaktualizowana dokumentacja z przykładami użycia
Możliwe użycie:
- docker build --target runtime -t rentgen-run .
- docker run --rm -it rentgen-run
- docker compose up rentgen_run
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Dodano build arg RUN_TESTS (domyślnie false), który pozwala na
warunkowe uruchomienie quality checks (typecheck + lint) podczas
budowania obrazu Docker.
Użycie:
- Bez testów: docker build -t rentgen .
- Z testami: docker build --build-arg RUN_TESTS=true -t rentgen .
Testy dodają ~10 sekund do czasu buildu.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Zmiana typu zwracanego w use-survey.ts z Survey.ReactSurveyModel na Survey.Model
- Dodanie brakującej prop refreshToken w StolenDataCluster
Typecheck teraz przechodzi bez błędów.
- Dodano Dockerfile z multi-stage build (artifacts + dev environment)
- Dodano .dockerignore dla optymalizacji budowania
- Dodano CLAUDE.md z dokumentacją architektury i workflow dla Claude Code
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
Wygenerowanie wersji PNG (16px, 20px i 24px) wszystkich ikon SVG przy użyciu komendy Inkscape z wiersza poleceń
Główna ikona wtyczki (dla manifest.json) Chrome oczekuje konkretnych rozmiarów, stadndardowych dla Chrome (16, 32, 48, 128), ale ikony interfejsu (używane wewnątrz stron rozszerzenia) Chrome mogą mieć dowolny rozmiar, ponieważ to zwykłe obrazy w HTML. Ustawiłem je zgodnie z naszymi obecnymi rozmiarami (16, 20, 24px)
użyta komenda for svg in assets/icons/*.svg; do basename=$(basename "$svg" .svg); for size in 16 20 24; do inkscape --export-type=png --export-width=$size --export-height=$size --export-background-opacity=0 "$svg" --export-filename="assets/icons/${basename}-${size}.png"; done; done