# FoxBrowser — інструкція для наступного агента ## Мета проєкту FoxBrowser — Windows-first легкий фоновий браузер для музики/відео. Мета — не зробити ще один Chromium-клон, а зменшити кількість одночасно живого web-коду, renderer-ів, мережевих ресурсів і візуального навантаження. Ключовий сценарій: користувач відкриває багато логічних вкладок, але у фоні реально працює одна або кілька медіа-вкладок. Важливо не ламати звук і повертати стан вкладки після перемикання. ## Стек і запуск - C# / .NET 8; - WPF; - Microsoft.Web.WebView2 `1.0.2903.40`; - Windows 10 1809+ і Microsoft Edge WebView2 Runtime. Поточний агент працює в Linux sandbox без `dotnet`, Windows SDK та WebView2 Runtime, тому перед релізом потрібно запускати: ```powershell dotnet restore dotnet build -c Debug dotnet run --project .\FoxBrowser.csproj ``` ## Що вже зроблено ### Shell і UI - WPF shell, адресний рядок, назад/вперед/оновити; - логічні вкладки; - системний трей; - кнопка `♫ Audio`; - явна кнопка `Перейти`; - address bar синхронізується з активною вкладкою і оновлюється після навігації по посиланнях; - закриття вкладок виправлено на WPF `Button`. ### Один WebView2 `Core/TabManager.cs` використовує **один спільний WebView2**. `BrowserTab` у `Tab.cs` містить тільки metadata: URL, title, scroll position, media position, прапори Audio/playing/loading. При перемиканні: 1. поточний URL/scroll/media state зберігається через JS; 2. активною стає інша логічна вкладка; 3. єдиний WebView2 переходить на її URL; 4. після `NavigationCompleted` відновлюються scroll position, currentTime і playback, якщо попереднє медіа грало. ### Resource firewall Через `WebResourceRequested` блокуються відомі рекламні й аналітичні host-и. У lightweight/minimized режимі блокуються images і fonts. Окремого `CoreWebView2WebResourceContext.Iframe` **не існує**, тому iframe/embed фільтруються тільки консервативно за URL (`/embed/`, `livechat`). Не повертати enum `Iframe` у код. ### Audio / minimal YouTube Кнопка Audio: - приховує картинки, SVG, canvas і відеовізуалізацію; - прибирає частину YouTube UI, рекомендації, comments, chat, Shorts/shelves; - прибирає preload/prefetch/next; - залишає media element для звуку. CSS/JS не може звільнити базову пам’ять JavaScript runtime YouTube. Це оптимізація трафіку/DOM/GPU, а не повна заміна renderer. ### Minimized і watchdog - при згортанні у трей встановлюється minimized mode; - нові навігації блокуються, візуальний шар стискається, звук не зупиняється; - watchdog кожні 30 секунд перевіряє Working Set; - поріг soft-reload — 850 MB; - перед reload зберігаються URL, scrollY, currentTime, playing; - після reload стан відновлюється з повторними спробами через 300 і 1000 мс. ### Native audio boundary `Core/NativeAudioSession.cs` містить `INativeAudioSession` і WPF `MediaPlayer` для **direct audio URL**. Автоматичного YouTube extractor немає. Це навмисно: extractor нестабільний через зміни YouTube, авторизацію, DRM та правила сервісу. ## Що ще не зроблено 1. Фінальна компіляція на Windows і тест WebView2 Runtime. 2. Реальний вимір RAM/CPU/GPU у старій і новій архітектурі. 3. Надійне збереження cookies/session state між переходами — профіль WebView2 існує, але стан вкладки поки metadata-only. 4. Повне відновлення плейлистів, form state, history та відкритих popup/window. 5. Відокремлений native YouTube audio backend із optional extractor. 6. Win32 always-on-bottom (`SetWinEventHook`) ще не реалізований. 7. Не можна блокувати всі iframe, scripts або media: YouTube зламається. Firewall має бути allow-by-default, deny тільки для перевірених ресурсів. ## Відомі ризики - `ExecuteScriptAsync` повертає JSON-encoded string; для state parsing використовувати `JsonSerializer.Deserialize(result)`, а не простий `Trim('"')`. - Перемикання вкладки не повинно повторно запускати navigation через `SelectionChanged`; у `TabManager` є guard для вже активної вкладки. - Після переходу посиланням address bar оновлюється через `ActiveTabStateChanged`. - `WasPlaying` не гарантує autoplay: сайт може блокувати `play()` після navigation. - Сховати `