61 Commits

Author SHA1 Message Date
am0
ffb37f9d61 feat/refactor: Chrome MV3 Support + Refaktoryzacja architektury dla kompatybilności obu przeglądarek
## 🎯 Cel
Dodanie pełnego wsparcia dla Chrome Manifest V3 przy zachowaniu kompatybilności z Firefox. Główne wyzwanie: Chrome MV3 używa service workerów zamiast persistent background pages, co wymaga nowej architektury zarządzania pamięcią.

---

## 🏗️ Architektura

### Nowa warstwa abstrakcji: lib/browser-api/

**lib/browser-api/index.ts**
- Główny punkt wejścia do zunifikowanego API
- Wybiera właściwą implementację na podstawie zmiennej TARGET (build-time)
- Eksportuje jeden interfejs dla całej aplikacji

**lib/browser-api/types.ts**
- Wspólne definicje typów dla obu przeglądarek
- Interfejs BrowserAPI definiujący wszystkie potrzebne metody
- Typy dla tabs, badge, webRequest, cookies, extension, windows

**lib/browser-api/firefox.ts**
- Adapter dla Firefox browser.* API
- Lazy access do globalnego obiektu browser (bezpieczne dla środowisk bez Firefox API)
- Wszystkie metody zwracają Promise lub są no-op jeśli API niedostępne

**lib/browser-api/chrome.ts**
- Adapter dla Chrome chrome.* API
- Mapowanie chrome.action → badge (różnica nazewnictwa)
- Ochrona przed błędami gdy karta zostaje zamknięta (try-catch w operacjach badge)

---

## 🔧 Build System

### esbuild.config.js
- **Dodano**: Rozpoznawanie zmiennej środowiskowej TARGET (firefox/chrome)
- **Dodano**: Różne katalogi wyjściowe (dist-firefox, dist-chrome)
- **Dodano**: Kopiowanie odpowiedniego manifestu na podstawie TARGET
- **Dodano**: Plugin do konwersji ikon SVG → PNG dla Chrome (wymaga PNG w MV3)
- **Zmieniono**: define zawiera teraz process.env.TARGET dostępny w runtime

### package.json
- **Dodano**: Skrypty build:firefox, build:chrome, watch:firefox, watch:chrome
- **Dodano**: Skrypty build-addon:firefox, build-addon:chrome do tworzenia paczek
- **Dodano**: Skrypt convert-icons do generowania PNG z SVG
- **Dodano**: Zależność sharp do konwersji obrazów

### scripts/convert-icons.js (NOWY PLIK)
- Konwertuje assets/icon-addon.svg → PNG w rozmiarach 16, 32, 48, 128px
- Wymagane dla Chrome (MV3 nie akceptuje SVG w manifestach)

### manifest-chrome.json (NOWY PLIK)
- Manifest V3 dla Chrome
- background.service_worker zamiast background.scripts
- action zamiast browser_action
- Ikony PNG zamiast SVG
- host_permissions zamiast embedowanych w permissions

---

## 🧠 Pamięć i Stan (NAJWIĘKSZA ZMIANA)

### memory.ts - Kompletna refaktoryzacja

**Problem Chrome MV3:**
- Service worker może być wyładowany w dowolnym momencie
- Brak dostępu do window.memory z popup/sidebar
- chrome.extension.getBackgroundPage() zwraca null w MV3

**Rozwiązanie:**
1. **Service Worker**: Trzyma pełne dane, synchronizuje do chrome.storage.session
2. **Popup/Sidebar**: Tworzy własną instancję Memory czytając z storage
3. **Throttled sync**: Maksymalnie co 500ms zapisy do storage (wydajność)

**Nowa klasa: CachedRequestCluster**
- Dziedziczy po RequestCluster ale NIE ma rzeczywistych requestów
- Przechowuje tylko metadane: hasCookies, exposesOrigin, hasMarks
- Implementuje wszystkie wymagane metody zwracając cached state
- Używana TYLKO w popup/report window w Chrome

**Zmiany w Memory klasie:**
- **Dodano**: isReady flag i readyPromise dla async inicjalizacji (Chrome)
- **Dodano**: waitUntilReady() - popup musi poczekać na załadowanie danych
- **Dodano**: tabUrls: Map<number, string> - tracking pełnych URL dla Chrome (service worker nie dostaje documentUrl)
- **Dodano**: scheduleSyncToStorage() - throttled sync do storage
- **Dodano**: syncToStorage() - serializacja clustrów do JSON
- **Dodano**: loadFromStorage() - deserializacja przy starcie popup
- **Zmieniono**: register() śledzi main_frame URL i synuje po każdej zmianie
- **Zmieniono**: Badge operacje w try-catch (karta może być zamknięta)

**Funkcja getMemory():**
- **Firefox**: browserAPI.extension.getBackgroundPage().memory (tradycyjnie)
- **Chrome Service Worker**: self.memory (jesteśmy W service workerze)
- **Chrome Popup**: Tworzy NOWĄ instancję czytając z storage (cachowana jako popupMemoryInstance)

---

## 🔒 Bezpieczeństwo i Obsługa Błędów

### util.ts - getshorthost()
- **Dodano**: Walidacja wejścia (null, undefined, pusty string)
- **Dodano**: Czyszczenie URL (protokół, ścieżka, port)
- **Dodano**: Obsługa edge cases (localhost, single word domains)
- **Dodano**: Bezpieczne fallbacki zamiast crashowania
- **Dodano**: Console.warn zamiast milczących błędów

### extended-request.ts
- **MASYWNE POPRAWKI** parsowania URL w konstruktorze
- **Dodano**: isValidHttpUrl() helper - sprawdza czy URL zaczyna się od http(s)
- **Dodano**: safeParseUrl() helper - try-catch wokół new URL()
- **Dodano**: Próba parsowania wielu URL w kolejności priorytetów
- **Dodano**: Obsługa Chrome MV3 initiator property
- **Dodano**: Bezpieczne defaulty gdy parsowanie się nie uda (unknown://unknown)
- **Zmieniono**: isThirdParty() pomija requesty z unparseable URLs
- **Dodano**: uint8ArrayToString() - chunked konwersja dużych arrayów (zapobiega stack overflow)
- **Zmieniono**: Request body processing używa chunked konwersji

---

## 🎨 UI Components

### toolbar.tsx (popup)
- **Dodano**: getCurrentTab() z retry mechanism (Chrome czasem nie zwraca karty od razu)
- **Dodano**: Sprawdzanie memoryReady przed renderowaniem danych
- **Dodano**: Wywołanie waitUntilReady() w useEffect
- **Dodano**: Opóźnienie 200ms dla Chrome przy inicjalizacji (service worker + storage delay)
- **Dodano**: Graceful handling gdy popup otwarty bez active tab

### sidebar.tsx
- **Dodano**: Stan memoryReady i loading screen dla Chrome
- **Dodano**: Wywołanie waitUntilReady() przed dostępem do danych
- **Dodano**: Conditional rendering - pokazuje Ładowanie... gdy pamięć nie gotowa

### report-window.tsx
- **Dodano**: Stan memoryReady i loading message
- **Dodano**: Wywołanie waitUntilReady() przed generowaniem raportu
- **Dodano**: Fallback konstruowania URL z origin gdy brak visited_url
- **Zmieniono**: Filtr clustrów używa hasMarks() zamiast getMarkedRequests().length

### stolen-data-cluster.tsx
- **Bez znaczących zmian** - działa z abstrakcją RequestCluster

---

## 🐛 Poprawki Bugów

### background.ts
- **Dodano**: Diagnostic logging do debugowania inicjalizacji
- **Dodano**: Try-catch wokół init() z error logging
- **Dodano**: Różne logi dla Firefox vs Chrome

### memory.ts - badge operations
- **Dodano**: Try-catch wokół wszystkich operacji badge
- Zapobiega crashowaniu gdy użytkownik zamknie kartę podczas operacji

### chrome.ts - badge adapter
- **Dodano**: Try-catch w setBadgeText, setTitle, setBadgeBackgroundColor
- Chrome rzuca błędy gdy operujemy na zamkniętych kartach

---

## 📝 Workflow Użytkownika (Chrome)

1. **Użytkownik odwiedza stronę** → Service worker rejestruje requesty → Auto-mark podejrzanych → Sync do storage
2. **Użytkownik otwiera popup** → Tworzy Memory → Czyta ze storage → Pokazuje dane z flagami
3. **Użytkownik (od)zaznacza domeny** → Zmienia flagi → Sync do storage
4. **Użytkownik generuje raport** → Otwiera report-window → Czyta ze storage → Filtruje według hasMarks()

---

##  Rezultat

-  **Firefox**: Działa jak wcześniej (background page + window.memory)
-  **Chrome**: Pełne wsparcie MV3 (service worker + storage.session)
-  **Wspólny kod**: 95% kodu jest shared, tylko warstwa dostępu do API różni się
-  **Bezpieczeństwo**: Obsługa wszystkich edge cases w parsowaniu URL
-  **Wydajność**: Throttled sync do storage (max co 500ms)
-  **UX**: Loading states w popup/sidebar dla Chrome
-  **Build**: npm run build-addon:firefox lub npm build-addon dla firefox / npm run build:chrome dla chrome
2025-10-18 13:08:14 +02:00
546233e093 Prawo telekomunikacyjne → Prawo Komunikacji Elektronicznej
Dzięki @kayo77@pol.social za sygnał, aby to poprawić
2025-07-19 15:31:46 +02:00
1680026bc4 Typos 2023-06-21 17:14:40 +02:00
d5a8172759 Fix typos 2023-06-21 17:14:07 +02:00
32107f0ebc Dodanie explainerów dot. cookies na podstawie komentarzy, od których
odwołał się WSA w uzasadnieniu wyroku w sprawie z iSecure
2022-09-25 14:03:06 +02:00
1106e86b41 Merge pull request 'Problem: nieznany cel. Dodanie narzędzi diagnostycznych' (#99) from unknown-purpose into develop
Reviewed-on: #99
2022-09-12 09:47:52 +02:00
aae1a7e970 HOTFIX: nie działały URL-e, które mają '#' 2022-09-02 22:07:04 +02:00
3a32456534 Fix $ typo 2022-09-01 07:47:16 +02:00
67544a4bff Finish broken sentence 2022-08-31 21:23:35 +02:00
ea59a506f8 Problem: nieznany cel. Fixes #68 #97 2022-08-13 22:42:50 +02:00
5f29730613 Zmiana wordingu w problemie z administratorem. Wyświetlanie pytania o
konieczność w większej ilości przypadków
2022-07-31 16:01:01 +02:00
09dfe8d63a Change domain of screenshot service 2022-07-15 14:14:42 +02:00
Arkadiusz Wieczorek
3d9711b605 Fix typo 2022-07-15 14:06:28 +02:00
adf82b3dd6 Send to screenshot service only the domains that are marked 2022-07-15 12:11:24 +02:00
520a26923e Reduce live preview flicker. Make the preview the first item 2022-07-15 12:11:11 +02:00
7c4de6fc5c Use thumnbails instead of full screenshots for previews 2022-07-15 12:10:10 +02:00
4163bf3cf7 Change preview width so it fits the entire screenshot 2022-07-15 12:09:29 +02:00
Arkadiusz Wieczorek
4f17c5164a Fix address bar animation 2022-07-15 10:53:26 +02:00
Arkadiusz Wieczorek
1c773becf3 Add live preview 2022-07-15 10:25:20 +02:00
Arkadiusz Wieczorek
fddf8b4de1 Adjust css styles 2022-07-14 23:05:45 +02:00
10038467ae Notka informacyjna o screenshotach 2022-07-14 22:43:33 +02:00
Arkadiusz Wieczorek
0d9226ad1f Survey fixes 2022-07-10 13:52:48 +02:00
94f054df16 Include deps in the zip 2022-07-10 12:32:57 +02:00
Arkadiusz Wieczorek
0c05df45cf Update browser style 2022-07-09 21:43:51 +02:00
61e01c5244 Display current action while polling screenshots 2022-07-09 21:28:34 +02:00
f4f287a3bb Fix report not working 2022-07-09 20:20:05 +02:00
4a030e47c3 Fix react warnings
Closes #55
2022-07-09 16:52:29 +02:00
8a93cf5463 Fix mozilla linter problems 2022-07-09 16:41:22 +02:00
416a6aa340 Fix typechecks. Closes #54 2022-07-09 15:51:34 +02:00
e1d97f0411 typecheck fixes checkpoint 2022-07-09 15:28:37 +02:00
Arkadiusz Wieczorek
f44daf4909 Cleanup 2022-07-09 10:53:20 +02:00
Arkadiusz Wieczorek
3271af3896 Fix address url in browser on screenshots view 2022-07-08 23:13:57 +02:00
Arkadiusz Wieczorek
fae0a8d8b7 Download buttons for screenshots 2022-07-08 22:42:49 +02:00
895260b096 Add Unknown Identity problem
Closes #10
2022-07-08 21:13:50 +02:00
ebad5ab022 lowercase the verb options 2022-07-08 21:01:55 +02:00
2b763cd7e8 Closes #19 - dodanie alternatywnych templatek (raport vs email) 2022-07-08 20:53:12 +02:00
69115b9e64 Copy na intro 2022-07-08 17:07:11 +02:00
7118a597f1 remove logs 2022-07-08 12:53:34 +02:00
316e4ab50c Typo 2022-07-07 22:18:52 +02:00
3ab97b23aa Add OutsideEU problem, improve wording 2022-07-07 22:10:03 +02:00
f39bfd12b5 Add unknown-legal-basis problem 2022-07-07 21:16:48 +02:00
052eb5eb89 Improve wording and explainers 2022-07-07 19:59:16 +02:00
Arkadiusz Wieczorek
592122a7da Add intro to survey 2022-07-06 20:01:14 +02:00
Arkadiusz Wieczorek
e47bb1e9b8 Updates 2022-07-06 18:50:35 +02:00
Arkadiusz Wieczorek
8492022a11 Translate surveyjs 2022-07-03 19:51:04 +02:00
Arkadiusz Wieczorek
534f9f3db6 Add minor UI fixes 2022-07-03 19:35:36 +02:00
Arkadiusz Wieczorek
9a1287c35b Fix styling for mail and generating images, add copy button, add images 2022-07-03 14:28:42 +02:00
58c40efc79 Handle new screenshot-service API 2022-06-17 11:47:51 +02:00
Arkadiusz Wieczorek
48809c7cc5 Fix margin padding in report-window 2022-05-22 18:27:18 +02:00
Arkadiusz Wieczorek
83e8498459 Add style for mail template 2022-05-22 18:22:29 +02:00