From fd6bc3459f2c55d551df0d0f6bf9d23a4eb84af6 Mon Sep 17 00:00:00 2001 From: AlastorFox MAC Date: Thu, 1 Oct 2026 01:46:18 +0300 Subject: [PATCH] BASE changed interface --- .gitignore | 5 + 25.09.2026.md | 140 ++++++++ App.xaml | 142 ++++++++ App.xaml.cs | 12 + Core/AudioSessionLabeler.cs | 161 +++++++++ Core/ExtensionManager.cs | 193 +++++++++++ Core/SessionStore.cs | 96 ++++++ Core/TabManager.cs | 311 ++++++++++++++++++ Core/VpnManager.cs | 167 ++++++++++ Core/WebView2EnvironmentFactory.cs | 190 +++++++++++ FEATURE_REQUEST_2026-09.md | 96 ++++++ FoxBrowser.csproj | 29 ++ FoxBrowser.ico | Bin 0 -> 370070 bytes FoxBrowser.sln | 18 + MainWindow.xaml | 177 ++++++++++ MainWindow.xaml.cs | 214 ++++++++++++ NEXT_AGENT_GUIDE.md | 280 ++++++++++++++++ Native/Win32Interop.cs | 20 ++ .../PublishProfiles/FolderProfile.pubxml | 11 + README.md | 60 ++++ Tab.cs | 34 ++ UI/ExtensionPopupWindow.xaml | 10 + UI/ExtensionPopupWindow.xaml.cs | 39 +++ UI/ExtensionsSettingsWindow.xaml | 44 +++ UI/ExtensionsSettingsWindow.xaml.cs | 155 +++++++++ UI/TrayIconManager.cs | 75 +++++ UI/VpnSettingsWindow.xaml | 22 ++ UI/VpnSettingsWindow.xaml.cs | 72 ++++ ULTRALIGHT_AGENT_GUIDE.md | 70 ++++ ULTRALIGHT_EVAL_RESULTS.md | 82 +++++ app.manifest | 15 + foxbrowser_agent_prompt.md | 96 ++++++ peergrob.conf | 11 + 33 files changed, 3047 insertions(+) create mode 100644 .gitignore create mode 100644 25.09.2026.md create mode 100644 App.xaml create mode 100644 App.xaml.cs create mode 100644 Core/AudioSessionLabeler.cs create mode 100644 Core/ExtensionManager.cs create mode 100644 Core/SessionStore.cs create mode 100644 Core/TabManager.cs create mode 100644 Core/VpnManager.cs create mode 100644 Core/WebView2EnvironmentFactory.cs create mode 100644 FEATURE_REQUEST_2026-09.md create mode 100644 FoxBrowser.csproj create mode 100644 FoxBrowser.ico create mode 100644 FoxBrowser.sln create mode 100644 MainWindow.xaml create mode 100644 MainWindow.xaml.cs create mode 100644 NEXT_AGENT_GUIDE.md create mode 100644 Native/Win32Interop.cs create mode 100644 Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 README.md create mode 100644 Tab.cs create mode 100644 UI/ExtensionPopupWindow.xaml create mode 100644 UI/ExtensionPopupWindow.xaml.cs create mode 100644 UI/ExtensionsSettingsWindow.xaml create mode 100644 UI/ExtensionsSettingsWindow.xaml.cs create mode 100644 UI/TrayIconManager.cs create mode 100644 UI/VpnSettingsWindow.xaml create mode 100644 UI/VpnSettingsWindow.xaml.cs create mode 100644 ULTRALIGHT_AGENT_GUIDE.md create mode 100644 ULTRALIGHT_EVAL_RESULTS.md create mode 100644 app.manifest create mode 100644 foxbrowser_agent_prompt.md create mode 100644 peergrob.conf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1a354a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.vs/ +bin/ +obj/ +*.user +*.suo diff --git a/25.09.2026.md b/25.09.2026.md new file mode 100644 index 0000000..c157aa7 --- /dev/null +++ b/25.09.2026.md @@ -0,0 +1,140 @@ +УВАГА: Термінал агента не працює. Не виконуй жодних команд (dotnet build, +dotnet restore, dotnet run, встановлення NuGet-пакетів тощо) самостійно. +Якщо для задачі щось треба встановити, оновити чи запустити — напиши це +явним окремим пунктом "Потрібно виконати вручну:" в кінці відповіді для +цієї задачі, і не намагайся обійти це через bash/термінал. + +Реалізуй дві задачі в FoxBrowser. Роби послідовно, кожну — окремим описом, +що змінено і як перевірити вручну (агент працює в Linux sandbox без +dotnet/WPF runtime — фінальний тест виконує користувач на Windows). + +## 1. Діагностика й виправлення кнопки "Розширення" + +Кнопка налаштувань розширень (`ExtensionsSettingsWindow`) працює +неправильно. Перевір по черзі всі гіпотези нижче, знайди реальну причину +в коді (не вигадуй, яка з них правильна, — прочитай файли й перевір), +і виправ саме те, що підтвердиться. Якщо підтвердиться кілька — виправ усі. + +### 1a. Recovery-fallback environment без AreBrowserExtensionsEnabled + +- Знайти в `MainWindow`/`TabManager` весь код навколо recovery-гілки з + `NEXT_AGENT_GUIDE`/інструкції ("Startup recovery fix — 0x8007139F") — + місце, де при HRESULT `0x8007139F` створюється запасний + `CoreWebView2Environment` з тимчасовою user-data folder. +- Перевірити: чи цей запасний environment створюється через ту саму + функцію/той самий `CoreWebView2EnvironmentOptions` з + `AreBrowserExtensionsEnabled = true`, що й основний, чи через окремий + шматок коду, де цей прапорець забули виставити. +- Якщо прапорець не потрапляє в recovery-гілку — винести створення + `CoreWebView2EnvironmentOptions` в один спільний метод/константу, яку + використовують і основний, і recovery шлях, щоб розбіжність стала + неможливою в принципі, а не просто додати прапорець ще раз у другому місці. +- Додати явний лог/статус (напр. поле `bool ExtensionsAvailable` на + TabManager чи MainWindow), який ExtensionsSettingsWindow може прочитати + при відкритті — і якщо `false` (бо стартанули в recovery-режимі), + показати користувачу зрозуміле повідомлення в самому вікні + ("Розширення недоступні в цьому сеансі — застосунок запустився в + режимі відновлення профілю, перезапусти FoxBrowser"), а не порожній + список без пояснень. + +### 1b. IsEnabled read-only і биндинг чекбокса + +- Знайти XAML розмітку списку розширень в `ExtensionsSettingsWindow.xaml`. +- Перевірити: чи `IsChecked` чекбокса прив'язаний напряму двостороннім + біндингом до `Extension.IsEnabled` (read-only властивість), чи через + `Checked`/`Unchecked` event-обробник (або Command), що явно викликає + `await extension.EnableAsync(bool)`. +- Якщо це прямий `TwoWay`-біндинг на read-only властивість — замінити на + `OneWay`-біндинг для відображення поточного стану + окремий + `Click`/`Checked`/`Unchecked` обробник, який викликає `EnableAsync()`, + чекає результат, і тільки після успіху оновлює UI-стан (checkbox), + а при помилці — повертає checkbox у попередній стан і показує повідомлення. + +### 1c. FolderBrowserDialog без owner-вікна + +- Знайти виклик `FolderBrowserDialog`/`OpenFileDialog` для "Додати + розширення" в `ExtensionsSettingsWindow.xaml.cs`. +- Перевірити, чи передається owner-handle: + `new System.Windows.Interop.WindowInteropHelper(this).Handle` + через `IWin32Window`-обгортку (WinForms-діалог вимагає `IWin32Window`, + не голий `IntPtr` — якщо ще нема обгортки-хелпера, додати простий + `NativeWindowWrapper : IWin32Window`). +- Якщо owner не передається — додати, щоб діалог відкривався поверх + `ExtensionsSettingsWindow`, а не міг ховатись позаду. + +### 1d. Options-сторінка розширення через спільний WebView2 + +- Знайти обробник кнопки "Налаштування" (per-extension), що відкриває + `chrome-extension:///options.html`. +- Перевірити: чи ця навігація йде через ТОЙ САМИЙ спільний `CoreWebView2`, + яким керує `TabManager` для звичайних вкладок, чи через окремий + `CoreWebView2Controller`, створений безпосередньо в + `ExtensionsSettingsWindow`. +- Якщо використовується спільний контрол — це помилка архітектури: клік + по "Налаштування" в діалозі може непомітно перекидати активну вкладку + користувача в головному вікні. Виправити: створити в + `ExtensionsSettingsWindow` власний ізольований `CoreWebView2Controller` + (з того самого `CoreWebView2Environment`, щоб профіль/розширення + збігались) — тільки для options-сторінок, ніколи не займаючи головний + спільний WebView2. + +Після кожного виправленого пункту (1a-1d) — короткий підсумок і ручний +тест-сценарій для Windows. + +## 2. Звук WebView2 у Volume Mixer як "FoxBrowser" + +Додати `Core/AudioSessionLabeler.cs`, який перейменовує WASAPI +audio-сесії власних дочірніх WebView2-процесів на "FoxBrowser" з іконкою +застосунку, БЕЗ ризику торкнутись чужих WebView2-сесій (Teams, Outlook, +системний Edge). + +- Додати NuGet-пакет `NAudio` (зазнач це явно в "Потрібно виконати + вручну" — сам пакет не встановлюй, тільки допиши `` + в `.csproj` вручну і попроси користувача зробити `dotnet restore`). +- Клас має: + 1. Відстежувати список PID усіх дочірніх `msedgewebview2.exe`-процесів, + які належать саме FoxBrowser (ті самі, що вже прив'язані через + Job Object з попередньої задачі про дерево процесів — + переюзати ту логіку, не дублювати). + 2. Через `NAudio.CoreAudioApi.MMDeviceEnumerator` отримати default + render endpoint (`eRender`, `eMultimedia`), і його `AudioSessionManager`. + 3. Підписатись на подію нової сесії (`AudioSessionManager.SessionCreated` + в NAudio, або еквівалент `IAudioSessionNotification.OnSessionCreated` + якщо в NAudio такого немає в потрібній версії — перевір API + конкретної версії пакету, яку додаси). + 4. У обробнику нової сесії: якщо `session.GetProcessID` входить у + список PID FoxBrowser — викликати + `session.DisplayName = "FoxBrowser"` і + `session.IconPath = Path.Combine(AppContext.BaseDirectory, "foxbrowser.ico")` + (або еквівалентні NAudio-методи `SetDisplayNameAsync`/властивості — + перевір актуальний API пакету). + 5. **Критично:** ці властивості НЕ переживають життя об'єкта сесії + (задокументована поведінка WASAPI) — тому одноразового виклику при + старті недостатньо. Логіка з пункту 3-4 має спрацьовувати на КОЖНУ + нову сесію протягом усього часу роботи FoxBrowser, не тільки на старті. + 6. НІКОЛИ не застосовувати `DisplayName`/`IconPath` до сесії, чий PID + не входить у явно відстежуваний список власних дочірніх процесів — + це і є захист від зачіпання чужих `msedgewebview2.exe` на машині + користувача. +- Покласти файл `foxbrowser.ico` в корінь проєкту поруч з іншими іконками + (якщо такого файлу ще нема в репозиторії — створи заглушку-примітивну + іконку і явно напиши користувачу в "Потрібно виконати вручну", що варто + замінити на нормальну). +- Викликати ініціалізацію `AudioSessionLabeler` один раз при старті + застосунку (напр. в `MainWindow` після успішної ініціалізації + `TabManager`, коли вже відомий перший дочірній PID). + +Ручний тест Windows: + +1. Запустити FoxBrowser, відкрити вкладку з YouTube, почати відтворення. +2. Відкрити Volume Mixer (правий клік на іконку гучності в треї Windows → + Open Volume mixer, або через Settings → System → Sound → Volume mixer). +3. Перевірити, що застосунок у списку показаний як "FoxBrowser" з іконкою + застосунку, а не як "Microsoft Edge WebView2"/msedgewebview2.exe. +4. Переключитись на іншу вкладку, знову увімкнути звук на новій — + перевірити, що лейбл лишається "FoxBrowser" і для нової audio-сесії + (не тільки для першої). +5. Паралельно запустити щось інше з WebView2 на цій же машині (напр. + Microsoft Teams, якщо є), перевірити, що ЙОГО лейбл у Volume Mixer + НЕ змінився і лишився своїм — це підтверджує, що фільтр по PID працює + правильно й не займає чужі процеси. \ No newline at end of file diff --git a/App.xaml b/App.xaml new file mode 100644 index 0000000..38b2985 --- /dev/null +++ b/App.xaml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/App.xaml.cs b/App.xaml.cs new file mode 100644 index 0000000..a347296 --- /dev/null +++ b/App.xaml.cs @@ -0,0 +1,12 @@ +using System.Windows; + +namespace FoxBrowser; + +public partial class App : System.Windows.Application +{ + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + ShutdownMode = ShutdownMode.OnMainWindowClose; + } +} diff --git a/Core/AudioSessionLabeler.cs b/Core/AudioSessionLabeler.cs new file mode 100644 index 0000000..1d914aa --- /dev/null +++ b/Core/AudioSessionLabeler.cs @@ -0,0 +1,161 @@ +using System.IO; +using System.Runtime.InteropServices; +using NAudio.CoreAudioApi; +using NAudio.CoreAudioApi.Interfaces; + +namespace FoxBrowser.Core; + +/// +/// Labels only audio sessions owned by FoxBrowser's descendant WebView2 processes. +/// It never changes sessions belonging to unrelated WebView2 applications. +/// +public sealed class AudioSessionLabeler : IDisposable +{ + private const uint SnapshotProcess = 0x00000002; + private readonly uint _rootProcessId; + private readonly string _iconPath; + private readonly MMDeviceEnumerator _devices = new(); + private readonly AudioSessionManager _sessions; + private readonly System.Threading.Timer _refreshTimer; + private readonly object _gate = new(); + private bool _disposed; + + public AudioSessionLabeler(uint rootProcessId, string iconPath) + { + _rootProcessId = rootProcessId; + _iconPath = iconPath; + var device = _devices.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); + _sessions = device.AudioSessionManager; + _sessions.OnSessionCreated += OnSessionCreated; + _refreshTimer = new System.Threading.Timer(_ => RefreshAndLabel(), null, TimeSpan.Zero, TimeSpan.FromSeconds(2)); + } + + private void OnSessionCreated(object sender, IAudioSessionControl nativeSession) + { + LabelSession(new AudioSessionControl(nativeSession), disposeAfter: true); + } + + private void RefreshAndLabel() + { + if (_disposed) return; + try + { + var ownedPids = GetFoxBrowserWebViewPids(); + var sessionCollection = _sessions.Sessions; + if (sessionCollection is null) return; + for (var index = 0; index < sessionCollection.Count; index++) + { + var session = sessionCollection[index]; + if (session is null) continue; + try + { + if (ownedPids.Contains(session.GetProcessID)) + LabelSession(session, ownedPids, disposeAfter: false); + } + finally { session.Dispose(); } + } + } + catch { /* Audio devices can disappear or be replaced while Windows is running. */ } + } + + private void LabelSession(AudioSessionControl session, HashSet? knownOwnedPids = null, bool disposeAfter = false) + { + try + { + var ownedPids = knownOwnedPids ?? GetFoxBrowserWebViewPids(); + if (!ownedPids.Contains(session.GetProcessID)) return; + session.DisplayName = "FoxBrowser"; + if (File.Exists(_iconPath)) session.IconPath = _iconPath; + } + catch { /* A session may close between PID lookup and property update. */ } + finally { if (disposeAfter) session.Dispose(); } + } + + private HashSet GetFoxBrowserWebViewPids() + { + var processes = ReadProcesses(); + var children = new Dictionary>(); + foreach (var process in processes) + { + if (!children.TryGetValue(process.ParentId, out var list)) + children[process.ParentId] = list = new List(); + list.Add(process); + } + + var result = new HashSet(); + var pending = new Queue(new[] { _rootProcessId }); + while (pending.Count > 0) + { + var parent = pending.Dequeue(); + if (!children.TryGetValue(parent, out var descendants)) continue; + foreach (var child in descendants) + { + pending.Enqueue(child.ProcessId); + if (child.Name.Equals("msedgewebview2.exe", StringComparison.OrdinalIgnoreCase)) + result.Add(child.ProcessId); + } + } + return result; + } + + private static List ReadProcesses() + { + var result = new List(); + var snapshot = CreateToolhelp32Snapshot(SnapshotProcess, 0); + if (snapshot == IntPtr.Zero || snapshot == new IntPtr(-1)) return result; + try + { + var entry = new ProcessEntry32 { Size = (uint)Marshal.SizeOf() }; + if (!Process32First(snapshot, ref entry)) return result; + do + { + result.Add(new ProcessRecord(entry.ProcessId, entry.ParentProcessId, entry.ExeFile)); + entry.Size = (uint)Marshal.SizeOf(); + } while (Process32Next(snapshot, ref entry)); + } + finally { CloseHandle(snapshot); } + return result; + } + + public void Dispose() + { + lock (_gate) + { + if (_disposed) return; + _disposed = true; + _refreshTimer.Dispose(); + _sessions.OnSessionCreated -= OnSessionCreated; + _sessions.Dispose(); + _devices.Dispose(); + } + } + + private readonly record struct ProcessRecord(uint ProcessId, uint ParentId, string Name); + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct ProcessEntry32 + { + public uint Size; + public uint Usage; + public uint ProcessId; + public IntPtr DefaultHeapId; + public uint ModuleId; + public uint Threads; + public uint ParentProcessId; + public int BasePriority; + public uint Flags; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string ExeFile; + } + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processId); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool Process32First(IntPtr snapshot, ref ProcessEntry32 entry); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool Process32Next(IntPtr snapshot, ref ProcessEntry32 entry); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool CloseHandle(IntPtr handle); +} diff --git a/Core/ExtensionManager.cs b/Core/ExtensionManager.cs new file mode 100644 index 0000000..8e2f456 --- /dev/null +++ b/Core/ExtensionManager.cs @@ -0,0 +1,193 @@ +using System.Collections.ObjectModel; +using System.IO; +using System.Text.Json; +using Microsoft.Web.WebView2.Core; + +namespace FoxBrowser.Core; + +public sealed class PinnedExtensionItem +{ + public required CoreWebView2BrowserExtension Extension { get; init; } + public required string Name { get; init; } + public string Glyph => string.IsNullOrWhiteSpace(Name) ? "🧩" : Name[..1].ToUpperInvariant(); + public string? IconPath { get; init; } + public bool HasIcon => !string.IsNullOrWhiteSpace(IconPath) && File.Exists(IconPath); + public string? PopupPage { get; init; } +} + +public sealed class ExtensionManager +{ + private readonly CoreWebView2Profile _profile; + private readonly string _metadataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FoxBrowser", "extension-options.json"); + private readonly string _uiMetadataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FoxBrowser", "extension-ui.json"); + private readonly string _pinnedPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FoxBrowser", "pinned-extensions.json"); + private readonly Dictionary _optionsPages; + private readonly Dictionary _uiMetadata; + private readonly HashSet _pinnedIds; + + public ExtensionManager(CoreWebView2Profile profile) + { + _profile = profile; + _optionsPages = LoadOptionsPages(); + _uiMetadata = LoadUiMetadata(); + _pinnedIds = LoadPinnedIds(); + } + + public ObservableCollection Extensions { get; } = new(); + public ObservableCollection PinnedExtensions { get; } = new(); + public event EventHandler? PinnedExtensionsChanged; + + public async Task RefreshAsync() + { + Extensions.Clear(); + PinnedExtensions.Clear(); + var installed = await _profile.GetBrowserExtensionsAsync(); + foreach (var extension in installed) Extensions.Add(extension); + RebuildPinned(); + } + + public async Task AddExtensionAsync(string folderPath) + { + if (!Directory.Exists(folderPath)) throw new DirectoryNotFoundException(folderPath); + var manifestPath = Path.Combine(folderPath, "manifest.json"); + if (!File.Exists(manifestPath)) throw new InvalidDataException("У вибраній папці немає manifest.json."); + + var manifest = await ReadManifestAsync(manifestPath); + var extension = await _profile.AddBrowserExtensionAsync(folderPath); + _optionsPages[extension.Id] = ReadOptionsPage(manifest); + _uiMetadata[extension.Id] = ReadUiMetadata(manifest, folderPath); + SaveOptionsPages(); + SaveUiMetadata(); + Extensions.Add(extension); + RebuildPinned(); + return extension; + } + + public string? GetOptionsPage(string extensionId) => _optionsPages.TryGetValue(extensionId, out var page) ? page : null; + public string? GetPopupPage(string extensionId) => _uiMetadata.TryGetValue(extensionId, out var metadata) ? metadata.PopupPage : null; + public string? GetIconPath(string extensionId) => _uiMetadata.TryGetValue(extensionId, out var metadata) ? metadata.IconPath : null; + public bool IsPinned(CoreWebView2BrowserExtension extension) => _pinnedIds.Contains(extension.Id); + + public void SetPinned(CoreWebView2BrowserExtension extension, bool pinned) + { + if (pinned) _pinnedIds.Add(extension.Id); else _pinnedIds.Remove(extension.Id); + SavePinnedIds(); + RebuildPinned(); + } + + public async Task SetEnabledAsync(CoreWebView2BrowserExtension extension, bool enabled) + { + await extension.EnableAsync(enabled); + RebuildPinned(); + } + + public async Task RemoveAsync(CoreWebView2BrowserExtension extension) + { + await extension.RemoveAsync(); + Extensions.Remove(extension); + _optionsPages.Remove(extension.Id); + _uiMetadata.Remove(extension.Id); + _pinnedIds.Remove(extension.Id); + SaveOptionsPages(); + SaveUiMetadata(); + SavePinnedIds(); + RebuildPinned(); + } + + private void RebuildPinned() + { + PinnedExtensions.Clear(); + foreach (var extension in Extensions) + { + if (!_pinnedIds.Contains(extension.Id) || !extension.IsEnabled) continue; + _uiMetadata.TryGetValue(extension.Id, out var metadata); + PinnedExtensions.Add(new PinnedExtensionItem + { + Extension = extension, + Name = extension.Name, + IconPath = metadata?.IconPath, + PopupPage = metadata?.PopupPage + }); + } + PinnedExtensionsChanged?.Invoke(this, EventArgs.Empty); + } + + private static async Task ReadManifestAsync(string path) + { + await using var stream = File.OpenRead(path); + using var document = await JsonDocument.ParseAsync(stream); + return document.RootElement.Clone(); + } + + private static string? ReadOptionsPage(JsonElement manifest) + { + if (manifest.TryGetProperty("options_ui", out var optionsUi) && optionsUi.ValueKind == JsonValueKind.Object && optionsUi.TryGetProperty("page", out var modernPage) && modernPage.ValueKind == JsonValueKind.String) + return NormalizeRelativePage(modernPage.GetString()); + if (manifest.TryGetProperty("options_page", out var legacyPage) && legacyPage.ValueKind == JsonValueKind.String) + return NormalizeRelativePage(legacyPage.GetString()); + return null; + } + + private static ExtensionUiMetadata ReadUiMetadata(JsonElement manifest, string folderPath) + { + JsonElement action = default; + if (manifest.TryGetProperty("action", out var modernAction) && modernAction.ValueKind == JsonValueKind.Object) action = modernAction; + else if (manifest.TryGetProperty("browser_action", out var legacyAction) && legacyAction.ValueKind == JsonValueKind.Object) action = legacyAction; + + string? popup = null; + if (action.ValueKind == JsonValueKind.Object && action.TryGetProperty("default_popup", out var popupElement) && popupElement.ValueKind == JsonValueKind.String) + popup = NormalizeRelativePage(popupElement.GetString()); + + string? icon = null; + if (action.ValueKind == JsonValueKind.Object && action.TryGetProperty("default_icon", out var iconElement)) + { + var iconPage = iconElement.ValueKind == JsonValueKind.String + ? iconElement.GetString() + : iconElement.ValueKind == JsonValueKind.Object + ? iconElement.EnumerateObject().OrderByDescending(item => ParseIconSize(item.Name)).Select(item => item.Value.GetString()).FirstOrDefault() + : null; + var normalized = NormalizeRelativePage(iconPage); + if (normalized is not null) + { + var fullPath = Path.GetFullPath(Path.Combine(folderPath, normalized)); + if (File.Exists(fullPath)) icon = fullPath; + } + } + return new ExtensionUiMetadata(popup, icon); + } + + private static int ParseIconSize(string key) => int.TryParse(key, out var size) ? size : 0; + + private static string? NormalizeRelativePage(string? page) + { + if (string.IsNullOrWhiteSpace(page)) return null; + var normalized = page.Trim().Replace('\\', '/').TrimStart('/'); + return normalized.Contains("..", StringComparison.Ordinal) ? null : normalized; + } + + private Dictionary LoadOptionsPages() => LoadJson(_metadataPath, new Dictionary(StringComparer.OrdinalIgnoreCase)); + private Dictionary LoadUiMetadata() => LoadJson(_uiMetadataPath, new Dictionary(StringComparer.OrdinalIgnoreCase)); + private HashSet LoadPinnedIds() => LoadJson(_pinnedPath, new HashSet(StringComparer.OrdinalIgnoreCase)); + + private static T LoadJson(string path, T fallback) + { + try { return File.Exists(path) ? JsonSerializer.Deserialize(File.ReadAllText(path)) ?? fallback : fallback; } + catch { return fallback; } + } + + private static void SaveJson(string path, T value) + { + try + { + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + File.WriteAllText(path, JsonSerializer.Serialize(value, new JsonSerializerOptions { WriteIndented = true })); + } + catch { } + } + + private void SaveOptionsPages() => SaveJson(_metadataPath, _optionsPages); + private void SaveUiMetadata() => SaveJson(_uiMetadataPath, _uiMetadata); + private void SavePinnedIds() => SaveJson(_pinnedPath, _pinnedIds); + + public sealed record ExtensionUiMetadata(string? PopupPage, string? IconPath); +} diff --git a/Core/SessionStore.cs b/Core/SessionStore.cs new file mode 100644 index 0000000..33503dc --- /dev/null +++ b/Core/SessionStore.cs @@ -0,0 +1,96 @@ +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace FoxBrowser.Core; + +/// +/// Snapshot of a single tab persisted to disk. +/// All properties are nullable so old session files remain forward-compatible. +/// +public sealed class TabSnapshot +{ + public string Address { get; init; } = "https://www.google.com"; + public string Title { get; init; } = "Нова вкладка"; + public bool IsAudioOnly { get; init; } + public double ScrollY { get; init; } + public double MediaPosition { get; init; } + public bool WasPlaying { get; init; } +} + +public sealed class Session +{ + public List Tabs { get; init; } = new(); + public int ActiveTabIndex { get; init; } +} + +/// +/// Saves and loads the browser session (open tabs + per-tab state) to a JSON +/// file in LocalApplicationData\FoxBrowser\session.json. +/// +/// Crash-recovery strategy: the file is re-written after every successful +/// NavigationCompleted so a hard crash never loses more than one page load. +/// +public static class SessionStore +{ + private static readonly string SessionPath = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + "FoxBrowser", "session.json"); + + private static readonly JsonSerializerOptions JsonOptions = new() + { + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.Never, + }; + + public static async Task SaveAsync(IEnumerable tabs, int activeIndex) + { + try + { + var snapshots = tabs.Select(t => new TabSnapshot + { + Address = t.Address, + Title = t.Title, + IsAudioOnly = t.IsAudioOnly, + ScrollY = t.ScrollY, + MediaPosition = t.MediaPosition, + WasPlaying = t.WasPlaying, + }).ToList(); + + if (snapshots.Count == 0) return; + + var session = new Session + { + Tabs = snapshots, + ActiveTabIndex = Math.Clamp(activeIndex, 0, snapshots.Count - 1), + }; + + Directory.CreateDirectory(Path.GetDirectoryName(SessionPath)!); + var json = JsonSerializer.Serialize(session, JsonOptions); + // Write to a temp file first, then replace atomically — avoids + // truncating the real file if the process is killed mid-write. + var tmp = SessionPath + ".tmp"; + await File.WriteAllTextAsync(tmp, json); + File.Move(tmp, SessionPath, overwrite: true); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"[SessionStore] Save failed: {ex.Message}"); + } + } + + public static async Task LoadAsync() + { + if (!File.Exists(SessionPath)) return null; + try + { + var json = await File.ReadAllTextAsync(SessionPath); + return JsonSerializer.Deserialize(json); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"[SessionStore] Load failed: {ex.Message}"); + return null; + } + } +} diff --git a/Core/TabManager.cs b/Core/TabManager.cs new file mode 100644 index 0000000..e92474d --- /dev/null +++ b/Core/TabManager.cs @@ -0,0 +1,311 @@ +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.IO; +using System.Text.Json; +using System.Windows; +using System.Windows.Controls; +using Microsoft.Web.WebView2.Core; +using Microsoft.Web.WebView2.Wpf; + +namespace FoxBrowser.Core; + +public sealed class TabManager : IAsyncDisposable +{ + private static readonly string[] BlockedHosts = + { + "doubleclick.net", "googlesyndication.com", "googleadservices.com", "adservice.google.com", + "googletagmanager.com", "google-analytics.com", "analytics.google.com", "facebook.net", + "connect.facebook.net", "hotjar.com", "segment.io", "amplitude.com", "scorecardresearch.com", + "adsrvr.org", "adnxs.com", "taboola.com", "outbrain.com" + }; + + private readonly Grid _host; + private readonly CoreWebView2Environment _environment; + private readonly WebView2 _view; + private bool _audioOnly; + private bool _minimizedMode; + private bool _navigationInProgress; + private bool _switchInProgress; + + public TabManager(Grid host, CoreWebView2Environment environment, bool extensionsAvailable = true) + { + _host = host; + _environment = environment; + ExtensionsAvailable = extensionsAvailable; + _view = new WebView2 { Visibility = Visibility.Visible }; + _host.Children.Add(_view); + } + + public ObservableCollection Tabs { get; } = new(); + public BrowserTab? ActiveTab { get; private set; } + public bool IsMinimizedMode => _minimizedMode; + public bool ExtensionsAvailable { get; private set; } + public CoreWebView2Environment Environment => _environment; + public WebView2 View => _view; + public ExtensionManager? ExtensionManager { get; private set; } + public event EventHandler? ActiveTabStateChanged; + + public async Task InitializeAsync() + { + await _view.EnsureCoreWebView2Async(_environment); + try + { + ExtensionManager = new ExtensionManager(_view.CoreWebView2.Profile); + await ExtensionManager.RefreshAsync(); + } + catch + { + ExtensionManager = null; + ExtensionsAvailable = false; + } + ConfigureResourceFirewall(_view.CoreWebView2); + _view.CoreWebView2.NavigationStarting += OnNavigationStarting; + _view.CoreWebView2.NavigationCompleted += OnNavigationCompleted; + _view.CoreWebView2.DocumentTitleChanged += OnDocumentTitleChanged; + _view.CoreWebView2.IsDocumentPlayingAudioChanged += OnAudioStateChanged; + _view.CoreWebView2.HistoryChanged += OnHistoryChanged; + await RestoreSessionOrDefaultAsync(); + } + + public async Task SaveSessionAsync() + { + var activeIndex = ActiveTab is not null ? Tabs.IndexOf(ActiveTab) : 0; + await SessionStore.SaveAsync(Tabs, activeIndex); + } + + private async Task RestoreSessionOrDefaultAsync() + { + var session = await SessionStore.LoadAsync(); + if (session is null || session.Tabs.Count == 0) + { + await AddTabAsync(); + return; + } + + BrowserTab? activeTab = null; + for (int i = 0; i < session.Tabs.Count; i++) + { + var snap = session.Tabs[i]; + var tab = new BrowserTab(snap.Address) + { + Title = snap.Title, + IsAudioOnly = snap.IsAudioOnly, + ScrollY = snap.ScrollY, + MediaPosition = snap.MediaPosition, + WasPlaying = snap.WasPlaying, + }; + Tabs.Add(tab); + if (i == session.ActiveTabIndex) activeTab = tab; + } + await SwitchToTabAsync(activeTab ?? Tabs[0]); + } + + public async Task AddTabAsync(string address = "https://www.google.com") + { + var tab = new BrowserTab(NormalizeAddress(address)); + Tabs.Add(tab); + await SwitchToTabAsync(tab); + return tab; + } + + public async Task SwitchToTabAsync(BrowserTab? tab) + { + if (tab is null || !Tabs.Contains(tab)) return; + var core = _view.CoreWebView2; + if (core is null || ReferenceEquals(ActiveTab, tab) || _switchInProgress) return; + _switchInProgress = true; + try + { + if (ActiveTab is not null) await CaptureActiveStateAsync(); + ActiveTab = tab; + _audioOnly = tab.IsAudioOnly; + ActiveTabStateChanged?.Invoke(this, EventArgs.Empty); + _navigationInProgress = true; + core.Navigate(tab.Address); + await Task.Yield(); + } + finally { _switchInProgress = false; } + } + + public async Task NavigateAsync(BrowserTab tab, string address) + { + if (!Tabs.Contains(tab)) return; + var core = _view.CoreWebView2; + if (core is null) return; + tab.Address = NormalizeAddress(address); + if (ActiveTab != tab) { await SwitchToTabAsync(tab); return; } + _navigationInProgress = true; + core.Navigate(tab.Address); + } + + public Task OpenExtensionOptionsAsync(string extensionId) + { + var core = _view.CoreWebView2; + if (core is null || string.IsNullOrWhiteSpace(extensionId)) return Task.CompletedTask; + core.Navigate($"chrome-extension://{extensionId}/options.html"); + return Task.CompletedTask; + } + + public async Task OpenUrlAsync(string address) + { + if (ActiveTab is null) return; + if (address.StartsWith("chrome-extension://", StringComparison.OrdinalIgnoreCase)) + { + var core = _view.CoreWebView2; + if (core is null) return; + ActiveTab.Address = address; + core.Navigate(address); + return; + } + await NavigateAsync(ActiveTab, address); + } + + public async Task ToggleAudioOnlyAsync() + { + if (ActiveTab is null) return; + _audioOnly = !_audioOnly; + ActiveTab.IsAudioOnly = _audioOnly; + await ApplyLightweightPageModeAsync(_audioOnly || _minimizedMode); + } + + public async Task SetMinimizedModeAsync(bool enabled) + { + _minimizedMode = enabled; + await ApplyLightweightPageModeAsync(enabled || _audioOnly); + } + + public async Task SoftReloadIfNeededAsync(long thresholdBytes = 850L * 1024 * 1024) + { + using var process = Process.GetCurrentProcess(); + if (process.WorkingSet64 < thresholdBytes || ActiveTab is null || _navigationInProgress) return; + await CaptureActiveStateAsync(); + _navigationInProgress = true; + _view.CoreWebView2?.Navigate(ActiveTab.Address); + } + + public void GoBack() { var core = _view.CoreWebView2; if (core?.CanGoBack == true) core.GoBack(); } + public void GoForward() { var core = _view.CoreWebView2; if (core?.CanGoForward == true) core.GoForward(); } + public void Reload() { var core = _view.CoreWebView2; if (core is null) return; _navigationInProgress = true; core.Reload(); } + + public void CloseTab(BrowserTab tab) + { + var index = Tabs.IndexOf(tab); + Tabs.Remove(tab); + if (Tabs.Count == 0) { _ = AddTabAsync(); return; } + if (ActiveTab == tab) _ = SwitchToTabAsync(Tabs[Math.Min(index, Tabs.Count - 1)]); + _ = SaveSessionAsync(); + } + + public async ValueTask DisposeAsync() + { + if (ActiveTab is not null) await CaptureActiveStateAsync(); + await SaveSessionAsync(); + _view.Dispose(); + } + + private void OnNavigationStarting(object? sender, CoreWebView2NavigationStartingEventArgs e) + { + if (_minimizedMode && !_navigationInProgress) e.Cancel = true; + if (ActiveTab is not null) ActiveTab.IsLoading = true; + } + + private async void OnNavigationCompleted(object? sender, CoreWebView2NavigationCompletedEventArgs e) + { + _navigationInProgress = false; + if (ActiveTab is null) return; + ActiveTab.IsLoading = false; + ActiveTab.Address = _view.Source?.ToString() ?? ActiveTab.Address; + ActiveTab.Title = string.IsNullOrWhiteSpace(_view.CoreWebView2.DocumentTitle) ? "Нова вкладка" : _view.CoreWebView2.DocumentTitle; + ActiveTabStateChanged?.Invoke(this, EventArgs.Empty); + await ApplyLightweightPageModeAsync(_audioOnly || _minimizedMode); + await RestoreActiveStateAsync(); + await SaveSessionAsync(); + } + + private void OnDocumentTitleChanged(object? sender, object e) + { + if (ActiveTab is not null) ActiveTab.Title = string.IsNullOrWhiteSpace(_view.CoreWebView2.DocumentTitle) ? "Нова вкладка" : _view.CoreWebView2.DocumentTitle; + } + + private void OnAudioStateChanged(object? sender, object e) + { + if (ActiveTab is not null) ActiveTab.IsPlayingAudio = _view.CoreWebView2.IsDocumentPlayingAudio; + } + + private void OnHistoryChanged(object? sender, object e) + { + if (ActiveTab is null) return; + var current = _view.CoreWebView2.Source; + if (string.IsNullOrEmpty(current) || current == ActiveTab.Address) return; + ActiveTab.Address = current; + ActiveTabStateChanged?.Invoke(this, EventArgs.Empty); + _ = SaveSessionAsync(); + } + + private async Task CaptureActiveStateAsync() + { + if (ActiveTab is null || _view.CoreWebView2 is null) return; + try + { + var json = await _view.CoreWebView2.ExecuteScriptAsync("JSON.stringify({scrollY:window.scrollY, media:[...document.querySelectorAll('video,audio')].map(x=>({time:x.currentTime||0,playing:!x.paused}))})"); + var payload = JsonSerializer.Deserialize(json); + if (string.IsNullOrWhiteSpace(payload)) return; + using var doc = JsonDocument.Parse(payload); + if (doc.RootElement.TryGetProperty("scrollY", out var scroll)) ActiveTab.ScrollY = scroll.GetDouble(); + if (doc.RootElement.TryGetProperty("media", out var media) && media.GetArrayLength() > 0) + { + var first = media[0]; + if (first.TryGetProperty("time", out var time)) ActiveTab.MediaPosition = time.GetDouble(); + if (first.TryGetProperty("playing", out var playing)) ActiveTab.WasPlaying = playing.GetBoolean(); + } + } + catch (JsonException) { } + } + + private async Task RestoreActiveStateAsync() + { + if (ActiveTab is null || _view.CoreWebView2 is null) return; + var scroll = ActiveTab.ScrollY.ToString(System.Globalization.CultureInfo.InvariantCulture); + var position = ActiveTab.MediaPosition.ToString(System.Globalization.CultureInfo.InvariantCulture); + var resume = ActiveTab.WasPlaying ? ".play().catch(()=>{});" : ""; + var script = $"(() => {{ const restore=()=>{{ window.scrollTo(0,{scroll}); document.querySelectorAll('video,audio').forEach(x=>{{ try {{ x.currentTime={position}; {resume} }} catch {{}} }}); }}; restore(); setTimeout(restore,300); setTimeout(restore,1000); }})();"; + await _view.CoreWebView2.ExecuteScriptAsync(script); + } + + private void ConfigureResourceFirewall(CoreWebView2 core) + { + core.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All); + core.WebResourceRequested += OnWebResourceRequested; + } + + private void OnWebResourceRequested(object? sender, CoreWebView2WebResourceRequestedEventArgs e) + { + var uri = e.Request.Uri; + var host = Uri.TryCreate(uri, UriKind.Absolute, out var parsed) ? parsed.Host : string.Empty; + var blockedHost = BlockedHosts.Any(x => host.Equals(x, StringComparison.OrdinalIgnoreCase) || host.EndsWith("." + x, StringComparison.OrdinalIgnoreCase)); + var visualWaste = _audioOnly || _minimizedMode; + var blockedContext = visualWaste && (e.ResourceContext is CoreWebView2WebResourceContext.Image or CoreWebView2WebResourceContext.Font); + var thirdPartyFrame = visualWaste && (uri.Contains("/embed/", StringComparison.OrdinalIgnoreCase) || host.Contains("livechat", StringComparison.OrdinalIgnoreCase)); + if (!blockedHost && !blockedContext && !thirdPartyFrame) return; + e.Response = _view.CoreWebView2.Environment.CreateWebResourceResponse(new MemoryStream(Array.Empty()), 204, "No Content", ""); + } + + private async Task ApplyLightweightPageModeAsync(bool enabled) + { + if (_view.CoreWebView2 is null) return; + var script = enabled + ? """ + (()=>{let s=document.getElementById('fox-lightweight');if(!s){s=document.createElement('style');s.id='fox-lightweight';s.textContent='img,picture,svg,canvas{display:none!important}video{width:1px!important;height:1px!important;opacity:0!important;position:fixed!important;left:-10000px!important;top:-10000px!important}';document.documentElement.appendChild(s)};document.querySelectorAll('link[rel="preload"],link[rel="prefetch"],link[rel="next"]').forEach(x=>x.remove());})(); + """ + : "document.getElementById('fox-lightweight')?.remove();"; + await _view.CoreWebView2.ExecuteScriptAsync(script); + } + + private static string NormalizeAddress(string value) + { + var text = value.Trim(); + if (string.IsNullOrEmpty(text)) return "https://www.google.com"; + if (Uri.TryCreate(text, UriKind.Absolute, out var uri) && (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)) return text; + return $"https://www.google.com/search?q={Uri.EscapeDataString(text)}"; + } +} diff --git a/Core/VpnManager.cs b/Core/VpnManager.cs new file mode 100644 index 0000000..509d656 --- /dev/null +++ b/Core/VpnManager.cs @@ -0,0 +1,167 @@ +using Microsoft.Win32; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.IO; + +namespace FoxBrowser.Core; + +public enum VpnConnectionState +{ + Disconnected, + Connecting, + Connected, + Error +} + +public sealed class VpnProfile +{ + public VpnProfile(string path) + { + FilePath = path; + Name = Path.GetFileNameWithoutExtension(path); + } + + public string Name { get; } + public string FilePath { get; } +} + +public sealed class VpnManager +{ + private readonly string _profileDirectory = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + "FoxBrowser", "VPN"); + private string? _activeTunnel; + + public VpnManager() + { + Directory.CreateDirectory(_profileDirectory); + Profiles = new ObservableCollection(); + RefreshProfiles(); + } + + public ObservableCollection Profiles { get; } + public VpnConnectionState State { get; private set; } = VpnConnectionState.Disconnected; + public string? LastError { get; private set; } + public VpnProfile? ActiveProfile { get; private set; } + public bool IsConnected => State == VpnConnectionState.Connected; + public string? WireGuardPath => FindWireGuard(); + public event EventHandler? StateChanged; + + public void RefreshProfiles() + { + Profiles.Clear(); + foreach (var path in Directory.EnumerateFiles(_profileDirectory, "*.conf")) + Profiles.Add(new VpnProfile(path)); + } + + public VpnProfile ImportTunnelConfig(string confFilePath) + { + if (!File.Exists(confFilePath)) throw new FileNotFoundException("Конфігурацію WireGuard не знайдено.", confFilePath); + if (!string.Equals(Path.GetExtension(confFilePath), ".conf", StringComparison.OrdinalIgnoreCase)) + throw new InvalidDataException("Потрібен файл конфігурації з розширенням .conf."); + + var safeName = Path.GetFileNameWithoutExtension(confFilePath); + foreach (var invalid in Path.GetInvalidFileNameChars()) safeName = safeName.Replace(invalid, '_'); + var destination = Path.Combine(_profileDirectory, safeName + ".conf"); + File.Copy(confFilePath, destination, true); + RefreshProfiles(); + return Profiles.First(x => string.Equals(x.FilePath, destination, StringComparison.OrdinalIgnoreCase)); + } + + public async Task ConnectAsync(VpnProfile profile, CancellationToken cancellationToken = default) + { + if (State == VpnConnectionState.Connecting) return; + var wireGuard = FindWireGuard(); + if (wireGuard is null) + { + State = VpnConnectionState.Error; + LastError = "WireGuard for Windows не встановлено. Завантажте його з https://www.wireguard.com/install/"; + StateChanged?.Invoke(this, EventArgs.Empty); + throw new InvalidOperationException(LastError); + } + + State = VpnConnectionState.Connecting; + LastError = null; + ActiveProfile = profile; + _activeTunnel = profile.Name; + StateChanged?.Invoke(this, EventArgs.Empty); + try + { + var result = await RunAsync(wireGuard, cancellationToken, "/installtunnelservice", profile.FilePath); + if (result.ExitCode != 0) + throw new InvalidOperationException(string.IsNullOrWhiteSpace(result.Error) ? result.Output : result.Error); + State = VpnConnectionState.Connected; + } + catch (Exception ex) + { + State = VpnConnectionState.Error; + LastError = ex.Message; + throw; + } + finally { StateChanged?.Invoke(this, EventArgs.Empty); } + } + + public async Task DisconnectAsync(CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(_activeTunnel)) return; + var wireGuard = FindWireGuard(); + if (wireGuard is null) throw new InvalidOperationException("WireGuard for Windows не встановлено."); + var result = await RunAsync(wireGuard, cancellationToken, "/uninstalltunnelservice", _activeTunnel); + if (result.ExitCode != 0) + { + State = VpnConnectionState.Error; + LastError = string.IsNullOrWhiteSpace(result.Error) ? result.Output : result.Error; + StateChanged?.Invoke(this, EventArgs.Empty); + throw new InvalidOperationException(LastError); + } + _activeTunnel = null; + ActiveProfile = null; + State = VpnConnectionState.Disconnected; + LastError = null; + StateChanged?.Invoke(this, EventArgs.Empty); + } + + private static async Task<(int ExitCode, string Output, string Error)> RunAsync(string executable, CancellationToken cancellationToken, params object[] arguments) + { + using var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = executable, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + } + }; + foreach (var argument in arguments) process.StartInfo.ArgumentList.Add(Convert.ToString(argument) ?? string.Empty); + process.Start(); + var outputTask = process.StandardOutput.ReadToEndAsync(); + var errorTask = process.StandardError.ReadToEndAsync(); + await process.WaitForExitAsync(cancellationToken); + return (process.ExitCode, await outputTask, await errorTask); + } + + private static string? FindWireGuard() + { + var candidates = new[] + { + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "WireGuard", "wireguard.exe"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "WireGuard", "wireguard.exe"), + }; + foreach (var candidate in candidates) if (File.Exists(candidate)) return candidate; + + using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\wireguard.exe"); + var registered = key?.GetValue(null) as string; + if (!string.IsNullOrWhiteSpace(registered) && File.Exists(registered)) return registered; + + foreach (var segment in (Environment.GetEnvironmentVariable("PATH") ?? string.Empty).Split(Path.PathSeparator)) + { + var candidate = Path.Combine(segment.Trim(), "wireguard.exe"); + try { if (File.Exists(candidate)) return candidate; } + catch { /* Ignore unreadable PATH entries. */ } + } + + return null; + } +} diff --git a/Core/WebView2EnvironmentFactory.cs b/Core/WebView2EnvironmentFactory.cs new file mode 100644 index 0000000..804ddce --- /dev/null +++ b/Core/WebView2EnvironmentFactory.cs @@ -0,0 +1,190 @@ +using System.IO; +using System.Security; +using Microsoft.Web.WebView2.Core; + +namespace FoxBrowser.Core; + +/// +/// Creates every WebView2 environment with one consistent set of options and +/// chooses the portable profile when the application directory is writable. +/// +public sealed class WebView2EnvironmentFactory +{ + private const string ProductFolderName = "FoxBrowser"; + private const string ProfileFolderName = "Profile"; + private const string LegacyProfileFolderName = "WebView2"; + private const string ProtectedFolderNoticeMarker = "portable-profile-fallback-notified"; + + private readonly string _applicationDataRoot = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), ProductFolderName); + private bool _shouldShowProtectedFolderNotice; + + public string PortableProfilePath => Path.Combine(AppContext.BaseDirectory, ProfileFolderName); + public string LegacyProfilePath => Path.Combine(_applicationDataRoot, LegacyProfileFolderName); + public bool UsingLegacyProfile { get; private set; } + public string? MigrationError { get; private set; } + + /// + /// Creates a WebView2 environment. An override is used only by startup + /// recovery, which must always receive its own temporary profile. + /// + public async Task CreateAsync(string? userDataFolderOverride = null) + { + var userDataFolder = userDataFolderOverride ?? SelectPersistentProfile(); + Directory.CreateDirectory(userDataFolder); + + return await CoreWebView2Environment.CreateAsync( + browserExecutableFolder: null, + userDataFolder: userDataFolder, + options: CreateWebViewOptions()); + } + + /// + /// Returns a startup notice once for the protected-installation fallback, + /// and returns a migration error when one occurred during this startup. + /// + public string? TakeStartupNotice() + { + if (_shouldShowProtectedFolderNotice) + { + _shouldShowProtectedFolderNotice = false; + return "FoxBrowser встановлено в захищену папку — профіль зберігається " + + "у стандартному місці Windows, а не поруч із застосунком. Для " + + "портативного профілю перенесіть FoxBrowser у папку з правами запису " + + "(наприклад, Робочий стіл або Документи)."; + } + + if (MigrationError is not null) + return $"Не вдалося перенести профіль FoxBrowser у папку поруч із застосунком: {MigrationError}\n\n" + + "Запуск продовжено зі стандартним профілем Windows."; + + return null; + } + + private string SelectPersistentProfile() + { + UsingLegacyProfile = false; + MigrationError = null; + + if (!CanWriteToApplicationDirectory()) + { + UsingLegacyProfile = true; + MarkProtectedFolderNotice(); + return LegacyProfilePath; + } + + if (!Directory.Exists(PortableProfilePath) && Directory.Exists(LegacyProfilePath)) + { + try + { + CopyDirectoryContents(LegacyProfilePath, PortableProfilePath); + } + catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or SecurityException) + { + MigrationError = ex.Message; + TryDeleteDirectory(PortableProfilePath); + UsingLegacyProfile = true; + return LegacyProfilePath; + } + } + + return PortableProfilePath; + } + + private static CoreWebView2EnvironmentOptions CreateWebViewOptions() => new() + { + AreBrowserExtensionsEnabled = true + }; + + private static bool CanWriteToApplicationDirectory() + { + var testFile = Path.Combine(AppContext.BaseDirectory, $".foxbrowser-write-test-{Guid.NewGuid():N}.tmp"); + try + { + using (var stream = new FileStream(testFile, FileMode.CreateNew, FileAccess.Write, FileShare.None)) + stream.WriteByte(0); + File.Delete(testFile); + return true; + } + catch (UnauthorizedAccessException) + { + TryDeleteFile(testFile); + return false; + } + catch (IOException) + { + TryDeleteFile(testFile); + return false; + } + catch (SecurityException) + { + TryDeleteFile(testFile); + return false; + } + } + + private void MarkProtectedFolderNotice() + { + try + { + Directory.CreateDirectory(_applicationDataRoot); + var marker = ProtectedFolderNoticeMarkerPath(); + if (!File.Exists(marker)) + { + File.WriteAllText(marker, DateTimeOffset.UtcNow.ToString("O")); + _shouldShowProtectedFolderNotice = true; + } + } + catch + { + // The fallback profile remains valid even if the notice marker cannot be saved. + } + } + + private string ProtectedFolderNoticeMarkerPath() => Path.Combine(_applicationDataRoot, ProtectedFolderNoticeMarker); + + private static void CopyDirectoryContents(string sourceDirectory, string destinationDirectory) + { + Directory.CreateDirectory(destinationDirectory); + + foreach (var directory in Directory.EnumerateDirectories(sourceDirectory, "*", SearchOption.AllDirectories)) + { + var relativePath = Path.GetRelativePath(sourceDirectory, directory); + Directory.CreateDirectory(Path.Combine(destinationDirectory, relativePath)); + } + + foreach (var file in Directory.EnumerateFiles(sourceDirectory, "*", SearchOption.AllDirectories)) + { + var relativePath = Path.GetRelativePath(sourceDirectory, file); + var destinationFile = Path.Combine(destinationDirectory, relativePath); + Directory.CreateDirectory(Path.GetDirectoryName(destinationFile)!); + File.Copy(file, destinationFile, overwrite: false); + } + } + + private static void TryDeleteDirectory(string path) + { + try + { + if (Directory.Exists(path)) + Directory.Delete(path, recursive: true); + } + catch + { + // A partial migration must not prevent fallback to the legacy profile. + } + } + + private static void TryDeleteFile(string path) + { + try + { + if (File.Exists(path)) + File.Delete(path); + } + catch + { + // Best effort cleanup only. + } + } +} diff --git a/FEATURE_REQUEST_2026-09.md b/FEATURE_REQUEST_2026-09.md new file mode 100644 index 0000000..86d9c27 --- /dev/null +++ b/FEATURE_REQUEST_2026-09.md @@ -0,0 +1,96 @@ +Реалізуй чотири незалежні покращення в FoxBrowser. Роби їх послідовно, +кожне — окремим комітом, з коротким тестовим сценарієм на кінці. +Не чіпай TabManager/watchdog-логіку, якщо це не потрібно напряму для задачі. + +## 1. Підтримка розширень (Chrome-сумісні extensions) + +WebView2 має нативну підтримку unpacked-розширень через CoreWebView2Profile: + +- При створенні CoreWebView2Environment виставити + `CoreWebView2EnvironmentOptions.AreBrowserExtensionsEnabled = true` + (без цього прапорця AddBrowserExtensionAsync повертає ERROR_NOT_SUPPORTED). +- Додати `Core/ExtensionManager.cs`: + - `AddExtensionAsync(string folderPath)` → `profile.AddBrowserExtensionAsync(folderPath)`. + Важливо: приймається тільки шлях до **розпакованої** папки з manifest.json + (той самий формат, що й Chrome "Load unpacked" у режимі розробника) — + прямого встановлення з Chrome Web Store за URL немає в API, це нормально, + не намагайся емулювати завантаження з магазину. + - `GetInstalledExtensionsAsync()` → `profile.GetBrowserExtensionsAsync()`. + - Enable/disable через `CoreWebView2BrowserExtension.IsEnabled`, видалення — `.Remove()`. +- UI: нове вікно/секція в налаштуваннях `ExtensionsSettingsWindow.xaml` — список + встановлених розширень (назва, іконка якщо є, перемикач увімк/вимк, кнопка + видалити) + кнопка "Додати" з `System.Windows.Forms.FolderBrowserDialog` для + вибору папки розширення. +- Розширення персистяться в профілі (user data folder) автоматично — + не треба вручну зберігати список між запусками, просто перечитувати + GetBrowserExtensionsAsync() при старті. +- ⚠️ Це API позначене в документації Microsoft як таке, що ще може змінюватись + ("prerelease"/experimental) — перевір актуальну версію WebView2 SDK + в csproj, і якщо AddBrowserExtensionAsync недоступний у поточній версії, + онови NuGet-пакет Microsoft.Web.WebView2 до версії, де метод є. + +## 2. Темна смужка заголовка вікна (title bar) + +Стандартний WPF Window малює системну (світлу) title bar незалежно від теми +застосунку. Потрібен P/Invoke до DWM: + +- У `Native/Win32Interop.cs` додати сигнатуру: + `DwmSetWindowAttribute(IntPtr hwnd, int attribute, ref int value, int size)`. +- Атрибут `DWMWA_USE_IMMERSIVE_DARK_MODE` = 20 (Windows 10 build 19041+ і всі + Windows 11); для старіших білдів Windows 10 (до 19041) значення атрибута — 19. + Визнач білд через `Environment.OSVersion` і підстав правильне число, або + просто пробуй 20 і фолбек на 19, якщо виклик повернув помилку. +- Викликати з value=1 (true) у `MainWindow.xaml.cs` в обробнику + `SourceInitialized` (handle вікна вже створений на цьому етапі, + раніше — hwnd ще нульовий і виклик не подіє). +- Якщо застосунок надалі планує світлу/темну тему як перемикач — винести + виклик у окремий метод `ApplyDarkTitleBar(bool enabled)` і викликати його + і при старті, і при зміні теми в налаштуваннях, а не хардкодити один раз. + +## 3. Прибрати кнопку "у трей" з головного вікна + +- У `MainWindow.xaml` знайти і видалити XAML-кнопку, що ховає вікно в трей + (і відповідний Click-обробник у code-behind, якщо він не використовується + більше ніде). +- Функціональність згортання в трей НЕ прибирати — вона має лишитись + доступною через стандартну поведінку: клік на "згорнути" (мінімізувати) + вікна або на "закрити" (якщо зараз close перехоплюється і ховає замість + завершення застосунку — залиш як є). Перевір `TrayIconManager.cs` — + контекстне меню трею (Show/Hide, Exit) лишається без змін. +- Ціль — прибрати саме зайвий UI-елемент з панелі інструментів вікна, + не ламаючи існуючий цикл згортання/розгортання. + +## 4. Виправити подвійний клік по іконці трею + +Зараз: перший клік на іконку в треї лише "проявляє" застосунок на панелі +задач, і тільки другий клік по цій новій іконці на панелі задач реально +відкриває вікно. Це означає, що десь у `TrayIconManager.cs` логіка розбита +на два окремі кроки замість одного atomic-виклику, або що обробник висить +на `MouseDoubleClick` замість одинарного кліку лівою кнопкою, а проміжний +стан (ShowInTaskbar=true) відбувається окремо від Show()/Activate(). + +Виправлення: +- Знайти обробник кліку по NotifyIcon (ймовірно `MouseClick`/`MouseDoubleClick` + на `System.Windows.Forms.NotifyIcon` або аналог з бібліотеки трею, якщо + використовується інша, напр. Hardcodet.NotifyIcon.Wpf). +- Прибрати залежність на подвійний клік — підписатись на одинарний клік + лівою кнопкою (`MouseClick` з перевіркою `e.Button == MouseButtons.Left`, + або відповідний однократний eventArgs у використовуваній бібліотеці). +- В одному обробнику, синхронно й без проміжних станів, виконати весь ланцюжок: +```csharp + mainWindow.ShowInTaskbar = true; + mainWindow.Show(); + mainWindow.WindowState = WindowState.Normal; + mainWindow.Activate(); +``` + Порядок важливий: ShowInTaskbar виставляється ДО Show(), інакше вікно + може з'явитись без іконки на панелі задач до наступного перемальовування. +- Протестувати сценарій: застосунок згорнутий у трей (ShowInTaskbar=false, + Hide()) → один клік лівою кнопкою по іконці трею → вікно одразу видиме, + активне, і з'являється на панелі задач за один крок, без другого кліка. +- Right-click (контекстне меню Show/Hide/Exit) не займати — воно вже працює + окремо і його логіку не чіпати. + +Після кожного пункту напиши короткий підсумок, що саме змінено і як це +перевірити вручну на Windows-машині (агент у Linux sandbox без dotnet/WPF +runtime, тому фінальну компіляцію й ручний тест виконує користувач). \ No newline at end of file diff --git a/FoxBrowser.csproj b/FoxBrowser.csproj new file mode 100644 index 0000000..478b810 --- /dev/null +++ b/FoxBrowser.csproj @@ -0,0 +1,29 @@ + + + WinExe + net8.0-windows + true + true + enable + enable + FoxBrowser + FoxBrowser + app.manifest + FoxBrowser.ico + + + + + + + + + + + + PreserveNewest + + + + + diff --git a/FoxBrowser.ico b/FoxBrowser.ico new file mode 100644 index 0000000000000000000000000000000000000000..5b62debc780deaa7c0579d62f7080e499f338eef GIT binary patch literal 370070 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 NNu9oA0AlI%{4b~!mf8RS literal 0 HcmV?d00001 diff --git a/FoxBrowser.sln b/FoxBrowser.sln new file mode 100644 index 0000000..a281007 --- /dev/null +++ b/FoxBrowser.sln @@ -0,0 +1,18 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FoxBrowser", "FoxBrowser.csproj", "{9A7C5D50-9B70-4E4D-96D2-6F30E1A6C4BD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9A7C5D50-9B70-4E4D-96D2-6F30E1A6C4BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A7C5D50-9B70-4E4D-96D2-6F30E1A6C4BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A7C5D50-9B70-4E4D-96D2-6F30E1A6C4BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A7C5D50-9B70-4E4D-96D2-6F30E1A6C4BD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/MainWindow.xaml b/MainWindow.xaml new file mode 100644 index 0000000..41bdfb1 --- /dev/null +++ b/MainWindow.xaml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +