From c5fb5f62d9777d1cbabea1ee198e07f6f7a4e33e Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 03:01:46 +0100 Subject: [PATCH 01/16] Add IntegrationTests project --- .../ElectronFixture.cs | 43 ++++ .../ElectronNET.IntegrationTests.csproj | 39 +++ .../GlobalUsings.cs | 2 + .../Properties/electron-builder.json | 19 ++ .../Tests/AppTests.cs | 166 +++++++++++++ .../Tests/BrowserViewTests.cs | 27 +++ .../Tests/BrowserWindowTests.cs | 223 ++++++++++++++++++ .../Tests/ClipboardTests.cs | 43 ++++ .../Tests/CookiesTests.cs | 26 ++ .../Tests/GlobalShortcutTests.cs | 20 ++ .../Tests/HostHookTests.cs | 15 ++ .../Tests/IpcMainTests.cs | 86 +++++++ .../Tests/MenuTests.cs | 60 +++++ .../Tests/MultiEventRegistrationTests.cs | 64 +++++ .../Tests/NativeImageTests.cs | 87 +++++++ .../Tests/NativeThemeTests.cs | 43 ++++ .../Tests/NotificationTests.cs | 31 +++ .../Tests/ProcessTests.cs | 29 +++ .../Tests/ScreenTests.cs | 32 +++ .../Tests/SessionTests.cs | 103 ++++++++ .../Tests/ShellTests.cs | 15 ++ .../Tests/ThumbarButtonTests.cs | 44 ++++ .../Tests/TrayTests.cs | 26 ++ .../Tests/WebContentsTests.cs | 75 ++++++ src/ElectronNET.sln | 10 +- 25 files changed, 1327 insertions(+), 1 deletion(-) create mode 100644 src/ElectronNET.IntegrationTests/ElectronFixture.cs create mode 100644 src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj create mode 100644 src/ElectronNET.IntegrationTests/GlobalUsings.cs create mode 100644 src/ElectronNET.IntegrationTests/Properties/electron-builder.json create mode 100644 src/ElectronNET.IntegrationTests/Tests/AppTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/BrowserViewTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/BrowserWindowTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/ClipboardTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/CookiesTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/GlobalShortcutTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/HostHookTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/IpcMainTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/MenuTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/MultiEventRegistrationTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/NativeImageTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/NativeThemeTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/NotificationTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/ProcessTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/ScreenTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/SessionTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/ShellTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/ThumbarButtonTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/TrayTests.cs create mode 100644 src/ElectronNET.IntegrationTests/Tests/WebContentsTests.cs diff --git a/src/ElectronNET.IntegrationTests/ElectronFixture.cs b/src/ElectronNET.IntegrationTests/ElectronFixture.cs new file mode 100644 index 00000000..68a1ec9b --- /dev/null +++ b/src/ElectronNET.IntegrationTests/ElectronFixture.cs @@ -0,0 +1,43 @@ +namespace ElectronNET.IntegrationTests +{ + using System.Reflection; + using ElectronNET.API; + using ElectronNET.API.Entities; + + // Shared fixture that starts Electron runtime once + public class ElectronFixture : IAsyncLifetime + { + public BrowserWindow MainWindow { get; private set; } = null!; + + public async Task InitializeAsync() + { + AppDomain.CurrentDomain.SetData("ElectronTestAssembly", Assembly.GetExecutingAssembly()); + var runtimeController = ElectronNetRuntime.RuntimeController; + await runtimeController.Start(); + await runtimeController.WaitReadyTask; + + // create hidden window for tests (avoid showing UI) + this.MainWindow = await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions + { + Show = false, + Width = 800, + Height = 600, + }); + + // Clear potential cache side-effects + await this.MainWindow.WebContents.Session.ClearCacheAsync(); + } + + public async Task DisposeAsync() + { + var runtimeController = ElectronNetRuntime.RuntimeController; + await runtimeController.Stop(); + await runtimeController.WaitStoppedTask; + } + } + + [CollectionDefinition("ElectronCollection")] + public class ElectronCollection : ICollectionFixture + { + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj b/src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj new file mode 100644 index 00000000..f13ae152 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj @@ -0,0 +1,39 @@ + + + + + true + + + + + + net8.0 + enable + enable + false + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + false + + + + + diff --git a/src/ElectronNET.IntegrationTests/GlobalUsings.cs b/src/ElectronNET.IntegrationTests/GlobalUsings.cs new file mode 100644 index 00000000..7fef4b0e --- /dev/null +++ b/src/ElectronNET.IntegrationTests/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using Xunit; +global using FluentAssertions; \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Properties/electron-builder.json b/src/ElectronNET.IntegrationTests/Properties/electron-builder.json new file mode 100644 index 00000000..41f483cc --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Properties/electron-builder.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://raw.githubusercontent.com/electron-userland/electron-builder/refs/heads/master/packages/app-builder-lib/scheme.json", + "compression": "maximum", + "linux": { + "target": [ + "tar.xz" + ], + "executableArgs": [ "--no-sandbox" ], + "artifactName": "${name}-${arch}-${version}.${ext}" + }, + "win": { + "target": [ + { + "target": "portable", + "arch": "x64" + } + ] + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/AppTests.cs b/src/ElectronNET.IntegrationTests/Tests/AppTests.cs new file mode 100644 index 00000000..3e77d27a --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/AppTests.cs @@ -0,0 +1,166 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using System.Runtime.InteropServices; + using ElectronNET.API; + using ElectronNET.API.Entities; + using System; + using System.IO; + using System.Threading.Tasks; + + [Collection("ElectronCollection")] + public class AppTests + { + // ReSharper disable once NotAccessedField.Local + private readonly ElectronFixture fx; + public AppTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Can_get_app_path() + { + var path = await Electron.App.GetAppPathAsync(); + path.Should().NotBeNullOrWhiteSpace(); + Directory.Exists(path).Should().BeTrue(); + } + + [Fact] + public async Task Can_get_version_and_locale() + { + var version = await Electron.App.GetVersionAsync(); + version.Should().NotBeNullOrWhiteSpace(); + var locale = await Electron.App.GetLocaleAsync(); + locale.Should().NotBeNullOrWhiteSpace(); + } + + [Fact] + public async Task Can_get_special_paths() + { + var userData = await Electron.App.GetPathAsync(PathName.UserData); + userData.Should().NotBeNullOrWhiteSpace(); + Directory.Exists(Path.GetDirectoryName(userData) ?? userData).Should().BeTrue(); + + var temp = await Electron.App.GetPathAsync(PathName.Temp); + temp.Should().NotBeNullOrWhiteSpace(); + Directory.Exists(temp).Should().BeTrue(); + } + + + [Fact] + public async Task Badge_count_roundtrip_where_supported() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + var ok = await Electron.App.SetBadgeCountAsync(3); + ok.Should().BeTrue(); + var count = await Electron.App.GetBadgeCountAsync(); + count.Should().Be(3); + // reset + await Electron.App.SetBadgeCountAsync(0); + } + else + { + // On Windows it's usually unsupported; ensure badge query works and returns a non-negative value + await Electron.App.SetBadgeCountAsync(0); // ignore return value + var count = await Electron.App.GetBadgeCountAsync(); + count.Should().BeGreaterOrEqualTo(0); + } + } + + [Fact] + public async Task Can_get_app_metrics() + { + var metrics = await Electron.App.GetAppMetricsAsync(); + metrics.Should().NotBeNull(); + metrics.Length.Should().BeGreaterThan(0); + } + + [Fact] + public async Task Can_get_gpu_feature_status() + { + var status = await Electron.App.GetGpuFeatureStatusAsync(); + status.Should().NotBeNull(); + } + + [Fact] + public async Task Can_get_login_item_settings() + { + var settings = await Electron.App.GetLoginItemSettingsAsync(); + settings.Should().NotBeNull(); + } + + [Fact] + public void Can_set_app_logs_path() + { + var tempDir = Path.Combine(Path.GetTempPath(), "ElectronLogsTest" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(tempDir); + Electron.App.SetAppLogsPath(tempDir); + } + + [Fact] + public async Task CommandLine_append_and_query_switch() + { + var switchName = "integration-switch"; + Electron.App.CommandLine.AppendSwitch(switchName, "value123"); + (await Electron.App.CommandLine.HasSwitchAsync(switchName)).Should().BeTrue(); + (await Electron.App.CommandLine.GetSwitchValueAsync(switchName)).Should().Be("value123"); + } + + [Fact] + public async Task Accessibility_support_toggle() + { + Electron.App.SetAccessibilitySupportEnabled(true); + var enabled = await Electron.App.IsAccessibilitySupportEnabledAsync(); + enabled.Should().BeTrue(); // API responded + Electron.App.SetAccessibilitySupportEnabled(false); + } + + [Fact] + public async Task UserAgentFallback_roundtrip() + { + var original = await Electron.App.UserAgentFallbackAsync; + Electron.App.UserAgentFallback = "ElectronIntegrationTest/1.0"; + var updated = await Electron.App.UserAgentFallbackAsync; + updated.Should().Be("ElectronIntegrationTest/1.0"); + Electron.App.UserAgentFallback = original; // restore + } + + [Fact] + public async Task BadgeCount_set_and_reset_where_supported() + { + await Electron.App.SetBadgeCountAsync(2); + var count = await Electron.App.GetBadgeCountAsync(); + // Some platforms may always return0; just ensure call didn't throw and is non-negative + count.Should().BeGreaterOrEqualTo(0); + await Electron.App.SetBadgeCountAsync(0); + } + + [Fact] + public async Task App_metrics_have_cpu_info() + { + var metrics = await Electron.App.GetAppMetricsAsync(); + metrics[0].Cpu.Should().NotBeNull(); + } + + [Fact] + public async Task App_badge_count_roundtrip() + { + // Set then get (non-mac platforms treat as no-op but should return0 or set value) + var success = await Electron.App.SetBadgeCountAsync(3); + success.Should().BeTrue(); + var count = await Electron.App.GetBadgeCountAsync(); + // Allow fallback to0 on platforms without badge support + (count ==3 || count ==0).Should().BeTrue(); + } + + [Fact] + public async Task App_gpu_feature_status_has_some_fields() + { + var status = await Electron.App.GetGpuFeatureStatusAsync(); + status.Should().NotBeNull(); + status.Webgl.Should().NotBeNull(); + status.VideoDecode.Should().NotBeNull(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/BrowserViewTests.cs b/src/ElectronNET.IntegrationTests/Tests/BrowserViewTests.cs new file mode 100644 index 00000000..754c9b08 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/BrowserViewTests.cs @@ -0,0 +1,27 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + using ElectronNET.API.Entities; + + [Collection("ElectronCollection")] + public class BrowserViewTests + { + private readonly ElectronFixture fx; + public BrowserViewTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Create_browser_view_and_adjust_bounds() + { + var view = await Electron.WindowManager.CreateBrowserViewAsync(new BrowserViewConstructorOptions()); + this.fx.MainWindow.SetBrowserView(view); + view.Bounds = new Rectangle { X = 0, Y = 0, Width = 300, Height = 200 }; + // Access bounds again (synchronous property fetch) + var current = view.Bounds; + current.Width.Should().Be(300); + current.Height.Should().Be(200); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/BrowserWindowTests.cs b/src/ElectronNET.IntegrationTests/Tests/BrowserWindowTests.cs new file mode 100644 index 00000000..40077784 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/BrowserWindowTests.cs @@ -0,0 +1,223 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using System.Runtime.InteropServices; + using ElectronNET.API; + using ElectronNET.API.Entities; + + [Collection("ElectronCollection")] + public class BrowserWindowTests + { + private readonly ElectronFixture fx; + + public BrowserWindowTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Can_set_and_get_title() + { + const string title = "Integration Test Title"; + this.fx.MainWindow.SetTitle(title); + var roundTrip = await this.fx.MainWindow.GetTitleAsync(); + roundTrip.Should().Be(title); + } + + [Fact] + public async Task Can_resize_and_get_size() + { + this.fx.MainWindow.SetSize(643, 482); + var size = await this.fx.MainWindow.GetSizeAsync(); + size.Should().HaveCount(2); + size[0].Should().Be(643); + size[1].Should().Be(482); + } + + [Fact] + public async Task Can_set_progress_bar_and_clear() + { + this.fx.MainWindow.SetProgressBar(0.5); + // No direct getter; rely on absence of error. Try changing again. + this.fx.MainWindow.SetProgressBar(-1); // clears + await Task.Delay(50); + } + + [Fact] + public async Task Can_set_and_get_position() + { + this.fx.MainWindow.SetPosition(134, 246); + await Task.Delay(500); + var pos = await this.fx.MainWindow.GetPositionAsync(); + pos.Should().BeEquivalentTo(new[] { 134, 246 }); + } + + [Fact] + public async Task Can_set_and_get_bounds() + { + var bounds = new Rectangle { X = 10, Y = 20, Width = 400, Height = 300 }; + this.fx.MainWindow.SetBounds(bounds); + var round = await this.fx.MainWindow.GetBoundsAsync(); + + round.Should().BeEquivalentTo(bounds); + round.Width.Should().Be(400); + round.Height.Should().Be(300); + } + + [Fact] + public async Task Can_set_and_get_content_bounds() + { + var bounds = new Rectangle { X = 0, Y = 0, Width = 300, Height = 200 }; + this.fx.MainWindow.SetContentBounds(bounds); + var round = await this.fx.MainWindow.GetContentBoundsAsync(); + round.Width.Should().BeGreaterThan(0); + round.Height.Should().BeGreaterThan(0); + } + + [Fact] + public async Task Show_hide_visibility_roundtrip() + { + this.fx.MainWindow.Show(); + (await this.fx.MainWindow.IsVisibleAsync()).Should().BeTrue(); + this.fx.MainWindow.Hide(); + (await this.fx.MainWindow.IsVisibleAsync()).Should().BeFalse(); + } + + [Fact] + public async Task AlwaysOnTop_toggle_and_query() + { + this.fx.MainWindow.SetAlwaysOnTop(true); + (await this.fx.MainWindow.IsAlwaysOnTopAsync()).Should().BeTrue(); + this.fx.MainWindow.SetAlwaysOnTop(false); + (await this.fx.MainWindow.IsAlwaysOnTopAsync()).Should().BeFalse(); + } + + [Fact] + public async Task MenuBar_auto_hide_and_visibility() + { + this.fx.MainWindow.SetAutoHideMenuBar(true); + (await this.fx.MainWindow.IsMenuBarAutoHideAsync()).Should().BeTrue(); + this.fx.MainWindow.SetMenuBarVisibility(false); + (await this.fx.MainWindow.IsMenuBarVisibleAsync()).Should().BeFalse(); + this.fx.MainWindow.SetMenuBarVisibility(true); + (await this.fx.MainWindow.IsMenuBarVisibleAsync()).Should().BeTrue(); + } + + [Fact] + public async Task ReadyToShow_event_fires_after_content_ready() + { + var window = await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { Show = false }); + var tcs = new TaskCompletionSource(); + window.OnReadyToShow += () => tcs.TrySetResult(); + + // Trigger a navigation and wait for DOM ready so the renderer paints, which emits ready-to-show + var domReadyTcs = new TaskCompletionSource(); + window.WebContents.OnDomReady += () => domReadyTcs.TrySetResult(); + await window.WebContents.LoadURLAsync("about:blank"); + await domReadyTcs.Task; + + var completed = await Task.WhenAny(tcs.Task, Task.Delay(3000)); + completed.Should().Be(tcs.Task); + + // Typical usage is to show once ready + window.Show(); + } + + [Fact] + public async Task PageTitleUpdated_event_fires_on_title_change() + { + var window = await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { Show = true }); + var tcs = new TaskCompletionSource(); + window.OnPageTitleUpdated += title => tcs.TrySetResult(title); + + // Navigate and wait for DOM ready, then change the document.title to trigger the event + var domReadyTcs = new TaskCompletionSource(); + window.WebContents.OnDomReady += () => domReadyTcs.TrySetResult(); + await window.WebContents.LoadURLAsync("about:blank"); + await domReadyTcs.Task; + await window.WebContents.ExecuteJavaScriptAsync("document.title='NewTitle';"); + + // Wait for event up to a short timeout + var completed2 = await Task.WhenAny(tcs.Task, Task.Delay(3000)); + completed2.Should().Be(tcs.Task); + (await tcs.Task).Should().Be("NewTitle"); + } + + [Fact] + public async Task Resize_event_fires_on_size_change() + { + var window = await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { Show = false }); + var resized = false; + window.OnResize += () => resized = true; + window.SetSize(500, 400); + await Task.Delay(300); + resized.Should().BeTrue(); + } + + [Fact] + public async Task Progress_bar_and_always_on_top_toggle() + { + var win = this.fx.MainWindow; + win.SetProgressBar(0.5); + win.SetProgressBar(0.8, new ProgressBarOptions { Mode = ProgressBarMode.normal }); + win.SetAlwaysOnTop(true); + (await win.IsAlwaysOnTopAsync()).Should().BeTrue(); + win.SetAlwaysOnTop(false); + (await win.IsAlwaysOnTopAsync()).Should().BeFalse(); + } + + [Fact] + public async Task Menu_bar_visibility_and_auto_hide() + { + var win = this.fx.MainWindow; + win.SetAutoHideMenuBar(true); + (await win.IsMenuBarAutoHideAsync()).Should().BeTrue(); + win.SetMenuBarVisibility(true); + (await win.IsMenuBarVisibleAsync()).Should().BeTrue(); + } + + [Fact] + public async Task Parent_child_relationship_roundtrip() + { + var child = await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { Show = false, Width = 300, Height = 200 }); + this.fx.MainWindow.SetParentWindow(null); // ensure top-level + child.SetParentWindow(this.fx.MainWindow); + var parent = await child.GetParentWindowAsync(); + parent.Id.Should().Be(this.fx.MainWindow.Id); + var kids = await this.fx.MainWindow.GetChildWindowsAsync(); + kids.Select(k => k.Id).Should().Contain(child.Id); + child.Destroy(); + } + + [Fact] + public async Task Represented_filename_and_edited_flags() + { + var win = this.fx.MainWindow; + var temp = Path.Combine(Path.GetTempPath(), "electronnet_test.txt"); + File.WriteAllText(temp, "test"); + win.SetRepresentedFilename(temp); + var represented = await win.GetRepresentedFilenameAsync(); + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + represented.Should().Be(temp); + } + else + { + // Non-macOS platforms may not support represented filename; empty is acceptable + represented.Should().BeEmpty(); + } + + win.SetDocumentEdited(true); + var edited = await win.IsDocumentEditedAsync(); + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + edited.Should().BeTrue(); + } + else + { + edited.Should().BeFalse(); // unsupported on non-mac platforms + } + + win.SetDocumentEdited(false); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/ClipboardTests.cs b/src/ElectronNET.IntegrationTests/Tests/ClipboardTests.cs new file mode 100644 index 00000000..1f7d74f7 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/ClipboardTests.cs @@ -0,0 +1,43 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + + [Collection("ElectronCollection")] + public class ClipboardTests + { + // ReSharper disable once NotAccessedField.Local + private readonly ElectronFixture fx; + + public ClipboardTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Clipboard_text_roundtrip() + { + var text = $"Hello Electron {Guid.NewGuid()}"; + Electron.Clipboard.WriteText(text); + var read = await Electron.Clipboard.ReadTextAsync(); + read.Should().Be(text); + } + + [Fact] + public async Task Available_formats_contains_text_after_write() + { + var text = "FormatsTest"; + Electron.Clipboard.WriteText(text); + var formats = await Electron.Clipboard.AvailableFormatsAsync(); + formats.Should().Contain(f => f.Contains("text") || f.Contains("TEXT") || f.Contains("plain")); + } + + [Fact] + public async Task Bookmark_write_and_read() + { + var url = "https://electron-test.com"; + Electron.Clipboard.WriteBookmark("TitleTest", url); + var bookmark = await Electron.Clipboard.ReadBookmarkAsync(); + bookmark.Url.Should().Be(url); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/CookiesTests.cs b/src/ElectronNET.IntegrationTests/Tests/CookiesTests.cs new file mode 100644 index 00000000..284b381c --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/CookiesTests.cs @@ -0,0 +1,26 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + [Collection("ElectronCollection")] + public class CookiesTests + { + private readonly ElectronFixture fx; + public CookiesTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact(Skip = "Cookie set/get requires navigation to domain; skipping until test harness serves page")] + public async Task Cookie_set_get_remove_sequence() + { + var session = this.fx.MainWindow.WebContents.Session; + var changed = false; + session.Cookies.OnChanged += (cookie, cause, removed) => changed = true; + // Navigate to example.com so cookie domain matches + await this.fx.MainWindow.WebContents.LoadURLAsync("https://example.com"); + // Set via renderer for now + await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync("document.cookie='integration_cookie=1;path=/';"); + await Task.Delay(500); + changed.Should().BeTrue(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/GlobalShortcutTests.cs b/src/ElectronNET.IntegrationTests/Tests/GlobalShortcutTests.cs new file mode 100644 index 00000000..32564260 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/GlobalShortcutTests.cs @@ -0,0 +1,20 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using System.Runtime.InteropServices; + using ElectronNET.API; + + [Collection("ElectronCollection")] + public class GlobalShortcutTests + { + [Fact] + public async Task Can_register_and_unregister() + { + var accel = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "Cmd+Alt+G" : "Ctrl+Alt+G"; + var tcs = new TaskCompletionSource(); + Electron.GlobalShortcut.Register(accel, () => tcs.TrySetResult(true)); + var isRegistered = await Electron.GlobalShortcut.IsRegisteredAsync(accel); + isRegistered.Should().BeTrue(); + Electron.GlobalShortcut.Unregister(accel); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/HostHookTests.cs b/src/ElectronNET.IntegrationTests/Tests/HostHookTests.cs new file mode 100644 index 00000000..254f7aa4 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/HostHookTests.cs @@ -0,0 +1,15 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + + [Collection("ElectronCollection")] + public class HostHookTests + { + [Fact(Skip = "Requires HostHook setup; skipping")] + public async Task HostHook_call_returns_value() + { + var result = await Electron.HostHook.CallAsync("create-excel-file", "."); + result.Should().NotBeNull(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/IpcMainTests.cs b/src/ElectronNET.IntegrationTests/Tests/IpcMainTests.cs new file mode 100644 index 00000000..9e49f46e --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/IpcMainTests.cs @@ -0,0 +1,86 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + + [Collection("ElectronCollection")] + public class IpcMainTests + { + private readonly ElectronFixture fx; + public IpcMainTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Ipc_On_receives_message_from_renderer() + { + var tcs = new TaskCompletionSource(); + await Electron.IpcMain.On("ipc-on-test", obj => tcs.TrySetResult(obj?.ToString() ?? string.Empty)); + await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync("require('electron').ipcRenderer.send('ipc-on-test','payload123')"); + var result = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5)); + result.Should().Be("payload123"); + } + + [Fact] + public async Task Ipc_Once_only_fires_once() + { + var count = 0; + Electron.IpcMain.Once("ipc-once-test", _ => count++); + await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync("const {ipcRenderer}=require('electron'); ipcRenderer.send('ipc-once-test','a'); ipcRenderer.send('ipc-once-test','b');"); + await Task.Delay(500); + count.Should().Be(1); + } + + [Fact] + public async Task Ipc_RemoveAllListeners_stops_receiving() + { + var fired = false; + await Electron.IpcMain.On("ipc-remove-test", _ => fired = true); + Electron.IpcMain.RemoveAllListeners("ipc-remove-test"); + await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync("require('electron').ipcRenderer.send('ipc-remove-test','x')"); + await Task.Delay(400); + fired.Should().BeFalse(); + } + + [Fact] + public async Task Ipc_OnSync_returns_value() + { + Electron.IpcMain.OnSync("ipc-sync-test", obj => + { + obj.Should().NotBeNull(); + return "pong"; + }); + var ret = await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync("require('electron').ipcRenderer.sendSync('ipc-sync-test','ping')"); + ret.Should().Be("pong"); + } + + [Fact] + public async Task Ipc_Send_from_main_reaches_renderer() + { + // Listener: store raw arg; if Electron packs differently we will normalize later + await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync(@"(function(){ const {ipcRenderer}=require('electron'); ipcRenderer.once('main-to-render',(e,arg)=>{ globalThis.__mainToRender = arg;}); return 'ready'; })();"); + Electron.IpcMain.Send(this.fx.MainWindow, "main-to-render", "hello-msg"); + string value = ""; + for (int i = 0; i < 20; i++) + { + var jsVal = await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync("globalThis.__mainToRender === undefined ? '' : (typeof globalThis.__mainToRender === 'string' ? globalThis.__mainToRender : JSON.stringify(globalThis.__mainToRender))"); + value = jsVal?.ToString() ?? ""; + if (!string.IsNullOrEmpty(value)) + { + break; + } + + await Task.Delay(100); + } + + // Normalize possible JSON array ["hello-msg"] case + if (value.StartsWith("[\"") && value.EndsWith("\"]")) + { + // Extract first element between [" and "] + value = value.Substring(2, value.Length - 4); + } + + value.Should().Be("hello-msg"); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/MenuTests.cs b/src/ElectronNET.IntegrationTests/Tests/MenuTests.cs new file mode 100644 index 00000000..511860b2 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/MenuTests.cs @@ -0,0 +1,60 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + using ElectronNET.API.Entities; + + [Collection("ElectronCollection")] + public class MenuTests + { + private readonly ElectronFixture fx; + public MenuTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task ApplicationMenu_click_invokes_handler() + { + var clicked = false; + var items = new[] + { + new MenuItem + { + Label = "File", + Submenu = new[] + { + new MenuItem { Label = "Ping", Click = () => clicked = true }, + }, + }, + }; + Electron.Menu.SetApplicationMenu(items); + var targetId = items[0].Submenu[0].Id; + await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync($"require('electron').ipcRenderer.send('integration-click-application-menu','{targetId}')"); + for (int i = 0; i < 20 && !clicked; i++) + { + await Task.Delay(100); + } + + clicked.Should().BeTrue(); + } + + [Fact] + public async Task ContextMenu_popup_registers_items() + { + var win = this.fx.MainWindow; + var ctxClicked = false; + var ctxItems = new[] { new MenuItem { Label = "Ctx", Click = () => ctxClicked = true } }; + Electron.Menu.SetContextMenu(win, ctxItems); + var ctxId = ctxItems[0].Id; + // simulate popup then click + Electron.Menu.ContextMenuPopup(win); + await this.fx.MainWindow.WebContents.ExecuteJavaScriptAsync($"require('electron').ipcRenderer.send('integration-click-context-menu',{win.Id},'{ctxId}')"); + for (int i = 0; i < 20 && !ctxClicked; i++) + { + await Task.Delay(100); + } + + ctxClicked.Should().BeTrue(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/MultiEventRegistrationTests.cs b/src/ElectronNET.IntegrationTests/Tests/MultiEventRegistrationTests.cs new file mode 100644 index 00000000..2561aece --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/MultiEventRegistrationTests.cs @@ -0,0 +1,64 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + [Collection("ElectronCollection")] + public class MultiEventRegistrationTests + { + private readonly ElectronFixture fx; + + public MultiEventRegistrationTests(ElectronFixture fx) + { + this.fx = fx; + } + + private static async Task WaitAllOrTimeout(TimeSpan timeout, params Task[] tasks) + { + var all = Task.WhenAll(tasks); + var completed = await Task.WhenAny(all, Task.Delay(timeout)); + return ReferenceEquals(completed, all) && all.IsCompletedSuccessfully; + } + + [Fact] + public async Task BrowserWindow_OnResize_multiple_handlers_called() + { + var win = this.fx.MainWindow; + var h1 = new TaskCompletionSource(); + var h2 = new TaskCompletionSource(); + var h3 = new TaskCompletionSource(); + + win.OnResize += () => h1.TrySetResult(); + win.OnResize += () => h2.TrySetResult(); + win.OnResize += () => h3.TrySetResult(); + + var size = await win.GetSizeAsync(); + // trigger resize + win.SetSize(size[0] + 20, size[1] + 10); + + var ok = await WaitAllOrTimeout(TimeSpan.FromSeconds(5), h1.Task, h2.Task, h3.Task); + + if (!ok) + { + throw new Xunit.Sdk.XunitException($"Not all events were fired: \nEvent1 fired: {h1.Task.IsCompleted}\nEvent2 fired: {h2.Task.IsCompleted}\nEvent3 fired: {h3.Task.IsCompleted}"); + } + } + + [Fact] + public async Task WebContents_OnDomReady_multiple_handlers_called() + { + var wc = this.fx.MainWindow.WebContents; + var r1 = new TaskCompletionSource(); + var r2 = new TaskCompletionSource(); + + wc.OnDomReady += () => r1.TrySetResult(); + wc.OnDomReady += () => r2.TrySetResult(); + + await wc.LoadURLAsync("about:blank"); + + var ok = await WaitAllOrTimeout(TimeSpan.FromSeconds(2), r1.Task, r2.Task); + + if (!ok) + { + throw new Xunit.Sdk.XunitException($"Not all events were fired: \nEvent1 fired: {r1.Task.IsCompleted}\nEvent2 fired: {r2.Task.IsCompleted}"); + } + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/NativeImageTests.cs b/src/ElectronNET.IntegrationTests/Tests/NativeImageTests.cs new file mode 100644 index 00000000..35d7825e --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/NativeImageTests.cs @@ -0,0 +1,87 @@ +using RectangleEntity = ElectronNET.API.Entities.Rectangle; + +namespace ElectronNET.IntegrationTests.Tests +{ + using System.Drawing; + using ElectronNET.API.Entities; + + public class NativeImageTests + { + [Fact] + public void Create_from_bitmap_and_to_png() + { + using var bmp = new Bitmap(10, 10); + using (var g = Graphics.FromImage(bmp)) + { + g.Clear(Color.Red); + } + + var native = NativeImage.CreateFromBitmap(bmp); + var size = native.GetSize(); + size.Width.Should().Be(10); + size.Height.Should().Be(10); + var png = native.ToPNG(new ToPNGOptions { ScaleFactor = 1.0f }); + png.Should().NotBeNull(); + png!.Length.Should().BeGreaterThan(0); + } + + [Fact] + public void Create_from_buffer_and_to_data_url() + { + // Prepare PNG bytes + using var bmp = new Bitmap(8, 8); + using (var g = Graphics.FromImage(bmp)) + { + g.Clear(Color.Blue); + } + + using var ms = new MemoryStream(); + bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + var bytes = ms.ToArray(); + var native = NativeImage.CreateFromBuffer(bytes); + var dataUrl = native.ToDataURL(new ToDataUrlOptions { ScaleFactor = 1.0f }); + dataUrl.Should().NotBeNullOrWhiteSpace(); + dataUrl!.StartsWith("data:image/", StringComparison.Ordinal).Should().BeTrue(); + } + + [Fact] + public void Resize_and_crop_produce_expected_sizes() + { + using var bmp = new Bitmap(12, 10); + using (var g = Graphics.FromImage(bmp)) + { + g.Clear(Color.Green); + } + + var native = NativeImage.CreateFromBitmap(bmp); + var resized = native.Resize(new ResizeOptions { Width = 6, Height = 5 }); + var rsize = resized.GetSize(); + rsize.Width.Should().Be(6); + rsize.Height.Should().Be(5); + var cropped = native.Crop(new RectangleEntity { X = 2, Y = 2, Width = 4, Height = 3 }); + var csize = cropped.GetSize(); + csize.Width.Should().Be(4); + csize.Height.Should().Be(3); + } + + [Fact] + public void Add_representation_for_scale_factor() + { + using var bmp = new Bitmap(5, 5); + using (var g = Graphics.FromImage(bmp)) + { + g.Clear(Color.Black); + } + + using var ms = new MemoryStream(); + bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + var buffer = ms.ToArray(); + var native = NativeImage.CreateFromBitmap(bmp); + native.AddRepresentation(new AddRepresentationOptions { Buffer = buffer, ScaleFactor = 2.0f }); + var size2X = native.GetSize(2.0f); + size2X.Should().NotBeNull(); + size2X.Width.Should().Be(5); + size2X.Height.Should().Be(5); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/NativeThemeTests.cs b/src/ElectronNET.IntegrationTests/Tests/NativeThemeTests.cs new file mode 100644 index 00000000..aeffee81 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/NativeThemeTests.cs @@ -0,0 +1,43 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + using ElectronNET.API.Entities; + + [Collection("ElectronCollection")] + public class NativeThemeTests + { + [Fact] + public async Task ThemeSource_roundtrip() + { + // Capture initial + _ = await Electron.NativeTheme.ShouldUseDarkColorsAsync(); + // Force light + Electron.NativeTheme.SetThemeSource(ThemeSourceMode.Light); + var useDarkAfterLight = await Electron.NativeTheme.ShouldUseDarkColorsAsync(); + // Force dark + Electron.NativeTheme.SetThemeSource(ThemeSourceMode.Dark); + var useDarkAfterDark = await Electron.NativeTheme.ShouldUseDarkColorsAsync(); + // Restore system + Electron.NativeTheme.SetThemeSource(ThemeSourceMode.System); + // Assertions are tolerant (platform dependent) + useDarkAfterLight.Should().BeFalse("forcing Light should result in light colors"); + useDarkAfterDark.Should().BeTrue("forcing Dark should result in dark colors"); + } + + [Fact] + public async Task Updated_event_fires_on_change() + { + var fired = false; + Electron.NativeTheme.Updated += () => fired = true; + Electron.NativeTheme.SetThemeSource(ThemeSourceMode.Dark); + await Task.Delay(400); + Electron.NativeTheme.SetThemeSource(ThemeSourceMode.Light); + for (int i = 0; i < 10 && !fired; i++) + { + await Task.Delay(100); + } + + fired.Should().BeTrue(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/NotificationTests.cs b/src/ElectronNET.IntegrationTests/Tests/NotificationTests.cs new file mode 100644 index 00000000..5e3439bb --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/NotificationTests.cs @@ -0,0 +1,31 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + using ElectronNET.API.Entities; + + [Collection("ElectronCollection")] + public class NotificationTests + { + [Fact] + public async Task Notification_create_check() + { + var tcs = new TaskCompletionSource(); + + var options = new NotificationOptions("Notification Title", "Notification test 123"); + options.OnShow = () => tcs.SetResult(); + + Electron.Notification.Show(options); + + await Task.WhenAny(tcs.Task, Task.Delay(5_000)); + + tcs.Task.IsCompletedSuccessfully.Should().BeTrue(); + } + + [Fact] + public async Task Notification_is_supported_check() + { + var supported = await Electron.Notification.IsSupportedAsync(); + supported.Should().BeTrue(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/ProcessTests.cs b/src/ElectronNET.IntegrationTests/Tests/ProcessTests.cs new file mode 100644 index 00000000..edfb986a --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/ProcessTests.cs @@ -0,0 +1,29 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + + [Collection("ElectronCollection")] + public class ProcessTests + { + [Fact] + public async Task Process_info_is_accessible() + { + // Use renderer to fetch process info and round-trip + var execPath = await Electron.WindowManager.CreateWindowAsync(new API.Entities.BrowserWindowOptions { Show = false }); + var result = await execPath.WebContents.ExecuteJavaScriptAsync("process.execPath && process.platform ? 'ok' : 'fail'"); + result.Should().Be("ok"); + } + + [Fact] + public async Task Process_properties_are_populated() + { + var execPath = await Electron.Process.ExecPathAsync; + execPath.Should().NotBeNullOrWhiteSpace(); + var pid = await Electron.Process.PidAsync; + pid.Should().BeGreaterThan(0); + var platform = await Electron.Process.PlatformAsync; + platform.Should().NotBeNullOrWhiteSpace(); + } + + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/ScreenTests.cs b/src/ElectronNET.IntegrationTests/Tests/ScreenTests.cs new file mode 100644 index 00000000..31521fdc --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/ScreenTests.cs @@ -0,0 +1,32 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + + [Collection("ElectronCollection")] + public class ScreenTests + { + // ReSharper disable once NotAccessedField.Local + private readonly ElectronFixture fx; + + public ScreenTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Primary_display_has_positive_dimensions() + { + var display = await Electron.Screen.GetPrimaryDisplayAsync(); + display.Size.Width.Should().BeGreaterThan(0); + display.Size.Height.Should().BeGreaterThan(0); + } + + [Fact] + public async Task GetAllDisplays_returns_at_least_one() + { + var displays = await Electron.Screen.GetAllDisplaysAsync(); + displays.Should().NotBeNull(); + displays.Length.Should().BeGreaterThan(0); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/SessionTests.cs b/src/ElectronNET.IntegrationTests/Tests/SessionTests.cs new file mode 100644 index 00000000..3114087c --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/SessionTests.cs @@ -0,0 +1,103 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API.Entities; + + [Collection("ElectronCollection")] + public class SessionTests + { + private readonly ElectronFixture fx; + + public SessionTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Session_preloads_roundtrip() + { + var session = this.fx.MainWindow.WebContents.Session; + _ = await session.GetPreloadsAsync(); + // Use a dummy path; API should store value + session.SetPreloads(new[] { "/tmp/preload_dummy.js" }); + var preloadsAfter = await session.GetPreloadsAsync(); + preloadsAfter.Should().Contain("/tmp/preload_dummy.js"); + } + + [Fact] + public async Task Session_proxy_set_and_resolve() + { + var session = this.fx.MainWindow.WebContents.Session; + // Provide all ctor args (pacScript empty to ignore, proxyRules direct, bypass empty) + await session.SetProxyAsync(new ProxyConfig("", "direct://", "")); + var proxy = await session.ResolveProxyAsync("https://example.com"); + proxy.Should().NotBeNull(); + } + + + [Fact] + public async Task Session_clear_cache_and_storage_completes() + { + var session = this.fx.MainWindow.WebContents.Session; + await session.ClearCacheAsync(); + await session.ClearStorageDataAsync(); + await session.ClearHostResolverCacheAsync(); + // Ensure still can query user agent after clears + var ua = await session.GetUserAgent(); + ua.Should().NotBeNullOrWhiteSpace(); + } + + [Fact] + public async Task Session_preloads_set_multiple_and_clear() + { + var session = this.fx.MainWindow.WebContents.Session; + session.SetPreloads(new[] { "/tmp/a.js", "/tmp/b.js" }); + var after = await session.GetPreloadsAsync(); + after.Should().Contain("/tmp/a.js").And.Contain("/tmp/b.js"); + // Reset to empty + session.SetPreloads(Array.Empty()); + var empty = await session.GetPreloadsAsync(); + empty.Should().NotContain("/tmp/a.js"); + } + + [Fact] + public async Task Clear_auth_cache_overloads() + { + var session = this.fx.MainWindow.WebContents.Session; + await session.ClearAuthCacheAsync(); + await session.ClearAuthCacheAsync(new RemovePassword("password") { Origin = "https://example.com", Username = "user", Password = "pw", Realm = "realm", Scheme = Scheme.basic }); + } + + [Fact] + public async Task Clear_storage_with_options() + { + var session = this.fx.MainWindow.WebContents.Session; + await session.ClearStorageDataAsync(new ClearStorageDataOptions { Storages = new[] { "cookies" }, Quotas = new[] { "temporary" } }); + } + + [Fact] + public void Enable_disable_network_emulation() + { + var session = this.fx.MainWindow.WebContents.Session; + session.EnableNetworkEmulation(new EnableNetworkEmulationOptions { Offline = false, Latency = 10, DownloadThroughput = 50000, UploadThroughput = 20000 }); + session.DisableNetworkEmulation(); + } + + [Fact] + public void Flush_storage_data_does_not_throw() + { + var session = this.fx.MainWindow.WebContents.Session; + session.FlushStorageData(); + } + + [Fact] + public async Task Set_user_agent_affects_new_navigation() + { + var session = this.fx.MainWindow.WebContents.Session; + // Set UA and verify via session API (navigator.userAgent on existing WebContents may not reflect the override) + session.SetUserAgent("IntegrationAgent/1.0"); + var ua = await session.GetUserAgent(); + ua.Should().NotBeNullOrWhiteSpace(); + ua.Should().Contain("IntegrationAgent/1.0"); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/ShellTests.cs b/src/ElectronNET.IntegrationTests/Tests/ShellTests.cs new file mode 100644 index 00000000..1ce3fb57 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/ShellTests.cs @@ -0,0 +1,15 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + + [Collection("ElectronCollection")] + public class ShellTests + { + [Fact] + public async Task OpenExternal_invalid_scheme_returns_error_or_empty() + { + var error = await Electron.Shell.OpenExternalAsync("mailto:test@example.com"); + (error == string.Empty || error.Contains("@") || error.Length > 0).Should().BeTrue(); // call succeeded + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/ThumbarButtonTests.cs b/src/ElectronNET.IntegrationTests/Tests/ThumbarButtonTests.cs new file mode 100644 index 00000000..49613107 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/ThumbarButtonTests.cs @@ -0,0 +1,44 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using System.Runtime.InteropServices; + using ElectronNET.API.Entities; + + [Collection("ElectronCollection")] + public class ThumbarButtonTests + { + private readonly ElectronFixture fx; + + public ThumbarButtonTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task SetThumbarButtons_returns_success() + { + var btn = new ThumbarButton("icon.png") { Tooltip = "Test" }; + var success = await this.fx.MainWindow.SetThumbarButtonsAsync(new[] { btn }); + success.Should().BeTrue(); + } + + [Fact] + public async Task Thumbar_button_click_invokes_callback() + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return; // only meaningful on Windows taskbar + } + + var icon = Path.Combine(Directory.GetCurrentDirectory(), "ElectronNET.WebApp", "wwwroot", "icon.png"); + if (!File.Exists(icon)) + { + return; // skip if icon missing + } + + var tcs = new TaskCompletionSource(); + var btn = new ThumbarButton(icon) { Tooltip = "Test", Flags = new[] { ThumbarButtonFlag.enabled }, Click = () => tcs.TrySetResult(true) }; + var ok = await this.fx.MainWindow.SetThumbarButtonsAsync(new[] { btn }); + ok.Should().BeTrue(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/TrayTests.cs b/src/ElectronNET.IntegrationTests/Tests/TrayTests.cs new file mode 100644 index 00000000..fdbd9f44 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/TrayTests.cs @@ -0,0 +1,26 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API; + + [Collection("ElectronCollection")] + public class TrayTests + { + // ReSharper disable once NotAccessedField.Local + private readonly ElectronFixture fx; + public TrayTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Can_create_tray_and_destroy() + { + //await Electron.Tray.Show("assets/icon.png"); + await Electron.Tray.Show(null); + var isDestroyed = await Electron.Tray.IsDestroyedAsync(); + isDestroyed.Should().BeFalse(); + await Electron.Tray.Destroy(); + (await Electron.Tray.IsDestroyedAsync()).Should().BeTrue(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.IntegrationTests/Tests/WebContentsTests.cs b/src/ElectronNET.IntegrationTests/Tests/WebContentsTests.cs new file mode 100644 index 00000000..066557e3 --- /dev/null +++ b/src/ElectronNET.IntegrationTests/Tests/WebContentsTests.cs @@ -0,0 +1,75 @@ +namespace ElectronNET.IntegrationTests.Tests +{ + using ElectronNET.API.Entities; + + [Collection("ElectronCollection")] + public class WebContentsTests + { + private readonly ElectronFixture fx; + + public WebContentsTests(ElectronFixture fx) + { + this.fx = fx; + } + + [Fact] + public async Task Can_get_url_after_navigation() + { + var wc = this.fx.MainWindow.WebContents; + await wc.LoadURLAsync("https://example.com"); + var url = await wc.GetUrl(); + url.Should().Contain("example.com"); + } + + [Fact] + public async Task ExecuteJavaScript_returns_title() + { + var wc = this.fx.MainWindow.WebContents; + await wc.LoadURLAsync("https://example.com"); + var title = await wc.ExecuteJavaScriptAsync("document.title"); + title.Should().NotBeNull(); + } + + [Fact] + public async Task DomReady_event_fires() + { + var wc = this.fx.MainWindow.WebContents; + var fired = false; + wc.OnDomReady += () => fired = true; + await wc.LoadURLAsync("https://example.com"); + await Task.Delay(500); + fired.Should().BeTrue(); + } + + [Fact] + public async Task Can_print_to_pdf() + { + var html = "data:text/html,

PDF Test

Electron.NET

"; + await this.fx.MainWindow.WebContents.LoadURLAsync(html); + var tmp = Path.Combine(Path.GetTempPath(), $"electronnet_pdf_{Guid.NewGuid():N}.pdf"); + try + { + var ok = await this.fx.MainWindow.WebContents.PrintToPDFAsync(tmp); + ok.Should().BeTrue(); + File.Exists(tmp).Should().BeTrue(); + new FileInfo(tmp).Length.Should().BeGreaterThan(0); + } + finally + { + if (File.Exists(tmp)) + { + File.Delete(tmp); + } + } + } + + [Fact] + public async Task Can_basic_print() + { + var html = "data:text/html,

Print Test

"; + await this.fx.MainWindow.WebContents.LoadURLAsync(html); + var ok = await this.fx.MainWindow.WebContents.PrintAsync(new PrintOptions { Silent = true, PrintBackground = true }); + ok.Should().BeTrue(); + } + } +} \ No newline at end of file diff --git a/src/ElectronNET.sln b/src/ElectronNET.sln index 55de11a2..3f46f97b 100644 --- a/src/ElectronNET.sln +++ b/src/ElectronNET.sln @@ -67,6 +67,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "!Docs", "!Docs", "{D36CDFFD EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Docs", "..\docs\Docs.shproj", "{06CAADC7-DE5B-47B4-AB2A-E9501459A2D1}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test Projects", "Test Projects", "{75129C45-FC6F-41B0-A485-07F4A7E031ED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElectronNET.IntegrationTests", "ElectronNET.IntegrationTests\ElectronNET.IntegrationTests.csproj", "{AE877E48-6B44-63C2-8EA0-DB58D096B553}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -86,7 +90,6 @@ Global {B33E9B82-B6B4-4DB0-B6EE-61CC34641518}.Release|Any CPU.ActiveCfg = Debug|Any CPU {B33E9B82-B6B4-4DB0-B6EE-61CC34641518}.Release|Any CPU.Build.0 = Debug|Any CPU {829FC339-4785-4229-ABA5-53ADB544DA00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {829FC339-4785-4229-ABA5-53ADB544DA00}.Debug|Any CPU.Build.0 = Debug|Any CPU {829FC339-4785-4229-ABA5-53ADB544DA00}.Release|Any CPU.ActiveCfg = Release|Any CPU {829FC339-4785-4229-ABA5-53ADB544DA00}.Release|Any CPU.Build.0 = Release|Any CPU {8860606D-6847-F22A-5AED-DF4E0984DD24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -105,6 +108,10 @@ Global {015CB06B-6CAE-209F-E050-21C3ACA5FE9F}.Release|Any CPU.ActiveCfg = Release|Any CPU {06CAADC7-DE5B-47B4-AB2A-E9501459A2D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {06CAADC7-DE5B-47B4-AB2A-E9501459A2D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE877E48-6B44-63C2-8EA0-DB58D096B553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE877E48-6B44-63C2-8EA0-DB58D096B553}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE877E48-6B44-63C2-8EA0-DB58D096B553}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE877E48-6B44-63C2-8EA0-DB58D096B553}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -119,6 +126,7 @@ Global {EE38A326-5DE8-AF09-9EB9-DF0878938783} = {EDCBFC49-2AEE-4BAF-9368-4409298C52FC} {015CB06B-6CAE-209F-E050-21C3ACA5FE9F} = {985D39A7-5216-4945-8167-2FD0CB387BD8} {06CAADC7-DE5B-47B4-AB2A-E9501459A2D1} = {D36CDFFD-3438-42E4-A7FF-88BA19AC4964} + {AE877E48-6B44-63C2-8EA0-DB58D096B553} = {75129C45-FC6F-41B0-A485-07F4A7E031ED} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {81A62E71-9E04-4EFE-AD5C-23165375F8EF} From ed7cc434eafd273f500de4fe73b81f43582b7d33 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:25:33 +0100 Subject: [PATCH 02/16] browserWindowSetParentWindow: Support null parameter --- src/ElectronNET.API/API/BrowserWindow.cs | 12 +++++++++++- src/ElectronNET.Host/api/browserWindows.ts | 9 +++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/ElectronNET.API/API/BrowserWindow.cs b/src/ElectronNET.API/API/BrowserWindow.cs index d74b82c3..012cbfb0 100644 --- a/src/ElectronNET.API/API/BrowserWindow.cs +++ b/src/ElectronNET.API/API/BrowserWindow.cs @@ -1140,7 +1140,17 @@ public Task SetThumbarButtonsAsync(ThumbarButton[] thumbarButtons) /// passing null will turn current window into a top-level window. /// /// - public void SetParentWindow(BrowserWindow parent) => this.CallMethod1(JObject.FromObject(parent, _jsonSerializer)); + public void SetParentWindow(BrowserWindow parent) + { + if (parent == null) + { + BridgeConnector.Socket.Emit("browserWindowSetParentWindow", Id, null); + } + else + { + BridgeConnector.Socket.Emit("browserWindowSetParentWindow", Id, JObject.FromObject(parent, _jsonSerializer)); + } + } /// /// The parent window. diff --git a/src/ElectronNET.Host/api/browserWindows.ts b/src/ElectronNET.Host/api/browserWindows.ts index a6a56a56..b231742e 100644 --- a/src/ElectronNET.Host/api/browserWindows.ts +++ b/src/ElectronNET.Host/api/browserWindows.ts @@ -721,9 +721,14 @@ export = (socket: Socket, app: Electron.App) => { }); socket.on('browserWindowSetParentWindow', (id, parent) => { + const child = getWindowById(id); + if (!parent) { + // Clear parent: make this window top-level + child.setParentWindow(null); + return; + } const browserWindow = BrowserWindow.fromId(parent.id); - - getWindowById(id).setParentWindow(browserWindow); + child.setParentWindow(browserWindow); }); socket.on('browserWindowGetParentWindow', (id) => { From 402147b8eff861978bca6f45be3958b55a9892d9 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:27:41 +0100 Subject: [PATCH 03/16] BrowserWindow: Disable SetPosition 'workaround' It doesn't make sense to do this adjustment for set only but not for get. Neither is this done for SetBounds, so it should be either fully consistent or left up to the application to deal with it. --- src/ElectronNET.API/API/BrowserWindow.cs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/ElectronNET.API/API/BrowserWindow.cs b/src/ElectronNET.API/API/BrowserWindow.cs index 012cbfb0..37957c70 100644 --- a/src/ElectronNET.API/API/BrowserWindow.cs +++ b/src/ElectronNET.API/API/BrowserWindow.cs @@ -749,11 +749,10 @@ public void SetPosition(int x, int y) { // Workaround Windows 10 / Electron Bug // https://github.com/electron/electron/issues/4045 - if (isWindows10()) - { - x = x - 7; - } - + ////if (isWindows10()) + ////{ + //// x = x - 7; + ////} this.CallMethod2(x, y); } @@ -767,11 +766,10 @@ public void SetPosition(int x, int y, bool animate) { // Workaround Windows 10 / Electron Bug // https://github.com/electron/electron/issues/4045 - if (isWindows10()) - { - x = x - 7; - } - + ////if (isWindows10()) + ////{ + //// x = x - 7; + ////} this.CallMethod3(x, y, animate); } From 95fd7aa6659c519694e4f0cee850c845289a6d93 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:28:39 +0100 Subject: [PATCH 04/16] ApiBase: fix event names for App --- src/ElectronNET.API/API/ApiBase.cs | 23 +++++++++++++++++++++-- src/ElectronNET.API/API/App.cs | 2 +- src/ElectronNET.API/API/BrowserWindow.cs | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/ElectronNET.API/API/ApiBase.cs b/src/ElectronNET.API/API/ApiBase.cs index 73a3e9a6..13285cac 100644 --- a/src/ElectronNET.API/API/ApiBase.cs +++ b/src/ElectronNET.API/API/ApiBase.cs @@ -9,6 +9,12 @@ public abstract class ApiBase { + protected enum SocketEventNameTypes + { + DashesLowerFirst, + NoDashUpperFirst, + } + internal const int PropertyTimeout = 1000; private readonly string objectName; @@ -31,7 +37,7 @@ protected set } } - protected abstract string SocketEventCompleteSuffix { get; } + protected abstract SocketEventNameTypes SocketEventNameType { get; } protected ApiBase() { @@ -128,7 +134,20 @@ public PropertyGetter(ApiBase apiBase, string callerName, int timeoutMs) this.tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); this.tcsTask = this.tcs.Task; - var eventName = apiBase.propertyEventNames.GetOrAdd(callerName, s => $"{apiBase.objectName}-{s.StripAsync().LowerFirst()}{apiBase.SocketEventCompleteSuffix}"); + string eventName; + + switch (apiBase.SocketEventNameType) + { + case SocketEventNameTypes.DashesLowerFirst: + eventName = apiBase.propertyEventNames.GetOrAdd(callerName, s => $"{apiBase.objectName}-{s.StripAsync().LowerFirst()}-completed"); + break; + case SocketEventNameTypes.NoDashUpperFirst: + eventName = apiBase.propertyEventNames.GetOrAdd(callerName, s => $"{apiBase.objectName}{s.StripAsync()}Completed"); + break; + default: + throw new ArgumentOutOfRangeException(); + } + var messageName = apiBase.propertyMessageNames.GetOrAdd(callerName, s => apiBase.objectName + s.StripAsync()); BridgeConnector.Socket.On(eventName, (result) => diff --git a/src/ElectronNET.API/API/App.cs b/src/ElectronNET.API/API/App.cs index a7233b03..f7bea6e2 100644 --- a/src/ElectronNET.API/API/App.cs +++ b/src/ElectronNET.API/API/App.cs @@ -18,7 +18,7 @@ namespace ElectronNET.API /// public sealed class App : ApiBase { - protected override string SocketEventCompleteSuffix => "Completed"; + protected override SocketEventNameTypes SocketEventNameType => SocketEventNameTypes.NoDashUpperFirst; /// /// Emitted when all windows have been closed. diff --git a/src/ElectronNET.API/API/BrowserWindow.cs b/src/ElectronNET.API/API/BrowserWindow.cs index 37957c70..0c0e54a1 100644 --- a/src/ElectronNET.API/API/BrowserWindow.cs +++ b/src/ElectronNET.API/API/BrowserWindow.cs @@ -24,7 +24,7 @@ namespace ElectronNET.API; /// public class BrowserWindow : ApiBase { - protected override string SocketEventCompleteSuffix => "-completed"; + protected override SocketEventNameTypes SocketEventNameType => SocketEventNameTypes.DashesLowerFirst; /// /// Gets the identifier. From bc0f601dd87c8718923ee95502f49dd4240b4c42 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:30:31 +0100 Subject: [PATCH 05/16] ProcessMetric: Fix deserialization error for CreationTime --- src/ElectronNET.API/API/Entities/ProcessMetric.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/ElectronNET.API/API/Entities/ProcessMetric.cs b/src/ElectronNET.API/API/Entities/ProcessMetric.cs index 10162cf4..30ef1c34 100644 --- a/src/ElectronNET.API/API/Entities/ProcessMetric.cs +++ b/src/ElectronNET.API/API/Entities/ProcessMetric.cs @@ -1,7 +1,7 @@ namespace ElectronNET.API.Entities { /// - /// + /// Process metrics information. /// public class ProcessMetric { @@ -21,11 +21,9 @@ public class ProcessMetric public CPUUsage Cpu { get; set; } /// - /// Creation time for this process. The time is represented as number of milliseconds since epoch. - /// Since the can be reused after a process dies, it is useful to use both the - /// and the to uniquely identify a process. + /// Creation time for this process in milliseconds since Unix epoch. Can exceed Int32 range and may contain fractional milliseconds. /// - public int CreationTime { get; set; } + public double CreationTime { get; set; } /// /// Memory information for the process. From 4129cc17a6d69051ec34ddf703cfa7989d3277b5 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:31:27 +0100 Subject: [PATCH 06/16] main.js: Load api/process import (was missing) --- src/ElectronNET.Host/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ElectronNET.Host/main.js b/src/ElectronNET.Host/main.js index 0ea7c602..1cddaa5a 100644 --- a/src/ElectronNET.Host/main.js +++ b/src/ElectronNET.Host/main.js @@ -11,6 +11,7 @@ let appApi, menu, dialogApi, notification, tray, webContents; let globalShortcut, shellApi, screen, clipboard, autoUpdater; let commandLine, browserView; let powerMonitor; +let processInfo; let splashScreen, hostHook; let nativeTheme; let dock; @@ -327,6 +328,7 @@ function startSocketApiBridge(port) { if (powerMonitor === undefined) powerMonitor = require('./api/powerMonitor')(socket); if (nativeTheme === undefined) nativeTheme = require('./api/nativeTheme')(socket); if (dock === undefined) dock = require('./api/dock')(socket); + if (processInfo === undefined) processInfo = require('./api/process')(socket); socket.on('register-app-open-file', (id) => { global['electronsocket'] = socket; From 04210955a38e90a5dfa1f94fa1895b9448675a9d Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:33:51 +0100 Subject: [PATCH 07/16] webContents.ts: Fix clearAuthCache invocation The options were no propagated for the overload with RemovePassword options --- src/ElectronNET.Host/api/webContents.js | 26 ++++++++++++++++++--- src/ElectronNET.Host/api/webContents.js.map | 2 +- src/ElectronNET.Host/api/webContents.ts | 24 +++++++++++++++---- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/ElectronNET.Host/api/webContents.js b/src/ElectronNET.Host/api/webContents.js index edb0a6ab..7b16a712 100644 --- a/src/ElectronNET.Host/api/webContents.js +++ b/src/ElectronNET.Host/api/webContents.js @@ -111,9 +111,29 @@ module.exports = (socket) => { const browserWindow = getWindowById(id); browserWindow.webContents.session.allowNTLMCredentialsForDomains(domains); }); - socket.on('webContents-session-clearAuthCache', async (id, guid) => { - const browserWindow = getWindowById(id); - await browserWindow.webContents.session.clearAuthCache(); + socket.on('webContents-session-clearAuthCache', async (...args) => { + // Overload support: (id, guid) OR (id, options, guid) + const browserWindow = getWindowById(args[0]); + let guid; + if (args.length === 2) { + // No options + guid = args[1]; + await browserWindow.webContents.session.clearAuthCache(); + } + else if (args.length === 3) { + const options = args[1]; + guid = args[2]; + try { + await browserWindow.webContents.session.clearAuthCache(options); + } + catch { + // Fallback to clearing without options if Electron version rejects custom options + await browserWindow.webContents.session.clearAuthCache(); + } + } + else { + return; // invalid invocation + } electronSocket.emit('webContents-session-clearAuthCache-completed' + guid); }); socket.on('webContents-session-clearCache', async (id, guid) => { diff --git a/src/ElectronNET.Host/api/webContents.js.map b/src/ElectronNET.Host/api/webContents.js.map index 759d3260..72f434f6 100644 --- a/src/ElectronNET.Host/api/webContents.js.map +++ b/src/ElectronNET.Host/api/webContents.js.map @@ -1 +1 @@ -{"version":3,"file":"webContents.js","sourceRoot":"","sources":["webContents.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"webContents.js","sourceRoot":"","sources":["webContents.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/ElectronNET.Host/api/webContents.ts b/src/ElectronNET.Host/api/webContents.ts index fc4df486..e9eadb06 100644 --- a/src/ElectronNET.Host/api/webContents.ts +++ b/src/ElectronNET.Host/api/webContents.ts @@ -137,10 +137,26 @@ export = (socket: Socket) => { browserWindow.webContents.session.allowNTLMCredentialsForDomains(domains); }); - socket.on('webContents-session-clearAuthCache', async (id, guid) => { - const browserWindow = getWindowById(id); - await browserWindow.webContents.session.clearAuthCache(); - + socket.on('webContents-session-clearAuthCache', async (...args) => { + // Overload support: (id, guid) OR (id, options, guid) + const browserWindow = getWindowById(args[0]); + let guid: string; + if (args.length ===2) { + // No options + guid = args[1]; + await browserWindow.webContents.session.clearAuthCache(); + } else if (args.length ===3) { + const options = args[1]; + guid = args[2]; + try { + await browserWindow.webContents.session.clearAuthCache(options); + } catch { + // Fallback to clearing without options if Electron version rejects custom options + await browserWindow.webContents.session.clearAuthCache(); + } + } else { + return; // invalid invocation + } electronSocket.emit('webContents-session-clearAuthCache-completed' + guid); }); From dd465baebf76f1f5d3076980e4498e5475742ff4 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:34:53 +0100 Subject: [PATCH 08/16] notification.ts: Fix notificationIsSupported It's a method, was used like a property --- src/ElectronNET.Host/api/notification.js | 2 +- src/ElectronNET.Host/api/notification.js.map | 2 +- src/ElectronNET.Host/api/notification.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ElectronNET.Host/api/notification.js b/src/ElectronNET.Host/api/notification.js index 3a575cf2..2af6d2c8 100644 --- a/src/ElectronNET.Host/api/notification.js +++ b/src/ElectronNET.Host/api/notification.js @@ -43,7 +43,7 @@ module.exports = (socket) => { notification.show(); }); socket.on('notificationIsSupported', () => { - const isSupported = electron_1.Notification.isSupported; + const isSupported = electron_1.Notification.isSupported(); electronSocket.emit('notificationIsSupportedComplete', isSupported); }); }; diff --git a/src/ElectronNET.Host/api/notification.js.map b/src/ElectronNET.Host/api/notification.js.map index e67c9d12..267b9b31 100644 --- a/src/ElectronNET.Host/api/notification.js.map +++ b/src/ElectronNET.Host/api/notification.js.map @@ -1 +1 @@ -{"version":3,"file":"notification.js","sourceRoot":"","sources":["notification.ts"],"names":[],"mappings":";AACA,uCAAwC;AACxC,MAAM,aAAa,GAA4B,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAA4B,CAAC;AACpI,IAAI,cAAc,CAAC;AAEnB,iBAAS,CAAC,MAAc,EAAE,EAAE;IACxB,cAAc,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,IAAI,uBAAY,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACzB,cAAc,CAAC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC1B,cAAc,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC1B,cAAc,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACtC,cAAc,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACvC,cAAc,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QAED,YAAY,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACtC,MAAM,WAAW,GAAG,uBAAY,CAAC,WAAW,CAAC;QAC7C,cAAc,CAAC,IAAI,CAAC,iCAAiC,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"notification.js","sourceRoot":"","sources":["notification.ts"],"names":[],"mappings":";AACA,uCAAwC;AACxC,MAAM,aAAa,GAA4B,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAA4B,CAAC;AACpI,IAAI,cAAc,CAAC;AAEnB,iBAAS,CAAC,MAAc,EAAE,EAAE;IACxB,cAAc,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,IAAI,uBAAY,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACzB,cAAc,CAAC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC1B,cAAc,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC1B,cAAc,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACtC,cAAc,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACvC,cAAc,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QAED,YAAY,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACtC,MAAM,WAAW,GAAG,uBAAY,CAAC,WAAW,EAAE,CAAC;QAC/C,cAAc,CAAC,IAAI,CAAC,iCAAiC,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"} \ No newline at end of file diff --git a/src/ElectronNET.Host/api/notification.ts b/src/ElectronNET.Host/api/notification.ts index 50f1a2d6..188aed06 100644 --- a/src/ElectronNET.Host/api/notification.ts +++ b/src/ElectronNET.Host/api/notification.ts @@ -52,7 +52,7 @@ export = (socket: Socket) => { }); socket.on('notificationIsSupported', () => { - const isSupported = Notification.isSupported; + const isSupported = Notification.isSupported(); electronSocket.emit('notificationIsSupportedComplete', isSupported); }); }; From dc27511aa52158b0ab99f539580eef4e2415c49b Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:36:41 +0100 Subject: [PATCH 09/16] browserWindows.ts: Add catch for Set/GetRepresentedFilename It's not supported on all platforms --- src/ElectronNET.Host/api/browserWindows.js | 21 +++++++++++++++++++-- src/ElectronNET.Host/api/browserWindows.ts | 20 +++++++++++++++++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/ElectronNET.Host/api/browserWindows.js b/src/ElectronNET.Host/api/browserWindows.js index 551b10fd..c24153ba 100644 --- a/src/ElectronNET.Host/api/browserWindows.js +++ b/src/ElectronNET.Host/api/browserWindows.js @@ -444,10 +444,27 @@ module.exports = (socket, app) => { electronSocket.emit('browserWindow-getNativeWindowHandle-completed', nativeWindowHandle); }); socket.on('browserWindowSetRepresentedFilename', (id, filename) => { - getWindowById(id).setRepresentedFilename(filename); + const win = getWindowById(id); + try { + if (win && typeof win.setRepresentedFilename === 'function') { + win.setRepresentedFilename(filename); + } + } + catch (e) { + console.warn('setRepresentedFilename failed (likely unsupported platform):', e); + } }); socket.on('browserWindowGetRepresentedFilename', (id) => { - const pathname = getWindowById(id).getRepresentedFilename(); + const win = getWindowById(id); + let pathname = ''; + try { + if (win && typeof win.getRepresentedFilename === 'function') { + pathname = win.getRepresentedFilename() || ''; + } + } + catch (e) { + console.warn('getRepresentedFilename failed (likely unsupported platform):', e); + } electronSocket.emit('browserWindow-getRepresentedFilename-completed', pathname); }); socket.on('browserWindowSetDocumentEdited', (id, edited) => { diff --git a/src/ElectronNET.Host/api/browserWindows.ts b/src/ElectronNET.Host/api/browserWindows.ts index b231742e..3f4453b1 100644 --- a/src/ElectronNET.Host/api/browserWindows.ts +++ b/src/ElectronNET.Host/api/browserWindows.ts @@ -566,12 +566,26 @@ export = (socket: Socket, app: Electron.App) => { }); socket.on('browserWindowSetRepresentedFilename', (id, filename) => { - getWindowById(id).setRepresentedFilename(filename); + const win = getWindowById(id); + try { + if (win && typeof win.setRepresentedFilename === 'function') { + win.setRepresentedFilename(filename); + } + } catch (e) { + console.warn('setRepresentedFilename failed (likely unsupported platform):', e); + } }); socket.on('browserWindowGetRepresentedFilename', (id) => { - const pathname = getWindowById(id).getRepresentedFilename(); - + const win = getWindowById(id); + let pathname = ''; + try { + if (win && typeof win.getRepresentedFilename === 'function') { + pathname = win.getRepresentedFilename() || ''; + } + } catch (e) { + console.warn('getRepresentedFilename failed (likely unsupported platform):', e); + } electronSocket.emit('browserWindow-getRepresentedFilename-completed', pathname); }); From 8dcc3721ebf09910344c4e1ab6fcd34334f12863 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:37:18 +0100 Subject: [PATCH 10/16] browserWindows.ts: Fix SetThumbarButtons --- src/ElectronNET.Host/api/browserWindows.js | 25 ++++++++++++++++--- .../api/browserWindows.js.map | 2 +- src/ElectronNET.Host/api/browserWindows.ts | 16 ++++++++++-- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/ElectronNET.Host/api/browserWindows.js b/src/ElectronNET.Host/api/browserWindows.js index c24153ba..f229a438 100644 --- a/src/ElectronNET.Host/api/browserWindows.js +++ b/src/ElectronNET.Host/api/browserWindows.js @@ -524,8 +524,21 @@ module.exports = (socket, app) => { }); socket.on('browserWindowSetThumbarButtons', (id, thumbarButtons) => { thumbarButtons.forEach(thumbarButton => { - const imagePath = path.join(__dirname.replace('api', ''), 'bin', thumbarButton.icon.toString()); - thumbarButton.icon = electron_1.nativeImage.createFromPath(imagePath); + const originalIconPath = thumbarButton.icon.toString(); + const path = require('path'); + const fs = require('fs'); + let imagePath = originalIconPath; + if (!path.isAbsolute(originalIconPath)) { + imagePath = path.join(__dirname.replace('api', ''), 'bin', originalIconPath); + } + const { nativeImage } = require('electron'); + if (fs.existsSync(imagePath)) { + thumbarButton.icon = nativeImage.createFromPath(imagePath); + } + else { + // Fallback to empty image to avoid failure + thumbarButton.icon = nativeImage.createEmpty(); + } thumbarButton.click = () => { electronSocket.emit('thumbarButtonClicked', thumbarButton['id']); }; @@ -576,8 +589,14 @@ module.exports = (socket, app) => { getWindowById(id).setFocusable(focusable); }); socket.on('browserWindowSetParentWindow', (id, parent) => { + const child = getWindowById(id); + if (!parent) { + // Clear parent: make this window top-level + child.setParentWindow(null); + return; + } const browserWindow = electron_1.BrowserWindow.fromId(parent.id); - getWindowById(id).setParentWindow(browserWindow); + child.setParentWindow(browserWindow); }); socket.on('browserWindowGetParentWindow', (id) => { const browserWindow = getWindowById(id).getParentWindow(); diff --git a/src/ElectronNET.Host/api/browserWindows.js.map b/src/ElectronNET.Host/api/browserWindows.js.map index 85b223ca..becb38d5 100644 --- a/src/ElectronNET.Host/api/browserWindows.js.map +++ b/src/ElectronNET.Host/api/browserWindows.js.map @@ -1 +1 @@ -{"version":3,"file":"browserWindows.js","sourceRoot":"","sources":["browserWindows.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browserWindows.js","sourceRoot":"","sources":["browserWindows.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/ElectronNET.Host/api/browserWindows.ts b/src/ElectronNET.Host/api/browserWindows.ts index 3f4453b1..6e9516b5 100644 --- a/src/ElectronNET.Host/api/browserWindows.ts +++ b/src/ElectronNET.Host/api/browserWindows.ts @@ -665,8 +665,20 @@ export = (socket: Socket, app: Electron.App) => { socket.on('browserWindowSetThumbarButtons', (id, thumbarButtons: Electron.ThumbarButton[]) => { thumbarButtons.forEach(thumbarButton => { - const imagePath = path.join(__dirname.replace('api', ''), 'bin', thumbarButton.icon.toString()); - thumbarButton.icon = nativeImage.createFromPath(imagePath); + const originalIconPath = thumbarButton.icon.toString(); + const path = require('path'); + const fs = require('fs'); + let imagePath = originalIconPath; + if (!path.isAbsolute(originalIconPath)) { + imagePath = path.join(__dirname.replace('api', ''), 'bin', originalIconPath); + } + const { nativeImage } = require('electron'); + if (fs.existsSync(imagePath)) { + thumbarButton.icon = nativeImage.createFromPath(imagePath); + } else { + // Fallback to empty image to avoid failure + thumbarButton.icon = nativeImage.createEmpty(); + } thumbarButton.click = () => { electronSocket.emit('thumbarButtonClicked', thumbarButton['id']); }; From 423ea57af701b3c5468885770b53a9386cfe7602 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:37:41 +0100 Subject: [PATCH 11/16] ipc.ts: Add helper method for tests --- src/ElectronNET.Host/api/ipc.js | 25 +++++++++++++++++++++++++ src/ElectronNET.Host/api/ipc.js.map | 2 +- src/ElectronNET.Host/api/ipc.ts | 26 +++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/ElectronNET.Host/api/ipc.js b/src/ElectronNET.Host/api/ipc.js index 4c18ea83..3233738a 100644 --- a/src/ElectronNET.Host/api/ipc.js +++ b/src/ElectronNET.Host/api/ipc.js @@ -45,5 +45,30 @@ module.exports = (socket) => { view.webContents.send(channel, ...data); } }); + // Integration helpers: programmatically click menu items from renderer tests + electron_1.ipcMain.on('integration-click-application-menu', (event, id) => { + try { + const menu = electron_1.Menu.getApplicationMenu(); + const mi = menu ? menu.getMenuItemById(id) : null; + if (mi && typeof mi.click === 'function') { + const bw = electron_1.BrowserWindow.fromWebContents(event.sender); + mi.click(undefined, bw, undefined); + } + } + catch { /* ignore */ } + }); + electron_1.ipcMain.on('integration-click-context-menu', (event, windowId, id) => { + var _a, _b; + try { + const entries = global['contextMenuItems'] || []; + const entry = entries.find((x) => x.browserWindowId === windowId); + const mi = (_b = (_a = entry === null || entry === void 0 ? void 0 : entry.menu) === null || _a === void 0 ? void 0 : _a.items) === null || _b === void 0 ? void 0 : _b.find((i) => i.id === id); + if (mi && typeof mi.click === 'function') { + const bw = electron_1.BrowserWindow.fromId(windowId); + mi.click(undefined, bw, undefined); + } + } + catch { /* ignore */ } + }); }; //# sourceMappingURL=ipc.js.map \ No newline at end of file diff --git a/src/ElectronNET.Host/api/ipc.js.map b/src/ElectronNET.Host/api/ipc.js.map index e16f8eb4..cd2a1151 100644 --- a/src/ElectronNET.Host/api/ipc.js.map +++ b/src/ElectronNET.Host/api/ipc.js.map @@ -1 +1 @@ -{"version":3,"file":"ipc.js","sourceRoot":"","sources":["ipc.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ipc.js","sourceRoot":"","sources":["ipc.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/ElectronNET.Host/api/ipc.ts b/src/ElectronNET.Host/api/ipc.ts index 801160f6..6a1f6011 100644 --- a/src/ElectronNET.Host/api/ipc.ts +++ b/src/ElectronNET.Host/api/ipc.ts @@ -1,4 +1,4 @@ -import { ipcMain, BrowserWindow, BrowserView } from 'electron'; +import { ipcMain, BrowserWindow, BrowserView, Menu } from 'electron'; import { Socket } from 'net'; let electronSocket; @@ -54,4 +54,28 @@ export = (socket: Socket) => { view.webContents.send(channel, ...data); } }); + + // Integration helpers: programmatically click menu items from renderer tests + ipcMain.on('integration-click-application-menu', (event, id: string) => { + try { + const menu = Menu.getApplicationMenu(); + const mi = menu ? menu.getMenuItemById(id) : null; + if (mi && typeof (mi as any).click === 'function') { + const bw = BrowserWindow.fromWebContents(event.sender); + (mi as any).click(undefined, bw, undefined); + } + } catch { /* ignore */ } + }); + + ipcMain.on('integration-click-context-menu', (event, windowId: number, id: string) => { + try { + const entries = (global as any)['contextMenuItems'] || []; + const entry = entries.find((x: any) => x.browserWindowId === windowId); + const mi = entry?.menu?.items?.find((i: any) => i.id === id); + if (mi && typeof (mi as any).click === 'function') { + const bw = BrowserWindow.fromId(windowId); + (mi as any).click(undefined, bw, undefined); + } + } catch { /* ignore */ } + }); }; From bb59bc8365649a9f82ddcb11647f9ca2107a7f94 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:38:29 +0100 Subject: [PATCH 12/16] App.cs: Fix UserAgentFallbackAsync --- src/ElectronNET.API/API/App.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/ElectronNET.API/API/App.cs b/src/ElectronNET.API/API/App.cs index f7bea6e2..4739d0a6 100644 --- a/src/ElectronNET.API/API/App.cs +++ b/src/ElectronNET.API/API/App.cs @@ -1306,7 +1306,20 @@ public Task UserAgentFallbackAsync { get { - return this.GetPropertyAsync(); + return Task.Run(() => + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("appGetUserAgentFallbackCompleted", (result) => + { + BridgeConnector.Socket.Off("appGetUserAgentFallbackCompleted"); + taskCompletionSource.SetResult((string)result); + }); + + BridgeConnector.Socket.Emit("appGetUserAgentFallback"); + + return taskCompletionSource.Task; + }); } } From 707c0f5a7b1fc322b9fa7a48ce843e20aac18bfa Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:39:42 +0100 Subject: [PATCH 13/16] BrowserView.cs: Fix cast exception in Bounds property getter --- src/ElectronNET.API/API/BrowserView.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ElectronNET.API/API/BrowserView.cs b/src/ElectronNET.API/API/BrowserView.cs index cc25226d..50814f2c 100644 --- a/src/ElectronNET.API/API/BrowserView.cs +++ b/src/ElectronNET.API/API/BrowserView.cs @@ -35,20 +35,20 @@ public Rectangle Bounds { get { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(); - BridgeConnector.Socket.On("browserView-getBounds-reply", (result) => + Task.Run(() => + { + BridgeConnector.Socket.On("browserView-getBounds-reply", (result) => { BridgeConnector.Socket.Off("browserView-getBounds-reply"); - taskCompletionSource.SetResult((Rectangle)result); + taskCompletionSource.SetResult(result); }); BridgeConnector.Socket.Emit("browserView-getBounds", Id); + }); - return taskCompletionSource.Task; - }).Result; + return taskCompletionSource.Task.GetAwaiter().GetResult(); } set { From 5b597cc12c4ae8450f4c37cb58742ef7050f3e9d Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 02:40:15 +0100 Subject: [PATCH 14/16] StartupManager: Add support for running under testhost --- src/ElectronNET.API/Runtime/StartupManager.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/ElectronNET.API/Runtime/StartupManager.cs b/src/ElectronNET.API/Runtime/StartupManager.cs index a405a6e5..fd17d26c 100644 --- a/src/ElectronNET.API/Runtime/StartupManager.cs +++ b/src/ElectronNET.API/Runtime/StartupManager.cs @@ -128,9 +128,21 @@ private BuildInfo GatherBuildInfo() { var buildInfo = new BuildInfo(); - var attributes = Assembly.GetEntryAssembly()?.GetCustomAttributes().ToList(); + var electronAssembly = Assembly.GetEntryAssembly(); - if (attributes?.Count > 0) + if (electronAssembly == null) + { + return buildInfo; + } + + if (electronAssembly.GetName().Name == "testhost") + { + electronAssembly = AppDomain.CurrentDomain.GetData("ElectronTestAssembly") as Assembly ?? electronAssembly; + } + + var attributes = electronAssembly.GetCustomAttributes().ToList(); + + if (attributes.Count > 0) { buildInfo.ElectronExecutable = attributes.FirstOrDefault(e => e.Key == nameof(buildInfo.ElectronExecutable))?.Value; buildInfo.ElectronVersion = attributes.FirstOrDefault(e => e.Key == nameof(buildInfo.ElectronVersion))?.Value; From 9d25795b7a32808faf86ef9a23f4324d30096d9a Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 03:07:05 +0100 Subject: [PATCH 15/16] SocketBridgeService: Fix state transition error --- .../Runtime/Services/SocketBridge/SocketBridgeService.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ElectronNET.API/Runtime/Services/SocketBridge/SocketBridgeService.cs b/src/ElectronNET.API/Runtime/Services/SocketBridge/SocketBridgeService.cs index fea9d0a4..8d7c9dac 100644 --- a/src/ElectronNET.API/Runtime/Services/SocketBridge/SocketBridgeService.cs +++ b/src/ElectronNET.API/Runtime/Services/SocketBridge/SocketBridgeService.cs @@ -40,7 +40,10 @@ protected override Task StopCore() private void Connect() { this.socket.Connect(); - this.TransitionState(LifetimeState.Started); + if (this.State < LifetimeState.Started) + { + this.TransitionState(LifetimeState.Started); + } } private void Socket_BridgeDisconnected(object sender, EventArgs e) From 60a278c41f831476bf06d35db37b5213795e1ade Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 9 Nov 2025 12:47:56 +0100 Subject: [PATCH 16/16] Cookie: Fix formatting --- src/ElectronNET.API/API/Entities/Cookie.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ElectronNET.API/API/Entities/Cookie.cs b/src/ElectronNET.API/API/Entities/Cookie.cs index b6b37fae..d9b9b278 100644 --- a/src/ElectronNET.API/API/Entities/Cookie.cs +++ b/src/ElectronNET.API/API/Entities/Cookie.cs @@ -1,12 +1,14 @@ -namespace ElectronNET.API.Entities { +namespace ElectronNET.API.Entities +{ /// /// /// - public class Cookie { + public class Cookie + { /// /// The name of the cookie. /// - public string Name { get; set;} + public string Name { get; set; } /// /// The value of the cookie. @@ -26,7 +28,7 @@ public class Cookie { /// /// (optional) - The path of the cookie. /// - public string Path { get; set; } + public string Path { get; set; } /// /// (optional) - Whether the cookie is marked as secure. @@ -36,7 +38,7 @@ public class Cookie { /// /// (optional) - Whether the cookie is marked as HTTP only. /// - public bool HttpOnly { get; set; } + public bool HttpOnly { get; set; } /// /// (optional) - Whether the cookie is a session cookie or a persistent cookie with an expiration date. @@ -48,4 +50,4 @@ public class Cookie { /// public long ExpirationDate { get; set; } } -} +} \ No newline at end of file