diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c88ce7e33c76..3905abcb1d9e9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,11 +62,11 @@ on Github. This document will guide you through the contribution process. -### Step 1: Fork +### Step 1: Fork & Clone Fork the project [on Github](https://github.com/seleniumhq/selenium) -and check out your copy locally. Use `--depth 1` for a quick check out. -The repository is ~2GB and checking the whole history takes a while. +and clone the repository locally. Use `--depth 1` for a quick clone. +The repository is over 2GB and cloning the whole history takes a while. ```shell % git clone git@github.com:username/selenium.git --depth 1 @@ -76,7 +76,7 @@ The repository is ~2GB and checking the whole history takes a while. #### Dependencies -We bundle dependencies in the _third-party/_ directory that is not +We bundle dependencies in the _third-party/_ directory that are not part of the proper project. Any changes to files in this directory or its subdirectories should be sent upstream to the respective projects. Please don't send your patch to us as we cannot accept it. diff --git a/Rakefile b/Rakefile index b148b41935ef9..4dcaac4c32826 100644 --- a/Rakefile +++ b/Rakefile @@ -963,9 +963,9 @@ namespace :java do ENV['MAVEN_USER'] ||= ENV.fetch('SEL_M2_USER', nil) ENV['MAVEN_PASSWORD'] ||= ENV.fetch('SEL_M2_PASS', nil) read_m2_user_pass unless ENV['MAVEN_PASSWORD'] && ENV['MAVEN_USER'] - - repo = nightly ? 'content/repositories/snapshots' : 'service/local/staging/deploy/maven2' - ENV['MAVEN_REPO'] = "https://central.sonatype.org/#{repo}" + repo_domain = 'central.sonatype.com' + repo = nightly ? "#{repo_domain}/repository/maven-snapshots" : "ossrh-staging-api.#{repo_domain}/service/local/" + ENV['MAVEN_REPO'] = "https://#{repo}" ENV['GPG_SIGN'] = (!nightly).to_s if nightly diff --git a/common/repositories.bzl b/common/repositories.bzl index 92cca26c97756..d1829387c6ade 100644 --- a/common/repositories.bzl +++ b/common/repositories.bzl @@ -165,8 +165,8 @@ js_library( http_archive( name = "linux_edgedriver", - url = "https://msedgedriver.azureedge.net/137.0.3296.83/edgedriver_linux64.zip", - sha256 = "141cd4cd42b7642dec1f215e0b1a0c1dae05f573218cb8ef18b876efa14f152a", + url = "https://msedgedriver.azureedge.net/137.0.3296.93/edgedriver_linux64.zip", + sha256 = "417bdfafbe8358e2b040b86b0e255344e0d200bd7087a9d85171abc9fc0c29c3", build_file_content = """ load("@aspect_rules_js//js:defs.bzl", "js_library") package(default_visibility = ["//visibility:public"]) @@ -182,8 +182,8 @@ js_library( http_archive( name = "mac_edgedriver", - url = "https://msedgedriver.azureedge.net/137.0.3296.83/edgedriver_mac64.zip", - sha256 = "e361cfea041e649944a60a41ec40076be35fda8608e9011fad638ec0491a1f79", + url = "https://msedgedriver.azureedge.net/137.0.3296.93/edgedriver_mac64.zip", + sha256 = "d55e0f377ba45c1d754625b88f16493bded924b41bd624210241493b77e4fdb9", build_file_content = """ load("@aspect_rules_js//js:defs.bzl", "js_library") package(default_visibility = ["//visibility:public"]) diff --git a/dotnet/src/webdriver/BiDi/Browser/ClientWindow.cs b/dotnet/src/webdriver/BiDi/Browser/ClientWindow.cs index 4cbb430d20d09..44387a5d67441 100644 --- a/dotnet/src/webdriver/BiDi/Browser/ClientWindow.cs +++ b/dotnet/src/webdriver/BiDi/Browser/ClientWindow.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Browser; -public record ClientWindow +public sealed record ClientWindow { internal ClientWindow(string id) { diff --git a/dotnet/src/webdriver/BiDi/Browser/ClientWindowInfo.cs b/dotnet/src/webdriver/BiDi/Browser/ClientWindowInfo.cs index bdab71f7df1fd..d097e14ded209 100644 --- a/dotnet/src/webdriver/BiDi/Browser/ClientWindowInfo.cs +++ b/dotnet/src/webdriver/BiDi/Browser/ClientWindowInfo.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Browser; -public record ClientWindowInfo(bool Active, ClientWindow ClientWindow, ClientWindowState State, int Height, int Width, int X, int Y); +public sealed record ClientWindowInfo(bool Active, ClientWindow ClientWindow, ClientWindowState State, int Height, int Width, int X, int Y); public enum ClientWindowState { diff --git a/dotnet/src/webdriver/BiDi/Browser/CloseCommand.cs b/dotnet/src/webdriver/BiDi/Browser/CloseCommand.cs index 96af7df29b195..67f6a3e0d29e9 100644 --- a/dotnet/src/webdriver/BiDi/Browser/CloseCommand.cs +++ b/dotnet/src/webdriver/BiDi/Browser/CloseCommand.cs @@ -21,7 +21,7 @@ namespace OpenQA.Selenium.BiDi.Browser; -internal class CloseCommand() +internal sealed class CloseCommand() : Command(CommandParameters.Empty, "browser.close"); -public record CloseOptions : CommandOptions; +public sealed class CloseOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Browser/CreateUserContextCommand.cs b/dotnet/src/webdriver/BiDi/Browser/CreateUserContextCommand.cs index 1d605740e7ab3..278dd44009cba 100644 --- a/dotnet/src/webdriver/BiDi/Browser/CreateUserContextCommand.cs +++ b/dotnet/src/webdriver/BiDi/Browser/CreateUserContextCommand.cs @@ -21,12 +21,12 @@ namespace OpenQA.Selenium.BiDi.Browser; -internal class CreateUserContextCommand(CreateUserContextCommandParameters @params) +internal sealed class CreateUserContextCommand(CreateUserContextCommandParameters @params) : Command(@params, "browser.createUserContext"); -internal record CreateUserContextCommandParameters(bool? AcceptInsecureCerts, Session.ProxyConfiguration? Proxy) : CommandParameters; +internal sealed record CreateUserContextCommandParameters(bool? AcceptInsecureCerts, Session.ProxyConfiguration? Proxy) : CommandParameters; -public record CreateUserContextOptions : CommandOptions +public sealed class CreateUserContextOptions : CommandOptions { public bool? AcceptInsecureCerts { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Browser/GetClientWindowsCommand.cs b/dotnet/src/webdriver/BiDi/Browser/GetClientWindowsCommand.cs index 2971ad6246398..b4d1228f4e26f 100644 --- a/dotnet/src/webdriver/BiDi/Browser/GetClientWindowsCommand.cs +++ b/dotnet/src/webdriver/BiDi/Browser/GetClientWindowsCommand.cs @@ -23,12 +23,12 @@ namespace OpenQA.Selenium.BiDi.Browser; -internal class GetClientWindowsCommand() +internal sealed class GetClientWindowsCommand() : Command(CommandParameters.Empty, "browser.getClientWindows"); -public record GetClientWindowsOptions : CommandOptions; +public sealed class GetClientWindowsOptions : CommandOptions; -public record GetClientWindowsResult : EmptyResult, IReadOnlyList +public sealed record GetClientWindowsResult : EmptyResult, IReadOnlyList { private readonly IReadOnlyList _clientWindows; diff --git a/dotnet/src/webdriver/BiDi/Browser/GetUserContextsCommand.cs b/dotnet/src/webdriver/BiDi/Browser/GetUserContextsCommand.cs index a56b341143822..b6efce675434c 100644 --- a/dotnet/src/webdriver/BiDi/Browser/GetUserContextsCommand.cs +++ b/dotnet/src/webdriver/BiDi/Browser/GetUserContextsCommand.cs @@ -23,12 +23,12 @@ namespace OpenQA.Selenium.BiDi.Browser; -internal class GetUserContextsCommand() +internal sealed class GetUserContextsCommand() : Command(CommandParameters.Empty, "browser.getUserContexts"); -public record GetUserContextsOptions : CommandOptions; +public class GetUserContextsOptions : CommandOptions; -public record GetUserContextsResult : EmptyResult, IReadOnlyList +public sealed record GetUserContextsResult : EmptyResult, IReadOnlyList { private readonly IReadOnlyList _userContexts; diff --git a/dotnet/src/webdriver/BiDi/Browser/RemoveUserContextCommand.cs b/dotnet/src/webdriver/BiDi/Browser/RemoveUserContextCommand.cs index 35f23eae0f176..feaf1e820600c 100644 --- a/dotnet/src/webdriver/BiDi/Browser/RemoveUserContextCommand.cs +++ b/dotnet/src/webdriver/BiDi/Browser/RemoveUserContextCommand.cs @@ -21,9 +21,9 @@ namespace OpenQA.Selenium.BiDi.Browser; -internal class RemoveUserContextCommand(RemoveUserContextCommandParameters @params) +internal sealed class RemoveUserContextCommand(RemoveUserContextCommandParameters @params) : Command(@params, "browser.removeUserContext"); -internal record RemoveUserContextCommandParameters(UserContext UserContext) : CommandParameters; +internal sealed record RemoveUserContextCommandParameters(UserContext UserContext) : CommandParameters; -public record RemoveUserContextOptions : CommandOptions; +public sealed class RemoveUserContextOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Browser/UserContext.cs b/dotnet/src/webdriver/BiDi/Browser/UserContext.cs index 42eb769a47f2a..6f7bc3f8dab5d 100644 --- a/dotnet/src/webdriver/BiDi/Browser/UserContext.cs +++ b/dotnet/src/webdriver/BiDi/Browser/UserContext.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.BiDi.Browser; -public class UserContext : IAsyncDisposable +public sealed class UserContext : IAsyncDisposable { private readonly BiDi _bidi; diff --git a/dotnet/src/webdriver/BiDi/Browser/UserContextInfo.cs b/dotnet/src/webdriver/BiDi/Browser/UserContextInfo.cs index 724021671572a..7440624658b1f 100644 --- a/dotnet/src/webdriver/BiDi/Browser/UserContextInfo.cs +++ b/dotnet/src/webdriver/BiDi/Browser/UserContextInfo.cs @@ -21,4 +21,4 @@ namespace OpenQA.Selenium.BiDi.Browser; -public record UserContextInfo(UserContext UserContext) : EmptyResult; +public sealed record UserContextInfo(UserContext UserContext) : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/ActivateCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/ActivateCommand.cs index 4d57d85789fc6..59aae1197767b 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/ActivateCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/ActivateCommand.cs @@ -21,9 +21,9 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class ActivateCommand(ActivateCommandParameters @params) +internal sealed class ActivateCommand(ActivateCommandParameters @params) : Command(@params, "browsingContext.activate"); -internal record ActivateCommandParameters(BrowsingContext Context) : CommandParameters; +internal sealed record ActivateCommandParameters(BrowsingContext Context) : CommandParameters; -public record ActivateOptions : CommandOptions; +public sealed class ActivateOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContext.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContext.cs index 81f03ffb59134..11232a165d093 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContext.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContext.cs @@ -23,7 +23,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public class BrowsingContext +public sealed class BrowsingContext { internal BrowsingContext(BiDi bidi, string id) { diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextInfo.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextInfo.cs index ca1f31e135ec5..271aefc1310c7 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextInfo.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextInfo.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public record BrowsingContextInfo(BiDi BiDi, IReadOnlyList? Children, Browser.ClientWindow ClientWindow, BrowsingContext Context, BrowsingContext? OriginalOpener, string Url, Browser.UserContext UserContext) +public sealed record BrowsingContextInfo(BiDi BiDi, IReadOnlyList? Children, Browser.ClientWindow ClientWindow, BrowsingContext Context, BrowsingContext? OriginalOpener, string Url, Browser.UserContext UserContext) : BrowsingContextEventArgs(BiDi, Context) { [JsonInclude] diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextInputModule.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextInputModule.cs index b3d0dc2391349..3d78a4fd4e16b 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextInputModule.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextInputModule.cs @@ -23,7 +23,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public class BrowsingContextInputModule(BrowsingContext context, InputModule inputModule) +public sealed class BrowsingContextInputModule(BrowsingContext context, InputModule inputModule) { public Task PerformActionsAsync(IEnumerable actions, PerformActionsOptions? options = null) { diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextLogModule.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextLogModule.cs index 8cbb8fcfc8be1..d98fe04948631 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextLogModule.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextLogModule.cs @@ -23,7 +23,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public class BrowsingContextLogModule(BrowsingContext context, LogModule logModule) +public sealed class BrowsingContextLogModule(BrowsingContext context, LogModule logModule) { public Task OnEntryAddedAsync(Func handler, SubscriptionOptions? options = null) { diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextModule.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextModule.cs index 4f966c4df46a8..7db46b952e15b 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextModule.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextModule.cs @@ -24,7 +24,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public class BrowsingContextModule(Broker broker) : Module(broker) +public sealed class BrowsingContextModule(Broker broker) : Module(broker) { public async Task CreateAsync(ContextType type, CreateOptions? options = null) { diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextNetworkModule.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextNetworkModule.cs index 1eb6dd127d9dc..9883532c90938 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextNetworkModule.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextNetworkModule.cs @@ -23,7 +23,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public class BrowsingContextNetworkModule(BrowsingContext context, NetworkModule networkModule) +public sealed class BrowsingContextNetworkModule(BrowsingContext context, NetworkModule networkModule) { public async Task InterceptRequestAsync(Func handler, InterceptRequestOptions? options = null) { @@ -134,8 +134,8 @@ public Task OnAuthRequiredAsync(Action hand } } -public record InterceptRequestOptions : BrowsingContextAddInterceptOptions; +public sealed record InterceptRequestOptions : BrowsingContextAddInterceptOptions; -public record InterceptResponseOptions : BrowsingContextAddInterceptOptions; +public sealed record InterceptResponseOptions : BrowsingContextAddInterceptOptions; -public record InterceptAuthOptions : BrowsingContextAddInterceptOptions; +public sealed record InterceptAuthOptions : BrowsingContextAddInterceptOptions; diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextScriptModule.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextScriptModule.cs index 4120d2503ac50..5d9d279fe5059 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextScriptModule.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextScriptModule.cs @@ -23,7 +23,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public class BrowsingContextScriptModule(BrowsingContext context, ScriptModule scriptModule) +public sealed class BrowsingContextScriptModule(BrowsingContext context, ScriptModule scriptModule) { public async Task AddPreloadScriptAsync(string functionDeclaration, BrowsingContextAddPreloadScriptOptions? options = null) { diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextStorageModule.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextStorageModule.cs index cc00f46de3220..1aa8ffd812f9a 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextStorageModule.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextStorageModule.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public class BrowsingContextStorageModule(BrowsingContext context, StorageModule storageModule) +public sealed class BrowsingContextStorageModule(BrowsingContext context, StorageModule storageModule) { public Task GetCookiesAsync(GetCookiesOptions? options = null) { diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/CaptureScreenshotCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/CaptureScreenshotCommand.cs index c55a5b2305889..6fa5149b10646 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/CaptureScreenshotCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/CaptureScreenshotCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class CaptureScreenshotCommand(CaptureScreenshotCommandParameters @params) +internal sealed class CaptureScreenshotCommand(CaptureScreenshotCommandParameters @params) : Command(@params, "browsingContext.captureScreenshot"); -internal record CaptureScreenshotCommandParameters(BrowsingContext Context, ScreenshotOrigin? Origin, ImageFormat? Format, ClipRectangle? Clip) : CommandParameters; +internal sealed record CaptureScreenshotCommandParameters(BrowsingContext Context, ScreenshotOrigin? Origin, ImageFormat? Format, ClipRectangle? Clip) : CommandParameters; -public record CaptureScreenshotOptions : CommandOptions +public sealed class CaptureScreenshotOptions : CommandOptions { public ScreenshotOrigin? Origin { get; set; } @@ -52,11 +52,11 @@ public record struct ImageFormat(string Type) [JsonDerivedType(typeof(ElementClipRectangle), "element")] public abstract record ClipRectangle; -public record BoxClipRectangle(double X, double Y, double Width, double Height) : ClipRectangle; +public sealed record BoxClipRectangle(double X, double Y, double Width, double Height) : ClipRectangle; -public record ElementClipRectangle(Script.ISharedReference Element) : ClipRectangle; +public sealed record ElementClipRectangle(Script.ISharedReference Element) : ClipRectangle; -public record CaptureScreenshotResult(string Data) : EmptyResult +public sealed record CaptureScreenshotResult(string Data) : EmptyResult { public static implicit operator byte[](CaptureScreenshotResult captureScreenshotResult) => captureScreenshotResult.ToByteArray(); diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/CloseCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/CloseCommand.cs index d2f08818b8d81..69f207189ae70 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/CloseCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/CloseCommand.cs @@ -21,12 +21,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class CloseCommand(CloseCommandParameters @params) +internal sealed class CloseCommand(CloseCommandParameters @params) : Command(@params, "browsingContext.close"); -internal record CloseCommandParameters(BrowsingContext Context, bool? PromptUnload) : CommandParameters; +internal sealed record CloseCommandParameters(BrowsingContext Context, bool? PromptUnload) : CommandParameters; -public record CloseOptions : CommandOptions +public sealed class CloseOptions : CommandOptions { public bool? PromptUnload { get; set; } } diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/CreateCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/CreateCommand.cs index 3c9d4b405e25e..2e3881a393b6e 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/CreateCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/CreateCommand.cs @@ -21,12 +21,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class CreateCommand(CreateCommandParameters @params) +internal sealed class CreateCommand(CreateCommandParameters @params) : Command(@params, "browsingContext.create"); -internal record CreateCommandParameters(ContextType Type, BrowsingContext? ReferenceContext, bool? Background, Browser.UserContext? UserContext) : CommandParameters; +internal sealed record CreateCommandParameters(ContextType Type, BrowsingContext? ReferenceContext, bool? Background, Browser.UserContext? UserContext) : CommandParameters; -public record CreateOptions : CommandOptions +public sealed class CreateOptions : CommandOptions { public BrowsingContext? ReferenceContext { get; set; } @@ -41,4 +41,4 @@ public enum ContextType Window } -public record CreateResult(BrowsingContext Context) : EmptyResult; +public sealed record CreateResult(BrowsingContext Context) : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/GetTreeCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/GetTreeCommand.cs index 6c2c10cde7c3b..0a0aef4dc75f4 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/GetTreeCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/GetTreeCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class GetTreeCommand(GetTreeCommandParameters @params) +internal sealed class GetTreeCommand(GetTreeCommandParameters @params) : Command(@params, "browsingContext.getTree"); -internal record GetTreeCommandParameters(long? MaxDepth, BrowsingContext? Root) : CommandParameters; +internal sealed record GetTreeCommandParameters(long? MaxDepth, BrowsingContext? Root) : CommandParameters; -public record GetTreeOptions : CommandOptions +public sealed class GetTreeOptions : CommandOptions { public GetTreeOptions() { } @@ -41,9 +41,9 @@ internal GetTreeOptions(BrowsingContextGetTreeOptions? options) public BrowsingContext? Root { get; set; } } -public record BrowsingContextGetTreeOptions +public sealed record BrowsingContextGetTreeOptions { public long? MaxDepth { get; set; } } -public record GetTreeResult(IReadOnlyList Contexts) : EmptyResult; +public sealed record GetTreeResult(IReadOnlyList Contexts) : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/HandleUserPromptCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/HandleUserPromptCommand.cs index 04cc7fb09d3e7..6c01767d65a02 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/HandleUserPromptCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/HandleUserPromptCommand.cs @@ -21,12 +21,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -class HandleUserPromptCommand(HandleUserPromptCommandParameters @params) +internal sealed class HandleUserPromptCommand(HandleUserPromptCommandParameters @params) : Command(@params, "browsingContext.handleUserPrompt"); -internal record HandleUserPromptCommandParameters(BrowsingContext Context, bool? Accept, string? UserText) : CommandParameters; +internal sealed record HandleUserPromptCommandParameters(BrowsingContext Context, bool? Accept, string? UserText) : CommandParameters; -public record HandleUserPromptOptions : CommandOptions +public sealed class HandleUserPromptOptions : CommandOptions { public bool? Accept { get; set; } diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/HistoryUpdatedEventArgs.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/HistoryUpdatedEventArgs.cs index 6611f37bd684d..492b66a0a4e4f 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/HistoryUpdatedEventArgs.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/HistoryUpdatedEventArgs.cs @@ -21,5 +21,5 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public record HistoryUpdatedEventArgs(BiDi BiDi, BrowsingContext Context, DateTimeOffset Timestamp, string Url) +public sealed record HistoryUpdatedEventArgs(BiDi BiDi, BrowsingContext Context, DateTimeOffset Timestamp, string Url) : BrowsingContextEventArgs(BiDi, Context); diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/LocateNodesCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/LocateNodesCommand.cs index 916b06694b99f..a8efd228e1b69 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/LocateNodesCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/LocateNodesCommand.cs @@ -23,12 +23,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class LocateNodesCommand(LocateNodesCommandParameters @params) +internal sealed class LocateNodesCommand(LocateNodesCommandParameters @params) : Command(@params, "browsingContext.locateNodes"); -internal record LocateNodesCommandParameters(BrowsingContext Context, Locator Locator, long? MaxNodeCount, Script.SerializationOptions? SerializationOptions, IEnumerable? StartNodes) : CommandParameters; +internal sealed record LocateNodesCommandParameters(BrowsingContext Context, Locator Locator, long? MaxNodeCount, Script.SerializationOptions? SerializationOptions, IEnumerable? StartNodes) : CommandParameters; -public record LocateNodesOptions : CommandOptions +public sealed class LocateNodesOptions : CommandOptions { public long? MaxNodeCount { get; set; } @@ -37,7 +37,7 @@ public record LocateNodesOptions : CommandOptions public IEnumerable? StartNodes { get; set; } } -public record LocateNodesResult : EmptyResult, IReadOnlyList +public sealed record LocateNodesResult : EmptyResult, IReadOnlyList { private readonly IReadOnlyList _nodes; diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/Locator.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/Locator.cs index 34be2aeb3a6fe..b0aef53821dbf 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/Locator.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/Locator.cs @@ -29,13 +29,13 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; [JsonDerivedType(typeof(XPathLocator), "xpath")] public abstract record Locator; -public record AccessibilityLocator(AccessibilityValue Value) : Locator; +public sealed record AccessibilityLocator(AccessibilityValue Value) : Locator; -public record CssLocator(string Value) : Locator; +public sealed record CssLocator(string Value) : Locator; -public record ContextLocator(ContextValue Value) : Locator; +public sealed record ContextLocator(ContextValue Value) : Locator; -public record InnerTextLocator(string Value) : Locator +public sealed record InnerTextLocator(string Value) : Locator { public bool? IgnoreCase { get; set; } @@ -44,15 +44,15 @@ public record InnerTextLocator(string Value) : Locator public long? MaxDepth { get; set; } } -public record XPathLocator(string Value) : Locator; +public sealed record XPathLocator(string Value) : Locator; -public record AccessibilityValue +public sealed record AccessibilityValue { public string? Name { get; set; } public string? Role { get; set; } } -public record ContextValue(BrowsingContext Context); +public sealed record ContextValue(BrowsingContext Context); public enum MatchType { diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/NavigateCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/NavigateCommand.cs index 210d97831207b..87a36d5490ab7 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/NavigateCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/NavigateCommand.cs @@ -21,12 +21,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class NavigateCommand(NavigateCommandParameters @params) +internal sealed class NavigateCommand(NavigateCommandParameters @params) : Command(@params, "browsingContext.navigate"); -internal record NavigateCommandParameters(BrowsingContext Context, string Url, ReadinessState? Wait) : CommandParameters; +internal sealed record NavigateCommandParameters(BrowsingContext Context, string Url, ReadinessState? Wait) : CommandParameters; -public record NavigateOptions : CommandOptions +public sealed class NavigateOptions : CommandOptions { public ReadinessState? Wait { get; set; } } @@ -38,4 +38,4 @@ public enum ReadinessState Complete } -public record NavigateResult(Navigation? Navigation, string Url) : EmptyResult; +public sealed record NavigateResult(Navigation? Navigation, string Url) : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/Navigation.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/Navigation.cs index ca17338489bbf..c763d7cc4a482 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/Navigation.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/Navigation.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public record Navigation(string Id); +public sealed record Navigation(string Id); diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/NavigationInfo.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/NavigationInfo.cs index 823f452aff88d..91d6a589e7370 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/NavigationInfo.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/NavigationInfo.cs @@ -21,5 +21,5 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public record NavigationInfo(BiDi BiDi, BrowsingContext Context, Navigation? Navigation, DateTimeOffset Timestamp, string Url) +public sealed record NavigationInfo(BiDi BiDi, BrowsingContext Context, Navigation? Navigation, DateTimeOffset Timestamp, string Url) : BrowsingContextEventArgs(BiDi, Context); diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/PrintCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/PrintCommand.cs index 5bcc5325b4a7a..ae689de7737e6 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/PrintCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/PrintCommand.cs @@ -23,12 +23,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class PrintCommand(PrintCommandParameters @params) +internal sealed class PrintCommand(PrintCommandParameters @params) : Command(@params, "browsingContext.print"); -internal record PrintCommandParameters(BrowsingContext Context, bool? Background, PrintMargin? Margin, PrintOrientation? Orientation, PrintPage? Page, IEnumerable? PageRanges, double? Scale, bool? ShrinkToFit) : CommandParameters; +internal sealed record PrintCommandParameters(BrowsingContext Context, bool? Background, PrintMargin? Margin, PrintOrientation? Orientation, PrintPage? Page, IEnumerable? PageRanges, double? Scale, bool? ShrinkToFit) : CommandParameters; -public record PrintOptions : CommandOptions +public sealed class PrintOptions : CommandOptions { public bool? Background { get; set; } @@ -112,7 +112,7 @@ public static implicit operator PrintPageRange(Range range) #endif } -public record PrintResult(string Data) : EmptyResult +public sealed record PrintResult(string Data) : EmptyResult { public byte[] ToByteArray() => Convert.FromBase64String(Data); } diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/ReloadCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/ReloadCommand.cs index 5dac139f01385..7532d91359309 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/ReloadCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/ReloadCommand.cs @@ -21,12 +21,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class ReloadCommand(ReloadCommandParameters @params) +internal sealed class ReloadCommand(ReloadCommandParameters @params) : Command(@params, "browsingContext.reload"); -internal record ReloadCommandParameters(BrowsingContext Context, bool? IgnoreCache, ReadinessState? Wait) : CommandParameters; +internal sealed record ReloadCommandParameters(BrowsingContext Context, bool? IgnoreCache, ReadinessState? Wait) : CommandParameters; -public record ReloadOptions : CommandOptions +public sealed class ReloadOptions : CommandOptions { public bool? IgnoreCache { get; set; } diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/SetViewportCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/SetViewportCommand.cs index b6254f3a903b1..bbf274481c040 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/SetViewportCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/SetViewportCommand.cs @@ -21,12 +21,12 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class SetViewportCommand(SetViewportCommandParameters @params) +internal sealed class SetViewportCommand(SetViewportCommandParameters @params) : Command(@params, "browsingContext.setViewport"); -internal record SetViewportCommandParameters(BrowsingContext Context, Viewport? Viewport, double? DevicePixelRatio) : CommandParameters; +internal sealed record SetViewportCommandParameters(BrowsingContext Context, Viewport? Viewport, double? DevicePixelRatio) : CommandParameters; -public record SetViewportOptions : CommandOptions +public sealed class SetViewportOptions : CommandOptions { public Viewport? Viewport { get; set; } diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/TraverseHistoryCommand.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/TraverseHistoryCommand.cs index 3d94f3a9cab86..410798bd6f726 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/TraverseHistoryCommand.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/TraverseHistoryCommand.cs @@ -21,11 +21,11 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -internal class TraverseHistoryCommand(TraverseHistoryCommandParameters @params) +internal sealed class TraverseHistoryCommand(TraverseHistoryCommandParameters @params) : Command(@params, "browsingContext.traverseHistory"); -internal record TraverseHistoryCommandParameters(BrowsingContext Context, long Delta) : CommandParameters; +internal sealed record TraverseHistoryCommandParameters(BrowsingContext Context, long Delta) : CommandParameters; -public record TraverseHistoryOptions : CommandOptions; +public sealed class TraverseHistoryOptions : CommandOptions; -public record TraverseHistoryResult : EmptyResult; +public sealed record TraverseHistoryResult : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/UserPromptClosedEventArgs.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/UserPromptClosedEventArgs.cs index f022d58aa0b0f..75d1395b69b05 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/UserPromptClosedEventArgs.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/UserPromptClosedEventArgs.cs @@ -21,7 +21,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public record UserPromptClosedEventArgs(BiDi BiDi, BrowsingContext Context, bool Accepted) +public sealed record UserPromptClosedEventArgs(BiDi BiDi, BrowsingContext Context, bool Accepted) : BrowsingContextEventArgs(BiDi, Context) { [JsonInclude] diff --git a/dotnet/src/webdriver/BiDi/BrowsingContext/UserPromptOpenedEventArgs.cs b/dotnet/src/webdriver/BiDi/BrowsingContext/UserPromptOpenedEventArgs.cs index dbadd70dab990..6af71b761fde9 100644 --- a/dotnet/src/webdriver/BiDi/BrowsingContext/UserPromptOpenedEventArgs.cs +++ b/dotnet/src/webdriver/BiDi/BrowsingContext/UserPromptOpenedEventArgs.cs @@ -21,7 +21,7 @@ namespace OpenQA.Selenium.BiDi.BrowsingContext; -public record UserPromptOpenedEventArgs(BiDi BiDi, BrowsingContext Context, Session.UserPromptHandlerType Handler, UserPromptType Type, string Message) +public sealed record UserPromptOpenedEventArgs(BiDi BiDi, BrowsingContext Context, Session.UserPromptHandlerType Handler, UserPromptType Type, string Message) : BrowsingContextEventArgs(BiDi, Context) { [JsonInclude] diff --git a/dotnet/src/webdriver/BiDi/Communication/CommandOptions.cs b/dotnet/src/webdriver/BiDi/Communication/CommandOptions.cs index 5d414b5cd25ae..a68281a03800d 100644 --- a/dotnet/src/webdriver/BiDi/Communication/CommandOptions.cs +++ b/dotnet/src/webdriver/BiDi/Communication/CommandOptions.cs @@ -21,7 +21,7 @@ namespace OpenQA.Selenium.BiDi.Communication; -public record CommandOptions +public abstract class CommandOptions { public TimeSpan? Timeout { get; set; } } diff --git a/dotnet/src/webdriver/BiDi/Input/Key.cs b/dotnet/src/webdriver/BiDi/Input/Key.cs index b1cb81a3fd785..c016f0a449d21 100644 --- a/dotnet/src/webdriver/BiDi/Input/Key.cs +++ b/dotnet/src/webdriver/BiDi/Input/Key.cs @@ -17,7 +17,7 @@ // under the License. // -//partial record Key +//partial sealed record Key //{ // public const char Shift = '\uE008'; diff --git a/dotnet/src/webdriver/BiDi/Input/Origin.cs b/dotnet/src/webdriver/BiDi/Input/Origin.cs index 6a7bd606cb41f..55eb1eb6361f3 100644 --- a/dotnet/src/webdriver/BiDi/Input/Origin.cs +++ b/dotnet/src/webdriver/BiDi/Input/Origin.cs @@ -21,8 +21,8 @@ namespace OpenQA.Selenium.BiDi.Input; public abstract record Origin; -public record ViewportOrigin() : Origin; +public sealed record ViewportOrigin() : Origin; -public record PointerOrigin() : Origin; +public sealed record PointerOrigin() : Origin; -public record ElementOrigin(Script.ISharedReference Element) : Origin; +public sealed record ElementOrigin(Script.ISharedReference Element) : Origin; diff --git a/dotnet/src/webdriver/BiDi/Input/PerformActionsCommand.cs b/dotnet/src/webdriver/BiDi/Input/PerformActionsCommand.cs index 8df2d01d68825..be5206baaaf1b 100644 --- a/dotnet/src/webdriver/BiDi/Input/PerformActionsCommand.cs +++ b/dotnet/src/webdriver/BiDi/Input/PerformActionsCommand.cs @@ -22,9 +22,9 @@ namespace OpenQA.Selenium.BiDi.Input; -internal class PerformActionsCommand(PerformActionsCommandParameters @params) +internal sealed class PerformActionsCommand(PerformActionsCommandParameters @params) : Command(@params, "input.performActions"); -internal record PerformActionsCommandParameters(BrowsingContext.BrowsingContext Context, IEnumerable Actions) : CommandParameters; +internal sealed record PerformActionsCommandParameters(BrowsingContext.BrowsingContext Context, IEnumerable Actions) : CommandParameters; -public record PerformActionsOptions : CommandOptions; +public sealed class PerformActionsOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Input/ReleaseActionsCommand.cs b/dotnet/src/webdriver/BiDi/Input/ReleaseActionsCommand.cs index 25565e8cc9aaa..133c6bdad22be 100644 --- a/dotnet/src/webdriver/BiDi/Input/ReleaseActionsCommand.cs +++ b/dotnet/src/webdriver/BiDi/Input/ReleaseActionsCommand.cs @@ -21,9 +21,9 @@ namespace OpenQA.Selenium.BiDi.Input; -internal class ReleaseActionsCommand(ReleaseActionsCommandParameters @params) +internal sealed class ReleaseActionsCommand(ReleaseActionsCommandParameters @params) : Command(@params, "input.releaseActions"); -internal record ReleaseActionsCommandParameters(BrowsingContext.BrowsingContext Context) : CommandParameters; +internal sealed record ReleaseActionsCommandParameters(BrowsingContext.BrowsingContext Context) : CommandParameters; -public record ReleaseActionsOptions : CommandOptions; +public sealed class ReleaseActionsOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Input/SetFilesCommand.cs b/dotnet/src/webdriver/BiDi/Input/SetFilesCommand.cs index 0c5d5e5b7e50b..78fdcbf9048a1 100644 --- a/dotnet/src/webdriver/BiDi/Input/SetFilesCommand.cs +++ b/dotnet/src/webdriver/BiDi/Input/SetFilesCommand.cs @@ -22,9 +22,9 @@ namespace OpenQA.Selenium.BiDi.Input; -internal class SetFilesCommand(SetFilesCommandParameters @params) +internal sealed class SetFilesCommand(SetFilesCommandParameters @params) : Command(@params, "input.setFiles"); -internal record SetFilesCommandParameters(BrowsingContext.BrowsingContext Context, Script.ISharedReference Element, IEnumerable Files) : CommandParameters; +internal sealed record SetFilesCommandParameters(BrowsingContext.BrowsingContext Context, Script.ISharedReference Element, IEnumerable Files) : CommandParameters; -public record SetFilesOptions : CommandOptions; +public sealed class SetFilesOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Input/SourceActions.cs b/dotnet/src/webdriver/BiDi/Input/SourceActions.cs index 4c957885865b2..7a370c9b18982 100644 --- a/dotnet/src/webdriver/BiDi/Input/SourceActions.cs +++ b/dotnet/src/webdriver/BiDi/Input/SourceActions.cs @@ -31,7 +31,7 @@ public abstract record SourceActions public interface ISourceAction; -public record SourceActions : SourceActions, IEnumerable where T : ISourceAction +public abstract record SourceActions : SourceActions, IEnumerable where T : ISourceAction { public IList Actions { get; set; } = []; @@ -48,7 +48,7 @@ public record SourceActions : SourceActions, IEnumerable where [JsonDerivedType(typeof(UpKey), "keyUp")] public interface IKeySourceAction : ISourceAction; -public record KeyActions : SourceActions +public sealed record KeyActions : SourceActions { public KeyActions Type(string text) { @@ -69,7 +69,7 @@ public KeyActions Type(string text) [JsonDerivedType(typeof(MovePointer), "pointerMove")] public interface IPointerSourceAction : ISourceAction; -public record PointerActions : SourceActions +public sealed record PointerActions : SourceActions { public PointerParameters? Options { get; set; } } @@ -79,23 +79,23 @@ public record PointerActions : SourceActions [JsonDerivedType(typeof(ScrollWheel), "scroll")] public interface IWheelSourceAction : ISourceAction; -public record WheelActions : SourceActions; +public sealed record WheelActions : SourceActions; [JsonPolymorphic(TypeDiscriminatorPropertyName = "type")] [JsonDerivedType(typeof(Pause), "pause")] public interface INoneSourceAction : ISourceAction; -public record NoneActions : SourceActions; +public sealed record NoneActions : SourceActions; public abstract record Key : IKeySourceAction; -public record DownKey(char Value) : Key; +public sealed record DownKey(char Value) : Key; -public record UpKey(char Value) : Key; +public sealed record UpKey(char Value) : Key; public abstract record Pointer : IPointerSourceAction; -public record DownPointer(int Button) : Pointer, IPointerCommonProperties +public sealed record DownPointer(int Button) : Pointer, IPointerCommonProperties { public int? Width { get; set; } public int? Height { get; set; } @@ -106,9 +106,9 @@ public record DownPointer(int Button) : Pointer, IPointerCommonProperties public double? AzimuthAngle { get; set; } } -public record UpPointer(int Button) : Pointer; +public sealed record UpPointer(int Button) : Pointer; -public record MovePointer(int X, int Y) : Pointer, IPointerCommonProperties +public sealed record MovePointer(int X, int Y) : Pointer, IPointerCommonProperties { public int? Duration { get; set; } @@ -125,7 +125,7 @@ public record MovePointer(int X, int Y) : Pointer, IPointerCommonProperties public abstract record Wheel : IWheelSourceAction; -public record ScrollWheel(int X, int Y, int DeltaX, int DeltaY) : Wheel +public sealed record ScrollWheel(int X, int Y, int DeltaX, int DeltaY) : Wheel { public int? Duration { get; set; } @@ -134,12 +134,12 @@ public record ScrollWheel(int X, int Y, int DeltaX, int DeltaY) : Wheel public abstract record None : INoneSourceAction; -public record Pause : ISourceAction, IKeySourceAction, IPointerSourceAction, IWheelSourceAction, INoneSourceAction +public sealed record Pause : ISourceAction, IKeySourceAction, IPointerSourceAction, IWheelSourceAction, INoneSourceAction { public long? Duration { get; set; } } -public record PointerParameters +public sealed record PointerParameters { public PointerType? PointerType { get; set; } } diff --git a/dotnet/src/webdriver/BiDi/Log/LogEntry.cs b/dotnet/src/webdriver/BiDi/Log/LogEntry.cs index 4ddbc6df9ab6a..eb6b7ac6df24d 100644 --- a/dotnet/src/webdriver/BiDi/Log/LogEntry.cs +++ b/dotnet/src/webdriver/BiDi/Log/LogEntry.cs @@ -24,7 +24,7 @@ namespace OpenQA.Selenium.BiDi.Log; // https://github.com/dotnet/runtime/issues/72604 //[JsonPolymorphic(TypeDiscriminatorPropertyName = "type")] -//[JsonDerivedType(typeof(GenericLogEntry))] // Fallback when discriminator is not recognized, we have to double check +//[JsonDerivedType(typeof(GenericLogEntry))] //[JsonDerivedType(typeof(ConsoleLogEntry), "console")] //[JsonDerivedType(typeof(JavascriptLogEntry), "javascript")] public abstract record LogEntry(BiDi BiDi, Level Level, Script.Source Source, string? Text, DateTimeOffset Timestamp) @@ -33,13 +33,13 @@ public abstract record LogEntry(BiDi BiDi, Level Level, Script.Source Source, st public Script.StackTrace? StackTrace { get; set; } } -public record GenericLogEntry(BiDi BiDi, string Type, Level Level, Script.Source Source, string? Text, DateTimeOffset Timestamp) +public sealed record GenericLogEntry(BiDi BiDi, string Type, Level Level, Script.Source Source, string? Text, DateTimeOffset Timestamp) : LogEntry(BiDi, Level, Source, Text, Timestamp); -public record ConsoleLogEntry(BiDi BiDi, Level Level, Script.Source Source, string? Text, DateTimeOffset Timestamp, string Method, IReadOnlyList Args) +public sealed record ConsoleLogEntry(BiDi BiDi, Level Level, Script.Source Source, string? Text, DateTimeOffset Timestamp, string Method, IReadOnlyList Args) : LogEntry(BiDi, Level, Source, Text, Timestamp); -public record JavascriptLogEntry(BiDi BiDi, Level Level, Script.Source Source, string? Text, DateTimeOffset Timestamp) +public sealed record JavascriptLogEntry(BiDi BiDi, Level Level, Script.Source Source, string? Text, DateTimeOffset Timestamp) : LogEntry(BiDi, Level, Source, Text, Timestamp); public enum Level diff --git a/dotnet/src/webdriver/BiDi/Network/AddInterceptCommand.cs b/dotnet/src/webdriver/BiDi/Network/AddInterceptCommand.cs index 0121e427413f4..58ca8831009d6 100644 --- a/dotnet/src/webdriver/BiDi/Network/AddInterceptCommand.cs +++ b/dotnet/src/webdriver/BiDi/Network/AddInterceptCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Network; -internal class AddInterceptCommand(AddInterceptCommandParameters @params) +internal sealed class AddInterceptCommand(AddInterceptCommandParameters @params) : Command(@params, "network.addIntercept"); -internal record AddInterceptCommandParameters(IEnumerable Phases, IEnumerable? Contexts, IEnumerable? UrlPatterns) : CommandParameters; +internal sealed record AddInterceptCommandParameters(IEnumerable Phases, IEnumerable? Contexts, IEnumerable? UrlPatterns) : CommandParameters; -public record AddInterceptOptions : CommandOptions +public class AddInterceptOptions : CommandOptions { public AddInterceptOptions() { } @@ -46,7 +46,7 @@ public record BrowsingContextAddInterceptOptions public IEnumerable? UrlPatterns { get; set; } } -public record AddInterceptResult(Intercept Intercept) : EmptyResult; +public sealed record AddInterceptResult(Intercept Intercept) : EmptyResult; public enum InterceptPhase { diff --git a/dotnet/src/webdriver/BiDi/Network/AuthChallenge.cs b/dotnet/src/webdriver/BiDi/Network/AuthChallenge.cs index 0c88da8b42689..4eccd4c77a3d1 100644 --- a/dotnet/src/webdriver/BiDi/Network/AuthChallenge.cs +++ b/dotnet/src/webdriver/BiDi/Network/AuthChallenge.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Network; -public record AuthChallenge(string Scheme, string Realm); +public sealed record AuthChallenge(string Scheme, string Realm); diff --git a/dotnet/src/webdriver/BiDi/Network/AuthCredentials.cs b/dotnet/src/webdriver/BiDi/Network/AuthCredentials.cs index bcae423811af8..9aea88ebde836 100644 --- a/dotnet/src/webdriver/BiDi/Network/AuthCredentials.cs +++ b/dotnet/src/webdriver/BiDi/Network/AuthCredentials.cs @@ -21,7 +21,7 @@ namespace OpenQA.Selenium.BiDi.Network; -public record AuthCredentials(string Username, string Password) +public sealed record AuthCredentials(string Username, string Password) { [JsonInclude] internal string Type { get; } = "password"; diff --git a/dotnet/src/webdriver/BiDi/Network/BytesValue.cs b/dotnet/src/webdriver/BiDi/Network/BytesValue.cs index 0b1c99c36267b..9952bff13f1c2 100644 --- a/dotnet/src/webdriver/BiDi/Network/BytesValue.cs +++ b/dotnet/src/webdriver/BiDi/Network/BytesValue.cs @@ -31,6 +31,6 @@ public abstract record BytesValue public static implicit operator BytesValue(byte[] value) => new Base64BytesValue(Convert.ToBase64String(value)); } -public record StringBytesValue(string Value) : BytesValue; +public sealed record StringBytesValue(string Value) : BytesValue; -public record Base64BytesValue(string Value) : BytesValue; +public sealed record Base64BytesValue(string Value) : BytesValue; diff --git a/dotnet/src/webdriver/BiDi/Network/ContinueRequestCommand.cs b/dotnet/src/webdriver/BiDi/Network/ContinueRequestCommand.cs index 900a0c2f294aa..786ed9d68ca60 100644 --- a/dotnet/src/webdriver/BiDi/Network/ContinueRequestCommand.cs +++ b/dotnet/src/webdriver/BiDi/Network/ContinueRequestCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Network; -internal class ContinueRequestCommand(ContinueRequestCommandParameters @params) +internal sealed class ContinueRequestCommand(ContinueRequestCommandParameters @params) : Command(@params, "network.continueRequest"); -internal record ContinueRequestCommandParameters(Request Request, BytesValue? Body, IEnumerable? Cookies, IEnumerable
? Headers, string? Method, string? Url) : CommandParameters; +internal sealed record ContinueRequestCommandParameters(Request Request, BytesValue? Body, IEnumerable? Cookies, IEnumerable
? Headers, string? Method, string? Url) : CommandParameters; -public record ContinueRequestOptions : CommandOptions +public sealed class ContinueRequestOptions : CommandOptions { public BytesValue? Body { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Network/ContinueResponseCommand.cs b/dotnet/src/webdriver/BiDi/Network/ContinueResponseCommand.cs index db58ef2ddcc61..06ce733eb27d2 100644 --- a/dotnet/src/webdriver/BiDi/Network/ContinueResponseCommand.cs +++ b/dotnet/src/webdriver/BiDi/Network/ContinueResponseCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Network; -internal class ContinueResponseCommand(ContinueResponseCommandParameters @params) +internal sealed class ContinueResponseCommand(ContinueResponseCommandParameters @params) : Command(@params, "network.continueResponse"); -internal record ContinueResponseCommandParameters(Request Request, IEnumerable? Cookies, IEnumerable? Credentials, IEnumerable
? Headers, string? ReasonPhrase, long? StatusCode) : CommandParameters; +internal sealed record ContinueResponseCommandParameters(Request Request, IEnumerable? Cookies, IEnumerable? Credentials, IEnumerable
? Headers, string? ReasonPhrase, long? StatusCode) : CommandParameters; -public record ContinueResponseOptions : CommandOptions +public sealed class ContinueResponseOptions : CommandOptions { public IEnumerable? Cookies { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Network/ContinueWithAuthCommand.cs b/dotnet/src/webdriver/BiDi/Network/ContinueWithAuthCommand.cs index 4415ff26a9949..bd41e31c6d704 100644 --- a/dotnet/src/webdriver/BiDi/Network/ContinueWithAuthCommand.cs +++ b/dotnet/src/webdriver/BiDi/Network/ContinueWithAuthCommand.cs @@ -31,21 +31,21 @@ internal class ContinueWithAuthCommand(ContinueWithAuthParameters @params) [JsonDerivedType(typeof(ContinueWithAuthCancelCredentials), "cancel")] internal abstract record ContinueWithAuthParameters(Request Request) : CommandParameters; -internal record ContinueWithAuthCredentials(Request Request, AuthCredentials Credentials) : ContinueWithAuthParameters(Request); +internal sealed record ContinueWithAuthCredentials(Request Request, AuthCredentials Credentials) : ContinueWithAuthParameters(Request); internal abstract record ContinueWithAuthNoCredentials(Request Request) : ContinueWithAuthParameters(Request); -internal record ContinueWithAuthDefaultCredentials(Request Request) : ContinueWithAuthNoCredentials(Request); +internal sealed record ContinueWithAuthDefaultCredentials(Request Request) : ContinueWithAuthNoCredentials(Request); -internal record ContinueWithAuthCancelCredentials(Request Request) : ContinueWithAuthNoCredentials(Request); +internal sealed record ContinueWithAuthCancelCredentials(Request Request) : ContinueWithAuthNoCredentials(Request); -public record ContinueWithAuthOptions : CommandOptions; +public abstract class ContinueWithAuthOptions : CommandOptions; -public record ContinueWithAuthCredentialsOptions : ContinueWithAuthOptions; +public sealed class ContinueWithAuthCredentialsOptions : ContinueWithAuthOptions; -public record ContinueWithAuthNoCredentialsOptions : ContinueWithAuthOptions; +public abstract class ContinueWithAuthNoCredentialsOptions : ContinueWithAuthOptions; -public record ContinueWithAuthDefaultCredentialsOptions : ContinueWithAuthNoCredentialsOptions; +public sealed class ContinueWithAuthDefaultCredentialsOptions : ContinueWithAuthNoCredentialsOptions; -public record ContinueWithAuthCancelCredentialsOptions : ContinueWithAuthNoCredentialsOptions; +public sealed class ContinueWithAuthCancelCredentialsOptions : ContinueWithAuthNoCredentialsOptions; diff --git a/dotnet/src/webdriver/BiDi/Network/Cookie.cs b/dotnet/src/webdriver/BiDi/Network/Cookie.cs index eb358fa50afe7..7b17f0c48dcbc 100644 --- a/dotnet/src/webdriver/BiDi/Network/Cookie.cs +++ b/dotnet/src/webdriver/BiDi/Network/Cookie.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.BiDi.Network; -public record Cookie(string Name, BytesValue Value, string Domain, string Path, long Size, bool HttpOnly, bool Secure, SameSite SameSite) +public sealed record Cookie(string Name, BytesValue Value, string Domain, string Path, long Size, bool HttpOnly, bool Secure, SameSite SameSite) { [JsonInclude] public DateTimeOffset? Expiry { get; internal set; } diff --git a/dotnet/src/webdriver/BiDi/Network/CookieHeader.cs b/dotnet/src/webdriver/BiDi/Network/CookieHeader.cs index 27e6ebf3c7d47..979b825ceb8c2 100644 --- a/dotnet/src/webdriver/BiDi/Network/CookieHeader.cs +++ b/dotnet/src/webdriver/BiDi/Network/CookieHeader.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Network; -public record CookieHeader(string Name, BytesValue Value); +public sealed record CookieHeader(string Name, BytesValue Value); diff --git a/dotnet/src/webdriver/BiDi/Network/FailRequestCommand.cs b/dotnet/src/webdriver/BiDi/Network/FailRequestCommand.cs index df0177e078dec..1c2cdbafab295 100644 --- a/dotnet/src/webdriver/BiDi/Network/FailRequestCommand.cs +++ b/dotnet/src/webdriver/BiDi/Network/FailRequestCommand.cs @@ -21,9 +21,9 @@ namespace OpenQA.Selenium.BiDi.Network; -internal class FailRequestCommand(FailRequestCommandParameters @params) +internal sealed class FailRequestCommand(FailRequestCommandParameters @params) : Command(@params, "network.failRequest"); -internal record FailRequestCommandParameters(Request Request) : CommandParameters; +internal sealed record FailRequestCommandParameters(Request Request) : CommandParameters; -public record FailRequestOptions : CommandOptions; +public sealed class FailRequestOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Network/FetchErrorEventArgs.cs b/dotnet/src/webdriver/BiDi/Network/FetchErrorEventArgs.cs index 2fd1e4f38d48e..829d73aa45413 100644 --- a/dotnet/src/webdriver/BiDi/Network/FetchErrorEventArgs.cs +++ b/dotnet/src/webdriver/BiDi/Network/FetchErrorEventArgs.cs @@ -22,5 +22,5 @@ namespace OpenQA.Selenium.BiDi.Network; -public record FetchErrorEventArgs(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, string ErrorText) +public sealed record FetchErrorEventArgs(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, string ErrorText) : BaseParametersEventArgs(BiDi, Context, IsBlocked, Navigation, RedirectCount, Request, Timestamp); diff --git a/dotnet/src/webdriver/BiDi/Network/FetchTimingInfo.cs b/dotnet/src/webdriver/BiDi/Network/FetchTimingInfo.cs index adba1444a37fe..af3382002f252 100644 --- a/dotnet/src/webdriver/BiDi/Network/FetchTimingInfo.cs +++ b/dotnet/src/webdriver/BiDi/Network/FetchTimingInfo.cs @@ -19,16 +19,17 @@ namespace OpenQA.Selenium.BiDi.Network; -public record FetchTimingInfo(double TimeOrigin, - double RequestTime, - double RedirectStart, - double RedirectEnd, - double FetchStart, - double DnsStart, - double DnsEnd, - double ConnectStart, - double ConnectEnd, - double TlsStart, - double RequestStart, - double ResponseStart, - double ResponseEnd); +public sealed record FetchTimingInfo( + double TimeOrigin, + double RequestTime, + double RedirectStart, + double RedirectEnd, + double FetchStart, + double DnsStart, + double DnsEnd, + double ConnectStart, + double ConnectEnd, + double TlsStart, + double RequestStart, + double ResponseStart, + double ResponseEnd); diff --git a/dotnet/src/webdriver/BiDi/Network/Header.cs b/dotnet/src/webdriver/BiDi/Network/Header.cs index e0c3c8e8abcb6..ee70eb00dff82 100644 --- a/dotnet/src/webdriver/BiDi/Network/Header.cs +++ b/dotnet/src/webdriver/BiDi/Network/Header.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Network; -public record Header(string Name, BytesValue Value); +public sealed record Header(string Name, BytesValue Value); diff --git a/dotnet/src/webdriver/BiDi/Network/Initiator.cs b/dotnet/src/webdriver/BiDi/Network/Initiator.cs index 81181216b0649..cea2a48e59f98 100644 --- a/dotnet/src/webdriver/BiDi/Network/Initiator.cs +++ b/dotnet/src/webdriver/BiDi/Network/Initiator.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Network; -public record Initiator(InitiatorType Type) +public sealed record Initiator(InitiatorType Type) { public long? ColumnNumber { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Network/Intercept.cs b/dotnet/src/webdriver/BiDi/Network/Intercept.cs index f567b0326f64a..c266f791efaa3 100644 --- a/dotnet/src/webdriver/BiDi/Network/Intercept.cs +++ b/dotnet/src/webdriver/BiDi/Network/Intercept.cs @@ -24,7 +24,7 @@ namespace OpenQA.Selenium.BiDi.Network; -public class Intercept : IAsyncDisposable +public sealed class Intercept : IAsyncDisposable { private readonly BiDi _bidi; @@ -36,9 +36,9 @@ internal Intercept(BiDi bidi, string id) internal string Id { get; } - protected IList OnBeforeRequestSentSubscriptions { get; } = []; - protected IList OnResponseStartedSubscriptions { get; } = []; - protected IList OnAuthRequiredSubscriptions { get; } = []; + IList OnBeforeRequestSentSubscriptions { get; } = []; + IList OnResponseStartedSubscriptions { get; } = []; + IList OnAuthRequiredSubscriptions { get; } = []; public async Task RemoveAsync() { diff --git a/dotnet/src/webdriver/BiDi/Network/NetworkModule.HighLevel.cs b/dotnet/src/webdriver/BiDi/Network/NetworkModule.HighLevel.cs index 336e7b1e8dbc1..b2137c8c9ec31 100644 --- a/dotnet/src/webdriver/BiDi/Network/NetworkModule.HighLevel.cs +++ b/dotnet/src/webdriver/BiDi/Network/NetworkModule.HighLevel.cs @@ -52,13 +52,13 @@ public async Task InterceptAuthAsync(Func hand } } -public record InterceptRequestOptions : AddInterceptOptions; +public sealed class InterceptRequestOptions : AddInterceptOptions; -public record InterceptResponseOptions : AddInterceptOptions; +public sealed class InterceptResponseOptions : AddInterceptOptions; -public record InterceptAuthOptions : AddInterceptOptions; +public sealed class InterceptAuthOptions : AddInterceptOptions; -public record InterceptedRequest(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, BrowsingContext.Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, Initiator Initiator) +public sealed record InterceptedRequest(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, BrowsingContext.Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, Initiator Initiator) : BeforeRequestSentEventArgs(BiDi, Context, IsBlocked, Navigation, RedirectCount, Request, Timestamp, Initiator) { public Task ContinueAsync(ContinueRequestOptions? options = null) @@ -77,7 +77,7 @@ public Task ProvideResponseAsync(ProvideResponseOptions? options = null) } } -public record InterceptedResponse(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, BrowsingContext.Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, ResponseData Response) +public sealed record InterceptedResponse(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, BrowsingContext.Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, ResponseData Response) : ResponseStartedEventArgs(BiDi, Context, IsBlocked, Navigation, RedirectCount, Request, Timestamp, Response) { public Task ContinueAsync(ContinueResponseOptions? options = null) @@ -86,7 +86,7 @@ public Task ContinueAsync(ContinueResponseOptions? options = null) } } -public record InterceptedAuth(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, BrowsingContext.Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, ResponseData Response) +public sealed record InterceptedAuth(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, BrowsingContext.Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, ResponseData Response) : AuthRequiredEventArgs(BiDi, Context, IsBlocked, Navigation, RedirectCount, Request, Timestamp, Response) { public Task ContinueAsync(AuthCredentials credentials, ContinueWithAuthCredentialsOptions? options = null) diff --git a/dotnet/src/webdriver/BiDi/Network/ProvideResponseCommand.cs b/dotnet/src/webdriver/BiDi/Network/ProvideResponseCommand.cs index 9ef8ffd223695..679dc088b6998 100644 --- a/dotnet/src/webdriver/BiDi/Network/ProvideResponseCommand.cs +++ b/dotnet/src/webdriver/BiDi/Network/ProvideResponseCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Network; -internal class ProvideResponseCommand(ProvideResponseCommandParameters @params) +internal sealed class ProvideResponseCommand(ProvideResponseCommandParameters @params) : Command(@params, "network.provideResponse"); -internal record ProvideResponseCommandParameters(Request Request, BytesValue? Body, IEnumerable? Cookies, IEnumerable
? Headers, string? ReasonPhrase, long? StatusCode) : CommandParameters; +internal sealed record ProvideResponseCommandParameters(Request Request, BytesValue? Body, IEnumerable? Cookies, IEnumerable
? Headers, string? ReasonPhrase, long? StatusCode) : CommandParameters; -public record ProvideResponseOptions : CommandOptions +public sealed class ProvideResponseOptions : CommandOptions { public BytesValue? Body { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Network/RemoveInterceptCommand.cs b/dotnet/src/webdriver/BiDi/Network/RemoveInterceptCommand.cs index 199f77f1d4117..179c18d68d089 100644 --- a/dotnet/src/webdriver/BiDi/Network/RemoveInterceptCommand.cs +++ b/dotnet/src/webdriver/BiDi/Network/RemoveInterceptCommand.cs @@ -21,9 +21,9 @@ namespace OpenQA.Selenium.BiDi.Network; -internal class RemoveInterceptCommand(RemoveInterceptCommandParameters @params) +internal sealed class RemoveInterceptCommand(RemoveInterceptCommandParameters @params) : Command(@params, "network.removeIntercept"); -internal record RemoveInterceptCommandParameters(Intercept Intercept) : CommandParameters; +internal sealed record RemoveInterceptCommandParameters(Intercept Intercept) : CommandParameters; -public record RemoveInterceptOptions : CommandOptions; +public class RemoveInterceptOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Network/Request.cs b/dotnet/src/webdriver/BiDi/Network/Request.cs index d10deaca9070f..0182c49838205 100644 --- a/dotnet/src/webdriver/BiDi/Network/Request.cs +++ b/dotnet/src/webdriver/BiDi/Network/Request.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Network; -public class Request +public sealed class Request { internal Request(string id) { diff --git a/dotnet/src/webdriver/BiDi/Network/RequestData.cs b/dotnet/src/webdriver/BiDi/Network/RequestData.cs index 29fd9654af33c..53e7f1de7e17e 100644 --- a/dotnet/src/webdriver/BiDi/Network/RequestData.cs +++ b/dotnet/src/webdriver/BiDi/Network/RequestData.cs @@ -21,4 +21,14 @@ namespace OpenQA.Selenium.BiDi.Network; -public record RequestData(Request Request, string Url, string Method, IReadOnlyList
Headers, IReadOnlyList Cookies, long? HeadersSize, long? BodySize, string Destination, string? InitiatorType, FetchTimingInfo Timings); +public sealed record RequestData( + Request Request, + string Url, + string Method, + IReadOnlyList
Headers, + IReadOnlyList Cookies, + long? HeadersSize, + long? BodySize, + string Destination, + string? InitiatorType, + FetchTimingInfo Timings); diff --git a/dotnet/src/webdriver/BiDi/Network/ResponseCompletedEventArgs.cs b/dotnet/src/webdriver/BiDi/Network/ResponseCompletedEventArgs.cs index 4e72f73ab98a1..3cd7ea5dad54e 100644 --- a/dotnet/src/webdriver/BiDi/Network/ResponseCompletedEventArgs.cs +++ b/dotnet/src/webdriver/BiDi/Network/ResponseCompletedEventArgs.cs @@ -22,5 +22,12 @@ namespace OpenQA.Selenium.BiDi.Network; -public record ResponseCompletedEventArgs(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, ResponseData Response) +public sealed record ResponseCompletedEventArgs(BiDi BiDi, + BrowsingContext.BrowsingContext? Context, + bool IsBlocked, + Navigation? Navigation, + long RedirectCount, + RequestData Request, + DateTimeOffset Timestamp, + ResponseData Response) : BaseParametersEventArgs(BiDi, Context, IsBlocked, Navigation, RedirectCount, Request, Timestamp); diff --git a/dotnet/src/webdriver/BiDi/Network/ResponseContent.cs b/dotnet/src/webdriver/BiDi/Network/ResponseContent.cs index 1bd9ca8b205e8..c8e031f4c0bae 100644 --- a/dotnet/src/webdriver/BiDi/Network/ResponseContent.cs +++ b/dotnet/src/webdriver/BiDi/Network/ResponseContent.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Network; -public record ResponseContent(long Size); +public sealed record ResponseContent(long Size); diff --git a/dotnet/src/webdriver/BiDi/Network/ResponseData.cs b/dotnet/src/webdriver/BiDi/Network/ResponseData.cs index ec0ae2b7180fe..87868bde43534 100644 --- a/dotnet/src/webdriver/BiDi/Network/ResponseData.cs +++ b/dotnet/src/webdriver/BiDi/Network/ResponseData.cs @@ -23,16 +23,16 @@ namespace OpenQA.Selenium.BiDi.Network; public record ResponseData(string Url, - string Protocol, - int Status, // TODO: should be unit - string StatusText, - bool FromCache, - IReadOnlyList
Headers, - string MimeType, - long BytesReceived, - long? HeadersSize, - long? BodySize, - ResponseContent Content) + string Protocol, + int Status, // TODO: should be unit + string StatusText, + bool FromCache, + IReadOnlyList
Headers, + string MimeType, + long BytesReceived, + long? HeadersSize, + long? BodySize, + ResponseContent Content) { [JsonInclude] public IReadOnlyList? AuthChallenges { get; internal set; } diff --git a/dotnet/src/webdriver/BiDi/Network/ResponseStartedEventArgs.cs b/dotnet/src/webdriver/BiDi/Network/ResponseStartedEventArgs.cs index 3724474bb7389..71a3eeb573388 100644 --- a/dotnet/src/webdriver/BiDi/Network/ResponseStartedEventArgs.cs +++ b/dotnet/src/webdriver/BiDi/Network/ResponseStartedEventArgs.cs @@ -22,5 +22,12 @@ namespace OpenQA.Selenium.BiDi.Network; -public record ResponseStartedEventArgs(BiDi BiDi, BrowsingContext.BrowsingContext? Context, bool IsBlocked, Navigation? Navigation, long RedirectCount, RequestData Request, DateTimeOffset Timestamp, ResponseData Response) +public record ResponseStartedEventArgs(BiDi BiDi, + BrowsingContext.BrowsingContext? Context, + bool IsBlocked, + Navigation? Navigation, + long RedirectCount, + RequestData Request, + DateTimeOffset Timestamp, + ResponseData Response) : BaseParametersEventArgs(BiDi, Context, IsBlocked, Navigation, RedirectCount, Request, Timestamp); diff --git a/dotnet/src/webdriver/BiDi/Network/SetCacheBehaviorCommand.cs b/dotnet/src/webdriver/BiDi/Network/SetCacheBehaviorCommand.cs index fbe5540ad786b..15a96b235e4fa 100644 --- a/dotnet/src/webdriver/BiDi/Network/SetCacheBehaviorCommand.cs +++ b/dotnet/src/webdriver/BiDi/Network/SetCacheBehaviorCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Network; -internal class SetCacheBehaviorCommand(SetCacheBehaviorCommandParameters @params) +internal sealed class SetCacheBehaviorCommand(SetCacheBehaviorCommandParameters @params) : Command(@params, "network.setCacheBehavior"); -internal record SetCacheBehaviorCommandParameters(CacheBehavior CacheBehavior, IEnumerable? Contexts) : CommandParameters; +internal sealed record SetCacheBehaviorCommandParameters(CacheBehavior CacheBehavior, IEnumerable? Contexts) : CommandParameters; -public record SetCacheBehaviorOptions : CommandOptions +public sealed class SetCacheBehaviorOptions : CommandOptions { public SetCacheBehaviorOptions() { @@ -42,10 +42,7 @@ internal SetCacheBehaviorOptions(BrowsingContextSetCacheBehaviorOptions? options public IEnumerable? Contexts { get; set; } } -public record BrowsingContextSetCacheBehaviorOptions -{ - -} +public sealed record BrowsingContextSetCacheBehaviorOptions; public enum CacheBehavior { diff --git a/dotnet/src/webdriver/BiDi/Network/SetCookieHeader.cs b/dotnet/src/webdriver/BiDi/Network/SetCookieHeader.cs index 134cf82a88cc4..19d76a21248dc 100644 --- a/dotnet/src/webdriver/BiDi/Network/SetCookieHeader.cs +++ b/dotnet/src/webdriver/BiDi/Network/SetCookieHeader.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Network; -public record SetCookieHeader(string Name, BytesValue Value) +public sealed record SetCookieHeader(string Name, BytesValue Value) { public string? Domain { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Network/UrlPattern.cs b/dotnet/src/webdriver/BiDi/Network/UrlPattern.cs index 4f3c29d98344d..f77dff14ce9c2 100644 --- a/dotnet/src/webdriver/BiDi/Network/UrlPattern.cs +++ b/dotnet/src/webdriver/BiDi/Network/UrlPattern.cs @@ -29,7 +29,7 @@ public abstract record UrlPattern public static implicit operator UrlPattern(string value) => new StringUrlPattern(value); } -public record PatternUrlPattern : UrlPattern +public sealed record PatternUrlPattern : UrlPattern { public string? Protocol { get; set; } @@ -42,4 +42,4 @@ public record PatternUrlPattern : UrlPattern public string? Search { get; set; } } -public record StringUrlPattern(string Pattern) : UrlPattern; +public sealed record StringUrlPattern(string Pattern) : UrlPattern; diff --git a/dotnet/src/webdriver/BiDi/Script/AddPreloadScriptCommand.cs b/dotnet/src/webdriver/BiDi/Script/AddPreloadScriptCommand.cs index d034c8998583d..612301b4864ce 100644 --- a/dotnet/src/webdriver/BiDi/Script/AddPreloadScriptCommand.cs +++ b/dotnet/src/webdriver/BiDi/Script/AddPreloadScriptCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Script; -internal class AddPreloadScriptCommand(AddPreloadScriptCommandParameters @params) +internal sealed class AddPreloadScriptCommand(AddPreloadScriptCommandParameters @params) : Command(@params, "script.addPreloadScript"); -internal record AddPreloadScriptCommandParameters(string FunctionDeclaration, IEnumerable? Arguments, IEnumerable? Contexts, string? Sandbox) : CommandParameters; +internal sealed record AddPreloadScriptCommandParameters(string FunctionDeclaration, IEnumerable? Arguments, IEnumerable? Contexts, string? Sandbox) : CommandParameters; -public record AddPreloadScriptOptions : CommandOptions +public sealed class AddPreloadScriptOptions : CommandOptions { public AddPreloadScriptOptions() { } @@ -44,11 +44,11 @@ internal AddPreloadScriptOptions(BrowsingContextAddPreloadScriptOptions? options public string? Sandbox { get; set; } } -public record BrowsingContextAddPreloadScriptOptions +public sealed record BrowsingContextAddPreloadScriptOptions { public IEnumerable? Arguments { get; set; } public string? Sandbox { get; set; } } -internal record AddPreloadScriptResult(PreloadScript Script) : EmptyResult; +internal sealed record AddPreloadScriptResult(PreloadScript Script) : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/Script/CallFunctionCommand.cs b/dotnet/src/webdriver/BiDi/Script/CallFunctionCommand.cs index 047750299d067..7d8381296c53b 100644 --- a/dotnet/src/webdriver/BiDi/Script/CallFunctionCommand.cs +++ b/dotnet/src/webdriver/BiDi/Script/CallFunctionCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Script; -internal class CallFunctionCommand(CallFunctionCommandParameters @params) +internal sealed class CallFunctionCommand(CallFunctionCommandParameters @params) : Command(@params, "script.callFunction"); -internal record CallFunctionCommandParameters(string FunctionDeclaration, bool AwaitPromise, Target Target, IEnumerable? Arguments, ResultOwnership? ResultOwnership, SerializationOptions? SerializationOptions, LocalValue? This, bool? UserActivation) : CommandParameters; +internal sealed record CallFunctionCommandParameters(string FunctionDeclaration, bool AwaitPromise, Target Target, IEnumerable? Arguments, ResultOwnership? ResultOwnership, SerializationOptions? SerializationOptions, LocalValue? This, bool? UserActivation) : CommandParameters; -public record CallFunctionOptions : CommandOptions +public sealed class CallFunctionOptions : CommandOptions { public IEnumerable? Arguments { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Script/Channel.cs b/dotnet/src/webdriver/BiDi/Script/Channel.cs index 2e6361bea5a9a..ea21ef212f3d3 100644 --- a/dotnet/src/webdriver/BiDi/Script/Channel.cs +++ b/dotnet/src/webdriver/BiDi/Script/Channel.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Script; -public record Channel(string Id); +public sealed record Channel(string Id); diff --git a/dotnet/src/webdriver/BiDi/Script/ChannelProperties.cs b/dotnet/src/webdriver/BiDi/Script/ChannelProperties.cs index 7ef43b6894eaa..1001f0ba3f4ea 100644 --- a/dotnet/src/webdriver/BiDi/Script/ChannelProperties.cs +++ b/dotnet/src/webdriver/BiDi/Script/ChannelProperties.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public record ChannelProperties(Channel Channel) +public sealed record ChannelProperties(Channel Channel) { public SerializationOptions? SerializationOptions { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Script/DisownCommand.cs b/dotnet/src/webdriver/BiDi/Script/DisownCommand.cs index c7141eb58ecc8..abfa458329763 100644 --- a/dotnet/src/webdriver/BiDi/Script/DisownCommand.cs +++ b/dotnet/src/webdriver/BiDi/Script/DisownCommand.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.BiDi.Script; -internal class DisownCommand(DisownCommandParameters @params) +internal sealed class DisownCommand(DisownCommandParameters @params) : Command(@params, "script.disown"); -internal record DisownCommandParameters(IEnumerable Handles, Target Target) : CommandParameters; +internal sealed record DisownCommandParameters(IEnumerable Handles, Target Target) : CommandParameters; diff --git a/dotnet/src/webdriver/BiDi/Script/EvaluateCommand.cs b/dotnet/src/webdriver/BiDi/Script/EvaluateCommand.cs index ac4291ac8fded..cf9aecd75ceac 100644 --- a/dotnet/src/webdriver/BiDi/Script/EvaluateCommand.cs +++ b/dotnet/src/webdriver/BiDi/Script/EvaluateCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Script; -internal class EvaluateCommand(EvaluateCommandParameters @params) +internal sealed class EvaluateCommand(EvaluateCommandParameters @params) : Command(@params, "script.evaluate"); -internal record EvaluateCommandParameters(string Expression, Target Target, bool AwaitPromise, ResultOwnership? ResultOwnership, SerializationOptions? SerializationOptions, bool? UserActivation) : CommandParameters; +internal sealed record EvaluateCommandParameters(string Expression, Target Target, bool AwaitPromise, ResultOwnership? ResultOwnership, SerializationOptions? SerializationOptions, bool? UserActivation) : CommandParameters; -public record EvaluateOptions : CommandOptions +public sealed class EvaluateOptions : CommandOptions { public ResultOwnership? ResultOwnership { get; set; } @@ -53,11 +53,11 @@ public RemoteValue AsSuccessResult() } } -public record EvaluateResultSuccess(RemoteValue Result, Realm Realm) : EvaluateResult +public sealed record EvaluateResultSuccess(RemoteValue Result, Realm Realm) : EvaluateResult { public static implicit operator RemoteValue(EvaluateResultSuccess success) => success.Result; } -public record EvaluateResultException(ExceptionDetails ExceptionDetails, Realm Realm) : EvaluateResult; +public sealed record EvaluateResultException(ExceptionDetails ExceptionDetails, Realm Realm) : EvaluateResult; -public record ExceptionDetails(long ColumnNumber, long LineNumber, StackTrace StackTrace, string Text); +public sealed record ExceptionDetails(long ColumnNumber, long LineNumber, StackTrace StackTrace, string Text); diff --git a/dotnet/src/webdriver/BiDi/Script/GetRealmsCommand.cs b/dotnet/src/webdriver/BiDi/Script/GetRealmsCommand.cs index dd6f51ba7bf75..cc2b8d332f64c 100644 --- a/dotnet/src/webdriver/BiDi/Script/GetRealmsCommand.cs +++ b/dotnet/src/webdriver/BiDi/Script/GetRealmsCommand.cs @@ -23,19 +23,19 @@ namespace OpenQA.Selenium.BiDi.Script; -internal class GetRealmsCommand(GetRealmsCommandParameters @params) +internal sealed class GetRealmsCommand(GetRealmsCommandParameters @params) : Command(@params, "script.getRealms"); -internal record GetRealmsCommandParameters(BrowsingContext.BrowsingContext? Context, RealmType? Type) : CommandParameters; +internal sealed record GetRealmsCommandParameters(BrowsingContext.BrowsingContext? Context, RealmType? Type) : CommandParameters; -public record GetRealmsOptions : CommandOptions +public sealed class GetRealmsOptions : CommandOptions { public BrowsingContext.BrowsingContext? Context { get; set; } public RealmType? Type { get; set; } } -public record GetRealmsResult : EmptyResult, IReadOnlyList +public sealed record GetRealmsResult : EmptyResult, IReadOnlyList { private readonly IReadOnlyList _realms; diff --git a/dotnet/src/webdriver/BiDi/Script/Handle.cs b/dotnet/src/webdriver/BiDi/Script/Handle.cs index e6fba21111df2..5b5e4f63ede08 100644 --- a/dotnet/src/webdriver/BiDi/Script/Handle.cs +++ b/dotnet/src/webdriver/BiDi/Script/Handle.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public class Handle +public sealed class Handle { private readonly BiDi _bidi; diff --git a/dotnet/src/webdriver/BiDi/Script/InternalId.cs b/dotnet/src/webdriver/BiDi/Script/InternalId.cs index 8e458f80000a0..2914c77c99a0c 100644 --- a/dotnet/src/webdriver/BiDi/Script/InternalId.cs +++ b/dotnet/src/webdriver/BiDi/Script/InternalId.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public class InternalId +public sealed class InternalId { readonly BiDi _bidi; diff --git a/dotnet/src/webdriver/BiDi/Script/LocalValue.cs b/dotnet/src/webdriver/BiDi/Script/LocalValue.cs index 0409f4542b7df..7418bb3d09a0f 100644 --- a/dotnet/src/webdriver/BiDi/Script/LocalValue.cs +++ b/dotnet/src/webdriver/BiDi/Script/LocalValue.cs @@ -282,36 +282,36 @@ private static LocalValue ReflectionBasedConvertFrom(object? value) public abstract record PrimitiveProtocolLocalValue : LocalValue; -public record NumberLocalValue(double Value) : PrimitiveProtocolLocalValue +public sealed record NumberLocalValue(double Value) : PrimitiveProtocolLocalValue { public static explicit operator NumberLocalValue(double n) => new NumberLocalValue(n); } -public record StringLocalValue(string Value) : PrimitiveProtocolLocalValue; +public sealed record StringLocalValue(string Value) : PrimitiveProtocolLocalValue; -public record NullLocalValue : PrimitiveProtocolLocalValue; +public sealed record NullLocalValue : PrimitiveProtocolLocalValue; -public record UndefinedLocalValue : PrimitiveProtocolLocalValue; +public sealed record UndefinedLocalValue : PrimitiveProtocolLocalValue; -public record BooleanLocalValue(bool Value) : PrimitiveProtocolLocalValue; +public sealed record BooleanLocalValue(bool Value) : PrimitiveProtocolLocalValue; -public record BigIntLocalValue(string Value) : PrimitiveProtocolLocalValue; +public sealed record BigIntLocalValue(string Value) : PrimitiveProtocolLocalValue; -public record ChannelLocalValue(ChannelProperties Value) : LocalValue +public sealed record ChannelLocalValue(ChannelProperties Value) : LocalValue { // AddPreloadScript takes arguments typed as ChannelLocalValue but still requires "type":"channel" [JsonInclude] internal string Type => "channel"; } -public record ArrayLocalValue(IEnumerable Value) : LocalValue; +public sealed record ArrayLocalValue(IEnumerable Value) : LocalValue; -public record DateLocalValue(string Value) : LocalValue; +public sealed record DateLocalValue(string Value) : LocalValue; -public record MapLocalValue(IEnumerable> Value) : LocalValue; +public sealed record MapLocalValue(IEnumerable> Value) : LocalValue; -public record ObjectLocalValue(IEnumerable> Value) : LocalValue; +public sealed record ObjectLocalValue(IEnumerable> Value) : LocalValue; -public record RegExpLocalValue(RegExpValue Value) : LocalValue; +public sealed record RegExpLocalValue(RegExpValue Value) : LocalValue; -public record SetLocalValue(IEnumerable Value) : LocalValue; +public sealed record SetLocalValue(IEnumerable Value) : LocalValue; diff --git a/dotnet/src/webdriver/BiDi/Script/MessageEventArgs.cs b/dotnet/src/webdriver/BiDi/Script/MessageEventArgs.cs index 351a98f7bd002..3bbf2ed939a23 100644 --- a/dotnet/src/webdriver/BiDi/Script/MessageEventArgs.cs +++ b/dotnet/src/webdriver/BiDi/Script/MessageEventArgs.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Script; -public record MessageEventArgs(BiDi BiDi, Channel Channel, RemoteValue Data, Source Source) : EventArgs(BiDi); +public sealed record MessageEventArgs(BiDi BiDi, Channel Channel, RemoteValue Data, Source Source) : EventArgs(BiDi); diff --git a/dotnet/src/webdriver/BiDi/Script/NodeProperties.cs b/dotnet/src/webdriver/BiDi/Script/NodeProperties.cs index 2d9bf23da89ce..a63bf44def9a6 100644 --- a/dotnet/src/webdriver/BiDi/Script/NodeProperties.cs +++ b/dotnet/src/webdriver/BiDi/Script/NodeProperties.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public record NodeProperties(long NodeType, long ChildNodeCount) +public sealed record NodeProperties(long NodeType, long ChildNodeCount) { [JsonInclude] public IReadOnlyDictionary? Attributes { get; internal set; } diff --git a/dotnet/src/webdriver/BiDi/Script/PreloadScript.cs b/dotnet/src/webdriver/BiDi/Script/PreloadScript.cs index cfe0b02fa76ce..428825305709c 100644 --- a/dotnet/src/webdriver/BiDi/Script/PreloadScript.cs +++ b/dotnet/src/webdriver/BiDi/Script/PreloadScript.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public class PreloadScript : IAsyncDisposable +public sealed class PreloadScript : IAsyncDisposable { private readonly BiDi _bidi; diff --git a/dotnet/src/webdriver/BiDi/Script/Realm.cs b/dotnet/src/webdriver/BiDi/Script/Realm.cs index 3f748dc36902e..b3fd6f776e0c7 100644 --- a/dotnet/src/webdriver/BiDi/Script/Realm.cs +++ b/dotnet/src/webdriver/BiDi/Script/Realm.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public class Realm +public sealed class Realm { private readonly BiDi _bidi; diff --git a/dotnet/src/webdriver/BiDi/Script/RealmDestroyedEventArgs.cs b/dotnet/src/webdriver/BiDi/Script/RealmDestroyedEventArgs.cs index 0cc1f35bae572..74af338ffad42 100644 --- a/dotnet/src/webdriver/BiDi/Script/RealmDestroyedEventArgs.cs +++ b/dotnet/src/webdriver/BiDi/Script/RealmDestroyedEventArgs.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Script; -public record RealmDestroyedEventArgs(BiDi BiDi, Realm Realm) : EventArgs(BiDi); +public sealed record RealmDestroyedEventArgs(BiDi BiDi, Realm Realm) : EventArgs(BiDi); diff --git a/dotnet/src/webdriver/BiDi/Script/RealmInfo.cs b/dotnet/src/webdriver/BiDi/Script/RealmInfo.cs index d79e4a8d45dc4..84a97bee9ee2c 100644 --- a/dotnet/src/webdriver/BiDi/Script/RealmInfo.cs +++ b/dotnet/src/webdriver/BiDi/Script/RealmInfo.cs @@ -33,21 +33,21 @@ namespace OpenQA.Selenium.BiDi.Script; //[JsonDerivedType(typeof(WorkletRealmInfo), "worklet")] public abstract record RealmInfo(BiDi BiDi, Realm Realm, string Origin) : EventArgs(BiDi); -public record WindowRealmInfo(BiDi BiDi, Realm Realm, string Origin, BrowsingContext.BrowsingContext Context) : RealmInfo(BiDi, Realm, Origin) +public sealed record WindowRealmInfo(BiDi BiDi, Realm Realm, string Origin, BrowsingContext.BrowsingContext Context) : RealmInfo(BiDi, Realm, Origin) { public string? Sandbox { get; set; } } -public record DedicatedWorkerRealmInfo(BiDi BiDi, Realm Realm, string Origin, IReadOnlyList Owners) : RealmInfo(BiDi, Realm, Origin); +public sealed record DedicatedWorkerRealmInfo(BiDi BiDi, Realm Realm, string Origin, IReadOnlyList Owners) : RealmInfo(BiDi, Realm, Origin); -public record SharedWorkerRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); +public sealed record SharedWorkerRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); -public record ServiceWorkerRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); +public sealed record ServiceWorkerRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); -public record WorkerRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); +public sealed record WorkerRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); -public record PaintWorkletRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); +public sealed record PaintWorkletRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); -public record AudioWorkletRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); +public sealed record AudioWorkletRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); -public record WorkletRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); +public sealed record WorkletRealmInfo(BiDi BiDi, Realm Realm, string Origin) : RealmInfo(BiDi, Realm, Origin); diff --git a/dotnet/src/webdriver/BiDi/Script/RegExpValue.cs b/dotnet/src/webdriver/BiDi/Script/RegExpValue.cs index caae933a61d9a..c64c915582443 100644 --- a/dotnet/src/webdriver/BiDi/Script/RegExpValue.cs +++ b/dotnet/src/webdriver/BiDi/Script/RegExpValue.cs @@ -23,7 +23,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public record RegExpValue(string Pattern) +public sealed record RegExpValue(string Pattern) { public string? Flags { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Script/RemoteValue.cs b/dotnet/src/webdriver/BiDi/Script/RemoteValue.cs index d1ac8be390be0..80eaea6979116 100644 --- a/dotnet/src/webdriver/BiDi/Script/RemoteValue.cs +++ b/dotnet/src/webdriver/BiDi/Script/RemoteValue.cs @@ -97,26 +97,28 @@ public abstract record RemoteValue } } -public record NumberRemoteValue(double Value) : PrimitiveProtocolRemoteValue; +public abstract record PrimitiveProtocolRemoteValue : RemoteValue; + +public sealed record NumberRemoteValue(double Value) : PrimitiveProtocolRemoteValue; -public record BooleanRemoteValue(bool Value) : PrimitiveProtocolRemoteValue; +public sealed record BooleanRemoteValue(bool Value) : PrimitiveProtocolRemoteValue; -public record BigIntRemoteValue(string Value) : PrimitiveProtocolRemoteValue; +public sealed record BigIntRemoteValue(string Value) : PrimitiveProtocolRemoteValue; -public record StringRemoteValue(string Value) : PrimitiveProtocolRemoteValue; +public sealed record StringRemoteValue(string Value) : PrimitiveProtocolRemoteValue; -public record NullRemoteValue : PrimitiveProtocolRemoteValue; +public sealed record NullRemoteValue : PrimitiveProtocolRemoteValue; -public record UndefinedRemoteValue : PrimitiveProtocolRemoteValue; +public sealed record UndefinedRemoteValue : PrimitiveProtocolRemoteValue; -public record SymbolRemoteValue : RemoteValue +public sealed record SymbolRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record ArrayRemoteValue : RemoteValue +public sealed record ArrayRemoteValue : RemoteValue { public Handle? Handle { get; set; } @@ -125,7 +127,7 @@ public record ArrayRemoteValue : RemoteValue public IReadOnlyList? Value { get; set; } } -public record ObjectRemoteValue : RemoteValue +public sealed record ObjectRemoteValue : RemoteValue { public Handle? Handle { get; set; } @@ -134,28 +136,28 @@ public record ObjectRemoteValue : RemoteValue public IReadOnlyList>? Value { get; set; } } -public record FunctionRemoteValue : RemoteValue +public sealed record FunctionRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record RegExpRemoteValue(RegExpValue Value) : RemoteValue +public sealed record RegExpRemoteValue(RegExpValue Value) : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record DateRemoteValue(string Value) : RemoteValue +public sealed record DateRemoteValue(string Value) : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record MapRemoteValue : RemoteValue +public sealed record MapRemoteValue : RemoteValue { public Handle? Handle { get; set; } @@ -164,7 +166,7 @@ public record MapRemoteValue : RemoteValue public IReadOnlyList>? Value { get; set; } } -public record SetRemoteValue : RemoteValue +public sealed record SetRemoteValue : RemoteValue { public Handle? Handle { get; set; } @@ -173,63 +175,63 @@ public record SetRemoteValue : RemoteValue public IReadOnlyList? Value { get; set; } } -public record WeakMapRemoteValue : RemoteValue +public sealed record WeakMapRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record WeakSetRemoteValue : RemoteValue +public sealed record WeakSetRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record GeneratorRemoteValue : RemoteValue +public sealed record GeneratorRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record ErrorRemoteValue : RemoteValue +public sealed record ErrorRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record ProxyRemoteValue : RemoteValue +public sealed record ProxyRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record PromiseRemoteValue : RemoteValue +public sealed record PromiseRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record TypedArrayRemoteValue : RemoteValue +public sealed record TypedArrayRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record ArrayBufferRemoteValue : RemoteValue +public sealed record ArrayBufferRemoteValue : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public record NodeListRemoteValue : RemoteValue +public sealed record NodeListRemoteValue : RemoteValue { public Handle? Handle { get; set; } @@ -238,7 +240,7 @@ public record NodeListRemoteValue : RemoteValue public IReadOnlyList? Value { get; set; } } -public record HtmlCollectionRemoteValue : RemoteValue +public sealed record HtmlCollectionRemoteValue : RemoteValue { public Handle? Handle { get; set; } @@ -247,7 +249,7 @@ public record HtmlCollectionRemoteValue : RemoteValue public IReadOnlyList? Value { get; set; } } -public record NodeRemoteValue : RemoteValue, ISharedReference +public sealed record NodeRemoteValue : RemoteValue, ISharedReference { [JsonInclude] public string? SharedId { get; internal set; } @@ -260,15 +262,13 @@ public record NodeRemoteValue : RemoteValue, ISharedReference public NodeProperties? Value { get; internal set; } } -public record WindowProxyRemoteValue(WindowProxyProperties Value) : RemoteValue +public sealed record WindowProxyRemoteValue(WindowProxyProperties Value) : RemoteValue { public Handle? Handle { get; set; } public InternalId? InternalId { get; set; } } -public abstract record PrimitiveProtocolRemoteValue : RemoteValue; - public enum Mode { Open, diff --git a/dotnet/src/webdriver/BiDi/Script/RemovePreloadScriptCommand.cs b/dotnet/src/webdriver/BiDi/Script/RemovePreloadScriptCommand.cs index f962488fe956f..6fbce4dbed82d 100644 --- a/dotnet/src/webdriver/BiDi/Script/RemovePreloadScriptCommand.cs +++ b/dotnet/src/webdriver/BiDi/Script/RemovePreloadScriptCommand.cs @@ -21,9 +21,9 @@ namespace OpenQA.Selenium.BiDi.Script; -internal class RemovePreloadScriptCommand(RemovePreloadScriptCommandParameters @params) +internal sealed class RemovePreloadScriptCommand(RemovePreloadScriptCommandParameters @params) : Command(@params, "script.removePreloadScript"); -internal record RemovePreloadScriptCommandParameters(PreloadScript Script) : CommandParameters; +internal sealed record RemovePreloadScriptCommandParameters(PreloadScript Script) : CommandParameters; -public record RemovePreloadScriptOptions : CommandOptions; +public sealed class RemovePreloadScriptOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Script/SerializationOptions.cs b/dotnet/src/webdriver/BiDi/Script/SerializationOptions.cs index 1e7c2101219fe..ae4d1880dd30c 100644 --- a/dotnet/src/webdriver/BiDi/Script/SerializationOptions.cs +++ b/dotnet/src/webdriver/BiDi/Script/SerializationOptions.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public class SerializationOptions +public sealed class SerializationOptions { public long? MaxDomDepth { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Script/Source.cs b/dotnet/src/webdriver/BiDi/Script/Source.cs index 58e01ee34e005..273b42099fbf4 100644 --- a/dotnet/src/webdriver/BiDi/Script/Source.cs +++ b/dotnet/src/webdriver/BiDi/Script/Source.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Script; -public record Source(Realm Realm) +public sealed record Source(Realm Realm) { public BrowsingContext.BrowsingContext? Context { get; set; } } diff --git a/dotnet/src/webdriver/BiDi/Script/StackFrame.cs b/dotnet/src/webdriver/BiDi/Script/StackFrame.cs index b8c796a0a186a..8ae1a6883bc5f 100644 --- a/dotnet/src/webdriver/BiDi/Script/StackFrame.cs +++ b/dotnet/src/webdriver/BiDi/Script/StackFrame.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Script; -public record StackFrame(long LineNumber, long ColumnNumber, string Url, string FunctionName); +public sealed record StackFrame(long LineNumber, long ColumnNumber, string Url, string FunctionName); diff --git a/dotnet/src/webdriver/BiDi/Script/StackTrace.cs b/dotnet/src/webdriver/BiDi/Script/StackTrace.cs index b04289f1cf480..1c8e95cd6b385 100644 --- a/dotnet/src/webdriver/BiDi/Script/StackTrace.cs +++ b/dotnet/src/webdriver/BiDi/Script/StackTrace.cs @@ -21,4 +21,4 @@ namespace OpenQA.Selenium.BiDi.Script; -public record StackTrace(IReadOnlyList CallFrames); +public sealed record StackTrace(IReadOnlyList CallFrames); diff --git a/dotnet/src/webdriver/BiDi/Script/Target.cs b/dotnet/src/webdriver/BiDi/Script/Target.cs index 5590419518a68..88972b9a4b6f0 100644 --- a/dotnet/src/webdriver/BiDi/Script/Target.cs +++ b/dotnet/src/webdriver/BiDi/Script/Target.cs @@ -25,14 +25,14 @@ namespace OpenQA.Selenium.BiDi.Script; [JsonDerivedType(typeof(ContextTarget))] public abstract record Target; -public record RealmTarget(Realm Realm) : Target; +public sealed record RealmTarget(Realm Realm) : Target; -public record ContextTarget(BrowsingContext.BrowsingContext Context) : Target +public sealed record ContextTarget(BrowsingContext.BrowsingContext Context) : Target { public string? Sandbox { get; set; } } -public class ContextTargetOptions +public sealed class ContextTargetOptions { public string? Sandbox { set; get; } } diff --git a/dotnet/src/webdriver/BiDi/Script/WindowProxyProperties.cs b/dotnet/src/webdriver/BiDi/Script/WindowProxyProperties.cs index 487f1680ecf2a..80e6931a20d97 100644 --- a/dotnet/src/webdriver/BiDi/Script/WindowProxyProperties.cs +++ b/dotnet/src/webdriver/BiDi/Script/WindowProxyProperties.cs @@ -19,4 +19,4 @@ namespace OpenQA.Selenium.BiDi.Script; -public record WindowProxyProperties(BrowsingContext.BrowsingContext Context); +public sealed record WindowProxyProperties(BrowsingContext.BrowsingContext Context); diff --git a/dotnet/src/webdriver/BiDi/Session/CapabilitiesRequest.cs b/dotnet/src/webdriver/BiDi/Session/CapabilitiesRequest.cs index 4f1af939bffe4..1e14b3c140361 100644 --- a/dotnet/src/webdriver/BiDi/Session/CapabilitiesRequest.cs +++ b/dotnet/src/webdriver/BiDi/Session/CapabilitiesRequest.cs @@ -21,7 +21,7 @@ namespace OpenQA.Selenium.BiDi.Session; -public record CapabilitiesRequest +public sealed record CapabilitiesRequest { public CapabilityRequest? AlwaysMatch { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Session/CapabilityRequest.cs b/dotnet/src/webdriver/BiDi/Session/CapabilityRequest.cs index 6113a5fc9b76d..0c9e1a23e7dd8 100644 --- a/dotnet/src/webdriver/BiDi/Session/CapabilityRequest.cs +++ b/dotnet/src/webdriver/BiDi/Session/CapabilityRequest.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Session; -public record CapabilityRequest +public sealed record CapabilityRequest { public bool? AcceptInsecureCerts { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Session/EndCommand.cs b/dotnet/src/webdriver/BiDi/Session/EndCommand.cs index e4754361b4c31..a75f5f29c088e 100644 --- a/dotnet/src/webdriver/BiDi/Session/EndCommand.cs +++ b/dotnet/src/webdriver/BiDi/Session/EndCommand.cs @@ -21,7 +21,7 @@ namespace OpenQA.Selenium.BiDi.Session; -internal class EndCommand() +internal sealed class EndCommand() : Command(CommandParameters.Empty, "session.end"); -public record EndOptions : CommandOptions; +public sealed class EndOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Session/NewCommand.cs b/dotnet/src/webdriver/BiDi/Session/NewCommand.cs index c1586234b7e93..23c4a2f402ad4 100644 --- a/dotnet/src/webdriver/BiDi/Session/NewCommand.cs +++ b/dotnet/src/webdriver/BiDi/Session/NewCommand.cs @@ -21,16 +21,16 @@ namespace OpenQA.Selenium.BiDi.Session; -internal class NewCommand(NewCommandParameters @params) +internal sealed class NewCommand(NewCommandParameters @params) : Command(@params, "session.new"); -internal record NewCommandParameters(CapabilitiesRequest Capabilities) : CommandParameters; +internal sealed record NewCommandParameters(CapabilitiesRequest Capabilities) : CommandParameters; -public record NewOptions : CommandOptions; +public sealed class NewOptions : CommandOptions; -public record NewResult(string SessionId, Capability Capability) : EmptyResult; +public sealed record NewResult(string SessionId, Capability Capability) : EmptyResult; -public record Capability(bool AcceptInsecureCerts, string BrowserName, string BrowserVersion, string PlatformName, bool SetWindowRect, string UserAgent) +public sealed record Capability(bool AcceptInsecureCerts, string BrowserName, string BrowserVersion, string PlatformName, bool SetWindowRect, string UserAgent) { public ProxyConfiguration? Proxy { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Session/ProxyConfiguration.cs b/dotnet/src/webdriver/BiDi/Session/ProxyConfiguration.cs index 694e76b506875..8c160b8b8ae2a 100644 --- a/dotnet/src/webdriver/BiDi/Session/ProxyConfiguration.cs +++ b/dotnet/src/webdriver/BiDi/Session/ProxyConfiguration.cs @@ -30,11 +30,11 @@ namespace OpenQA.Selenium.BiDi.Session; [JsonDerivedType(typeof(SystemProxyConfiguration), "system")] public abstract record ProxyConfiguration; -public record AutoDetectProxyConfiguration : ProxyConfiguration; +public sealed record AutoDetectProxyConfiguration : ProxyConfiguration; -public record DirectProxyConfiguration : ProxyConfiguration; +public sealed record DirectProxyConfiguration : ProxyConfiguration; -public record ManualProxyConfiguration : ProxyConfiguration, ISocksProxyConfiguration +public sealed record ManualProxyConfiguration : ProxyConfiguration, ISocksProxyConfiguration { public string? HttpProxy { get; set; } @@ -47,9 +47,9 @@ public record ManualProxyConfiguration : ProxyConfiguration, ISocksProxyConfigur public IEnumerable? NoProxy { get; set; } } -public record PacProxyConfiguration(string ProxyAutoConfigUrl) : ProxyConfiguration; +public sealed record PacProxyConfiguration(string ProxyAutoConfigUrl) : ProxyConfiguration; -public record SystemProxyConfiguration : ProxyConfiguration; +public sealed record SystemProxyConfiguration : ProxyConfiguration; public interface ISocksProxyConfiguration { diff --git a/dotnet/src/webdriver/BiDi/Session/StatusCommand.cs b/dotnet/src/webdriver/BiDi/Session/StatusCommand.cs index f1f34fa184416..f8bd3fbefbe61 100644 --- a/dotnet/src/webdriver/BiDi/Session/StatusCommand.cs +++ b/dotnet/src/webdriver/BiDi/Session/StatusCommand.cs @@ -21,9 +21,9 @@ namespace OpenQA.Selenium.BiDi.Session; -internal class StatusCommand() +internal sealed class StatusCommand() : Command(CommandParameters.Empty, "session.status"); -public record StatusResult(bool Ready, string Message) : EmptyResult; +public sealed record StatusResult(bool Ready, string Message) : EmptyResult; -public record StatusOptions : CommandOptions; +public sealed class StatusOptions : CommandOptions; diff --git a/dotnet/src/webdriver/BiDi/Session/SubscribeCommand.cs b/dotnet/src/webdriver/BiDi/Session/SubscribeCommand.cs index ddcc6ff2250fe..ba63121fefd85 100644 --- a/dotnet/src/webdriver/BiDi/Session/SubscribeCommand.cs +++ b/dotnet/src/webdriver/BiDi/Session/SubscribeCommand.cs @@ -22,14 +22,14 @@ namespace OpenQA.Selenium.BiDi.Session; -internal class SubscribeCommand(SubscribeCommandParameters @params) +internal sealed class SubscribeCommand(SubscribeCommandParameters @params) : Command(@params, "session.subscribe"); -internal record SubscribeCommandParameters(IEnumerable Events, IEnumerable? Contexts) : CommandParameters; +internal sealed record SubscribeCommandParameters(IEnumerable Events, IEnumerable? Contexts) : CommandParameters; -public record SubscribeOptions : CommandOptions +public sealed class SubscribeOptions : CommandOptions { public IEnumerable? Contexts { get; set; } } -internal record SubscribeResult(Subscription Subscription) : EmptyResult; +internal sealed record SubscribeResult(Subscription Subscription) : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/Session/UnsubscribeCommand.cs b/dotnet/src/webdriver/BiDi/Session/UnsubscribeCommand.cs index af9f43f4fa076..4540126b32e5f 100644 --- a/dotnet/src/webdriver/BiDi/Session/UnsubscribeCommand.cs +++ b/dotnet/src/webdriver/BiDi/Session/UnsubscribeCommand.cs @@ -23,23 +23,23 @@ namespace OpenQA.Selenium.BiDi.Session; -internal class UnsubscribeByIdCommand(UnsubscribeByIdCommandParameters @params) +internal sealed class UnsubscribeByIdCommand(UnsubscribeByIdCommandParameters @params) : Command(@params, "session.unsubscribe"); -internal class UnsubscribeByAttributesCommand(UnsubscribeByAttributesCommandParameters @params) +internal sealed class UnsubscribeByAttributesCommand(UnsubscribeByAttributesCommandParameters @params) : Command(@params, "session.unsubscribe"); -internal record UnsubscribeByIdCommandParameters(IEnumerable Subscriptions) : CommandParameters; +internal sealed record UnsubscribeByIdCommandParameters(IEnumerable Subscriptions) : CommandParameters; -public record UnsubscribeByIdOptions : CommandOptions; +public sealed class UnsubscribeByIdOptions : CommandOptions; -internal record UnsubscribeByAttributesCommandParameters( +internal sealed record UnsubscribeByAttributesCommandParameters( IEnumerable Events, [property: Obsolete("Contexts param is deprecated and will be removed in the future versions")] // https://w3c.github.io/webdriver-bidi/#type-session-UnsubscribeByAttributesRequest IEnumerable? Contexts) : CommandParameters; -public record UnsubscribeByAttributesOptions : CommandOptions +public sealed class UnsubscribeByAttributesOptions : CommandOptions { public IEnumerable? Contexts { get; set; } } diff --git a/dotnet/src/webdriver/BiDi/Session/UserPromptHandler.cs b/dotnet/src/webdriver/BiDi/Session/UserPromptHandler.cs index 5d5e9866c41bc..111a8b6985806 100644 --- a/dotnet/src/webdriver/BiDi/Session/UserPromptHandler.cs +++ b/dotnet/src/webdriver/BiDi/Session/UserPromptHandler.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Session; -public record UserPromptHandler +public sealed record UserPromptHandler { public UserPromptHandlerType? Alert { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Storage/DeleteCookiesCommand.cs b/dotnet/src/webdriver/BiDi/Storage/DeleteCookiesCommand.cs index c17d79336ba44..cb3d061fb4b88 100644 --- a/dotnet/src/webdriver/BiDi/Storage/DeleteCookiesCommand.cs +++ b/dotnet/src/webdriver/BiDi/Storage/DeleteCookiesCommand.cs @@ -21,11 +21,16 @@ namespace OpenQA.Selenium.BiDi.Storage; -internal class DeleteCookiesCommand(DeleteCookiesCommandParameters @params) +internal sealed class DeleteCookiesCommand(DeleteCookiesCommandParameters @params) : Command(@params, "storage.deleteCookies"); -internal record DeleteCookiesCommandParameters(CookieFilter? Filter, PartitionDescriptor? Partition) : CommandParameters; +internal sealed record DeleteCookiesCommandParameters(CookieFilter? Filter, PartitionDescriptor? Partition) : CommandParameters; -public record DeleteCookiesOptions : GetCookiesOptions; +public sealed class DeleteCookiesOptions : CommandOptions +{ + public CookieFilter? Filter { get; set; } -public record DeleteCookiesResult(PartitionKey PartitionKey) : EmptyResult; + public PartitionDescriptor? Partition { get; set; } +} + +public sealed record DeleteCookiesResult(PartitionKey PartitionKey) : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/Storage/GetCookiesCommand.cs b/dotnet/src/webdriver/BiDi/Storage/GetCookiesCommand.cs index c554f929aeefc..30a5e23f00754 100644 --- a/dotnet/src/webdriver/BiDi/Storage/GetCookiesCommand.cs +++ b/dotnet/src/webdriver/BiDi/Storage/GetCookiesCommand.cs @@ -25,19 +25,19 @@ namespace OpenQA.Selenium.BiDi.Storage; -internal class GetCookiesCommand(GetCookiesCommandParameters @params) +internal sealed class GetCookiesCommand(GetCookiesCommandParameters @params) : Command(@params, "storage.getCookies"); -internal record GetCookiesCommandParameters(CookieFilter? Filter, PartitionDescriptor? Partition) : CommandParameters; +internal sealed record GetCookiesCommandParameters(CookieFilter? Filter, PartitionDescriptor? Partition) : CommandParameters; -public record GetCookiesOptions : CommandOptions +public sealed class GetCookiesOptions : CommandOptions { public CookieFilter? Filter { get; set; } public PartitionDescriptor? Partition { get; set; } } -public record GetCookiesResult : EmptyResult, IReadOnlyList +public sealed record GetCookiesResult : EmptyResult, IReadOnlyList { private readonly IReadOnlyList _cookies; @@ -58,7 +58,7 @@ internal GetCookiesResult(IReadOnlyList cookies, PartitionKey pa IEnumerator IEnumerable.GetEnumerator() => (_cookies as IEnumerable).GetEnumerator(); } -public class CookieFilter +public sealed record CookieFilter { public string? Name { get; set; } @@ -84,9 +84,9 @@ public class CookieFilter [JsonDerivedType(typeof(StorageKeyPartitionDescriptor), "storageKey")] public abstract record PartitionDescriptor; -public record ContextPartitionDescriptor(BrowsingContext.BrowsingContext Context) : PartitionDescriptor; +public sealed record ContextPartitionDescriptor(BrowsingContext.BrowsingContext Context) : PartitionDescriptor; -public record StorageKeyPartitionDescriptor : PartitionDescriptor +public sealed record StorageKeyPartitionDescriptor : PartitionDescriptor { public string? UserContext { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Storage/PartitionKey.cs b/dotnet/src/webdriver/BiDi/Storage/PartitionKey.cs index 88f99ce79e2b4..31978d4fb15b5 100644 --- a/dotnet/src/webdriver/BiDi/Storage/PartitionKey.cs +++ b/dotnet/src/webdriver/BiDi/Storage/PartitionKey.cs @@ -19,7 +19,7 @@ namespace OpenQA.Selenium.BiDi.Storage; -public class PartitionKey +public sealed record PartitionKey { public Browser.UserContext? UserContext { get; set; } diff --git a/dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs b/dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs index 77086dc697dde..e92f99bfb2057 100644 --- a/dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs +++ b/dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs @@ -22,12 +22,12 @@ namespace OpenQA.Selenium.BiDi.Storage; -internal class SetCookieCommand(SetCookieCommandParameters @params) +internal sealed class SetCookieCommand(SetCookieCommandParameters @params) : Command(@params, "storage.setCookie"); -internal record SetCookieCommandParameters(PartialCookie Cookie, PartitionDescriptor? Partition) : CommandParameters; +internal sealed record SetCookieCommandParameters(PartialCookie Cookie, PartitionDescriptor? Partition) : CommandParameters; -public record PartialCookie(string Name, Network.BytesValue Value, string Domain) +public sealed record PartialCookie(string Name, Network.BytesValue Value, string Domain) { public string? Path { get; set; } @@ -40,9 +40,9 @@ public record PartialCookie(string Name, Network.BytesValue Value, string Domain public DateTimeOffset? Expiry { get; set; } } -public record SetCookieOptions : CommandOptions +public sealed class SetCookieOptions : CommandOptions { public PartitionDescriptor? Partition { get; set; } } -public record SetCookieResult(PartitionKey PartitionKey) : EmptyResult; +public sealed record SetCookieResult(PartitionKey PartitionKey) : EmptyResult; diff --git a/dotnet/src/webdriver/BiDi/Storage/StorageModule.cs b/dotnet/src/webdriver/BiDi/Storage/StorageModule.cs index 4ebb08c25ca80..0fdd70288a141 100644 --- a/dotnet/src/webdriver/BiDi/Storage/StorageModule.cs +++ b/dotnet/src/webdriver/BiDi/Storage/StorageModule.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.BiDi.Storage; -public class StorageModule(Broker broker) : Module(broker) +public sealed class StorageModule(Broker broker) : Module(broker) { public async Task GetCookiesAsync(GetCookiesOptions? options = null) { diff --git a/java/src/org/openqa/selenium/Keys.java b/java/src/org/openqa/selenium/Keys.java index 02231ea99cd0c..0b729541cb001 100644 --- a/java/src/org/openqa/selenium/Keys.java +++ b/java/src/org/openqa/selenium/Keys.java @@ -23,13 +23,26 @@ /** * Representations of pressable keys that aren't text. These are stored in the Unicode PUA (Private - * Use Area) code points, 0xE000-0xF8FF. + * Use Area) code points, 0xE000–0xF8FF. These values are used internally by WebDriver to simulate + * keyboard input where standard Unicode characters are insufficient, such as modifier and control + * keys. * - * @see http://www.google.com.au/search?&q=unicode+pua&btnK=Search + *

The codes follow conventions partially established by the W3C WebDriver specification and the + * Selenium project. Some values (e.g., RIGHT_SHIFT, RIGHT_COMMAND) are used in ChromeDriver but are + * not currently part of the W3C spec. Others (e.g., OPTION, FN) are symbolic and reserved for + * possible future mapping. + * + *

For consistency across platforms and drivers, values should be verified before assuming native + * support. + * + * @see W3C WebDriver Keyboard + * Actions + * @see Unicode PUA + * Overview */ @NullMarked public enum Keys implements CharSequence { + // Basic control characters NULL('\uE000'), CANCEL('\uE001'), // ^break HELP('\uE002'), @@ -99,6 +112,16 @@ public enum Keys implements CharSequence { META('\uE03D'), COMMAND(Keys.META), + // Extended macOS/ChromeDriver keys (based on observed Chrome usage) + RIGHT_SHIFT('\uE050'), // aligns with ChromeDriver usage + RIGHT_CONTROL('\uE051'), + RIGHT_ALT('\uE052'), + RIGHT_COMMAND('\uE053'), + + // Symbolic macOS keys not yet standardized + OPTION('\uE050'), // TODO: verify Unicode value with WebDriver spec + FN('\uE051'), // TODO: symbolic only; confirm or remove in future + ZENKAKU_HANKAKU('\uE040'); private final char keyCode; @@ -122,7 +145,6 @@ public char charAt(int index) { if (index == 0) { return keyCode; } - return 0; } @@ -136,7 +158,6 @@ public CharSequence subSequence(int start, int end) { if (start == 0 && end == 1) { return String.valueOf(keyCode); } - throw new IndexOutOfBoundsException(); } @@ -147,11 +168,9 @@ public String toString() { /** * Simulate pressing many keys at once in a "chord". Takes a sequence of Keys.XXXX or strings; - * appends each of the values to a string, and adds the chord termination key (Keys.NULL) and - * returns the resultant string. + * appends each to a string, adds the chord termination key (Keys.NULL), and returns it. * - *

Note: When the low-level webdriver key handlers see Keys.NULL, active modifier keys - * (CTRL/ALT/SHIFT/etc) release via a keyup event. + *

Note: Keys.NULL signals release of modifier keys like CTRL/ALT/SHIFT via keyup events. * * @param value characters to send * @return String representation of the char sequence @@ -161,27 +180,25 @@ public static String chord(CharSequence... value) { } /** - * @see #chord(CharSequence...) + * Overload of {@link #chord(CharSequence...)} that accepts an iterable. + * * @param value characters to send * @return String representation of the char sequence */ public static String chord(Iterable value) { StringBuilder builder = new StringBuilder(); - for (CharSequence seq : value) { builder.append(seq); } - builder.append(Keys.NULL); return builder.toString(); } /** - * Get the special key representation, {@link Keys}, of the supplied character if there is one. If - * there is no special key tied to this character, null will be returned. + * Retrieves the {@link Keys} enum constant corresponding to the given Unicode character. * * @param key unicode character code - * @return special key linked to the character code, or null if character is not a special key + * @return special key linked to the character code, or null if not found */ public static @Nullable Keys getKeyFromUnicode(char key) { for (Keys unicodeKey : values()) { @@ -189,7 +206,6 @@ public static String chord(Iterable value) { return unicodeKey; } } - return null; } } diff --git a/java/src/org/openqa/selenium/bidi/browsingcontext/HistoryUpdated.java b/java/src/org/openqa/selenium/bidi/browsingcontext/HistoryUpdated.java new file mode 100644 index 0000000000000..aee7758f2fd62 --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/browsingcontext/HistoryUpdated.java @@ -0,0 +1,92 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.browsingcontext; + +import static java.util.Collections.unmodifiableMap; + +import java.util.Map; +import java.util.TreeMap; +import org.openqa.selenium.json.JsonInput; + +public class HistoryUpdated { + + private final String browsingContextId; + + private final int timestamp; + + private final String url; + + private HistoryUpdated(String browsingContextId, int timestamp, String url) { + this.browsingContextId = browsingContextId; + this.timestamp = timestamp; + this.url = url; + } + + public static HistoryUpdated fromJson(JsonInput input) { + String browsingContextId = null; + int timestamp = 0; + String url = null; + + input.beginObject(); + while (input.hasNext()) { + switch (input.nextName()) { + case "context": + browsingContextId = input.read(String.class); + break; + + case "timestamp": + timestamp = input.read(int.class); + break; + + case "url": + url = input.read(String.class); + break; + + default: + input.skipValue(); + break; + } + } + + input.endObject(); + + return new HistoryUpdated(browsingContextId, timestamp, url); + } + + public String getBrowsingContextId() { + return browsingContextId; + } + + public int getTimestamp() { + return timestamp; + } + + public String getUrl() { + return url; + } + + private Map toJson() { + Map toReturn = new TreeMap<>(); + + toReturn.put("browsingContextId", this.getBrowsingContextId()); + toReturn.put("timestamp", this.getTimestamp()); + toReturn.put("url", this.getUrl()); + + return unmodifiableMap(toReturn); + } +} diff --git a/java/src/org/openqa/selenium/bidi/module/BUILD.bazel b/java/src/org/openqa/selenium/bidi/module/BUILD.bazel index 13bd4b6452418..bb8e51cb62a9d 100644 --- a/java/src/org/openqa/selenium/bidi/module/BUILD.bazel +++ b/java/src/org/openqa/selenium/bidi/module/BUILD.bazel @@ -25,6 +25,7 @@ java_library( "//java/src/org/openqa/selenium/bidi/permissions", "//java/src/org/openqa/selenium/bidi/script", "//java/src/org/openqa/selenium/bidi/storage", + "//java/src/org/openqa/selenium/bidi/webextension", "//java/src/org/openqa/selenium/json", "//java/src/org/openqa/selenium/remote/http", artifact("com.google.auto.service:auto-service-annotations"), diff --git a/java/src/org/openqa/selenium/bidi/module/BrowsingContextInspector.java b/java/src/org/openqa/selenium/bidi/module/BrowsingContextInspector.java index ba07250e6ae0e..4b08dc9c11906 100644 --- a/java/src/org/openqa/selenium/bidi/module/BrowsingContextInspector.java +++ b/java/src/org/openqa/selenium/bidi/module/BrowsingContextInspector.java @@ -29,6 +29,7 @@ import org.openqa.selenium.bidi.Event; import org.openqa.selenium.bidi.HasBiDi; import org.openqa.selenium.bidi.browsingcontext.BrowsingContextInfo; +import org.openqa.selenium.bidi.browsingcontext.HistoryUpdated; import org.openqa.selenium.bidi.browsingcontext.NavigationInfo; import org.openqa.selenium.bidi.browsingcontext.UserPromptClosed; import org.openqa.selenium.bidi.browsingcontext.UserPromptOpened; @@ -88,6 +89,16 @@ public class BrowsingContextInspector implements AutoCloseable { } }); + private final Event historyUpdated = + new Event<>( + "browsingContext.historyUpdated", + params -> { + try (StringReader reader = new StringReader(JSON.toJson(params)); + JsonInput input = JSON.newInput(reader)) { + return input.read(HistoryUpdated.class); + } + }); + public BrowsingContextInspector(WebDriver driver) { this(new HashSet<>(), driver); } @@ -172,6 +183,14 @@ public void onUserPromptOpened(Consumer consumer) { } } + public void onHistoryUpdated(Consumer consumer) { + if (browsingContextIds.isEmpty()) { + this.bidi.addListener(historyUpdated, consumer); + } else { + this.bidi.addListener(browsingContextIds, historyUpdated, consumer); + } + } + private void addNavigationEventListener(String name, Consumer consumer) { Event navigationEvent = new Event<>(name, navigationInfoMapper); @@ -190,6 +209,7 @@ public void close() { this.bidi.clearListener(browsingContextDestroyed); this.bidi.clearListener(userPromptOpened); this.bidi.clearListener(userPromptClosed); + this.bidi.clearListener(historyUpdated); navigationEventSet.forEach(this.bidi::clearListener); } diff --git a/java/src/org/openqa/selenium/bidi/webextension/BUILD.bazel b/java/src/org/openqa/selenium/bidi/webextension/BUILD.bazel new file mode 100644 index 0000000000000..cf1199d8fa9fc --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/webextension/BUILD.bazel @@ -0,0 +1,25 @@ +load("@rules_jvm_external//:defs.bzl", "artifact") +load("//java:defs.bzl", "java_library") + +java_library( + name = "webextension", + srcs = glob( + [ + "*.java", + ], + ), + visibility = [ + "//java/src/org/openqa/selenium/bidi:__subpackages__", + "//java/src/org/openqa/selenium/firefox:__subpackages__", + "//java/src/org/openqa/selenium/remote:__pkg__", + "//java/test/org/openqa/selenium/bidi:__subpackages__", + "//java/test/org/openqa/selenium/grid:__subpackages__", + ], + deps = [ + "//java/src/org/openqa/selenium:core", + "//java/src/org/openqa/selenium/bidi", + "//java/src/org/openqa/selenium/json", + "//java/src/org/openqa/selenium/remote/http", + artifact("com.google.auto.service:auto-service-annotations"), + ], +) diff --git a/java/src/org/openqa/selenium/bidi/webextension/ExtensionArchivePath.java b/java/src/org/openqa/selenium/bidi/webextension/ExtensionArchivePath.java new file mode 100644 index 0000000000000..465aa08f740b1 --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/webextension/ExtensionArchivePath.java @@ -0,0 +1,34 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.webextension; + +import java.util.Map; + +public class ExtensionArchivePath extends ExtensionData { + private final String path; + + public ExtensionArchivePath(String path) { + this.path = path; + } + + @Override + public Map toMap() { + String type = "archivePath"; + return Map.of("extensionData", Map.of("type", type, "path", path)); + } +} diff --git a/java/src/org/openqa/selenium/bidi/webextension/ExtensionBase64Encoded.java b/java/src/org/openqa/selenium/bidi/webextension/ExtensionBase64Encoded.java new file mode 100644 index 0000000000000..06a7e49dc0d0d --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/webextension/ExtensionBase64Encoded.java @@ -0,0 +1,34 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.webextension; + +import java.util.Map; + +public class ExtensionBase64Encoded extends ExtensionData { + private final String value; + + public ExtensionBase64Encoded(String value) { + this.value = value; + } + + @Override + public Map toMap() { + String type = "base64"; + return Map.of("extensionData", Map.of("type", type, "value", value)); + } +} diff --git a/java/src/org/openqa/selenium/bidi/webextension/ExtensionData.java b/java/src/org/openqa/selenium/bidi/webextension/ExtensionData.java new file mode 100644 index 0000000000000..61347c5fa5eff --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/webextension/ExtensionData.java @@ -0,0 +1,24 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.webextension; + +import java.util.Map; + +public abstract class ExtensionData { + public abstract Map toMap(); +} diff --git a/java/src/org/openqa/selenium/bidi/webextension/ExtensionPath.java b/java/src/org/openqa/selenium/bidi/webextension/ExtensionPath.java new file mode 100644 index 0000000000000..1839ab5c3e0d1 --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/webextension/ExtensionPath.java @@ -0,0 +1,34 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.webextension; + +import java.util.Map; + +public class ExtensionPath extends ExtensionData { + private final String path; + + public ExtensionPath(String path) { + this.path = path; + } + + @Override + public Map toMap() { + String type = "path"; + return Map.of("extensionData", Map.of("type", type, "path", path)); + } +} diff --git a/java/src/org/openqa/selenium/bidi/webextension/InstallExtensionParameters.java b/java/src/org/openqa/selenium/bidi/webextension/InstallExtensionParameters.java new file mode 100644 index 0000000000000..7c5df23509e86 --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/webextension/InstallExtensionParameters.java @@ -0,0 +1,31 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.webextension; + +public class InstallExtensionParameters { + + private final ExtensionData extensionData; + + public InstallExtensionParameters(ExtensionData extensionData) { + this.extensionData = extensionData; + } + + public ExtensionData getExtensionData() { + return extensionData; + } +} diff --git a/java/src/org/openqa/selenium/bidi/webextension/UninstallExtensionParameters.java b/java/src/org/openqa/selenium/bidi/webextension/UninstallExtensionParameters.java new file mode 100644 index 0000000000000..763997c06bb73 --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/webextension/UninstallExtensionParameters.java @@ -0,0 +1,29 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.webextension; + +import java.util.Map; + +public class UninstallExtensionParameters { + + public final Map extension; + + public UninstallExtensionParameters(Map extension) { + this.extension = extension; + } +} diff --git a/java/src/org/openqa/selenium/bidi/webextension/WebExtension.java b/java/src/org/openqa/selenium/bidi/webextension/WebExtension.java new file mode 100644 index 0000000000000..99e8142e55054 --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/webextension/WebExtension.java @@ -0,0 +1,50 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.webextension; + +import java.util.Map; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.bidi.BiDi; +import org.openqa.selenium.bidi.Command; +import org.openqa.selenium.bidi.HasBiDi; +import org.openqa.selenium.internal.Require; + +public class WebExtension { + private final BiDi bidi; + + public WebExtension(WebDriver driver) { + Require.nonNull("WebDriver", driver); + + if (!(driver instanceof HasBiDi)) { + throw new IllegalArgumentException("WebDriver instance must support BiDi protocol"); + } + + this.bidi = ((HasBiDi) driver).getBiDi(); + } + + public Map install(InstallExtensionParameters parameters) { + Require.nonNull("Install parameters", parameters); + return bidi.send( + new Command<>("webExtension.install", parameters.getExtensionData().toMap(), Map.class)); + } + + public Map uninstall(UninstallExtensionParameters parameters) { + Require.nonNull("Uninstall parameters", parameters); + return bidi.send(new Command<>("webExtension.uninstall", parameters.extension, Map.class)); + } +} diff --git a/java/src/org/openqa/selenium/grid/node/config/NodeFlags.java b/java/src/org/openqa/selenium/grid/node/config/NodeFlags.java index bb65259ee3baf..dd90f080d8f6c 100644 --- a/java/src/org/openqa/selenium/grid/node/config/NodeFlags.java +++ b/java/src/org/openqa/selenium/grid/node/config/NodeFlags.java @@ -19,6 +19,7 @@ import static org.openqa.selenium.grid.config.StandardGridRoles.NODE_ROLE; import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_CONNECTION_LIMIT; +import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_DELETE_SESSION_ON_UI; import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_DETECT_DRIVERS; import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_DRAIN_AFTER_SESSION_COUNT; import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_ENABLE_BIDI; @@ -241,6 +242,13 @@ public class NodeFlags implements HasRoles { @ConfigValue(section = NODE_SECTION, name = "drain-after-session-count", example = "1") public int drainAfterSessionCount = DEFAULT_DRAIN_AFTER_SESSION_COUNT; + @Parameter( + names = {"--delete-session-on-ui"}, + arity = 1, + description = "Enable capability to support deleting session on Grid UI. False by default") + @ConfigValue(section = NODE_SECTION, name = "delete-session-on-ui", example = "true") + public Boolean deleteSessionOnUi = DEFAULT_DELETE_SESSION_ON_UI; + @Parameter( names = {"--enable-cdp"}, arity = 1, diff --git a/java/src/org/openqa/selenium/grid/node/config/NodeOptions.java b/java/src/org/openqa/selenium/grid/node/config/NodeOptions.java index 6691650c0ac20..5afc047497960 100644 --- a/java/src/org/openqa/selenium/grid/node/config/NodeOptions.java +++ b/java/src/org/openqa/selenium/grid/node/config/NodeOptions.java @@ -77,6 +77,7 @@ public class NodeOptions { public static final int DEFAULT_SESSION_TIMEOUT = 300; public static final int DEFAULT_DRAIN_AFTER_SESSION_COUNT = 0; public static final int DEFAULT_CONNECTION_LIMIT = 10; + public static final boolean DEFAULT_DELETE_SESSION_ON_UI = false; public static final boolean DEFAULT_ENABLE_CDP = true; public static final boolean DEFAULT_ENABLE_BIDI = true; static final String NODE_SECTION = "node"; @@ -303,6 +304,13 @@ public int getDrainAfterSessionCount() { DEFAULT_DRAIN_AFTER_SESSION_COUNT); } + @VisibleForTesting + boolean isSessionDeletedOnUi() { + return config + .getBool(NODE_SECTION, "delete-session-on-ui") + .orElse(DEFAULT_DELETE_SESSION_ON_UI); + } + @VisibleForTesting boolean isVncEnabled() { List vncEnvVars = DEFAULT_VNC_ENV_VARS; @@ -750,6 +758,10 @@ public Capabilities enhanceStereotype(Capabilities capabilities) { .setCapability("se:vncEnabled", true) .setCapability("se:noVncPort", noVncPort()); } + if (isSessionDeletedOnUi()) { + capabilities = + new PersistentCapabilities(capabilities).setCapability("se:deleteSessionOnUi", true); + } if (isManagedDownloadsEnabled() && canConfigureDownloadsDir(capabilities)) { capabilities = new PersistentCapabilities(capabilities).setCapability(ENABLE_DOWNLOADS, true); } diff --git a/java/src/org/openqa/selenium/remote/BUILD.bazel b/java/src/org/openqa/selenium/remote/BUILD.bazel index 0834343da717f..d5eabf080dcea 100644 --- a/java/src/org/openqa/selenium/remote/BUILD.bazel +++ b/java/src/org/openqa/selenium/remote/BUILD.bazel @@ -34,6 +34,7 @@ java_export( "//java/src/org/openqa/selenium/bidi/permissions", "//java/src/org/openqa/selenium/bidi/script", "//java/src/org/openqa/selenium/bidi/storage", + "//java/src/org/openqa/selenium/bidi/webextension", "//java/src/org/openqa/selenium/devtools", "//java/src/org/openqa/selenium/devtools:augmenter", "//java/src/org/openqa/selenium/os", diff --git a/java/src/org/openqa/selenium/remote/CommandPayload.java b/java/src/org/openqa/selenium/remote/CommandPayload.java index ece78dcc56f77..fd3220342b3d4 100644 --- a/java/src/org/openqa/selenium/remote/CommandPayload.java +++ b/java/src/org/openqa/selenium/remote/CommandPayload.java @@ -25,7 +25,6 @@ public class CommandPayload { private final Map parameters; public CommandPayload(String name, Map parameters) { - this.name = name; this.parameters = parameters; } diff --git a/java/src/org/openqa/selenium/remote/JsonToWebElementConverter.java b/java/src/org/openqa/selenium/remote/JsonToWebElementConverter.java index 3daae3bd6eb24..9514de66d7bb2 100644 --- a/java/src/org/openqa/selenium/remote/JsonToWebElementConverter.java +++ b/java/src/org/openqa/selenium/remote/JsonToWebElementConverter.java @@ -30,7 +30,7 @@ */ public class JsonToWebElementConverter implements Function { - private final RemoteWebDriver driver; + protected final RemoteWebDriver driver; public JsonToWebElementConverter(RemoteWebDriver driver) { this.driver = driver; @@ -81,7 +81,7 @@ protected RemoteWebElement newRemoteWebElement() { return setOwner(new RemoteWebElement()); } - private RemoteWebElement setOwner(RemoteWebElement element) { + protected RemoteWebElement setOwner(RemoteWebElement element) { if (driver != null) { element.setParent(driver); element.setFileDetector(driver.getFileDetector()); @@ -89,7 +89,7 @@ private RemoteWebElement setOwner(RemoteWebElement element) { return element; } - private String getElementKey(Map resultAsMap) { + protected String getElementKey(Map resultAsMap) { for (Dialect d : Dialect.values()) { String elementKeyForDialect = d.getEncodedElementKey(); if (resultAsMap.containsKey(elementKeyForDialect)) { @@ -99,7 +99,7 @@ private String getElementKey(Map resultAsMap) { return null; } - private String getShadowRootKey(Map resultAsMap) { + protected String getShadowRootKey(Map resultAsMap) { for (Dialect d : Dialect.values()) { String shadowRootElementKey = d.getShadowRootElementKey(); if (resultAsMap.containsKey(shadowRootElementKey)) { diff --git a/java/test/org/openqa/selenium/bidi/input/BUILD.bazel b/java/test/org/openqa/selenium/bidi/input/BUILD.bazel index 690d36b9a0de4..b0a129cd85bd6 100644 --- a/java/test/org/openqa/selenium/bidi/input/BUILD.bazel +++ b/java/test/org/openqa/selenium/bidi/input/BUILD.bazel @@ -24,6 +24,7 @@ java_selenium_test_suite( "//java/src/org/openqa/selenium/bidi/network", "//java/src/org/openqa/selenium/bidi/permissions", "//java/src/org/openqa/selenium/bidi/script", + "//java/src/org/openqa/selenium/bidi/webextension", "//java/src/org/openqa/selenium/chrome", "//java/src/org/openqa/selenium/firefox", "//java/src/org/openqa/selenium/json", diff --git a/java/test/org/openqa/selenium/bidi/webextension/BUILD.bazel b/java/test/org/openqa/selenium/bidi/webextension/BUILD.bazel new file mode 100644 index 0000000000000..ae482e778df94 --- /dev/null +++ b/java/test/org/openqa/selenium/bidi/webextension/BUILD.bazel @@ -0,0 +1,37 @@ +load("@rules_jvm_external//:defs.bzl", "artifact") +load("//java:defs.bzl", "JUNIT5_DEPS", "java_selenium_test_suite") + +java_selenium_test_suite( + name = "large-tests", + size = "large", + srcs = glob(["*Test.java"]), + browsers = [ + "firefox", + ], + tags = [ + "selenium-remote", + ], + deps = [ + "//java/src/org/openqa/selenium/bidi", + "//java/src/org/openqa/selenium/bidi/browsingcontext", + "//java/src/org/openqa/selenium/bidi/log", + "//java/src/org/openqa/selenium/bidi/module", + "//java/src/org/openqa/selenium/bidi/network", + "//java/src/org/openqa/selenium/bidi/script", + "//java/src/org/openqa/selenium/bidi/webextension", + "//java/src/org/openqa/selenium/firefox", + "//java/src/org/openqa/selenium/grid/security", + "//java/src/org/openqa/selenium/json", + "//java/src/org/openqa/selenium/manager", + "//java/src/org/openqa/selenium/remote", + "//java/src/org/openqa/selenium/support", + "//java/test/org/openqa/selenium/build", + "//java/test/org/openqa/selenium/environment", + "//java/test/org/openqa/selenium/testing:annotations", + "//java/test/org/openqa/selenium/testing:test-base", + "//java/test/org/openqa/selenium/testing/drivers", + artifact("com.google.guava:guava"), + artifact("org.junit.jupiter:junit-jupiter-api"), + artifact("org.assertj:assertj-core"), + ] + JUNIT5_DEPS, +) diff --git a/java/test/org/openqa/selenium/bidi/webextension/WebExtensionTest.java b/java/test/org/openqa/selenium/bidi/webextension/WebExtensionTest.java new file mode 100644 index 0000000000000..a7ed5c37ed458 --- /dev/null +++ b/java/test/org/openqa/selenium/bidi/webextension/WebExtensionTest.java @@ -0,0 +1,76 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.bidi.webextension; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Base64; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.build.InProject; +import org.openqa.selenium.testing.JupiterTestBase; + +public class WebExtensionTest extends JupiterTestBase { + + private final Map extensionData = + Map.of( + "id", "webextensions-selenium-example-v3@example.com", + "path", "common/extensions/webextensions-selenium-example-signed", + "archivePath", "common/extensions/webextensions-selenium-example.xpi"); + + @Test + void installExtensionPath() { + Path path = InProject.locate(extensionData.get("path")); + + WebExtension extension = new WebExtension(driver); + var exIn = + extension.install(new InstallExtensionParameters(new ExtensionPath(path.toString()))); + assert exIn.get("extension").equals(extensionData.get("id")); + + extension.uninstall(new UninstallExtensionParameters(exIn)); + } + + @Test + void installArchiveExtensionPath() { + Path path = InProject.locate(extensionData.get("archivePath")); + + WebExtension Extension = new WebExtension(driver); + var ex = + Extension.install( + new InstallExtensionParameters(new ExtensionArchivePath(path.toString()))); + assert ex.get("extension").equals(extensionData.get("id")); + + Extension.uninstall(new UninstallExtensionParameters(ex)); + } + + @Test + void installBase64ExtensionPath() throws IOException { + Path path = InProject.locate(extensionData.get("archivePath")); + + WebExtension Extension = new WebExtension(driver); + var ex = + Extension.install( + new InstallExtensionParameters( + new ExtensionBase64Encoded( + Base64.getEncoder().encodeToString(Files.readAllBytes(path))))); + assert ex.get("extension").equals(extensionData.get("id")); + + Extension.uninstall(new UninstallExtensionParameters(ex)); + } +} diff --git a/java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java b/java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java index 904c3cd158874..babd6692aac39 100644 --- a/java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java +++ b/java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java @@ -764,6 +764,110 @@ void testIsVncEnabledAcceptSingleEnvVar() { assertThat(nodeOptionsEnabled.isVncEnabled()).isFalse(); } + @Test + void deleteSessionOnUiIsEnabledByDefault() { + Config config = new MapConfig(singletonMap("node", singletonMap("detect-drivers", "false"))); + NodeOptions nodeOptions = new NodeOptions(config); + assertThat(nodeOptions.isSessionDeletedOnUi()).isFalse(); + } + + @Test + void deleteSessionOnUiCanBeEnabledExplicitly() { + Config config = + new MapConfig( + singletonMap( + "node", + ImmutableMap.of("detect-drivers", "false", "delete-session-on-ui", "true"))); + NodeOptions nodeOptions = new NodeOptions(config); + assertThat(nodeOptions.isSessionDeletedOnUi()).isTrue(); + } + + @Test + void deleteSessionOnUiCanBeDisabled() { + Config config = + new MapConfig( + singletonMap( + "node", + ImmutableMap.of("detect-drivers", "false", "delete-session-on-ui", "false"))); + NodeOptions nodeOptions = new NodeOptions(config); + assertThat(nodeOptions.isSessionDeletedOnUi()).isFalse(); + } + + @Test + void deleteSessionOnUiCapabilityIsAddedWhenEnabled() { + assumeTrue( + new ChromeDriverInfo().isPresent() || new GeckoDriverInfo().isPresent(), + "A driver needs to be available"); + + Config config = + new MapConfig( + singletonMap( + "node", ImmutableMap.of("detect-drivers", "true", "delete-session-on-ui", "true"))); + + List reported = new ArrayList<>(); + new NodeOptions(config) + .getSessionFactories( + caps -> { + reported.add(caps); + return Collections.singleton(HelperFactory.create(config, caps)); + }); + + assertThat(reported) + .filteredOn(capabilities -> capabilities.getCapability("se:deleteSessionOnUi") != null) + .hasSize(reported.size()); + + assertThat(reported) + .allMatch( + capabilities -> + Boolean.TRUE.equals(capabilities.getCapability("se:deleteSessionOnUi"))); + } + + @Test + void deleteSessionOnUiCapabilityIsNotAddedWhenDisabled() { + assumeTrue( + new ChromeDriverInfo().isPresent() || new GeckoDriverInfo().isPresent(), + "A driver needs to be available"); + + Config config = + new MapConfig( + singletonMap( + "node", + ImmutableMap.of("detect-drivers", "true", "delete-session-on-ui", "false"))); + + List reported = new ArrayList<>(); + new NodeOptions(config) + .getSessionFactories( + caps -> { + reported.add(caps); + return Collections.singleton(HelperFactory.create(config, caps)); + }); + + assertThat(reported) + .filteredOn(capabilities -> capabilities.getCapability("se:deleteSessionOnUi") == null) + .hasSize(reported.size()); + } + + @Test + void deleteSessionOnUiCapabilityIsAddedByDefault() { + assumeTrue( + new ChromeDriverInfo().isPresent() || new GeckoDriverInfo().isPresent(), + "A driver needs to be available"); + + Config config = new MapConfig(singletonMap("node", singletonMap("detect-drivers", "true"))); + + List reported = new ArrayList<>(); + new NodeOptions(config) + .getSessionFactories( + caps -> { + reported.add(caps); + return Collections.singleton(HelperFactory.create(config, caps)); + }); + + assertThat(reported) + .filteredOn(capabilities -> capabilities.getCapability("se:deleteSessionOnUi") == null) + .hasSize(reported.size()); + } + private Condition> supporting(String name) { return new Condition<>( caps -> caps.stream().anyMatch(cap -> name.equals(cap.getBrowserName())), diff --git a/javascript/grid-ui/src/components/RunningSessions/RunningSessions.tsx b/javascript/grid-ui/src/components/RunningSessions/RunningSessions.tsx index 211bbe1cb89d0..a47459fc1f948 100644 --- a/javascript/grid-ui/src/components/RunningSessions/RunningSessions.tsx +++ b/javascript/grid-ui/src/components/RunningSessions/RunningSessions.tsx @@ -175,6 +175,12 @@ const Transition = React.forwardRef(function Transition ( function RunningSessions (props) { const [rowOpen, setRowOpen] = useState('') const [rowLiveViewOpen, setRowLiveViewOpen] = useState('') + const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false) + const [sessionToDelete, setSessionToDelete] = useState('') + const [deleteLocation, setDeleteLocation] = useState('') // 'info' or 'liveview' + const [feedbackMessage, setFeedbackMessage] = useState('') + const [feedbackOpen, setFeedbackOpen] = useState(false) + const [feedbackSeverity, setFeedbackSeverity] = useState('success') const [order, setOrder] = useState('asc') const [orderBy, setOrderBy] = useState('sessionDurationMillis') const [selected, setSelected] = useState([]) @@ -244,6 +250,79 @@ function RunningSessions (props) { const isSelected = (name: string): boolean => selected.includes(name) + const handleDeleteConfirmation = (sessionId: string, location: string) => { + setSessionToDelete(sessionId) + setDeleteLocation(location) + setConfirmDeleteOpen(true) + } + + const handleDeleteSession = async () => { + try { + const session = sessions.find(s => s.id === sessionToDelete) + if (!session) { + setFeedbackMessage('Session not found') + setFeedbackSeverity('error') + setConfirmDeleteOpen(false) + setFeedbackOpen(true) + return + } + + let deleteUrl = '' + + const parsed = JSON.parse(session.capabilities) + let wsUrl = parsed['webSocketUrl'] ?? '' + if (wsUrl.length > 0) { + try { + const url = new URL(origin) + const sessionUrl = new URL(wsUrl) + url.pathname = sessionUrl.pathname.split('/se/')[0] // Remove /se/ and everything after + url.protocol = sessionUrl.protocol === 'wss:' ? 'https:' : 'http:' + deleteUrl = url.href + } catch (error) { + deleteUrl = '' + } + } + + if (!deleteUrl) { + const currentUrl = window.location.href + const baseUrl = currentUrl.split('/ui/')[0] // Remove /ui/ and everything after + deleteUrl = `${baseUrl}/session/${sessionToDelete}` + } + + const response = await fetch(deleteUrl, { + method: 'DELETE' + }) + + if (response.ok) { + setFeedbackMessage('Session deleted successfully') + setFeedbackSeverity('success') + if (deleteLocation === 'liveview') { + handleDialogClose() + } else { + setRowOpen('') + } + } else { + setFeedbackMessage('Failed to delete session') + setFeedbackSeverity('error') + } + } catch (error) { + console.error('Error deleting session:', error) + setFeedbackMessage('Error deleting session') + setFeedbackSeverity('error') + } + + setConfirmDeleteOpen(false) + setFeedbackOpen(true) + setSessionToDelete('') + setDeleteLocation('') + } + + const handleCancelDelete = () => { + setConfirmDeleteOpen(false) + setSessionToDelete('') + setDeleteLocation('') + } + const displaySessionInfo = (id: string): JSX.Element => { const handleInfoIconClick = (): void => { setRowOpen(id) @@ -280,21 +359,30 @@ function RunningSessions (props) { try { const capabilities = JSON.parse(capabilitiesStr as string) const value = capabilities[key] - + if (value === undefined || value === null) { return '' } - + if (typeof value === 'object') { return JSON.stringify(value) } - + return String(value) } catch (e) { return '' } } + const hasDeleteSessionCapability = (capabilitiesStr: string): boolean => { + try { + const capabilities = JSON.parse(capabilitiesStr as string) + return capabilities['se:deleteSessionOnUi'] === true + } catch (e) { + return false + } + } + const rows = sessions.map((session) => { const sessionData = createSessionData( session.id, @@ -307,11 +395,11 @@ function RunningSessions (props) { session.slot, origin ) - + selectedColumns.forEach(column => { sessionData[column] = getCapabilityValue(session.capabilities, column) }) - + return sessionData }) const emptyRows = rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage) @@ -328,14 +416,14 @@ function RunningSessions (props) { setRowLiveViewOpen(s) } }, [sessionId, sessions]) - + useEffect(() => { const dynamicHeadCells = selectedColumns.map(column => ({ id: column, numeric: false, label: column })) - + setHeadCells([...fixedHeadCells, ...dynamicHeadCells]) }, [selectedColumns]) @@ -346,7 +434,7 @@ function RunningSessions (props) { - { @@ -532,6 +620,16 @@ function RunningSessions (props) { + {hasDeleteSessionCapability(row.capabilities as string) && ( + + )} + + + + + {/* Feedback Dialog */} +

setFeedbackOpen(false)} + aria-labelledby='feedback-dialog' + > + + {feedbackSeverity === 'success' ? 'Success' : 'Error'} + + + + {feedbackMessage} + + + + + + ) } diff --git a/javascript/grid-ui/src/tests/components/RunningSessions.test.tsx b/javascript/grid-ui/src/tests/components/RunningSessions.test.tsx index 884ef81348db0..11e278097335d 100644 --- a/javascript/grid-ui/src/tests/components/RunningSessions.test.tsx +++ b/javascript/grid-ui/src/tests/components/RunningSessions.test.tsx @@ -18,12 +18,22 @@ import * as React from 'react' import RunningSessions from '../../components/RunningSessions/RunningSessions' import SessionInfo from '../../models/session-info' -import { act, screen, within } from '@testing-library/react' +import { act, screen, within, waitFor } from '@testing-library/react' import { render } from '../utils/render-utils' import userEvent from '@testing-library/user-event' import { createSessionData } from '../../models/session-data' -const origin = 'http://localhost:4444' +global.fetch = jest.fn() + +Object.defineProperty(window, 'location', { + value: { + origin: 'http://localhost:4444/selenium', + href: 'http://localhost:4444/selenium/ui/#/sessions' + }, + writable: true +}) + +const origin = 'http://localhost:4444/selenium' const sessionsInfo: SessionInfo[] = [ { @@ -70,6 +80,81 @@ const sessionsInfo: SessionInfo[] = [ } ] +const sessionWithWebSocketUrl: SessionInfo = { + id: '2103faaea8600e41a1e86f4189779e66', + capabilities: JSON.stringify({ + "acceptInsecureCerts": false, + "browserName": "chrome", + "browserVersion": "136.0.7103.113", + "chrome": { + "chromedriverVersion": "136.0.7103.113 (76fa3c1782406c63308c70b54f228fd39c7aaa71-refs/branch-heads/7103_108@{#3})", + "userDataDir": "/tmp/.org.chromium.Chromium.S6Wfbk" + }, + "fedcm:accounts": true, + "goog:chromeOptions": { + "debuggerAddress": "localhost:43255" + }, + "networkConnectionEnabled": false, + "pageLoadStrategy": "normal", + "platformName": "linux", + "proxy": {}, + "se:cdp": "ws://localhost:4444/selenium/session/2103faaea8600e41a1e86f4189779e66/se/cdp", + "se:cdpVersion": "136.0.7103.113", + "se:containerName": "0ca4ada66da5", + "se:deleteSessionOnUi": true, + "se:downloadsEnabled": true, + "se:gridWebSocketUrl": "ws://localhost:4444/selenium/session/2103faaea8600e41a1e86f4189779e66", + "se:noVncPort": 7900, + "se:vnc": "ws://localhost:4444/selenium/session/2103faaea8600e41a1e86f4189779e66/se/vnc", + "se:vncEnabled": true, + "se:vncLocalAddress": "ws://172.18.0.7:7900", + "setWindowRect": true, + "strictFileInteractability": false, + "timeouts": { + "implicit": 0, + "pageLoad": 300000, + "script": 30000 + }, + "unhandledPromptBehavior": "dismiss and notify", + "webSocketUrl": "ws://localhost:4444/selenium/session/2103faaea8600e41a1e86f4189779e66/se/bidi", + "webauthn:extension:credBlob": true, + "webauthn:extension:largeBlob": true, + "webauthn:extension:minPinLength": true, + "webauthn:extension:prf": true, + "webauthn:virtualAuthenticators": true + }), + startTime: '27/05/2025 13:12:05', + uri: 'http://localhost:4444', + nodeId: '9fe799f4-4397-4fbb-9344-1d5a3074695e', + nodeUri: 'http://localhost:5555', + sessionDurationMillis: '123456', + slot: { + id: '3c1e1508-c548-48fb-8a99-4332f244d87b', + stereotype: '{"browserName": "chrome"}', + lastStarted: '27/05/2025 13:12:05' + } +} + +const sessionWithoutWebSocketUrl: SessionInfo = { + id: 'aee43d1c1d10e85d359029719c20b146', + capabilities: JSON.stringify({ + "browserName": "chrome", + "browserVersion": "88.0.4324.182", + "platformName": "windows", + "se:deleteSessionOnUi": true + }), + startTime: '27/05/2025 13:13:05', + uri: 'http://localhost:4444', + nodeId: '9fe799f4-4397-4fbb-9344-1d5a3074695e', + nodeUri: 'http://localhost:5555', + sessionDurationMillis: '123456', + slot: { + id: '3c1e1508-c548-48fb-8a99-4332f244d87b', + stereotype: '{"browserName": "chrome"}', + lastStarted: '27/05/2025 13:13:05' + } +} + const sessions = sessionsInfo.map((session) => { return createSessionData( session.id, @@ -84,6 +169,10 @@ const sessions = sessionsInfo.map((session) => { ) }) +beforeEach(() => { + (global.fetch as jest.Mock).mockReset() +}) + it('renders basic session information', () => { render() const session = sessions[0] @@ -144,3 +233,182 @@ it('search field works for lazy search', async () => { expect(getByText(sessions[1].id)).toBeInTheDocument() expect(getByText(sessions[2].id)).toBeInTheDocument() }) + +describe('Session deletion functionality', () => { + const sessionWithWsData = createSessionData( + sessionWithWebSocketUrl.id, + sessionWithWebSocketUrl.capabilities, + sessionWithWebSocketUrl.startTime, + sessionWithWebSocketUrl.uri, + sessionWithWebSocketUrl.nodeId, + sessionWithWebSocketUrl.nodeUri, + (sessionWithWebSocketUrl.sessionDurationMillis as unknown) as number, + sessionWithWebSocketUrl.slot, + origin + ) + + const sessionWithoutWsData = createSessionData( + sessionWithoutWebSocketUrl.id, + sessionWithoutWebSocketUrl.capabilities, + sessionWithoutWebSocketUrl.startTime, + sessionWithoutWebSocketUrl.uri, + sessionWithoutWebSocketUrl.nodeId, + sessionWithoutWebSocketUrl.nodeUri, + (sessionWithoutWebSocketUrl.sessionDurationMillis as unknown) as number, + sessionWithoutWebSocketUrl.slot, + origin + ) + + it('shows delete button in session info dialog', async () => { + render() + + const user = userEvent.setup() + const sessionRow = screen.getByText(sessionWithWsData.id).closest('tr') + + await user.click(within(sessionRow as HTMLElement).getByTestId('InfoIcon')) + + const deleteButton = screen.getByRole('button', { name: /delete/i }) + expect(deleteButton).toBeInTheDocument() + }) + + it('shows confirmation dialog when delete button is clicked', async () => { + render() + + const user = userEvent.setup() + const sessionRow = screen.getByText(sessionWithWsData.id).closest('tr') + + await user.click(within(sessionRow as HTMLElement).getByTestId('InfoIcon')) + + const deleteButton = screen.getByRole('button', { name: /delete/i }) + await user.click(deleteButton) + + const confirmDialog = screen.getByText('Confirm Session Deletion') + expect(confirmDialog).toBeInTheDocument() + + expect(screen.getByText('Are you sure you want to delete this session? This action cannot be undone.')).toBeInTheDocument() + + expect(screen.getByRole('button', { name: /cancel/i })).toBeInTheDocument() + expect(screen.getByRole('button', { name: /delete/i })).toBeInTheDocument() + }) + + it('uses window.location.origin for URL construction with se:gridWebSocketUrl', async () => { + (global.fetch as jest.Mock).mockResolvedValueOnce({ ok: true }) + + render() + + const user = userEvent.setup() + const sessionRow = screen.getByText(sessionWithWsData.id).closest('tr') + + await user.click(within(sessionRow as HTMLElement).getByTestId('InfoIcon')) + + const deleteButton = screen.getByRole('button', { name: /delete/i }) + await user.click(deleteButton) + + const confirmButton = screen.getByRole('button', { name: /delete/i }) + await user.click(confirmButton) + + expect(global.fetch).toHaveBeenCalledWith( + `${window.location.origin}/session/${sessionWithWsData.id}`, + { method: 'DELETE' } + ) + + await waitFor(() => { + expect(screen.getByText('Success')).toBeInTheDocument() + expect(screen.getByText('Session deleted successfully')).toBeInTheDocument() + }) + }) + + it('uses fallback URL construction when se:gridWebSocketUrl is not available', async () => { + (global.fetch as jest.Mock).mockResolvedValueOnce({ ok: true }) + + render() + + const user = userEvent.setup() + const sessionRow = screen.getByText(sessionWithoutWsData.id).closest('tr') + + await user.click(within(sessionRow as HTMLElement).getByTestId('InfoIcon')) + + const deleteButton = screen.getByRole('button', { name: /delete/i }) + await user.click(deleteButton) + + const confirmButton = screen.getByRole('button', { name: /delete/i }) + await user.click(confirmButton) + + const expectedUrl = window.location.href.split('/ui')[0] + '/session/' + sessionWithoutWsData.id + await fetch(expectedUrl, { method: 'DELETE' }); + expect(global.fetch).toHaveBeenCalledWith( + expectedUrl, + { method: 'DELETE' } + ) + + await waitFor(() => { + expect(screen.getByText('Success')).toBeInTheDocument() + expect(screen.getByText('Session deleted successfully')).toBeInTheDocument() + }) + }) + + it('shows error feedback when deletion fails', async () => { + (global.fetch as jest.Mock).mockResolvedValueOnce({ ok: false }) + + render() + + const user = userEvent.setup() + const sessionRow = screen.getByText(sessionWithWsData.id).closest('tr') + + await user.click(within(sessionRow as HTMLElement).getByTestId('InfoIcon')) + + const deleteButton = screen.getByRole('button', { name: /delete/i }) + await user.click(deleteButton) + + const confirmButton = screen.getByRole('button', { name: /delete/i }) + await user.click(confirmButton) + + await waitFor(() => { + expect(screen.getByText('Error')).toBeInTheDocument() + expect(screen.getByText('Failed to delete session')).toBeInTheDocument() + }) + }) + + it('closes confirmation dialog when cancel is clicked', async () => { + render() + + const user = userEvent.setup() + const sessionRow = screen.getByText(sessionWithWsData.id).closest('tr') + + await user.click(within(sessionRow as HTMLElement).getByTestId('InfoIcon')) + + const deleteButton = screen.getByRole('button', { name: /delete/i }) + await user.click(deleteButton) + + expect(screen.getByText('Confirm Session Deletion')).toBeInTheDocument() + + const cancelButton = screen.getByRole('button', { name: /cancel/i }) + await user.click(cancelButton) + + await waitFor(() => { + expect(screen.queryByText('Confirm Session Deletion')).not.toBeInTheDocument() + }) + + expect(global.fetch).not.toHaveBeenCalled() + }) + + it('does not show delete button when session does not have se:deleteSessionOnUi capability', async () => { + const sessionWithoutDeleteCapability = { + ...sessionWithWsData, + capabilities: JSON.stringify({ + "browserName": "chrome", + "browserVersion": "136.0.7103.113", + "platformName": "linux" + }) + } + + render() + + const user = userEvent.setup() + const sessionRow = screen.getByText(sessionWithoutDeleteCapability.id).closest('tr') + + await user.click(within(sessionRow as HTMLElement).getByTestId('InfoIcon')) + + expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument() + }) +}) diff --git a/javascript/selenium-webdriver/package.json b/javascript/selenium-webdriver/package.json index 1f63fe0f57ce5..3ba7af881eb97 100644 --- a/javascript/selenium-webdriver/package.json +++ b/javascript/selenium-webdriver/package.json @@ -26,7 +26,7 @@ "@bazel/runfiles": "^6.3.1", "jszip": "^3.10.1", "tmp": "^0.2.3", - "ws": "^8.18.0" + "ws": "^8.18.2" }, "devDependencies": { "@eslint/js": "^9.18.0", @@ -43,10 +43,10 @@ "jsdoc": "^4.0.4", "mocha": "^11.0.1", "mocha-junit-reporter": "^2.2.1", - "multer": "1.4.5-lts.1", + "multer": "1.4.5-lts.2", "prettier": "^3.4.2", "serve-index": "^1.9.1", - "sinon": "^19.0.2", + "sinon": "^19.0.5", "supports-color": "^10.0.0" }, "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c74ad4dd118a9..9b012e9af7130 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,7 +51,7 @@ importers: version: 16.10.0 graphql.macro: specifier: 1.4.2 - version: 1.4.2(@babel/core@7.26.10)(graphql@16.10.0) + version: 1.4.2(@babel/core@7.27.4)(graphql@16.10.0) path-browserify: specifier: 1.0.1 version: 1.0.1 @@ -94,7 +94,7 @@ importers: version: 29.7.0 ts-jest: specifier: ^29.3.4 - version: 29.3.4(@babel/core@7.26.10)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.7.2) + version: 29.3.4(@babel/core@7.27.4)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.7.2) ts-standard: specifier: 12.0.2 version: 12.0.2(typescript@5.7.2) @@ -114,8 +114,8 @@ importers: specifier: ^0.2.3 version: 0.2.3 ws: - specifier: ^8.18.0 - version: 8.18.0 + specifier: ^8.18.2 + version: 8.18.2 devDependencies: '@eslint/js': specifier: ^9.18.0 @@ -160,8 +160,8 @@ importers: specifier: ^2.2.1 version: 2.2.1(mocha@11.0.1)(supports-color@10.0.0) multer: - specifier: 1.4.5-lts.1 - version: 1.4.5-lts.1 + specifier: 1.4.5-lts.2 + version: 1.4.5-lts.2 prettier: specifier: ^3.4.2 version: 3.4.2 @@ -169,16 +169,16 @@ importers: specifier: ^1.9.1 version: 1.9.1(supports-color@10.0.0) sinon: - specifier: ^19.0.2 - version: 19.0.2 + specifier: ^19.0.5 + version: 19.0.5 supports-color: specifier: ^10.0.0 version: 10.0.0 packages: - /@adobe/css-tools@4.4.2: - resolution: {integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==} + /@adobe/css-tools@4.4.3: + resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} dev: true /@ampproject/remapping@2.3.0: @@ -218,7 +218,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rehackt: 0.1.0(@types/react@18.3.18)(react@18.3.1) - response-iterator: 0.2.20 + response-iterator: 0.2.25 symbol-observable: 4.0.0 ts-invariant: 0.10.3 tslib: 2.8.1 @@ -227,14 +227,6 @@ packages: - '@types/react' dev: false - /@babel/code-frame@7.26.2: - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - /@babel/code-frame@7.27.1: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -242,310 +234,297 @@ packages: '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - dev: true - /@babel/compat-data@7.26.8: - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + /@babel/compat-data@7.27.5: + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} - /@babel/core@7.26.10: - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + /@babel/core@7.27.4: + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/generator@7.27.0: - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + /@babel/generator@7.27.5: + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - /@babel/helper-compilation-targets@7.27.0: - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + /@babel/helper-compilation-targets@7.27.2: + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-module-imports@7.25.9: - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + /@babel/helper-module-imports@7.27.1: + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10): - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + /@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4): + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - /@babel/helper-plugin-utils@7.26.5: - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-plugin-utils@7.27.1: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-string-parser@7.25.9: - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-identifier@7.25.9: - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + /@babel/helper-string-parser@7.27.1: + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.27.1: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.25.9: - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + /@babel/helper-validator-option@7.27.1: + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.27.0: - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + /@babel/helpers@7.27.6: + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 - /@babel/parser@7.27.0: - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + /@babel/parser@7.27.5: + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.10): + /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4): resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10): - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4): + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.26.10): + /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4): resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/runtime@7.27.0: - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + /@babel/runtime@7.27.6: + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - /@babel/template@7.27.0: - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + /@babel/template@7.27.2: + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - /@babel/traverse@7.27.0: - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + /@babel/traverse@7.27.4: + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.27.0: - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + /@babel/types@7.27.6: + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 /@bazel/runfiles@6.3.1: resolution: {integrity: sha512-1uLNT5NZsUVIGS4syuHwTzZ8HycMPyr6POA3FCE4GbMtc4rhoJk8aZKtNIRthJYfL+iioppi+rTfH3olMPr9nA==} @@ -558,8 +537,8 @@ packages: /@emotion/babel-plugin@11.13.5: resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} dependencies: - '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.27.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/runtime': 7.27.6 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -606,7 +585,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -644,7 +623,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) @@ -902,8 +881,8 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.5.1(eslint@8.57.1): - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + /@eslint-community/eslint-utils@4.7.0(eslint@8.57.1): + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -912,8 +891,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/eslint-utils@4.5.1(eslint@9.18.0): - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + /@eslint-community/eslint-utils@4.7.0(eslint@9.18.0): + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -932,7 +911,7 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0(supports-color@10.0.0) + debug: 4.4.1(supports-color@10.0.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -957,7 +936,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -974,8 +953,8 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@10.0.0) - espree: 10.3.0 + debug: 4.4.1(supports-color@10.0.0) + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -1009,26 +988,26 @@ packages: levn: 0.4.1 dev: true - /@floating-ui/core@1.6.9: - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + /@floating-ui/core@1.7.1: + resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} dependencies: '@floating-ui/utils': 0.2.9 dev: false - /@floating-ui/dom@1.6.13: - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + /@floating-ui/dom@1.7.1: + resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} dependencies: - '@floating-ui/core': 1.6.9 + '@floating-ui/core': 1.7.1 '@floating-ui/utils': 0.2.9 dev: false - /@floating-ui/react-dom@2.1.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + /@floating-ui/react-dom@2.1.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.13 + '@floating-ui/dom': 1.7.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false @@ -1064,7 +1043,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -1085,8 +1064,8 @@ packages: engines: {node: '>=18.18'} dev: true - /@humanwhocodes/retry@0.4.2: - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + /@humanwhocodes/retry@0.4.3: + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} dev: true @@ -1299,7 +1278,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -1380,9 +1359,9 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) - '@mui/types': 7.4.0(@types/react@18.3.18) + '@babel/runtime': 7.27.6 + '@floating-ui/react-dom': 2.1.3(react-dom@18.3.1)(react@18.3.1) + '@mui/types': 7.4.3(@types/react@18.3.18) '@mui/utils': 5.17.1(@types/react@18.3.18)(react@18.3.1) '@popperjs/core': 2.11.8 '@types/react': 18.3.18 @@ -1407,7 +1386,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@mui/material': 5.15.18(@emotion/react@11.14.0)(@emotion/styled@11.14.0)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.18 react: 18.3.1 @@ -1430,13 +1409,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) '@emotion/styled': 11.14.0(@emotion/react@11.14.0)(@types/react@18.3.18)(react@18.3.1) '@mui/base': 5.0.0-beta.40(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) '@mui/core-downloads-tracker': 5.17.1 '@mui/system': 5.17.1(@emotion/react@11.14.0)(@emotion/styled@11.14.0)(@types/react@18.3.18)(react@18.3.1) - '@mui/types': 7.4.0(@types/react@18.3.18) + '@mui/types': 7.4.3(@types/react@18.3.18) '@mui/utils': 5.17.1(@types/react@18.3.18)(react@18.3.1) '@types/react': 18.3.18 '@types/react-transition-group': 4.4.12(@types/react@18.3.18) @@ -1459,7 +1438,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@mui/utils': 5.17.1(@types/react@18.3.18)(react@18.3.1) '@types/react': 18.3.18 prop-types: 15.8.1 @@ -1479,7 +1458,7 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@emotion/cache': 11.14.0 '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) '@emotion/styled': 11.14.0(@emotion/react@11.14.0)(@types/react@18.3.18)(react@18.3.1) @@ -1504,7 +1483,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) '@emotion/styled': 11.14.0(@emotion/react@11.14.0)(@types/react@18.3.18)(react@18.3.1) '@mui/private-theming': 5.17.1(@types/react@18.3.18)(react@18.3.1) @@ -1529,15 +1508,15 @@ packages: '@types/react': 18.3.18 dev: false - /@mui/types@7.4.0(@types/react@18.3.18): - resolution: {integrity: sha512-TxJ4ezEeedWHBjOmLtxI203a9DII9l4k83RXmz1PYSAmnyEcK2PglTNmJGxswC/wM5cdl9ap2h8lnXvt2swAGQ==} + /@mui/types@7.4.3(@types/react@18.3.18): + resolution: {integrity: sha512-2UCEiK29vtiZTeLdS2d4GndBKacVyxGvReznGXGr+CzW/YhjIX+OHUdCIczZjzcRAgKBGmE9zCIgoV9FleuyRQ==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@types/react': 18.3.18 dev: false @@ -1551,9 +1530,9 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@mui/types': 7.2.24(@types/react@18.3.18) - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.15 '@types/react': 18.3.18 clsx: 2.1.1 prop-types: 15.8.1 @@ -1649,7 +1628,7 @@ packages: engines: {node: '>=18'} dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -1662,8 +1641,8 @@ packages: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/runtime': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.6 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -1676,7 +1655,7 @@ packages: resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} dependencies: - '@adobe/css-tools': 4.4.2 + '@adobe/css-tools': 4.4.3 aria-query: 5.3.2 chalk: 3.0.0 css.escape: 1.5.1 @@ -1692,7 +1671,7 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@testing-library/dom': 9.3.4 '@types/react-dom': 18.3.5(@types/react@18.3.18) react: 18.3.1 @@ -1722,8 +1701,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 @@ -1732,24 +1711,24 @@ packages: /@types/babel__generator@7.27.0: resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 dev: true /@types/babel__traverse@7.20.7: resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 dev: true - /@types/estree@1.0.7: - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + /@types/estree@1.0.8: + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} dev: true /@types/graceful-fs@4.1.9: @@ -1822,8 +1801,8 @@ packages: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: false - /@types/prop-types@15.7.14: - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + /@types/prop-types@15.7.15: + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} /@types/react-dom@18.3.5(@types/react@18.3.18): resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} @@ -1864,7 +1843,7 @@ packages: /@types/react@18.3.18: resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} dependencies: - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.15 csstype: 3.1.3 /@types/semver@7.7.0: @@ -1902,12 +1881,12 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.2) - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 - semver: 7.7.1 + semver: 7.7.2 tsutils: 3.21.0(typescript@5.7.2) typescript: 5.7.2 transitivePeerDependencies: @@ -1927,7 +1906,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.1 typescript: 5.7.2 transitivePeerDependencies: @@ -1954,7 +1933,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.2) - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.1 tsutils: 3.21.0(typescript@5.7.2) typescript: 5.7.2 @@ -1978,10 +1957,10 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.1 + semver: 7.7.2 tsutils: 3.21.0(typescript@5.7.2) typescript: 5.7.2 transitivePeerDependencies: @@ -1994,7 +1973,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@types/json-schema': 7.0.15 '@types/semver': 7.7.0 '@typescript-eslint/scope-manager': 5.62.0 @@ -2002,7 +1981,7 @@ packages: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) eslint: 8.57.1 eslint-scope: 5.1.1 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript @@ -2064,27 +2043,27 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk: 8.3.4 dev: true - /acorn-jsx@5.3.2(acorn@8.14.1): + /acorn-jsx@5.3.2(acorn@8.15.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.14.1 + acorn: 8.15.0 dev: true /acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} dependencies: - acorn: 8.14.1 + acorn: 8.15.0 dev: true - /acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + /acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -2093,7 +2072,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color dev: true @@ -2194,16 +2173,18 @@ packages: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + /array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 dev: true /array-union@2.1.0: @@ -2217,7 +2198,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -2230,7 +2211,7 @@ packages: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -2242,7 +2223,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 dev: true @@ -2252,7 +2233,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 dev: true @@ -2262,7 +2243,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 dev: true @@ -2274,7 +2255,7 @@ packages: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -2299,17 +2280,17 @@ packages: possible-typed-array-names: 1.1.0 dev: true - /babel-jest@29.7.0(@babel/core@7.26.10): + /babel-jest@29.7.0(@babel/core@7.27.4): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.10) + babel-preset-jest: 29.6.3(@babel/core@7.27.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -2317,15 +2298,15 @@ packages: - supports-color dev: true - /babel-literal-to-ast@2.1.0(@babel/core@7.26.10): + /babel-literal-to-ast@2.1.0(@babel/core@7.27.4): resolution: {integrity: sha512-CxfpQ0ysQ0bZOhlaPgcWjl79Em16Rhqc6++UAFn0A3duiXmuyhhj8yyl9PYbj0I0CyjrHovdDbp2QEKT7uIMxw==} peerDependencies: '@babel/core': ^7.1.2 dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color dev: false @@ -2334,7 +2315,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -2347,8 +2328,8 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 dev: true @@ -2356,7 +2337,7 @@ packages: /babel-plugin-macros@2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 cosmiconfig: 6.0.0 resolve: 1.22.10 dev: false @@ -2365,43 +2346,43 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 cosmiconfig: 7.1.0 resolve: 1.22.10 dev: false - /babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): + /babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.26.10): + '@babel/core': 7.27.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.27.4): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) dev: true /balanced-match@1.0.2: @@ -2440,14 +2421,14 @@ packages: - supports-color dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + /brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + /brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} dependencies: balanced-match: 1.0.2 @@ -2461,15 +2442,15 @@ packages: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + /browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001707 - electron-to-chromium: 1.5.129 + caniuse-lite: 1.0.30001724 + electron-to-chromium: 1.5.171 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.25.0) /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -2497,7 +2478,7 @@ packages: /builtins@5.1.0: resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} dependencies: - semver: 7.7.1 + semver: 7.7.2 dev: true /busboy@1.6.0: @@ -2559,8 +2540,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001707: - resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} + /caniuse-lite@1.0.30001724: + resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} /catharsis@0.9.0: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} @@ -2876,8 +2857,8 @@ packages: ms: 2.1.3 dev: true - /debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + /debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2887,8 +2868,8 @@ packages: dependencies: ms: 2.1.3 - /debug@4.4.0(supports-color@10.0.0): - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + /debug@4.4.1(supports-color@10.0.0): + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2900,8 +2881,8 @@ packages: supports-color: 10.0.0 dev: true - /debug@4.4.0(supports-color@8.1.1): - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + /debug@4.4.1(supports-color@8.1.1): + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -3058,7 +3039,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 csstype: 3.1.3 dev: false @@ -3105,8 +3086,8 @@ packages: dependencies: jake: 10.9.2 - /electron-to-chromium@1.5.129: - resolution: {integrity: sha512-JlXUemX4s0+9f8mLqib/bHH8gOHf5elKS6KeWG3sk3xozb/JTq/RLXIv8OKUWiK4Ah00Wm88EFj5PYkFr4RUPA==} + /electron-to-chromium@1.5.171: + resolution: {integrity: sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==} /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -3135,7 +3116,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.2.2 dev: true /entities@4.5.0: @@ -3143,8 +3124,8 @@ packages: engines: {node: '>=0.12'} dev: true - /entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + /entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} dev: true @@ -3153,8 +3134,8 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + /es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.2 @@ -3184,7 +3165,9 @@ packages: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -3199,6 +3182,7 @@ packages: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -3241,7 +3225,7 @@ packages: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -3356,7 +3340,7 @@ packages: eslint: '>=6.0.0' dependencies: eslint: 9.18.0(supports-color@10.0.0) - semver: 7.7.1 + semver: 7.7.2 dev: true /eslint-config-prettier@10.0.1(eslint@9.18.0): @@ -3368,17 +3352,17 @@ packages: eslint: 9.18.0(supports-color@10.0.0) dev: true - /eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.4)(eslint@8.57.1): + /eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.5)(eslint@8.57.1): resolution: {integrity: sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==} peerDependencies: eslint: ^8.8.0 eslint-plugin-react: ^7.28.0 dependencies: eslint: 8.57.1 - eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react: 7.37.5(eslint@8.57.1) dev: true - /eslint-config-standard-with-typescript@23.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1)(typescript@5.7.2): + /eslint-config-standard-with-typescript@23.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.32.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1)(typescript@5.7.2): resolution: {integrity: sha512-iaaWifImn37Z1OXbNW1es7KI+S7D408F9ys0bpaQf2temeBWlvb0Nc5qHkOgYaRb5QxTZT32GGeN1gtswASOXA==} deprecated: Please use eslint-config-love, instead. peerDependencies: @@ -3392,8 +3376,8 @@ packages: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 - eslint-config-standard: 17.0.0(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) + eslint-config-standard: 17.0.0(eslint-plugin-import@2.32.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) typescript: 5.7.2 @@ -3401,7 +3385,7 @@ packages: - supports-color dev: true - /eslint-config-standard@17.0.0(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1): + /eslint-config-standard@17.0.0(eslint-plugin-import@2.32.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1): resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -3410,7 +3394,7 @@ packages: eslint-plugin-promise: ^6.0.0 dependencies: eslint: 8.57.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) dev: true @@ -3425,8 +3409,8 @@ packages: - supports-color dev: true - /eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + /eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3460,7 +3444,7 @@ packages: peerDependencies: eslint: '>=8' dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.18.0) '@eslint-community/regexpp': 4.12.1 eslint: 9.18.0(supports-color@10.0.0) eslint-compat-utils: 0.5.1(eslint@9.18.0) @@ -3477,8 +3461,8 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1): - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + /eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1): + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3489,7 +3473,7 @@ packages: dependencies: '@rtsao/scc': 1.1.0 '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 @@ -3497,7 +3481,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3540,7 +3524,7 @@ packages: is-core-module: 2.16.1 minimatch: 3.1.2 resolve: 1.22.10 - semver: 7.7.1 + semver: 7.7.2 dev: true /eslint-plugin-n@17.15.1(eslint@9.18.0): @@ -3549,15 +3533,15 @@ packages: peerDependencies: eslint: '>=8.23.0' dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.18.0) enhanced-resolve: 5.18.1 eslint: 9.18.0(supports-color@10.0.0) eslint-plugin-es-x: 7.8.0(eslint@9.18.0) - get-tsconfig: 4.10.0 + get-tsconfig: 4.10.1 globals: 15.14.0 ignore: 5.3.2 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 dev: true /eslint-plugin-no-only-tests@3.3.0: @@ -3583,7 +3567,7 @@ packages: eslint-config-prettier: 10.0.1(eslint@9.18.0) prettier: 3.4.2 prettier-linter-helpers: 1.0.0 - synckit: 0.9.2 + synckit: 0.9.3 dev: true /eslint-plugin-promise@6.6.0(eslint@8.57.1): @@ -3595,13 +3579,13 @@ packages: eslint: 8.57.1 dev: true - /eslint-plugin-react@7.37.4(eslint@8.57.1): - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + /eslint-plugin-react@7.37.5(eslint@8.57.1): + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 @@ -3638,8 +3622,8 @@ packages: estraverse: 5.3.0 dev: true - /eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + /eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: esrecurse: 4.3.0 @@ -3688,8 +3672,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + /eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true @@ -3699,7 +3683,7 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -3710,7 +3694,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -3751,7 +3735,7 @@ packages: jiti: optional: true dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.18.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2(supports-color@10.0.0) '@eslint/core': 0.10.0 @@ -3760,17 +3744,17 @@ packages: '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.7 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@10.0.0) + debug: 4.4.1(supports-color@10.0.0) escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -3789,21 +3773,21 @@ packages: - supports-color dev: true - /espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + /espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 dev: true /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 dev: true @@ -4075,13 +4059,14 @@ packages: signal-exit: 4.1.0 dev: true - /form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + /form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 dev: true @@ -4190,8 +4175,8 @@ packages: get-intrinsic: 1.3.0 dev: true - /get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + /get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -4296,11 +4281,11 @@ packages: tslib: 2.8.1 dev: false - /graphql.macro@1.4.2(@babel/core@7.26.10)(graphql@16.10.0): + /graphql.macro@1.4.2(@babel/core@7.27.4)(graphql@16.10.0): resolution: {integrity: sha512-vcIaStPgS65gp5i1M3DSBimNVkyus0Z7k4VObWAyZS319tKlpX/TEIJSWTgOZU5k8dn4RRzGoS/elQhX2E6yBw==} dependencies: - '@babel/template': 7.27.0 - babel-literal-to-ast: 2.1.0(@babel/core@7.26.10) + '@babel/template': 7.27.2 + babel-literal-to-ast: 2.1.0(@babel/core@7.27.4) babel-plugin-macros: 2.8.0 graphql-tag: 2.12.6(graphql@16.10.0) transitivePeerDependencies: @@ -4399,7 +4384,7 @@ packages: entities: 4.5.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.39.0 + terser: 5.43.1 dev: true /http-errors@1.6.3: @@ -4429,7 +4414,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color dev: true @@ -4439,7 +4424,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color dev: true @@ -4660,6 +4645,11 @@ packages: engines: {node: '>= 0.4'} dev: true + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + /is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -4789,8 +4779,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -4802,11 +4792,11 @@ packages: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color dev: true @@ -4824,7 +4814,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -4947,11 +4937,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.12.12 - babel-jest: 29.7.0(@babel/core@7.26.10) + babel-jest: 29.7.0(@babel/core@7.27.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -5081,7 +5071,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -5205,15 +5195,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.26.10 - '@babel/generator': 7.27.0 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -5224,7 +5214,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color dev: true @@ -5326,7 +5316,7 @@ packages: engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@babel/parser': 7.27.0 + '@babel/parser': 7.27.5 '@jsdoc/salty': 0.2.9 '@types/markdown-it': 14.1.2 bluebird: 3.7.2 @@ -5353,7 +5343,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.14.1 + acorn: 8.15.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -5361,7 +5351,7 @@ packages: decimal.js: 10.5.0 domexception: 4.0.0 escodegen: 2.1.0 - form-data: 4.0.2 + form-data: 4.0.3 html-encoding-sniffer: 3.0.0 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 @@ -5376,7 +5366,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.18.0 + ws: 8.18.2 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -5432,7 +5422,7 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -5601,7 +5591,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.7.1 + semver: 7.7.2 dev: true /make-error@1.3.6: @@ -5720,19 +5710,19 @@ packages: /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 /minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 dev: true /minimist@1.2.8: @@ -5766,7 +5756,7 @@ packages: peerDependencies: mocha: '>=2.2.5' dependencies: - debug: 4.4.0(supports-color@10.0.0) + debug: 4.4.1(supports-color@10.0.0) md5: 2.3.0 mkdirp: 3.0.1 mocha: 11.0.1 @@ -5784,7 +5774,7 @@ packages: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -5810,9 +5800,10 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /multer@1.4.5-lts.1: - resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} + /multer@1.4.5-lts.2: + resolution: {integrity: sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==} engines: {node: '>= 6.0.0'} + deprecated: Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version. dependencies: append-field: 1.0.0 busboy: 1.6.0 @@ -5926,7 +5917,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 dev: true @@ -5936,7 +5927,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 dev: true /object.values@1.2.1: @@ -6093,7 +6084,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -6106,7 +6097,7 @@ packages: /parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} dependencies: - entities: 6.0.0 + entities: 6.0.1 dev: true /parseurl@1.3.3: @@ -6416,7 +6407,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -6462,7 +6453,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -6470,9 +6461,6 @@ packages: which-builtin-type: 1.2.1 dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - /regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -6567,8 +6555,8 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /response-iterator@0.2.20: - resolution: {integrity: sha512-RfNi9saiJ9VKznrRZEGZtlfeiQI7NWMUlXvmkvO60xaHfW1y+36EOibZkV59LuKNak8VIqL6IyxYxhMOGTurIQ==} + /response-iterator@0.2.25: + resolution: {integrity: sha512-15K4tT8X35W0zJ5bv3fAf4eEKqOwS7yzd+Bg6YEE9NLltVbPbuTcYo3J2AP6AMQGMJmJkFCG421+kP2/iCBfDA==} engines: {node: '>=0.8'} dev: false @@ -6654,12 +6642,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - /semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - dev: true - /semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -6831,8 +6813,8 @@ packages: engines: {node: '>=14'} dev: true - /sinon@19.0.2: - resolution: {integrity: sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==} + /sinon@19.0.5: + resolution: {integrity: sha512-r15s9/s+ub/d4bxNXqIUmwp6imVSdTorIRaxoecYjqTVLZ8RuoXr/4EDGwIBo6Waxn7f2gnURX9zuhAfCwaF6Q==} dependencies: '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers': 13.0.5 @@ -6973,7 +6955,7 @@ packages: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -6989,7 +6971,7 @@ packages: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 dev: true /string.prototype.trim@1.2.10: @@ -7000,7 +6982,7 @@ packages: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 dev: true @@ -7104,16 +7086,16 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + /synckit@0.9.3: + resolution: {integrity: sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==} engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/core': 0.1.2 tslib: 2.8.1 dev: true - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + /tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} dev: true @@ -7125,13 +7107,13 @@ packages: rimraf: 2.6.3 dev: false - /terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + /terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -7193,7 +7175,7 @@ packages: tslib: 2.8.1 dev: false - /ts-jest@29.3.4(@babel/core@7.26.10)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.7.2): + /ts-jest@29.3.4(@babel/core@7.27.4)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.7.2): resolution: {integrity: sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -7217,7 +7199,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 bs-logger: 0.2.6 ejs: 3.1.10 esbuild: 0.24.2 @@ -7243,12 +7225,12 @@ packages: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 - eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.4)(eslint@8.57.1) - eslint-config-standard-with-typescript: 23.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1)(typescript@5.7.2) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) + eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.5)(eslint@8.57.1) + eslint-config-standard-with-typescript: 23.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.32.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1)(typescript@5.7.2) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) - eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react: 7.37.5(eslint@8.57.1) minimist: 1.2.8 pkg-conf: 4.0.0 standard-engine: 15.1.0 @@ -7421,13 +7403,13 @@ packages: engines: {node: '>= 0.8'} dev: true - /update-browserslist-db@1.1.3(browserslist@4.24.4): + /update-browserslist-db@1.1.3(browserslist@4.25.0): resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.24.4 + browserslist: 4.25.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -7608,8 +7590,8 @@ packages: signal-exit: 3.0.7 dev: true - /ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + /ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 diff --git a/py/selenium/webdriver/chromium/options.py b/py/selenium/webdriver/chromium/options.py index 3203f9b5fb6c9..e70eb0300071d 100644 --- a/py/selenium/webdriver/chromium/options.py +++ b/py/selenium/webdriver/chromium/options.py @@ -44,8 +44,9 @@ def binary_location(self) -> str: def binary_location(self, value: str) -> None: """Allows you to set where the chromium binary lives. - :Args: - - value: path to the Chromium binary + Parameters: + ---------- + value: path to the Chromium binary """ if not isinstance(value, str): raise TypeError(self.BINARY_LOCATION_ERROR) @@ -61,8 +62,9 @@ def debugger_address(self, value: str) -> None: """Allows you to set the address of the remote devtools instance that the ChromeDriver instance will try to connect to during an active wait. - :Args: - - value: address of remote devtools instance if any (hostname[:port]) + Parameters: + ---------- + value: address of remote devtools instance if any (hostname[:port]) """ if not isinstance(value, str): raise TypeError("Debugger Address must be a string") @@ -89,8 +91,9 @@ def add_extension(self, extension: str) -> None: """Adds the path to the extension to a list that will be used to extract it to the ChromeDriver. - :Args: - - extension: path to the \\*.crx file + Parameters: + ---------- + extension: path to the \\*.crx file """ if extension: extension_to_add = os.path.abspath(os.path.expanduser(extension)) @@ -105,8 +108,9 @@ def add_encoded_extension(self, extension: str) -> None: """Adds Base64 encoded string with extension data to a list that will be used to extract it to the ChromeDriver. - :Args: - - extension: Base64 encoded string with extension data + Parameters: + ---------- + extension: Base64 encoded string with extension data """ if extension: self._extensions.append(extension) @@ -121,7 +125,8 @@ def experimental_options(self) -> dict: def add_experimental_option(self, name: str, value: Union[str, int, dict, list[str]]) -> None: """Adds an experimental option which is passed to chromium. - :Args: + Parameters: + ---------- name: The experimental option name. value: The option value. """ @@ -129,9 +134,8 @@ def add_experimental_option(self, name: str, value: Union[str, int, dict, list[s @property def enable_webextensions(self) -> bool: - """Returns whether webextension support is enabled for Chromium-based browsers. - - :Returns: True if webextension support is enabled, False otherwise. + """:Returns: Whether webextension support is enabled for Chromium-based browsers. + True if webextension support is enabled, False otherwise. """ return self._enable_webextensions @@ -139,12 +143,19 @@ def enable_webextensions(self) -> bool: def enable_webextensions(self, value: bool) -> None: """Enables or disables webextension support for Chromium-based browsers. - When enabled, this automatically adds the required Chromium flags: - - --enable-unsafe-extension-debugging - - --remote-debugging-pipe - - :Args: - - value: True to enable webextension support, False to disable. + Parameters: + ---------- + value : bool + True to enable webextension support, False to disable. + + Notes: + ----- + - When enabled, this automatically adds the required Chromium flags: + - --enable-unsafe-extension-debugging + - --remote-debugging-pipe + - Enabling --remote-debugging-pipe makes the connection b/w chromedriver + and the browser use a pipe instead of a port, disabling many CDP functionalities + like devtools """ self._enable_webextensions = value if value: @@ -162,7 +173,11 @@ def enable_webextensions(self, value: bool) -> None: def to_capabilities(self) -> dict: """Creates a capabilities with all the options that have been set - :Returns: A dictionary with everything.""" + + Returns: + ------- + dict : a dictionary with all set options + """ caps = self._caps chrome_options = self.experimental_options.copy() if self.mobile_options: diff --git a/py/selenium/webdriver/remote/webdriver.py b/py/selenium/webdriver/remote/webdriver.py index 62ce619105186..7b19f053f3c99 100644 --- a/py/selenium/webdriver/remote/webdriver.py +++ b/py/selenium/webdriver/remote/webdriver.py @@ -1396,10 +1396,13 @@ def _get_cdp_details(self): import urllib3 http = urllib3.PoolManager() - if self.caps.get("browserName") == "chrome": - debugger_address = self.caps.get("goog:chromeOptions").get("debuggerAddress") - elif self.caps.get("browserName") == "MicrosoftEdge": - debugger_address = self.caps.get("ms:edgeOptions").get("debuggerAddress") + try: + if self.caps.get("browserName") == "chrome": + debugger_address = self.caps.get("goog:chromeOptions").get("debuggerAddress") + elif self.caps.get("browserName") == "MicrosoftEdge": + debugger_address = self.caps.get("ms:edgeOptions").get("debuggerAddress") + except AttributeError: + raise WebDriverException("Can't get debugger address.") res = http.request("GET", f"http://{debugger_address}/json/version") data = json.loads(res.data) diff --git a/rb/lib/selenium/webdriver/common/proxy.rb b/rb/lib/selenium/webdriver/common/proxy.rb index 9ea94c0dfb294..644511575915e 100644 --- a/rb/lib/selenium/webdriver/common/proxy.rb +++ b/rb/lib/selenium/webdriver/common/proxy.rb @@ -77,6 +77,7 @@ def ==(other) alias eql? == def ftp=(value) + WebDriver.logger.deprecate('FTP proxy support', nil, id: :ftp_proxy) self.type = :manual @ftp = value end