diff --git a/AUTHORS b/AUTHORS index c5dd7ca1b17568..4eeedcf9c00145 100644 --- a/AUTHORS +++ b/AUTHORS @@ -68,6 +68,7 @@ Andrei Andrei Botalov Andrei Rusu Andrei Solntsev +Andrew Nesbitt Andrey Botalov Andrii Rohovets Andy Duncan @@ -334,6 +335,7 @@ Harshit Agrawal <94462364+harshit-bs@users.noreply.github.com> havja Haw-bin Chai hectorhon +HeeJun <64578367+syber911911@users.noreply.github.com> Heky helen3141 <54561656+helen3141@users.noreply.github.com> Henrik Skupin @@ -458,6 +460,7 @@ Jonathan Lipps Jonathon Kereliuk Jongkuen Hong Jordan Mace +Jose D. Gomez R. <1josegomezr@gmail.com> josephg Josh Goldberg Joshua Bruning @@ -633,6 +636,7 @@ MustafaAgamy Muthu Kannan MWschutte <72599545+MWschutte@users.noreply.github.com> myslak71 +Natalia Pozhidaeva Nate Lowry Nathan Isom native-api diff --git a/MODULE.bazel b/MODULE.bazel index 979f4cfa7885a0..ffb74a8cfbaf49 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -19,7 +19,7 @@ bazel_dep(name = "rules_cc", version = "0.0.9", dev_dependency = True) bazel_dep(name = "rules_dotnet", version = "0.16.1") bazel_dep(name = "rules_java", version = "7.11.1") -bazel_dep(name = "rules_jvm_external", version = "6.3") +bazel_dep(name = "rules_jvm_external", version = "6.6") bazel_dep(name = "rules_nodejs", version = "6.3.0") bazel_dep(name = "rules_oci", version = "1.7.6") bazel_dep(name = "rules_pkg", version = "0.10.1") @@ -177,52 +177,57 @@ maven.install( "com.google.auto:auto-common:1.2.2", "com.google.auto.service:auto-service:1.1.1", "com.google.auto.service:auto-service-annotations:1.1.1", - "com.google.googlejavaformat:google-java-format:jar:1.24.0", + "com.google.googlejavaformat:google-java-format:jar:1.25.0", "com.graphql-java:graphql-java:22.3", "dev.failsafe:failsafe:3.3.2", "io.grpc:grpc-context:1.68.1", - "io.lettuce:lettuce-core:6.4.0.RELEASE", - "io.netty:netty-buffer:4.1.114.Final", - "io.netty:netty-codec-http:4.1.114.Final", - "io.netty:netty-codec-http2:4.1.114.Final", - "io.netty:netty-common:4.1.114.Final", - "io.netty:netty-handler:4.1.114.Final", - "io.netty:netty-handler-proxy:4.1.114.Final", - "io.netty:netty-transport:4.1.114.Final", - "io.opentelemetry:opentelemetry-api:1.43.0", - "io.opentelemetry:opentelemetry-context:1.43.0", - "io.opentelemetry:opentelemetry-exporter-logging:1.43.0", - "io.opentelemetry:opentelemetry-sdk:1.43.0", - "io.opentelemetry:opentelemetry-sdk-common:1.43.0", - "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.43.0", - "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.43.0", - "io.opentelemetry:opentelemetry-sdk-testing:1.43.0", - "io.opentelemetry:opentelemetry-sdk-trace:1.43.0", - "io.opentelemetry.semconv:opentelemetry-semconv:1.25.0-alpha", + "io.lettuce:lettuce-core:6.5.0.RELEASE", + "io.netty:netty-buffer", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-common", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-transport", + "io.opentelemetry:opentelemetry-api", + "io.opentelemetry:opentelemetry-context", + "io.opentelemetry:opentelemetry-exporter-logging", + "io.opentelemetry:opentelemetry-sdk", + "io.opentelemetry:opentelemetry-sdk-common", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi", + "io.opentelemetry:opentelemetry-sdk-testing", + "io.opentelemetry:opentelemetry-sdk-trace", + "io.opentelemetry.semconv:opentelemetry-semconv:1.28.0-alpha", "it.ozimov:embedded-redis:0.7.3", "net.bytebuddy:byte-buddy:1.15.10", - "org.htmlunit:htmlunit-core-js:4.5.0", + "org.htmlunit:htmlunit-core-js:4.6.0", "org.apache.commons:commons-exec:1.4.0", "org.apache.logging.log4j:log4j-core:2.24.1", "org.assertj:assertj-core:3.26.3", - "org.bouncycastle:bcpkix-jdk18on:1.78.1", + "org.bouncycastle:bcpkix-jdk18on:1.79", "org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5", "org.hsqldb:hsqldb:2.7.4", "org.jspecify:jspecify:1.0.0", - "org.junit.jupiter:junit-jupiter-api:5.11.3", - "org.junit.jupiter:junit-jupiter-engine:5.11.3", - "org.junit.jupiter:junit-jupiter-params:5.11.3", - "org.junit.platform:junit-platform-launcher:1.11.3", - "org.junit.platform:junit-platform-reporting:1.11.3", - "org.junit.platform:junit-platform-commons:1.11.3", - "org.junit.platform:junit-platform-engine:1.11.3", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-launcher", + "org.junit.platform:junit-platform-reporting", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", "org.mockito:mockito-core:5.14.2", - "org.redisson:redisson:3.37.0", + "org.redisson:redisson:3.39.0", "org.slf4j:slf4j-api:2.0.16", "org.slf4j:slf4j-jdk14:2.0.16", "org.tomlj:tomlj:1.1.1", "org.zeromq:jeromq:0.6.0", ], + boms = [ + "io.opentelemetry:opentelemetry-bom:1.44.1", + "io.netty:netty-bom:4.1.115.Final", + "org.junit:junit-bom:5.11.3", + ], excluded_artifacts = [ "org.hamcrest:hamcrest-all", # Replaced by hamcrest 2 "org.hamcrest:hamcrest-core", @@ -235,6 +240,7 @@ maven.install( repositories = [ "https://repo1.maven.org/maven2", ], + resolver = "maven", strict_visibility = True, ) use_repo(maven, "maven", "unpinned_maven") diff --git a/Rakefile b/Rakefile index 454096c1763663..7ee7099acb1357 100644 --- a/Rakefile +++ b/Rakefile @@ -97,7 +97,7 @@ task '//java/test/org/openqa/selenium/environment/webserver:webserver:uber' => [ JAVA_RELEASE_TARGETS = %w[ //java/src/org/openqa/selenium/chrome:chrome.publish //java/src/org/openqa/selenium/chromium:chromium.publish - //java/src/org/openqa/selenium/devtools/v128:v128.publish + //java/src/org/openqa/selenium/devtools/v131:v131.publish //java/src/org/openqa/selenium/devtools/v129:v129.publish //java/src/org/openqa/selenium/devtools/v130:v130.publish //java/src/org/openqa/selenium/devtools/v85:v85.publish diff --git a/common/devtools/chromium/v128/BUILD.bazel b/common/devtools/chromium/v131/BUILD.bazel similarity index 100% rename from common/devtools/chromium/v128/BUILD.bazel rename to common/devtools/chromium/v131/BUILD.bazel diff --git a/common/devtools/chromium/v128/browser_protocol.pdl b/common/devtools/chromium/v131/browser_protocol.pdl similarity index 98% rename from common/devtools/chromium/v128/browser_protocol.pdl rename to common/devtools/chromium/v131/browser_protocol.pdl index 95b6a8e9e021c6..49df8017971a7e 100644 --- a/common/devtools/chromium/v128/browser_protocol.pdl +++ b/common/devtools/chromium/v131/browser_protocol.pdl @@ -532,6 +532,8 @@ experimental domain Audits WarnDomainNonASCII WarnThirdPartyPhaseout WarnCrossSiteRedirectDowngradeChangesInclusion + WarnDeprecationTrialMetadata + WarnThirdPartyCookieHeuristic type CookieOperation extends string enum @@ -743,6 +745,7 @@ experimental domain Audits NoRegisterTriggerHeader NoRegisterOsSourceHeader NoRegisterOsTriggerHeader + NavigationRegistrationUniqueScopeAlreadySet type SharedDictionaryError extends string enum @@ -915,7 +918,7 @@ experimental domain Audits ThirdPartyCookiesBlocked NotSignedInWithIdp MissingTransientUserActivation - ReplacedByButtonMode + ReplacedByActiveMode InvalidFieldsSpecified RelyingPartyOriginIsOpaque TypeNotMatching @@ -1102,13 +1105,20 @@ experimental domain Audits parameters InspectorIssue issue -# Defines commands and events for browser extensions. Available if the client -# is connected using the --remote-debugging-pipe flag and -# the --enable-unsafe-extension-debugging flag is set. +# Defines commands and events for browser extensions. experimental domain Extensions + # Storage areas. + type StorageArea extends string + enum + session + local + sync + managed # Installs an unpacked extension from the filesystem similar to # --load-extension CLI flags. Returns extension ID once the extension - # has been installed. + # has been installed. Available if the client is connected using the + # --remote-debugging-pipe flag and the --enable-unsafe-extension-debugging + # flag is set. command loadUnpacked parameters # Absolute file path. @@ -1116,6 +1126,44 @@ experimental domain Extensions returns # Extension id. string id + # Gets data from extension storage in the given `storageArea`. If `keys` is + # specified, these are used to filter the result. + command getStorageItems + parameters + # ID of extension. + string id + # StorageArea to retrieve data from. + StorageArea storageArea + # Keys to retrieve. + optional array of string keys + returns + object data + # Removes `keys` from extension storage in the given `storageArea`. + command removeStorageItems + parameters + # ID of extension. + string id + # StorageArea to remove data from. + StorageArea storageArea + # Keys to remove. + array of string keys + # Clears extension storage in the given `storageArea`. + command clearStorageItems + parameters + # ID of extension. + string id + # StorageArea to remove data from. + StorageArea storageArea + # Sets `values` in extension storage in the given `storageArea`. The provided `values` + # will be merged with existing values in the storage area. + command setStorageItems + parameters + # ID of extension. + string id + # StorageArea to set data in. + StorageArea storageArea + # Values to set. + object values # Defines commands and events for Autofill. experimental domain Autofill @@ -1347,6 +1395,7 @@ domain Browser videoCapturePanTiltZoom wakeLockScreen wakeLockSystem + webAppInstallation windowManagement experimental type PermissionSetting extends string @@ -2011,13 +2060,6 @@ experimental domain CSS # Associated style declaration. CSSStyle style - # CSS position-fallback rule representation. - deprecated type CSSPositionFallbackRule extends object - properties - Value name - # List of keyframes. - array of CSSTryRule tryRules - # CSS @position-try rule representation. type CSSPositionTryRule extends object properties @@ -2204,8 +2246,6 @@ experimental domain CSS optional array of InheritedPseudoElementMatches inheritedPseudoElements # A list of CSS keyframed animations matching this node. optional array of CSSKeyframesRule cssKeyframesRules - # A list of CSS position fallbacks matching this node. - deprecated optional array of CSSPositionFallbackRule cssPositionFallbackRules # A list of CSS @position-try rules matching this node, based on the position-try-fallbacks property. optional array of CSSPositionTryRule cssPositionTryRules # Index of the active fallback in the applied position-try-fallback property, @@ -2641,6 +2681,7 @@ domain DOM after marker backdrop + column selection search-text target-text @@ -2650,6 +2691,8 @@ domain DOM first-line-inherited scroll-marker scroll-marker-group + scroll-next-button + scroll-prev-button scrollbar scrollbar-thumb scrollbar-button @@ -2663,6 +2706,12 @@ domain DOM view-transition-image-pair view-transition-old view-transition-new + placeholder + file-selector-button + details-content + select-fallback-button + select-fallback-button-text + picker # Shadow root type. type ShadowRootType extends string @@ -2767,6 +2816,13 @@ domain DOM optional boolean isSVG optional CompatibilityMode compatibilityMode optional BackendNode assignedSlot + experimental optional boolean isScrollable + + # A structure to hold the top-level node of a detached tree and an array of its retained descendants. + type DetachedElementInfo extends object + properties + Node treeNode + array of NodeId retainedNodeIds # A structure holding an RGBA color. type RGBA extends object @@ -3278,6 +3334,12 @@ domain DOM returns string path + # Returns list of detached nodes + experimental command getDetachedDomNodes + returns + # The list of detached nodes + array of DetachedElementInfo detachedNodes + # Enables console to refer to the node with given id via $x (see Command Line API for more details # $x functions). experimental command setInspectedNode @@ -3444,6 +3506,14 @@ domain DOM # Called when top layer elements are changed. experimental event topLayerElementsUpdated + # Fired when a node's scrollability state changes. + experimental event scrollableFlagUpdated + parameters + # The id of the node. + DOM.NodeId nodeId + # If the node is scrollable. + boolean isScrollable + # Called when a pseudo element is removed from an element. experimental event pseudoElementRemoved parameters @@ -4153,7 +4223,6 @@ domain Emulation gyroscope linear-acceleration magnetometer - proximity relative-orientation experimental type SensorMetadata extends object @@ -5472,12 +5541,21 @@ experimental domain Memory moderate critical + # Retruns current DOM object counters. command getDOMCounters returns integer documents integer nodes integer jsEventListeners + # Retruns DOM object counters after preparing renderer for leak detection. + command getDOMCountersForLeakDetection + returns + # DOM object counters. + array of DOMCounter counters + + # Prepares for leak detection by terminating workers, stopping spellcheckers, + # dropping non-essential internal caches, running garbage collections, etc. command prepareForLeakDetection # Simulate OomIntervention by purging V8 memory. @@ -5553,6 +5631,15 @@ experimental domain Memory # Size of the module in bytes. number size + # DOM object counter data. + type DOMCounter extends object + properties + # Object name. Note: object names should be presumed volatile and clients should not expect + # the returned names to be consistent across runs. + string name + # Object count. + integer count + # Network domain allows tracking network activities of the page. It exposes information about http, # file, data and other requests and responses, their headers, bodies, timing, etc. domain Network @@ -6290,6 +6377,8 @@ domain Network TPCDMetadata # The cookie should have been blocked by 3PCD but is exempted by Deprecation Trial mitigation. TPCDDeprecationTrial + # The cookie should have been blocked by 3PCD but is exempted by Top-level Deprecation Trial mitigation. + TopLevelTPCDDeprecationTrial # The cookie should have been blocked by 3PCD but is exempted by heuristics mitigation. TPCDHeuristics # The cookie should have been blocked by 3PCD but is exempted by Enterprise Policy. @@ -6298,8 +6387,6 @@ domain Network StorageAccess # The cookie should have been blocked by 3PCD but is exempted by Top-level Storage Access API. TopLevelStorageAccess - # The cookie should have been blocked by 3PCD but is exempted by CORS opt-in. - CorsOptIn # The cookie should have been blocked by 3PCD but is exempted by the first-party URL scheme. Scheme @@ -7838,8 +7925,8 @@ experimental domain Overlay # True for showing hit-test borders boolean show - # Request that backend shows an overlay with web vital metrics. - command setShowWebVitals + # Deprecated, no longer has any effect. + deprecated command setShowWebVitals parameters boolean show @@ -7964,6 +8051,7 @@ domain Page experimental type PermissionsPolicyFeature extends string enum accelerometer + all-screens-capture ambient-light-sensor attribution-reporting autoplay @@ -7997,10 +8085,12 @@ domain Page clipboard-read clipboard-write compute-pressure + controlled-frame cross-origin-isolated deferred-fetch digital-credentials-get direct-sockets + direct-sockets-private display-capture document-domain encrypted-media @@ -8020,11 +8110,13 @@ domain Page keyboard-map local-fonts magnetometer + media-playback-while-not-visible microphone midi otp-credentials payment picture-in-picture + popins private-aggregation private-state-token-issuance private-state-token-redemption @@ -8045,6 +8137,7 @@ domain Page usb usb-unrestricted vertical-scroll + web-app-installation web-printing web-share window-management @@ -8357,14 +8450,16 @@ domain Page experimental type ClientNavigationReason extends string enum + anchorClick formSubmissionGet formSubmissionPost httpHeaderRefresh - scriptInitiated + initialFrameNavigation metaTagRefresh + other pageBlockInterstitial reload - anchorClick + scriptInitiated experimental type ClientNavigationDisposition extends string enum @@ -9142,6 +9237,13 @@ domain Page # A new frame target will be created (see Target.attachedToTarget). swap + # Fired before frame subtree is detached. Emitted before any frame of the + # subtree is actually detached. + experimental event frameSubtreeWillBeDetached + parameters + # Id of the frame that is the root of the subtree that will be detached. + FrameId frameId + # The type of a frameNavigated event. experimental type NavigationType extends string enum @@ -9399,6 +9501,7 @@ domain Page ContentWebUSB ContentMediaSessionService ContentScreenReader + ContentDiscarded # See components/back_forward_cache/back_forward_cache_disable.h for explanations. EmbedderPopupBlockerTabHelper @@ -9417,6 +9520,7 @@ domain Page EmbedderExtensionMessagingForOpenPort EmbedderExtensionSentMessageToCachedFrame RequestedByWebViewClient + PostMessageByWebViewClient # Types of not restored reasons for back-forward cache. experimental type BackForwardCacheNotRestoredReasonType extends string @@ -9484,6 +9588,15 @@ domain Page FrameId frameId # Frame's new url. string url + # Navigation type + enum navigationType + # Navigation due to fragment navigation. + fragment + # Navigation due to history API usage. + historyApi + # Navigation due to other reasons. + other + # Compressed image data requested by the `startScreencast`. experimental event screencastFrame @@ -10573,6 +10686,14 @@ experimental domain Storage array of AttributionReportingAggregatableDebugReportingData debugData optional string aggregationCoordinatorOrigin + experimental type AttributionScopesData extends object + properties + array of string values + # number instead of integer because not all uint32 can be represented by + # int + number limit + number maxEventStates + experimental type AttributionReportingSourceRegistration extends object properties Network.TimeSinceEpoch time @@ -10593,6 +10714,7 @@ experimental domain Storage AttributionReportingTriggerDataMatching triggerDataMatching SignedInt64AsBase10 destinationLimitPriority AttributionReportingAggregatableDebugReportingConfig aggregatableDebugReportingConfig + optional AttributionScopesData scopesData experimental type AttributionReportingSourceRegistrationResult extends string enum @@ -10608,7 +10730,9 @@ experimental domain Storage destinationBothLimitsReached reportingOriginsPerSiteLimitReached exceedsMaxChannelCapacity + exceedsMaxScopesChannelCapacity exceedsMaxTriggerStateCardinality + exceedsMaxEventStatesLimit destinationPerDayReportingLimitReached experimental event attributionReportingSourceRegistered @@ -10667,6 +10791,7 @@ experimental domain Storage AttributionReportingSourceRegistrationTimeConfig sourceRegistrationTimeConfig optional string triggerContextId AttributionReportingAggregatableDebugReportingConfig aggregatableDebugReportingConfig + array of string scopes experimental type AttributionReportingEventLevelResult extends string enum @@ -11869,6 +11994,13 @@ experimental domain WebAuthn # flag set to this value. Defaults to the authenticator's # defaultBackupState value. optional boolean backupState + # The credential's user.name property. Equivalent to empty if not set. + # https://w3c.github.io/webauthn/#dom-publickeycredentialentity-name + optional string userName + # The credential's user.displayName property. Equivalent to empty if + # not set. + # https://w3c.github.io/webauthn/#dom-publickeycredentialuserentity-displayname + optional string userDisplayName # Enable the WebAuthn domain and start intercepting credential storage and # retrieval with a virtual authenticator. @@ -11972,6 +12104,20 @@ experimental domain WebAuthn AuthenticatorId authenticatorId Credential credential + # Triggered when a credential is deleted, e.g. through + # PublicKeyCredential.signalUnknownCredential(). + event credentialDeleted + parameters + AuthenticatorId authenticatorId + binary credentialId + + # Triggered when a credential is updated, e.g. through + # PublicKeyCredential.signalCurrentUserDetails(). + event credentialUpdated + parameters + AuthenticatorId authenticatorId + Credential credential + # Triggered when a credential is used in a webauthn assertion. event credentialAsserted parameters @@ -12283,6 +12429,10 @@ experimental domain Preload JavaScriptInterfaceRemoved AllPrerenderingCanceled WindowClosed + SlowNetwork + OtherPrerenderedPageActivated + V8OptimizerDisabled + PrerenderFailedDuringPrefetch # Fired when a preload enabled state is updated. event preloadEnabledStateUpdated @@ -12316,7 +12466,6 @@ experimental domain Preload PrefetchFailedMIMENotSupported PrefetchFailedNetError PrefetchFailedNon2XX - PrefetchFailedPerPageLimitExceeded PrefetchEvictedAfterCandidateRemoved PrefetchEvictedForNewerPrefetch PrefetchHeldback @@ -12447,7 +12596,7 @@ experimental domain FedCm parameters # Allows callers to disable the promise rejection delay that would # normally happen, if this is unimportant to what's being tested. - # (step 4 of https://w3c-fedid.github.io/FedCM/#browser-api-rp-sign-in) + # (step 4 of https://fedidcg.github.io/FedCM/#browser-api-rp-sign-in) optional boolean disableRejectionDelay command disable @@ -12598,3 +12747,67 @@ experimental domain PWA # supported yet. optional boolean linkCapturing optional DisplayMode displayMode + +# This domain allows configuring virtual Bluetooth devices to test +# the web-bluetooth API. +experimental domain BluetoothEmulation + # Indicates the various states of Central. + type CentralState extends string + enum + absent + powered-off + powered-on + + # Stores the manufacturer data + type ManufacturerData extends object + properties + # Company identifier + # https://bitbucket.org/bluetooth-SIG/public/src/main/assigned_numbers/company_identifiers/company_identifiers.yaml + # https://usb.org/developers + integer key + # Manufacturer-specific data + binary data + + # Stores the byte data of the advertisement packet sent by a Bluetooth device. + type ScanRecord extends object + properties + optional string name + optional array of string uuids + # Stores the external appearance description of the device. + optional integer appearance + # Stores the transmission power of a broadcasting device. + optional integer txPower + # Key is the company identifier and the value is an array of bytes of + # manufacturer specific data. + optional array of ManufacturerData manufacturerData + + # Stores the advertisement packet information that is sent by a Bluetooth device. + type ScanEntry extends object + properties + string deviceAddress + integer rssi + ScanRecord scanRecord + + # Enable the BluetoothEmulation domain. + command enable + parameters + # State of the simulated central. + CentralState state + + # Disable the BluetoothEmulation domain. + command disable + + # Simulates a peripheral with |address|, |name| and |knownServiceUuids| + # that has already been connected to the system. + command simulatePreconnectedPeripheral + parameters + string address + string name + array of ManufacturerData manufacturerData + array of string knownServiceUuids + + # Simulates an advertisement packet described in |entry| being received by + # the central. + command simulateAdvertisement + parameters + ScanEntry entry diff --git a/common/devtools/chromium/v128/js_protocol.pdl b/common/devtools/chromium/v131/js_protocol.pdl similarity index 99% rename from common/devtools/chromium/v128/js_protocol.pdl rename to common/devtools/chromium/v131/js_protocol.pdl index 8dad9c98de9f6e..b96102b7f8f793 100644 --- a/common/devtools/chromium/v128/js_protocol.pdl +++ b/common/devtools/chromium/v131/js_protocol.pdl @@ -369,6 +369,14 @@ domain Debugger # call stacks (default). integer maxDepth + # Replace previous blackbox execution contexts with passed ones. Forces backend to skip + # stepping/pausing in scripts in these execution contexts. VM will try to leave blackboxed script by + # performing 'step in' several times, finally resorting to 'step out' if unsuccessful. + experimental command setBlackboxExecutionContexts + parameters + # Array of execution context unique ids for the debugger to ignore. + array of string uniqueIds + # Replace previous blackbox patterns with passed ones. Forces backend to skip stepping/pausing in # scripts with url matching one of the patterns. VM will try to leave blackboxed script by # performing 'step in' several times, finally resorting to 'step out' if unsuccessful. @@ -376,6 +384,8 @@ domain Debugger parameters # Array of regexps that will be used to check script url for blackbox state. array of string patterns + # If true, also ignore scripts with no source url. + optional boolean skipAnonymous # Makes backend skip steps in the script in blackboxed ranges. VM will try leave blacklisted # scripts by performing 'step in' several times, finally resorting to 'step out' if unsuccessful. @@ -606,7 +616,6 @@ domain Debugger properties # Type of the debug symbols. enum type - None SourceMap EmbeddedDWARF ExternalDWARF @@ -689,8 +698,8 @@ domain Debugger experimental optional integer codeOffset # The language of the script. experimental optional Debugger.ScriptLanguage scriptLanguage - # If the scriptLanguage is WebASsembly, the source of debug symbols for the module. - experimental optional Debugger.DebugSymbols debugSymbols + # If the scriptLanguage is WebAssembly, the source of debug symbols for the module. + experimental optional array of Debugger.DebugSymbols debugSymbols # The name the embedder supplied for this script. experimental optional string embedderName diff --git a/common/mirror/selenium b/common/mirror/selenium index 664bf8d6e5a1b4..3f7b7af0c7a312 100644 --- a/common/mirror/selenium +++ b/common/mirror/selenium @@ -3,13 +3,33 @@ "tag_name": "nightly", "assets": [ { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-java-4.27.0-SNAPSHOT.zip" + "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-java-4.28.0-SNAPSHOT.zip" }, { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-server-4.27.0-SNAPSHOT.jar" + "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-server-4.28.0-SNAPSHOT.jar" }, { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-server-4.27.0-SNAPSHOT.zip" + "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-server-4.28.0-SNAPSHOT.zip" + } + ] + }, + { + "tag_name": "selenium-4.27.0", + "assets": [ + { + "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.27.0/selenium-dotnet-4.27.0.zip" + }, + { + "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.27.0/selenium-dotnet-strongnamed-4.27.0.zip" + }, + { + "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.27.0/selenium-java-4.27.0.zip" + }, + { + "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.27.0/selenium-server-4.27.0.jar" + }, + { + "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.27.0/selenium-server-4.27.0.zip" } ] }, @@ -932,28 +952,5 @@ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-rc-3/selenium-server-4.0.0-rc-3.zip" } ] - }, - { - "tag_name": "selenium-4.0.0-rc-2", - "assets": [ - { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-rc-2/selenium-dotnet-4.0.0-rc2.zip" - }, - { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-rc-2/selenium-dotnet-strongnamed-4.0.0-rc2.zip" - }, - { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-rc-2/selenium-html-runner-4.0.0-rc-2.jar" - }, - { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-rc-2/selenium-java-4.0.0-rc-2.zip" - }, - { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-rc-2/selenium-server-4.0.0-rc-2.jar" - }, - { - "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-rc-2/selenium-server-4.0.0-rc-2.zip" - } - ] } ] diff --git a/common/repositories.bzl b/common/repositories.bzl index 08eacbcf17615e..ba420b18bf293f 100644 --- a/common/repositories.bzl +++ b/common/repositories.bzl @@ -182,8 +182,8 @@ js_library( http_archive( name = "mac_edgedriver", - url = "https://msedgedriver.azureedge.net/131.0.2903.52/edgedriver_mac64.zip", - sha256 = "719f54eb9376df5963e80da727c8ab8bacf6a1f57b785602a53a22fe330bb160", + url = "https://msedgedriver.azureedge.net/131.0.2903.56/edgedriver_mac64.zip", + sha256 = "4f4d1d5b45849677f8d8e706f7b5ca9ebb99f40ed3b4ee203c2535a3429e0d5b", build_file_content = """ load("@aspect_rules_js//js:defs.bzl", "js_library") package(default_visibility = ["//visibility:public"]) @@ -199,8 +199,8 @@ js_library( http_archive( name = "linux_chrome", - url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.69/linux64/chrome-linux64.zip", - sha256 = "3e33f61511e5e9dabac0d7a57b4bb975555ed1d4dababa7898205c030f82e4e3", + url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.85/linux64/chrome-linux64.zip", + sha256 = "3a6d928b0002ec012a53b6bb65dcaf95add008adc223c961d566d824982a767e", build_file_content = """ load("@aspect_rules_js//js:defs.bzl", "js_library") package(default_visibility = ["//visibility:public"]) @@ -221,8 +221,8 @@ js_library( http_archive( name = "mac_chrome", - url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.69/mac-x64/chrome-mac-x64.zip", - sha256 = "72a52967c80f9f145856d08d91052eaa27f6b951f9a4d8ab279f192b98784e41", + url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.85/mac-x64/chrome-mac-x64.zip", + sha256 = "e26a606e2a3da403c6e1e93617a7b51ee010706614eb88de5b16470276e0896b", strip_prefix = "chrome-mac-x64", patch_cmds = [ "mv 'Google Chrome for Testing.app' Chrome.app", @@ -243,8 +243,8 @@ js_library( http_archive( name = "linux_chromedriver", - url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.69/linux64/chromedriver-linux64.zip", - sha256 = "afc7b41aa0e1606e8cc177c776287d836635690964e39eab1ed94d63a0c96be2", + url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.85/linux64/chromedriver-linux64.zip", + sha256 = "33910b16568feabd2b50a26a2c4456d154c760d6e28347427f99c025661a4f3e", strip_prefix = "chromedriver-linux64", build_file_content = """ load("@aspect_rules_js//js:defs.bzl", "js_library") @@ -261,8 +261,8 @@ js_library( http_archive( name = "mac_chromedriver", - url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.69/mac-x64/chromedriver-mac-x64.zip", - sha256 = "92583e52f601951d3e0849891239bb2f6ff00dd8f8fd6c908473cc21c0533dd2", + url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.85/mac-x64/chromedriver-mac-x64.zip", + sha256 = "ee194eba1d52dea61dfbf08b05a2ce139660e9c7d20d15024c3a0757ac4a5fcb", strip_prefix = "chromedriver-mac-x64", build_file_content = """ load("@aspect_rules_js//js:defs.bzl", "js_library") diff --git a/common/selenium_manager.bzl b/common/selenium_manager.bzl index 50f890f1e2029a..79d240b28c2041 100644 --- a/common/selenium_manager.bzl +++ b/common/selenium_manager.bzl @@ -6,22 +6,22 @@ def selenium_manager(): http_file( name = "download_sm_linux", executable = True, - sha256 = "97ab346b907a813c236f1c6b9eb0e1b878702374b0768894415629c2cf05d97e", - url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-33ad1b2/selenium-manager-linux", + sha256 = "8fa14a9c6e36de33485d69915861fe6d459f854f56d4b70e7f07f1783c4f4f08", + url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-694e399/selenium-manager-linux", ) http_file( name = "download_sm_macos", executable = True, - sha256 = "ef27b5c2d274dc4ab4417334116a1530571edc3deaf4740068e35484e275f28a", - url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-33ad1b2/selenium-manager-macos", + sha256 = "c3c08dd30bb2ede7996574be09aeac2d452bf232b9f0d77568765adeac1f2af9", + url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-694e399/selenium-manager-macos", ) http_file( name = "download_sm_windows", executable = True, - sha256 = "15113137d8d0d3648be9948c52e56e1f4c605bc5d9623962991198e8d0d413b6", - url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-33ad1b2/selenium-manager-windows.exe", + sha256 = "b7f87a63eb197a8e3a85d553755fec79a259f57c1216169e2377db2b89bc6b8b", + url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-694e399/selenium-manager-windows.exe", ) def _selenium_manager_artifacts_impl(_ctx): diff --git a/dotnet/CHANGELOG b/dotnet/CHANGELOG index ba87fcdaa96da3..d0ead0419bcf8a 100644 --- a/dotnet/CHANGELOG +++ b/dotnet/CHANGELOG @@ -1,3 +1,26 @@ +v4.27.0 +====== +* Copyright dotnet (#13522) +* Add CDP for Chrome 131 and remove 128 +* Add CDP deprecation warning for Firefox (#14759) +* Add ChromiumNetworkConditions to command serialization (#14716) +* Add Dictionary as well-known types for json serialization +* Add more well-known dictionary types for capability json serialization +* Add reflection-based JSON serialization fallback to `Command`s (#14732) +* Allow `RemoteSessionSettings` to use any value for metadata (#14726) +* Deprecate WebElement.GetAttribute() (#14676) +* Enable NRT on exceptional types (#14672) +* Fix API docs static generation (#14651) +* Fix `RelativeBy.Near` and empty list return (#14737) +* Gracefully handle clashing device names in Actions (#14713) +* Make FirefoxProfile AOT-safe (#14742) +* Make Selenium Manager's AOT safety explicit (#14733) +* Modernize exception handling in tests via assert that throws (#14776) +* Propagate async throughout test setup and teardown (#14775) +* Remove JSON serialization from `.ToString()` methods (#14736) +* Solidify nullability of `PinnedScript` (#14708) +* Update dependency System.Text.Json to 8.0.5 + v4.26.1 ====== * [bidi] Reveal browsing context module in bidi instance (#14684) diff --git a/dotnet/paket.dependencies b/dotnet/paket.dependencies index 35689c811683cb..58d951d7f4bf22 100644 --- a/dotnet/paket.dependencies +++ b/dotnet/paket.dependencies @@ -24,5 +24,5 @@ nuget System.Diagnostics.Tools 4.3.0 nuget System.Drawing.Common 7.0.0 nuget System.Runtime 4.3.1 nuget System.Runtime.InteropServices 4.3.0 -nuget System.Text.Json 8.0.4 +nuget System.Text.Json 8.0.5 nuget Runfiles 0.12.0 diff --git a/dotnet/paket.lock b/dotnet/paket.lock index 7edf7af4bafbf4..d442f8f04bb684 100644 --- a/dotnet/paket.lock +++ b/dotnet/paket.lock @@ -100,7 +100,7 @@ NUGET System.Buffers (>= 4.5.1) - restriction: || (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) System.Memory (>= 4.5.5) - restriction: || (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) System.Runtime.CompilerServices.Unsafe (>= 6.0) - restriction: || (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) - System.Text.Json (8.0.4) + System.Text.Json (8.0.5) Microsoft.Bcl.AsyncInterfaces (>= 8.0) - restriction: || (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) System.Buffers (>= 4.5.1) - restriction: || (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) System.Memory (>= 4.5.5) - restriction: || (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) diff --git a/dotnet/selenium-dotnet-version.bzl b/dotnet/selenium-dotnet-version.bzl index eb9c52953feeef..cb2640bcfe8843 100644 --- a/dotnet/selenium-dotnet-version.bzl +++ b/dotnet/selenium-dotnet-version.bzl @@ -1,12 +1,12 @@ # BUILD FILE SYNTAX: STARLARK -SE_VERSION = "4.27.0-nightly202410311906" +SE_VERSION = "4.28.0-nightly202411252021" ASSEMBLY_VERSION = "4.0.0.0" SUPPORTED_NET_STANDARD_VERSIONS = ["netstandard2.0"] SUPPORTED_DEVTOOLS_VERSIONS = [ "v85", - "v128", + "v131", "v129", "v130", ] diff --git a/dotnet/src/support/Events/EventFiringWebDriver.cs b/dotnet/src/support/Events/EventFiringWebDriver.cs index e68b261e387c33..cfcc7d0cc51547 100644 --- a/dotnet/src/support/Events/EventFiringWebDriver.cs +++ b/dotnet/src/support/Events/EventFiringWebDriver.cs @@ -1613,6 +1613,7 @@ public void Click() /// /// Attribute you wish to get details of /// The attribute's current value or null if the value is not set. + [Obsolete("Use GetDomAttribute(string attributeName) or GetDomProperty(string propertyName). GetAttribute(string attributeName) will be removed in Selenium 6.")] public string GetAttribute(string attributeName) { string attribute = string.Empty; diff --git a/dotnet/src/webdriver/DevTools/DevToolsDomains.cs b/dotnet/src/webdriver/DevTools/DevToolsDomains.cs index 53631416e161cc..81bb52e829206b 100644 --- a/dotnet/src/webdriver/DevTools/DevToolsDomains.cs +++ b/dotnet/src/webdriver/DevTools/DevToolsDomains.cs @@ -39,7 +39,7 @@ public abstract class DevToolsDomains { { 130, typeof(V130.V130Domains) }, { 129, typeof(V129.V129Domains) }, - { 128, typeof(V128.V128Domains) }, + { 131, typeof(V131.V131Domains) }, { 85, typeof(V85.V85Domains) } }; diff --git a/dotnet/src/webdriver/DevTools/v128/V128Domains.cs b/dotnet/src/webdriver/DevTools/v131/V131Domains.cs similarity index 78% rename from dotnet/src/webdriver/DevTools/v128/V128Domains.cs rename to dotnet/src/webdriver/DevTools/v131/V131Domains.cs index ad7fd36277336b..66fd521bf9f092 100644 --- a/dotnet/src/webdriver/DevTools/v128/V128Domains.cs +++ b/dotnet/src/webdriver/DevTools/v131/V131Domains.cs @@ -1,4 +1,4 @@ -// +// // 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 @@ -17,20 +17,20 @@ // under the License. // -namespace OpenQA.Selenium.DevTools.V128 +namespace OpenQA.Selenium.DevTools.V131 { /// - /// Class containing the domain implementation for version 128 of the DevTools Protocol. + /// Class containing the domain implementation for version 131 of the DevTools Protocol. /// - public class V128Domains : DevToolsDomains + public class V131Domains : DevToolsDomains { private DevToolsSessionDomains domains; /// - /// Initializes a new instance of the V128Domains class. + /// Initializes a new instance of the V131Domains class. /// /// The DevToolsSession to use with this set of domains. - public V128Domains(DevToolsSession session) + public V131Domains(DevToolsSession session) { this.domains = new DevToolsSessionDomains(session); } @@ -38,7 +38,7 @@ public V128Domains(DevToolsSession session) /// /// Gets the DevTools Protocol version for which this class is valid. /// - public static int DevToolsVersion => 128; + public static int DevToolsVersion => 131; /// /// Gets the version-specific domains for the DevTools session. This value must be cast to a version specific type to be at all useful. @@ -48,21 +48,21 @@ public V128Domains(DevToolsSession session) /// /// Gets the object used for manipulating network information in the browser. /// - public override DevTools.Network Network => new V128Network(domains.Network, domains.Fetch); + public override DevTools.Network Network => new V131Network(domains.Network, domains.Fetch); /// /// Gets the object used for manipulating the browser's JavaScript execution. /// - public override JavaScript JavaScript => new V128JavaScript(domains.Runtime, domains.Page); + public override JavaScript JavaScript => new V131JavaScript(domains.Runtime, domains.Page); /// /// Gets the object used for manipulating DevTools Protocol targets. /// - public override DevTools.Target Target => new V128Target(domains.Target); + public override DevTools.Target Target => new V131Target(domains.Target); /// /// Gets the object used for manipulating the browser's logs. /// - public override DevTools.Log Log => new V128Log(domains.Log); + public override DevTools.Log Log => new V131Log(domains.Log); } } diff --git a/dotnet/src/webdriver/DevTools/v128/V128JavaScript.cs b/dotnet/src/webdriver/DevTools/v131/V131JavaScript.cs similarity index 94% rename from dotnet/src/webdriver/DevTools/v128/V128JavaScript.cs rename to dotnet/src/webdriver/DevTools/v131/V131JavaScript.cs index 023efade5ff8f1..98ca5dc7f514ae 100644 --- a/dotnet/src/webdriver/DevTools/v128/V128JavaScript.cs +++ b/dotnet/src/webdriver/DevTools/v131/V131JavaScript.cs @@ -1,4 +1,4 @@ -// +// // 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 @@ -17,28 +17,28 @@ // under the License. // -using OpenQA.Selenium.DevTools.V128.Page; -using OpenQA.Selenium.DevTools.V128.Runtime; +using OpenQA.Selenium.DevTools.V131.Page; +using OpenQA.Selenium.DevTools.V131.Runtime; using System; using System.Collections.Generic; using System.Threading.Tasks; -namespace OpenQA.Selenium.DevTools.V128 +namespace OpenQA.Selenium.DevTools.V131 { /// - /// Class containing the JavaScript implementation for version 128 of the DevTools Protocol. + /// Class containing the JavaScript implementation for version 131 of the DevTools Protocol. /// - public class V128JavaScript : JavaScript + public class V131JavaScript : JavaScript { private RuntimeAdapter runtime; private PageAdapter page; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The DevTools Protocol adapter for the Runtime domain. /// The DevTools Protocol adapter for the Page domain. - public V128JavaScript(RuntimeAdapter runtime, PageAdapter page) + public V131JavaScript(RuntimeAdapter runtime, PageAdapter page) { this.runtime = runtime; this.page = page; diff --git a/dotnet/src/webdriver/DevTools/v128/V128Log.cs b/dotnet/src/webdriver/DevTools/v131/V131Log.cs similarity index 88% rename from dotnet/src/webdriver/DevTools/v128/V128Log.cs rename to dotnet/src/webdriver/DevTools/v131/V131Log.cs index 617a42447f7a92..4b4ab1d667b701 100644 --- a/dotnet/src/webdriver/DevTools/v128/V128Log.cs +++ b/dotnet/src/webdriver/DevTools/v131/V131Log.cs @@ -1,4 +1,4 @@ -// +// // 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 @@ -17,23 +17,23 @@ // under the License. // -using OpenQA.Selenium.DevTools.V128.Log; +using OpenQA.Selenium.DevTools.V131.Log; using System.Threading.Tasks; -namespace OpenQA.Selenium.DevTools.V128 +namespace OpenQA.Selenium.DevTools.V131 { /// - /// Class containing the browser's log as referenced by version 128 of the DevTools Protocol. + /// Class containing the browser's log as referenced by version 131 of the DevTools Protocol. /// - public class V128Log : DevTools.Log + public class V131Log : DevTools.Log { private LogAdapter adapter; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The adapter for the Log domain. - public V128Log(LogAdapter adapter) + public V131Log(LogAdapter adapter) { this.adapter = adapter; this.adapter.EntryAdded += OnAdapterEntryAdded; diff --git a/dotnet/src/webdriver/DevTools/v128/V128Network.cs b/dotnet/src/webdriver/DevTools/v131/V131Network.cs similarity index 95% rename from dotnet/src/webdriver/DevTools/v128/V128Network.cs rename to dotnet/src/webdriver/DevTools/v131/V131Network.cs index bd403f423dc9ba..30e6e68f03e218 100644 --- a/dotnet/src/webdriver/DevTools/v128/V128Network.cs +++ b/dotnet/src/webdriver/DevTools/v131/V131Network.cs @@ -1,4 +1,4 @@ -// +// // 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 @@ -17,29 +17,29 @@ // under the License. // -using OpenQA.Selenium.DevTools.V128.Fetch; -using OpenQA.Selenium.DevTools.V128.Network; +using OpenQA.Selenium.DevTools.V131.Fetch; +using OpenQA.Selenium.DevTools.V131.Network; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; -namespace OpenQA.Selenium.DevTools.V128 +namespace OpenQA.Selenium.DevTools.V131 { /// - /// Class providing functionality for manipulating network calls using version 128 of the DevTools Protocol + /// Class providing functionality for manipulating network calls using version 131 of the DevTools Protocol /// - public class V128Network : DevTools.Network + public class V131Network : DevTools.Network { private FetchAdapter fetch; private NetworkAdapter network; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The adapter for the Network domain. /// The adapter for the Fetch domain. - public V128Network(NetworkAdapter network, FetchAdapter fetch) + public V131Network(NetworkAdapter network, FetchAdapter fetch) { this.network = network; this.fetch = fetch; @@ -217,9 +217,9 @@ public override async Task ContinueWithAuth(string requestId, string userName, s await fetch.ContinueWithAuth(new ContinueWithAuthCommandSettings() { RequestId = requestId, - AuthChallengeResponse = new V128.Fetch.AuthChallengeResponse() + AuthChallengeResponse = new V131.Fetch.AuthChallengeResponse() { - Response = V128.Fetch.AuthChallengeResponseResponseValues.ProvideCredentials, + Response = V131.Fetch.AuthChallengeResponseResponseValues.ProvideCredentials, Username = userName, Password = password } @@ -236,9 +236,9 @@ public override async Task CancelAuth(string requestId) await fetch.ContinueWithAuth(new ContinueWithAuthCommandSettings() { RequestId = requestId, - AuthChallengeResponse = new OpenQA.Selenium.DevTools.V128.Fetch.AuthChallengeResponse() + AuthChallengeResponse = new OpenQA.Selenium.DevTools.V131.Fetch.AuthChallengeResponse() { - Response = V128.Fetch.AuthChallengeResponseResponseValues.CancelAuth + Response = V131.Fetch.AuthChallengeResponseResponseValues.CancelAuth } }).ConfigureAwait(false); } diff --git a/dotnet/src/webdriver/DevTools/v128/V128Target.cs b/dotnet/src/webdriver/DevTools/v131/V131Target.cs similarity index 94% rename from dotnet/src/webdriver/DevTools/v128/V128Target.cs rename to dotnet/src/webdriver/DevTools/v131/V131Target.cs index e2a532074d3c7d..3bf15943cbfec9 100644 --- a/dotnet/src/webdriver/DevTools/v128/V128Target.cs +++ b/dotnet/src/webdriver/DevTools/v131/V131Target.cs @@ -1,4 +1,4 @@ -// +// // 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 @@ -17,26 +17,26 @@ // under the License. // -using OpenQA.Selenium.DevTools.V128.Target; +using OpenQA.Selenium.DevTools.V131.Target; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Threading.Tasks; -namespace OpenQA.Selenium.DevTools.V128 +namespace OpenQA.Selenium.DevTools.V131 { /// - /// Class providing functionality for manipulating targets for version 128 of the DevTools Protocol + /// Class providing functionality for manipulating targets for version 131 of the DevTools Protocol /// - public class V128Target : DevTools.Target + public class V131Target : DevTools.Target { private TargetAdapter adapter; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The adapter for the Target domain. - public V128Target(TargetAdapter adapter) + public V131Target(TargetAdapter adapter) { this.adapter = adapter; adapter.DetachedFromTarget += OnDetachedFromTarget; diff --git a/dotnet/src/webdriver/EncodedFile.cs b/dotnet/src/webdriver/EncodedFile.cs index c8f9e1626a3f97..45ab15a74f64a7 100644 --- a/dotnet/src/webdriver/EncodedFile.cs +++ b/dotnet/src/webdriver/EncodedFile.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium { /// @@ -26,34 +28,32 @@ namespace OpenQA.Selenium /// public abstract class EncodedFile { - private string base64Encoded = string.Empty; - private byte[] byteArray; - /// /// Initializes a new instance of the class. /// /// The file as a Base64-encoded string. + /// If is . + /// + /// The length of , ignoring white-space characters, is not zero or a multiple of 4. + /// -or- + /// The format of is invalid. contains a non-base-64 character, + /// more than two padding characters, or a non-white space-character among the padding characters. + /// protected EncodedFile(string base64EncodedFile) { - this.base64Encoded = base64EncodedFile; - this.byteArray = Convert.FromBase64String(this.base64Encoded); + this.AsBase64EncodedString = base64EncodedFile ?? throw new ArgumentNullException(nameof(base64EncodedFile)); + this.AsByteArray = Convert.FromBase64String(base64EncodedFile); } /// /// Gets the value of the encoded file as a Base64-encoded string. /// - public string AsBase64EncodedString - { - get { return this.base64Encoded; } - } + public string AsBase64EncodedString { get; } /// /// Gets the value of the encoded file as an array of bytes. /// - public byte[] AsByteArray - { - get { return this.byteArray; } - } + public byte[] AsByteArray { get; } /// /// Saves the file, overwriting it if it already exists. @@ -65,9 +65,6 @@ public byte[] AsByteArray /// Returns a String that represents the current Object. /// /// A String that represents the current Object. - public override string ToString() - { - return this.base64Encoded; - } + public override string ToString() => this.AsBase64EncodedString; } } diff --git a/dotnet/src/webdriver/ISearchContext.cs b/dotnet/src/webdriver/ISearchContext.cs index 53c5f33ae36daf..a8e244ffdddee9 100644 --- a/dotnet/src/webdriver/ISearchContext.cs +++ b/dotnet/src/webdriver/ISearchContext.cs @@ -20,6 +20,8 @@ using System; using System.Collections.ObjectModel; +#nullable enable + namespace OpenQA.Selenium { /// diff --git a/dotnet/src/webdriver/ISupportsPrint.cs b/dotnet/src/webdriver/ISupportsPrint.cs index 6c79abf1a08e5e..84c712c15aca6b 100644 --- a/dotnet/src/webdriver/ISupportsPrint.cs +++ b/dotnet/src/webdriver/ISupportsPrint.cs @@ -17,6 +17,10 @@ // under the License. // +using System; + +#nullable enable + namespace OpenQA.Selenium { /// @@ -29,6 +33,7 @@ public interface ISupportsPrint /// /// A object describing the options of the printed document. /// The object containing the PDF-formatted print representation of the page. + /// If is . PrintDocument Print(PrintOptions options); } } diff --git a/dotnet/src/webdriver/IWrapsDriver.cs b/dotnet/src/webdriver/IWrapsDriver.cs index 27af4c7e56faa8..15fe5afa2bcf38 100644 --- a/dotnet/src/webdriver/IWrapsDriver.cs +++ b/dotnet/src/webdriver/IWrapsDriver.cs @@ -17,6 +17,8 @@ // under the License. // +#nullable enable + namespace OpenQA.Selenium { /// diff --git a/dotnet/src/webdriver/Internal/Base64UrlEncoder.cs b/dotnet/src/webdriver/Internal/Base64UrlEncoder.cs index 23c2fc5fae5f98..c8b22e7223e8b3 100644 --- a/dotnet/src/webdriver/Internal/Base64UrlEncoder.cs +++ b/dotnet/src/webdriver/Internal/Base64UrlEncoder.cs @@ -19,8 +19,17 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Internal { + /* + * Based on: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/6.19.0/src/Microsoft.IdentityModel.Tokens/Base64UrlEncoder.cs + * + * Now it is a part of .NET 9+ as System.Buffers.Text.Base64Url + * https://github.com/SeleniumHQ/selenium/issues/14813 + */ + /// /// Encodes and Decodes strings as Base64Url encoding. /// @@ -45,8 +54,6 @@ public static class Base64UrlEncoder base64UrlCharacter63 }; - // https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/6.19.0/src/Microsoft.IdentityModel.Tokens/Base64UrlEncoder.cs#L85 - /// /// Converts a subset of an array of 8-bit unsigned integers to its equivalent string representation which is encoded with base-64-url digits. /// @@ -115,8 +122,6 @@ public static string Encode(byte[] inArray) return new string(output, 0, j); } - // https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/6.19.0/src/Microsoft.IdentityModel.Tokens/Base64UrlEncoder.cs#L179 - /// /// Converts the specified string, which encodes binary data as base-64-url digits, to an equivalent 8-bit unsigned integer array. /// base64Url encoded string. diff --git a/dotnet/src/webdriver/Internal/IWebDriverObjectReference.cs b/dotnet/src/webdriver/Internal/IWebDriverObjectReference.cs index bc67fdd7c6a6bc..a62286ca57676f 100644 --- a/dotnet/src/webdriver/Internal/IWebDriverObjectReference.cs +++ b/dotnet/src/webdriver/Internal/IWebDriverObjectReference.cs @@ -19,6 +19,8 @@ using System.Collections.Generic; +#nullable enable + namespace OpenQA.Selenium.Internal { /// diff --git a/dotnet/src/webdriver/PrintDocument.cs b/dotnet/src/webdriver/PrintDocument.cs index 7244a9c42dde73..61e558a756b0a5 100644 --- a/dotnet/src/webdriver/PrintDocument.cs +++ b/dotnet/src/webdriver/PrintDocument.cs @@ -20,6 +20,8 @@ using System; using System.IO; +#nullable enable + namespace OpenQA.Selenium { /// @@ -31,6 +33,13 @@ public class PrintDocument : EncodedFile /// Initializes a new instance of the class. /// /// The printed document as a Base64-encoded string. + /// If is . + /// + /// The length of , ignoring white-space characters, is not zero or a multiple of 4. + /// -or- + /// The format of is invalid. contains a non-base-64 character, + /// more than two padding characters, or a non-white space-character among the padding characters. + /// public PrintDocument(string base64EncodedDocument) : base(base64EncodedDocument) { } @@ -39,6 +48,14 @@ public PrintDocument(string base64EncodedDocument) : base(base64EncodedDocument) /// Saves this as a PDF formatted file, overwriting the file if it already exists. /// /// The full path and file name to save the printed document to. + /// + /// If is or whitespace. + /// -or- + /// refers to a non-file device, such as "con:", "com1:", "lpt1:", etc. in an NTFS environment. + /// + /// refers to a non-file device, such as "con:", "com1:", "lpt1:", etc. in a non-NTFS environment. + /// The specified path is invalid, such as being on an unmapped drive. + /// The specified path, file name, or both exceed the system-defined maximum length. public override void SaveAsFile(string fileName) { if (string.IsNullOrEmpty(fileName)) diff --git a/dotnet/src/webdriver/PrintOptions.cs b/dotnet/src/webdriver/PrintOptions.cs index f1d96605656186..b1f3efd30692ea 100644 --- a/dotnet/src/webdriver/PrintOptions.cs +++ b/dotnet/src/webdriver/PrintOptions.cs @@ -21,6 +21,8 @@ using System.Collections.Generic; using System.Globalization; +#nullable enable + namespace OpenQA.Selenium { /// @@ -49,96 +51,80 @@ public class PrintOptions private const double DefaultPageWidth = 27.94; private const double CentimetersPerInch = 2.54; - private PrintOrientation orientation = PrintOrientation.Portrait; private double scale = 1.0; - private bool background = false; - private bool shrinkToFit = true; private PageSize pageSize = new PageSize(); private Margins margins = new Margins(); - private HashSet pageRanges = new HashSet(); + private readonly HashSet pageRanges = new HashSet(); /// /// Gets or sets the orientation of the pages in the printed document. /// - public PrintOrientation Orientation - { - get { return orientation; } - set { orientation = value; } - } + public PrintOrientation Orientation { get; set; } = PrintOrientation.Portrait; /// /// Gets or sets the amount which the printed content is zoomed. Valid values are 0.1 to 2.0. /// + /// If the value is not set between 0.1 and 2.0. public double ScaleFactor { - get { return scale; } + get => this.scale; set { if (value < 0.1 || value > 2.0) { - throw new ArgumentException("Scale factor must be between 0.1 and 2.0."); + throw new ArgumentOutOfRangeException(nameof(value), "Scale factor must be between 0.1 and 2.0."); } - scale = value; + this.scale = value; } } /// /// Gets or sets a value indicating whether to print background images in the printed document. /// - public bool OutputBackgroundImages - { - get { return background; } - set { background = value; } - } + public bool OutputBackgroundImages { get; set; } /// /// Gets or sets a value indicating whether to shrink the content to fit the printed page size. /// - public bool ShrinkToFit - { - get { return shrinkToFit; } - set { shrinkToFit = value; } - } + public bool ShrinkToFit { get; set; } = true; /// /// Gets or sets the dimensions for each page in the printed document. /// + /// If the value is set to . public PageSize PageDimensions { - get { return pageSize; } - set - { - pageSize = value ?? throw new ArgumentNullException(nameof(value)); - } + get => this.pageSize; + set => this.pageSize = value ?? throw new ArgumentNullException(nameof(value)); } /// /// Gets or sets the margins for each page in the doucment. /// + /// If the value is set to . public Margins PageMargins { - get { return margins; } - set - { - margins = value ?? throw new ArgumentNullException(nameof(value)); - } + get => this.margins; + set => this.margins = value ?? throw new ArgumentNullException(nameof(value)); } /// /// Adds a page to the list of pages to be included in the document. /// /// The page number to be included in the document. + /// If is negative. + /// If the requested page has already been added. public void AddPageToPrint(int pageNumber) { if (pageNumber < 0) { - throw new ArgumentException("Page number must be greater than or equal to zero"); + throw new ArgumentOutOfRangeException(nameof(pageNumber), "Page number must be greater than or equal to zero"); } if (this.pageRanges.Contains(pageNumber)) { - throw new ArgumentException("Cannot add the same page number twice"); + throw new ArgumentException("Cannot add the same page number twice", nameof(pageNumber)); } this.pageRanges.Add(pageNumber); @@ -148,28 +134,42 @@ public void AddPageToPrint(int pageNumber) /// Adds a range of pages to be included in the document. /// /// A string of the form "x-y" representing the page numbers to include. + /// + /// If is or . + /// -or- + /// If the requested is already included. + /// -or- + /// If the requested has multiple '-' separators. + /// -or- + /// If a bound value is neither empty nor a number. + /// + /// + /// If has a negative lower bound. + /// -or- + /// If has an upper bound less than the lower bound. + /// public void AddPageRangeToPrint(string pageRange) { if (string.IsNullOrEmpty(pageRange)) { - throw new ArgumentException("Page range cannot be null or the empty string"); + throw new ArgumentException("Page range cannot be null or the empty string", nameof(pageRange)); } if (this.pageRanges.Contains(pageRange)) { - throw new ArgumentException("Cannot add the same page range twice"); + throw new ArgumentException("Cannot add the same page range twice", nameof(pageRange)); } string[] pageRangeParts = pageRange.Trim().Split('-'); if (pageRangeParts.Length > 2) { - throw new ArgumentException("Page range cannot have multiple separators"); + throw new ArgumentException("Page range cannot have multiple separators", nameof(pageRange)); } int startPage = ParsePageRangePart(pageRangeParts[0], 1); if (startPage < 1) { - throw new ArgumentException("Start of a page range must be greater than or equal to 1"); + throw new ArgumentOutOfRangeException(nameof(pageRange), "Start of a page range must be greater than or equal to 1"); } if (pageRangeParts.Length == 2) @@ -177,20 +177,20 @@ public void AddPageRangeToPrint(string pageRange) int endPage = ParsePageRangePart(pageRangeParts[1], int.MaxValue); if (endPage < startPage) { - throw new ArgumentException("End of a page range must be greater than or equal to the start of the page range"); + throw new ArgumentOutOfRangeException(nameof(pageRange), "End of a page range must be greater than or equal to the start of the page range"); } } this.pageRanges.Add(pageRange); } - internal Dictionary ToDictionary() + internal Dictionary ToDictionary() { - Dictionary toReturn = new Dictionary(); + Dictionary toReturn = new Dictionary(); - if (this.orientation != PrintOrientation.Portrait) + if (this.Orientation != PrintOrientation.Portrait) { - toReturn["orientation"] = this.orientation.ToString().ToLowerInvariant(); + toReturn["orientation"] = this.Orientation.ToString().ToLowerInvariant(); } if (this.scale != 1.0) @@ -198,19 +198,19 @@ internal Dictionary ToDictionary() toReturn["scale"] = this.scale; } - if (this.background) + if (this.OutputBackgroundImages) { - toReturn["background"] = this.background; + toReturn["background"] = this.OutputBackgroundImages; } - if (!this.shrinkToFit) + if (!this.ShrinkToFit) { - toReturn["shrinkToFit"] = this.shrinkToFit; + toReturn["shrinkToFit"] = this.ShrinkToFit; } if (this.pageSize.Height != DefaultPageHeight || this.pageSize.Width != DefaultPageWidth) { - Dictionary pageSizeDictionary = new Dictionary(); + Dictionary pageSizeDictionary = new Dictionary(); pageSizeDictionary["width"] = this.pageSize.Width; pageSizeDictionary["height"] = this.pageSize.Height; toReturn["page"] = pageSizeDictionary; @@ -218,7 +218,7 @@ internal Dictionary ToDictionary() if (this.margins.Top != DefaultMarginSize || this.margins.Bottom != DefaultMarginSize || this.margins.Left != DefaultMarginSize || this.margins.Right != DefaultMarginSize) { - Dictionary marginsDictionary = new Dictionary(); + Dictionary marginsDictionary = new Dictionary(); marginsDictionary["top"] = this.margins.Top; marginsDictionary["bottom"] = this.margins.Bottom; marginsDictionary["left"] = this.margins.Left; @@ -228,7 +228,7 @@ internal Dictionary ToDictionary() if (this.pageRanges.Count > 0) { - toReturn["pageRanges"] = new List(this.pageRanges); + toReturn["pageRanges"] = new List(this.pageRanges); } return toReturn; @@ -237,16 +237,18 @@ internal Dictionary ToDictionary() private static int ParsePageRangePart(string pageRangePart, int defaultValue) { pageRangePart = pageRangePart.Trim(); - int pageRangePartValue = defaultValue; - if (!string.IsNullOrEmpty(pageRangePart)) + + if (string.IsNullOrEmpty(pageRangePart)) { - if (!int.TryParse(pageRangePart, NumberStyles.Integer, CultureInfo.InvariantCulture, out pageRangePartValue)) - { - throw new ArgumentException("Parts of a page range must be an empty string or an integer"); - } + return defaultValue; + } + + if (int.TryParse(pageRangePart, NumberStyles.Integer, CultureInfo.InvariantCulture, out int pageRangePartValue)) + { + return pageRangePartValue; } - return pageRangePartValue; + throw new ArgumentException("Parts of a page range must be an empty string or an integer"); } /// @@ -260,53 +262,57 @@ public class PageSize /// /// Gets or sets the height of each page in centimeters. /// + /// If the value is set to a negative value. public double Height { - get { return height; } + get => this.height; set { if (value < 0) { - throw new ArgumentException("Height must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(value), "Height must be greater than or equal to zero."); } - height = value; + this.height = value; } } /// /// Gets or sets the width of each page in centimeters. /// + /// If the value is set to a negative value. public double Width { - get { return width; } + get => this.width; set { if (value < 0) { - throw new ArgumentException("Width must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(value), "Width must be greater than or equal to zero."); } - width = value; + this.width = value; } } /// /// Gets or sets the height of each page in inches. /// + /// If the value is set to a negative value. public double HeightInInches { - get { return Height / CentimetersPerInch; } - set { Height = value * CentimetersPerInch; } + get => this.Height / CentimetersPerInch; + set => this.Height = value * CentimetersPerInch; } /// /// Gets or sets the width of each page in inches. /// + /// If the value is set to a negative value. public double WidthInInches { - get { return Width / CentimetersPerInch; } - set { Width = value * CentimetersPerInch; } + get => this.Width / CentimetersPerInch; + set => this.Width = value * CentimetersPerInch; } } @@ -323,68 +329,72 @@ public class Margins /// /// Gets or sets the top margin of the print options. /// + /// If the value is set to a negative value. public double Top { - get { return top; } + get => this.top; set { if (value < 0) { - throw new ArgumentException("Top margin must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(value), "Top margin must be greater than or equal to zero."); } - top = value; + this.top = value; } } /// /// Gets or sets the bottom margin of the print options. /// + /// If the value is set to a negative value. public double Bottom { - get { return bottom; } + get => this.bottom; set { if (value < 0) { - throw new ArgumentException("Bottom margin must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(value), "Bottom margin must be greater than or equal to zero."); } - bottom = value; + this.bottom = value; } } /// /// Gets or sets the left margin of the print options. /// + /// If the value is set to a negative value. public double Left { - get { return left; } + get => this.left; set { if (value < 0) { - throw new ArgumentException("Left margin must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(value), "Left margin must be greater than or equal to zero."); } - left = value; + this.left = value; } } /// /// Gets or sets the right margin of the print options. /// + /// If the value is set to a negative value. public double Right { - get { return right; } + get => this.right; set { if (value < 0) { - throw new ArgumentException("Right margin must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(value), "Right margin must be greater than or equal to zero."); } - right = value; + this.right = value; } } } diff --git a/dotnet/src/webdriver/Screenshot.cs b/dotnet/src/webdriver/Screenshot.cs index 67b59aab6ac01e..7b5f869fb6728f 100644 --- a/dotnet/src/webdriver/Screenshot.cs +++ b/dotnet/src/webdriver/Screenshot.cs @@ -20,6 +20,8 @@ using System; using System.IO; +#nullable enable + namespace OpenQA.Selenium { /// @@ -32,6 +34,13 @@ public class Screenshot : EncodedFile /// Initializes a new instance of the class. /// /// The image of the page as a Base64-encoded string. + /// If is . + /// + /// The length of , ignoring white-space characters, is not zero or a multiple of 4. + /// -or- + /// The format of is invalid. contains a non-base-64 character, + /// more than two padding characters, or a non-white space-character among the padding characters. + /// public Screenshot(string base64EncodedScreenshot) : base(base64EncodedScreenshot) { } diff --git a/dotnet/src/webdriver/ShadowRoot.cs b/dotnet/src/webdriver/ShadowRoot.cs index 459674b27c1d5a..a872d4fbc7d74a 100644 --- a/dotnet/src/webdriver/ShadowRoot.cs +++ b/dotnet/src/webdriver/ShadowRoot.cs @@ -21,6 +21,9 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; + +#nullable enable namespace OpenQA.Selenium { @@ -34,49 +37,46 @@ public class ShadowRoot : ISearchContext, IWrapsDriver, IWebDriverObjectReferenc /// public const string ShadowRootReferencePropertyName = "shadow-6066-11e4-a52e-4f735466cecf"; - private WebDriver driver; - private string shadowRootId; + private readonly WebDriver driver; + private readonly string shadowRootId; /// /// Initializes a new instance of the class. /// /// The instance that is driving this shadow root. /// The ID value provided to identify the shadow root. + /// If or are . public ShadowRoot(WebDriver parentDriver, string id) { - this.driver = parentDriver; - this.shadowRootId = id; + this.driver = parentDriver ?? throw new ArgumentNullException(nameof(parentDriver)); + this.shadowRootId = id ?? throw new ArgumentNullException(nameof(id)); } /// /// Gets the driving this shadow root. /// - public IWebDriver WrappedDriver - { - get { return this.driver; } - } + public IWebDriver WrappedDriver => this.driver; /// /// Gets the internal ID for this ShadowRoot. /// - string IWebDriverObjectReference.ObjectReferenceId - { - get { return this.shadowRootId; } - } + string IWebDriverObjectReference.ObjectReferenceId => this.shadowRootId; - internal static bool ContainsShadowRootReference(Dictionary shadowRootDictionary) + internal static bool TryCreate(WebDriver parentDriver, Dictionary shadowRootDictionary, [NotNullWhen(true)] out ShadowRoot? shadowRoot) { - if (shadowRootDictionary == null) + if (shadowRootDictionary is null) { throw new ArgumentNullException(nameof(shadowRootDictionary), "The dictionary containing the shadow root reference cannot be null"); } - return shadowRootDictionary.ContainsKey(ShadowRootReferencePropertyName); - } + if (shadowRootDictionary.TryGetValue(ShadowRootReferencePropertyName, out object? shadowRootValue)) + { + shadowRoot = new ShadowRoot(parentDriver, shadowRootValue?.ToString()!); + return true; + } - internal static ShadowRoot FromDictionary(WebDriver driver, Dictionary shadowRootDictionary) - { - return new ShadowRoot(driver, shadowRootDictionary[ShadowRoot.ShadowRootReferencePropertyName].ToString()); + shadowRoot = null; + return false; } /// @@ -84,18 +84,20 @@ internal static ShadowRoot FromDictionary(WebDriver driver, Dictionary /// The locating mechanism to use. /// The first matching on the current context. + /// If is . /// If no element matches the criteria. public IWebElement FindElement(By by) { - if (by == null) + if (by is null) { - throw new ArgumentNullException(nameof(@by), "by cannot be null"); + throw new ArgumentNullException(nameof(by), "by cannot be null"); } Dictionary parameters = new Dictionary(); parameters.Add("id", this.shadowRootId); parameters.Add("using", by.Mechanism); parameters.Add("value", by.Criteria); + Response commandResponse = this.driver.InternalExecute(DriverCommand.FindShadowChildElement, parameters); return this.driver.GetElementFromResponse(commandResponse); } @@ -107,26 +109,29 @@ public IWebElement FindElement(By by) /// The locating mechanism to use. /// A of all WebElements /// matching the current criteria, or an empty list if nothing matches. + /// If is . public ReadOnlyCollection FindElements(By by) { - if (by == null) + if (by is null) { - throw new ArgumentNullException(nameof(@by), "by cannot be null"); + throw new ArgumentNullException(nameof(by), "by cannot be null"); } Dictionary parameters = new Dictionary(); parameters.Add("id", this.shadowRootId); parameters.Add("using", by.Mechanism); parameters.Add("value", by.Criteria); + Response commandResponse = this.driver.InternalExecute(DriverCommand.FindShadowChildElements, parameters); return this.driver.GetElementsFromResponse(commandResponse); } Dictionary IWebDriverObjectReference.ToDictionary() { - Dictionary shadowRootDictionary = new Dictionary(); - shadowRootDictionary.Add(ShadowRootReferencePropertyName, this.shadowRootId); - return shadowRootDictionary; + return new Dictionary + { + [ShadowRootReferencePropertyName] = this.shadowRootId + }; } } } diff --git a/dotnet/src/webdriver/WebDriver.StrongNamed.nuspec b/dotnet/src/webdriver/WebDriver.StrongNamed.nuspec index 9c7dea901536f2..34f1966e68b507 100644 --- a/dotnet/src/webdriver/WebDriver.StrongNamed.nuspec +++ b/dotnet/src/webdriver/WebDriver.StrongNamed.nuspec @@ -24,7 +24,7 @@ - + diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index 6bd964136c9283..d9960ea97b2351 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -45,7 +45,6 @@ public class WebDriver : IWebDriver, ISearchContext, IJavaScriptExecutor, IFinds private NetworkManager network; private WebElementFactory elementFactory; private SessionId sessionId; - private String authenticatorId; private List registeredCommands = new List(); /// @@ -380,8 +379,14 @@ public Screenshot GetScreenshot() /// /// A object describing the options of the printed document. /// The object containing the PDF-formatted print representation of the page. + /// If is . public PrintDocument Print(PrintOptions printOptions) { + if (printOptions is null) + { + throw new ArgumentNullException(nameof(printOptions)); + } + Response commandResponse = this.Execute(DriverCommand.Print, printOptions.ToDictionary()); string base64 = commandResponse.Value.ToString(); return new PrintDocument(base64); @@ -974,9 +979,9 @@ private object ParseJavaScriptReturnValue(object responseValue) { returnValue = this.elementFactory.CreateElement(resultAsDictionary); } - else if (ShadowRoot.ContainsShadowRootReference(resultAsDictionary)) + else if (ShadowRoot.TryCreate(this, resultAsDictionary, out ShadowRoot shadowRoot)) { - returnValue = ShadowRoot.FromDictionary(this, resultAsDictionary); + returnValue = shadowRoot; } else { @@ -1040,8 +1045,8 @@ public string AddVirtualAuthenticator(VirtualAuthenticatorOptions options) { Response commandResponse = this.Execute(DriverCommand.AddVirtualAuthenticator, options.ToDictionary()); string id = commandResponse.Value.ToString(); - this.authenticatorId = id; - return this.authenticatorId; + this.AuthenticatorId = id; + return this.AuthenticatorId; } /// @@ -1051,15 +1056,15 @@ public string AddVirtualAuthenticator(VirtualAuthenticatorOptions options) public void RemoveVirtualAuthenticator(string authenticatorId) { Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.authenticatorId); + parameters.Add("authenticatorId", this.AuthenticatorId); this.Execute(DriverCommand.RemoveVirtualAuthenticator, parameters); - this.authenticatorId = null; + this.AuthenticatorId = null; } /// /// Gets the virtual authenticator ID for this WebDriver instance. /// - public string AuthenticatorId { get; } + public string AuthenticatorId { get; private set; } /// /// Add a credential to the Virtual Authenticator/ @@ -1068,7 +1073,7 @@ public void RemoveVirtualAuthenticator(string authenticatorId) public void AddCredential(Credential credential) { Dictionary parameters = new Dictionary(credential.ToDictionary()); - parameters.Add("authenticatorId", this.authenticatorId); + parameters.Add("authenticatorId", this.AuthenticatorId); this.Execute(driverCommandToExecute: DriverCommand.AddCredential, parameters); } @@ -1080,7 +1085,7 @@ public void AddCredential(Credential credential) public List GetCredentials() { Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.authenticatorId); + parameters.Add("authenticatorId", this.AuthenticatorId); object[] commandResponse = (object[])this.Execute(driverCommandToExecute: DriverCommand.GetCredentials, parameters).Value; @@ -1111,7 +1116,7 @@ public void RemoveCredential(byte[] credentialId) public void RemoveCredential(string credentialId) { Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.authenticatorId); + parameters.Add("authenticatorId", this.AuthenticatorId); parameters.Add("credentialId", credentialId); this.Execute(driverCommandToExecute: DriverCommand.RemoveCredential, parameters); @@ -1123,7 +1128,7 @@ public void RemoveCredential(string credentialId) public void RemoveAllCredentials() { Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.authenticatorId); + parameters.Add("authenticatorId", this.AuthenticatorId); this.Execute(driverCommandToExecute: DriverCommand.RemoveAllCredentials, parameters); } @@ -1135,7 +1140,7 @@ public void RemoveAllCredentials() public void SetUserVerified(bool verified) { Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.authenticatorId); + parameters.Add("authenticatorId", this.AuthenticatorId); parameters.Add("isUserVerified", verified); this.Execute(driverCommandToExecute: DriverCommand.SetUserVerified, parameters); diff --git a/dotnet/src/webdriver/WebDriver.csproj b/dotnet/src/webdriver/WebDriver.csproj index e9acf442d70c16..c6369e782047ea 100644 --- a/dotnet/src/webdriver/WebDriver.csproj +++ b/dotnet/src/webdriver/WebDriver.csproj @@ -52,7 +52,7 @@ - + diff --git a/dotnet/src/webdriver/WebDriver.nuspec b/dotnet/src/webdriver/WebDriver.nuspec index b582625550670e..4a66fae656f903 100644 --- a/dotnet/src/webdriver/WebDriver.nuspec +++ b/dotnet/src/webdriver/WebDriver.nuspec @@ -24,7 +24,7 @@ - + diff --git a/dotnet/src/webdriver/WebElement.cs b/dotnet/src/webdriver/WebElement.cs index 51cce73e1eb67b..b3e4356ca55b14 100644 --- a/dotnet/src/webdriver/WebElement.cs +++ b/dotnet/src/webdriver/WebElement.cs @@ -411,6 +411,7 @@ public virtual ReadOnlyCollection FindElements(string mechanism, st /// via JavaScript. /// /// Thrown when the target element is no longer valid in the document DOM. + [Obsolete("Use GetDomAttribute(string attributeName) or GetDomProperty(string propertyName). GetAttribute(string attributeName) will be removed in Selenium 6.")] public virtual string GetAttribute(string attributeName) { Response commandResponse = null; diff --git a/dotnet/test/common/CustomDriverConfigs/StableChannelChromeDriver.cs b/dotnet/test/common/CustomDriverConfigs/StableChannelChromeDriver.cs index 9ed2a32bddfc0e..fe5728aa971df2 100644 --- a/dotnet/test/common/CustomDriverConfigs/StableChannelChromeDriver.cs +++ b/dotnet/test/common/CustomDriverConfigs/StableChannelChromeDriver.cs @@ -39,7 +39,7 @@ public StableChannelChromeDriver(ChromeDriverService service, ChromeOptions opti public static ChromeOptions DefaultOptions { - get { return new ChromeOptions() { BrowserVersion = "130" }; } + get { return new ChromeOptions() { BrowserVersion = "131" }; } } } } diff --git a/dotnet/test/common/DevTools/DevToolsConsoleTest.cs b/dotnet/test/common/DevTools/DevToolsConsoleTest.cs index e352e575c773e6..a91bc591a7abc3 100644 --- a/dotnet/test/common/DevTools/DevToolsConsoleTest.cs +++ b/dotnet/test/common/DevTools/DevToolsConsoleTest.cs @@ -25,7 +25,7 @@ namespace OpenQA.Selenium.DevTools { - using CurrentCdpVersion = V130; + using CurrentCdpVersion = V131; [TestFixture] public class DevToolsConsoleTest : DevToolsTestFixture diff --git a/dotnet/test/common/DevTools/DevToolsLogTest.cs b/dotnet/test/common/DevTools/DevToolsLogTest.cs index 00872c8729252a..f9e96be1a7bd14 100644 --- a/dotnet/test/common/DevTools/DevToolsLogTest.cs +++ b/dotnet/test/common/DevTools/DevToolsLogTest.cs @@ -25,7 +25,7 @@ namespace OpenQA.Selenium.DevTools { - using CurrentCdpVersion = V130; + using CurrentCdpVersion = V131; [TestFixture] public class DevToolsLogTest : DevToolsTestFixture diff --git a/dotnet/test/common/DevTools/DevToolsNetworkTest.cs b/dotnet/test/common/DevTools/DevToolsNetworkTest.cs index d9a45c3652be4b..a842e1445c27c6 100644 --- a/dotnet/test/common/DevTools/DevToolsNetworkTest.cs +++ b/dotnet/test/common/DevTools/DevToolsNetworkTest.cs @@ -25,7 +25,7 @@ namespace OpenQA.Selenium.DevTools { - using CurrentCdpVersion = V130; + using CurrentCdpVersion = V131; [TestFixture] public class DevToolsNetworkTest : DevToolsTestFixture diff --git a/dotnet/test/common/DevTools/DevToolsPerformanceTest.cs b/dotnet/test/common/DevTools/DevToolsPerformanceTest.cs index 50b235311155fc..5dc5c4011b6f56 100644 --- a/dotnet/test/common/DevTools/DevToolsPerformanceTest.cs +++ b/dotnet/test/common/DevTools/DevToolsPerformanceTest.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.DevTools { - using CurrentCdpVersion = V130; + using CurrentCdpVersion = V131; [TestFixture] public class DevToolsPerformanceTest : DevToolsTestFixture diff --git a/dotnet/test/common/DevTools/DevToolsProfilerTest.cs b/dotnet/test/common/DevTools/DevToolsProfilerTest.cs index 0a5c13d16234c0..985a336e2c94e7 100644 --- a/dotnet/test/common/DevTools/DevToolsProfilerTest.cs +++ b/dotnet/test/common/DevTools/DevToolsProfilerTest.cs @@ -24,7 +24,7 @@ namespace OpenQA.Selenium.DevTools { - using CurrentCdpVersion = V130; + using CurrentCdpVersion = V131; [TestFixture] public class DevToolsProfilerTest : DevToolsTestFixture diff --git a/dotnet/test/common/DevTools/DevToolsSecurityTest.cs b/dotnet/test/common/DevTools/DevToolsSecurityTest.cs index 6ecffc5ab17953..47af8e49a0c5a5 100644 --- a/dotnet/test/common/DevTools/DevToolsSecurityTest.cs +++ b/dotnet/test/common/DevTools/DevToolsSecurityTest.cs @@ -25,7 +25,7 @@ namespace OpenQA.Selenium.DevTools { - using CurrentCdpVersion = V130; + using CurrentCdpVersion = V131; [TestFixture] public class DevToolsSecurityTest : DevToolsTestFixture diff --git a/dotnet/test/common/DevTools/DevToolsTabsTest.cs b/dotnet/test/common/DevTools/DevToolsTabsTest.cs index 5bb4065d4fcbe6..23ad303e0dea35 100644 --- a/dotnet/test/common/DevTools/DevToolsTabsTest.cs +++ b/dotnet/test/common/DevTools/DevToolsTabsTest.cs @@ -22,7 +22,7 @@ namespace OpenQA.Selenium.DevTools { - using CurrentCdpVersion = V130; + using CurrentCdpVersion = V131; [TestFixture] public class DevToolsTabsTest : DevToolsTestFixture diff --git a/dotnet/test/common/DevTools/DevToolsTargetTest.cs b/dotnet/test/common/DevTools/DevToolsTargetTest.cs index 5b1358bbdf2b9a..2752d6dc347f23 100644 --- a/dotnet/test/common/DevTools/DevToolsTargetTest.cs +++ b/dotnet/test/common/DevTools/DevToolsTargetTest.cs @@ -25,12 +25,12 @@ namespace OpenQA.Selenium.DevTools { - using CurrentCdpVersion = V130; + using CurrentCdpVersion = V131; [TestFixture] public class DevToolsTargetTest : DevToolsTestFixture { - private int id = 130; + private int id = 131; [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] diff --git a/dotnet/test/common/PrintTest.cs b/dotnet/test/common/PrintTest.cs index f48f63f4815fc7..324fc6e399c484 100644 --- a/dotnet/test/common/PrintTest.cs +++ b/dotnet/test/common/PrintTest.cs @@ -89,5 +89,38 @@ public void MarginsCannotBeNull() { Assert.That(() => new PrintOptions { PageMargins = null }, Throws.InstanceOf()); } + + [Test] + public void PageNumberCannotHaveInvalidValues() + { + Assert.That(() => new PrintOptions().AddPageToPrint(-1), Throws.TypeOf()); + Assert.That(() => new PrintOptions().AddPageRangeToPrint(null), Throws.TypeOf()); + Assert.That(() => new PrintOptions().AddPageRangeToPrint(""), Throws.TypeOf()); + Assert.That(() => new PrintOptions().AddPageRangeToPrint("1-2-3"), Throws.TypeOf()); + Assert.That(() => + { + var options = new PrintOptions(); + options.AddPageToPrint(1); + options.AddPageToPrint(1); + }, Throws.TypeOf()); + } + + [Test] + public void PageSizeCannotHaveNegativeValues() + { + Assert.That(() => new PrintOptions.PageSize { Height = -1 }, Throws.TypeOf()); + Assert.That(() => new PrintOptions.PageSize { HeightInInches = -1 }, Throws.TypeOf()); + Assert.That(() => new PrintOptions.PageSize { Width = -1 }, Throws.TypeOf()); + Assert.That(() => new PrintOptions.PageSize { WidthInInches = -1 }, Throws.TypeOf()); + } + + [Test] + public void MarginsCannotHaveNegativeValues() + { + Assert.That(() => new PrintOptions.Margins { Top = -1 }, Throws.TypeOf()); + Assert.That(() => new PrintOptions.Margins { Bottom = -1 }, Throws.TypeOf()); + Assert.That(() => new PrintOptions.Margins { Left = -1 }, Throws.TypeOf()); + Assert.That(() => new PrintOptions.Margins { Right = -1 }, Throws.TypeOf()); + } } } diff --git a/dotnet/test/common/ShadowRootHandlingTest.cs b/dotnet/test/common/ShadowRootHandlingTest.cs index 2d014aa865e95d..7fa25654dd10f0 100644 --- a/dotnet/test/common/ShadowRootHandlingTest.cs +++ b/dotnet/test/common/ShadowRootHandlingTest.cs @@ -47,6 +47,8 @@ public void ShouldFindElementUnderShadowRoot() } [Test] + [IgnoreBrowser(Browser.Chrome, "https://issues.chromium.org/issues/375892677")] + [IgnoreBrowser(Browser.Edge, "https://issues.chromium.org/issues/375892677")] public void ShouldThrowGettingShadowRootWithElementNotHavingShadowRoot() { driver.Url = shadowRootPage; diff --git a/dotnet/test/common/VirtualAuthn/VirtualAuthenticatorTest.cs b/dotnet/test/common/VirtualAuthn/VirtualAuthenticatorTest.cs index a5a8d53d73da4b..e6c16e11b673a9 100644 --- a/dotnet/test/common/VirtualAuthn/VirtualAuthenticatorTest.cs +++ b/dotnet/test/common/VirtualAuthn/VirtualAuthenticatorTest.cs @@ -71,7 +71,8 @@ public void Setup() [TearDown] public void Teardown() { - if (webDriver.AuthenticatorId != null) + if (webDriver.AuthenticatorId is not null && + webDriver.SessionId is not null) { webDriver.RemoveVirtualAuthenticator(webDriver.AuthenticatorId); } @@ -186,6 +187,8 @@ public void ShouldRemoveAuthenticator() { VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions(); string authenticatorId = webDriver.AddVirtualAuthenticator(options); + Assert.That(webDriver.AuthenticatorId, Is.EqualTo(authenticatorId)); + webDriver.RemoveVirtualAuthenticator(authenticatorId); Assert.IsNull(webDriver.AuthenticatorId); diff --git a/java/CHANGELOG b/java/CHANGELOG index 98cf2a20a00a6f..75b10d630960f1 100644 --- a/java/CHANGELOG +++ b/java/CHANGELOG @@ -1,3 +1,33 @@ +v4.27.0 +====== +* Add CDP for Chrome 131 and remove 128 +* Add Firefox CDP deprecation warnings +* Throw Error When Using Unsupported Linux ARM (#14616) +* Enhance error message for NoSuchElementException and return unmodifiable set for pinned scripts (#14707) +* Fix SpotBugs bugs in the Selenium manager (#14608) +* Allow to cancel a pending http request +* Case insensitive header names in http requests (#14095) +* Consume the input of the connection +* Deleted the deprecated FormEncodedData (#14688) +* Add method to select options containing the provided text (#14426) +* Remove toml parser warning (#14711) +* Simplify reading http headers +* Mark WebElement.getAttribute deprecated (#14666) +* Search windows by name without recursion (#14782) +* [bidi] Add network request handler APIs (#14424) +* [bidi] Fix the mode "closed" for a node +* [grid] TomlConfig: migrate TOML library to tomlj/tomlj (#14470) +* [grid] Avoid starting a session which will be disposed after start +* [grid] Cancel pending request on client timeout +* [grid] Check session ownership once +* [grid] Detect a client timeout while session creation #14743 +* [grid] Prevent NPE in handling request with unsupported http method +* [grid] Retry creating a session in a distributed grid +* [grid] Shutdown the server backend on stop +* [grid] Speed up the server shutdown +* [grid] Stop a stale session more graceful +* [grid] Stop polling events on close + v4.26.0 ====== * Add CDP for Chrome 130 and remove 127 diff --git a/java/maven_install.json b/java/maven_install.json index a0078edf86f7c5..f7a2f0fe6bcded 100644 --- a/java/maven_install.json +++ b/java/maven_install.json @@ -1,14 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -740136818, - "__RESOLVED_ARTIFACTS_HASH": 314475666, - "conflict_resolution": { - "com.google.code.gson:gson:2.8.9": "com.google.code.gson:gson:2.11.0", - "com.google.errorprone:error_prone_annotations:2.3.2": "com.google.errorprone:error_prone_annotations:2.28.0", - "com.google.guava:guava:31.1-jre": "com.google.guava:guava:33.3.1-jre", - "com.google.j2objc:j2objc-annotations:1.3": "com.google.j2objc:j2objc-annotations:3.0.0", - "org.mockito:mockito-core:4.3.1": "org.mockito:mockito-core:5.14.2" - }, + "__INPUT_ARTIFACTS_HASH": -756051712, + "__RESOLVED_ARTIFACTS_HASH": -748733705, "artifacts": { "com.beust:jcommander": { "shasums": { @@ -19,10 +12,10 @@ }, "com.esotericsoftware:kryo": { "shasums": { - "jar": "ead0f39530d6f30d27791eeb81621f3d7445331a06c32b3302e0ebe9e04b3a5d", - "sources": "fe808d5e9370797ebeddd87f1aefb84c15281a18148388645c79c2382acc1e5f" + "jar": "4e8b1d2f4977187af8a51a957329722dc1cdc56a7c94fbb5a791e82897629cff", + "sources": "acd9090539befa5421466ea1001dd808927af3f7d0ff12340ff518c15a9c5f4e" }, - "version": "5.6.0" + "version": "5.6.2" }, "com.esotericsoftware:minlog": { "shasums": { @@ -40,31 +33,31 @@ }, "com.fasterxml.jackson.core:jackson-annotations": { "shasums": { - "jar": "a09367d2eeb526873abf737ff754c5085f82073a382ee72c3bbe15412217671f", - "sources": "506c61d1efe6cf7aff5ec13a4b87532185e7a872dc2ffea66dc57bdcc1108f15" + "jar": "b7f9df5dac9a85f47fdb2769455ee8ba9cf2fe9b7c4cf636e0aec83479d7882f", + "sources": "de28b02b11bbbfa1c067473de8fa48ca2d1265b9410a27030426732dbb3dbeaf" }, - "version": "2.18.0" + "version": "2.18.1" }, "com.fasterxml.jackson.core:jackson-core": { "shasums": { - "jar": "215bbd7c8fd65be504cb92ff3aa1c4b790fc7b14cca72f4546aac4143c101bb5", - "sources": "afb36a31e0038a31d79e30719315ad5c7a1e140443ef400108d104d72c943162" + "jar": "ebe19596ad19f7a0514c8bb8f7b0acf85239a4eff5ae03229e9760d268d29c22", + "sources": "9b5089257fc20d3ba139b671e816c02b7c925705a8ad6c4a9937eb067581ea58" }, - "version": "2.18.0" + "version": "2.18.1" }, "com.fasterxml.jackson.core:jackson-databind": { "shasums": { - "jar": "2bf1927b7f3224683ed0157a1ec3b0ede75179da3e597d78c572d56ed00f9f3c", - "sources": "0531788c8193e81e40e16ff7c16401d7c5cb629ed493bb13d091d980bc425123" + "jar": "711bc3bf86d31d02968b9279efb07a6ad60adfc0baa0e9fe66d71a0ac2556234", + "sources": "992f36c82e422e4847f5f63f7acf3e4266a4154ea0af9408d56bc81392473615" }, - "version": "2.18.0" + "version": "2.18.1" }, "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { "shasums": { - "jar": "1e14646be85443e9be00c18fe7d67b71953edaed97ce0b30ce822279933aeaca", - "sources": "6fb2e6b2b39e2a93787f5d8ce3ea851623af6f1ecdbce2a724732936ade12fd4" + "jar": "b764452d6cdd644666bba2da35ef8e6dfb86b7a59d24d1d98ea2fcf1e6bb08b2", + "sources": "5abfc0355821094c67dacb3a0688a755053858c3e0ebeefc488afea75867ad81" }, - "version": "2.18.0" + "version": "2.18.1" }, "com.github.javaparser:javaparser-core": { "shasums": { @@ -138,17 +131,17 @@ }, "com.google.errorprone:error_prone_annotations": { "shasums": { - "jar": "f3fc8a3a0a4020706a373b00e7f57c2512dd26d1f83d28c7d38768f8682b231e", - "sources": "2936e9b315d790d8a6364f0574bcec9c8b2d78688b317e1765c4a16f9ef80632" + "jar": "357cd6cfb067c969226c442451502aee13800a24e950fdfde77bcdb4565a668d", + "sources": "7ce688ed1582a67097228c050192b7cfd00479a81d2b921f7cd5116994f1402d" }, - "version": "2.28.0" + "version": "2.3.2" }, "com.google.googlejavaformat:google-java-format": { "shasums": { - "jar": "9a4e0b9f4ec4d71a8a1d3641fd481118100fda2eeab712dbdfd4b2a06e9de4ce", - "sources": "d4dfd144c7dceca98cfa479591398160558c0311750eed069ebd796cda420d55" + "jar": "e9e3f83d1bf47a47d28d93b06ff0263421bc2dc5de75e238a12d8aea682ccbfd", + "sources": "40c30f0d367502d24da61c7d692f6f7d0f0e5b4d12289f99c53f1fa669bbad3d" }, - "version": "1.24.0" + "version": "1.25.0" }, "com.google.guava:failureaccess": { "shasums": { @@ -173,17 +166,16 @@ }, "com.google.guava:listenablefuture": { "shasums": { - "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", - "sources": null + "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99" }, "version": "9999.0-empty-to-avoid-conflict-with-guava" }, "com.google.j2objc:j2objc-annotations": { "shasums": { - "jar": "88241573467ddca44ffd4d74aa04c2bbfd11bf7c17e0c342c94c9de7a70a7c64", - "sources": "bd60019a0423c3a025ef6ab24fe0761f5f45ffb48a8cca74a01b678de1105d38" + "jar": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", + "sources": "ba4df669fec153fa4cd0ef8d02c6d3ef0702b7ac4cabe080facf3b6e490bb972" }, - "version": "3.0.0" + "version": "1.3" }, "com.google.truth:truth": { "shasums": { @@ -257,199 +249,199 @@ }, "io.lettuce:lettuce-core": { "shasums": { - "jar": "3257b7708b94597aece90f8ff234761f422b458e68907a67d7711fde7ec87111", - "sources": "694ec0daa3961915bd84f78ce1f7cc8d5e4183a14d1dd71b1497a46f8df82a59" + "jar": "bcadafb28f41343d39bf90820b8349e3462e43d7e5c0edc3f9886aa661972015", + "sources": "67d988cdd8d2e62a8c9c3c86ea812bf0020e59090ebd3469bfc0cca554d8d631" }, - "version": "6.4.0.RELEASE" + "version": "6.5.0.RELEASE" }, "io.netty:netty-buffer": { "shasums": { - "jar": "436ea25725d92c1f590a857d46dc1c8f5c54d7f2775984db2655e5e3bc0d97c9", - "sources": "62bec4230845ec978832f602b9a118b57955cf816da07b99fccd33430d5da3a8" + "jar": "4a7b331d3770c566ab70eb02a0d1feed63b95cf6e4d68c8fe778c4c9de2d116d", + "sources": "4fab39fb7a6ff8aed28433aa89c3d29e1286e8a8b2b2e77d5e542c801859cb1e" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-codec": { "shasums": { - "jar": "71d145491456b53212e38e24787bbbed0c77d850f7352e24e535d26a6eea913b", - "sources": "f0bc1dcab04f9c9fb9fb5450eb1636c7c99b67a772ceb7896e80094400e8c74c" + "jar": "cd189afb70ec6eacfcdfdd3a5f472b4e705a5c91d5bd3ef0386421f2ae15ec77", + "sources": "0546519a1db0ab595107ca451e6296ff9c7f3139bd569d6eabe232af98eedeab" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-codec-dns": { "shasums": { - "jar": "65d9690298403ada696a7cbf9ebab2106e9d6a9056ae51d5fda7c4c553d9a21a", - "sources": "edf01b849d83b8f6bbd754ed324e418a2c8cabf8659fa5316b285580307b85dd" + "jar": "23dd6806bcc326855f13e69838c6411d0490e6b1aeb12e217a19a3dd6ad3f10d", + "sources": "9fced4a3fc93413b03a25ddbbd2477f7032947fa0fe606fe796a1a6102c3e555" }, - "version": "4.1.113.Final" + "version": "4.1.115.Final" }, "io.netty:netty-codec-http": { "shasums": { - "jar": "56150ce900f6d931fce37a7fb05d7d75478d6d0b8b556a21781972eb9c3ed7df", - "sources": "69a06bd827300e88736660df76fc1d590379f2a161ca1fbc6aaaf8e1c9554ada" + "jar": "e6dbe971c59373bbae9802021c63b9bc1d8800fead382863d67e79e79b023166", + "sources": "b0228c970b95d394e0f42b3c3c1620c6eba4e9b5a8fd5943063258a39eaaf9c2" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-codec-http2": { "shasums": { - "jar": "e3e45427a46a8d5b03307a5bcd2eab3706b8b8d903c6a056fa3d1c9bf9738f24", - "sources": "e8e3f6c709ddcef83bfff99b144bc532e235dc8bdd685621179a7a08ddb763bd" + "jar": "cbed9829a5d582e91e314e209edce9a0c2eb369f23bb4fb74a5bc8b7990222c2", + "sources": "2b412de41e256fae0ecebad3e91c8b7f8ea5584467fe3305578102d8bd494c11" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-codec-socks": { "shasums": { - "jar": "2e48cb5af7cae82acbb8dcb7b0c9d67b9dddff3d6dd262cb8911fd4b5fd62ee2", - "sources": "2d90b45bc6f02c2c708c1773aae010b344b260bb4b033fbd01d054aed56f9c9e" + "jar": "e9b1cc744dc6195894450b1fd4d271a821ab167fe21ae3c459b27cdadc70e81f", + "sources": "9a731bc23fafca14775692bfbd23ad08826566eeed991335d181440eb0bae992" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-common": { "shasums": { - "jar": "d6b053b3b27cc568207f254902dcb6f95dd238c1b9d55ef719d2c4f8eb476223", - "sources": "fac8937c115808c600fcae35964e54ae4eef344b81c22f8de8913ca95ddbcebf" + "jar": "39f1b5a2aaa4eab5d036dfd0486e35a4276df412e092d36b2d88b494705a134d", + "sources": "c845481b98d301c7716a786b07cf0e94b1151db02e06da1878538a73489903e3" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-handler": { "shasums": { - "jar": "57be25ec6c8fa7052fe90119373d8bc979cd37fa0070a135c0e69f5f8e0ddad0", - "sources": "f07c13c7bd69f481136983bdf722fe64be29405065842010669d443455379c24" + "jar": "5972028cc863b74927ce0d11fb8d58f65da2560bef5602fe8ce8903bd306ca07", + "sources": "c1facec3ea662bbb8e918ab46fa8d0959ef49163f867b1351edb3a6bc028cda1" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-handler-proxy": { "shasums": { - "jar": "35555b41624c8384de773bc3d17eb2447f5449842119db0435a366372aceefd1", - "sources": "af00561a494ad88a960b02ffae8153bd7c04cd2aa87183e884ad146fee67cda9" + "jar": "807e67cfb17136927d11db42df62031169d1fa0883e13f254906994c84ffbe87", + "sources": "4a3a309e72ecff5efaed3bbf80475d49b884f2c32de25d7293e593900b2b8cac" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-resolver": { "shasums": { - "jar": "19661e7f1dbdee97fe99a227fbed0696d29c3cdf3f8f2d9839a790695c2bf0ac", - "sources": "83ddf3e14d989e90d28811e7c2697dfef35061fe63b8939ddaf42e5c91235681" + "jar": "7b3455d14f59828765a00573bc3967dc59379e874bd62a67eb1926d6512109d1", + "sources": "b56c0ad382a2ba9586df13c4b3dab11f65fadec95b2728997f8793634724298c" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-resolver-dns": { "shasums": { - "jar": "65c3bd4569bbe7d3d9b7b9991ac5fd2b1336d6f7a19e76fc60aa23a9bfe3b8f9", - "sources": "cfb42f6612adce6345ee5eca93fe4f5bf6540314fd3c2b8c561c255ac3299d53" + "jar": "4aca31593e5896c64ab7e041bbc6c0d851bd9634ec3a4354208141a35576619f", + "sources": "6fde922a5f66d3e550f14571f3d180de0bfed7a2ea95ac520076c4def42de53f" }, - "version": "4.1.113.Final" + "version": "4.1.115.Final" }, "io.netty:netty-transport": { "shasums": { - "jar": "2a8609fe6a8b4c9d5965c6b901777b4bd0b26600647ee2aa7d4d93f4d5c780de", - "sources": "dd4923fb040730ea5ddb4cb66a0e236ffe75385a201badd7902a99e5fad81ee4" + "jar": "c3d71faaa736ffd2c9260ab0b498024b814c39c7d764bea8113fa98de6e2bdd2", + "sources": "162c3531b2819f6b51ca9c59b54508b782e462549b1fffeed9771a1a718a84eb" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.netty:netty-transport-native-unix-common": { "shasums": { - "jar": "fd64c07c9e068f80dc271f6277278246328a171be669abdfe0bc8b2226d980de", - "sources": "84e5081550855aa7567a215b94fdc6cd7e8c62dabc9503fc2c3c72e0c3855a48" + "jar": "4b03e716272657c296b0204b57c140b2b2ca96b1a746c92da41f595892ec6d88", + "sources": "5bfbcb52d0f0d52b996a427eb1b77927d182026c367366548d2c49d0825b5dd9" }, - "version": "4.1.114.Final" + "version": "4.1.115.Final" }, "io.opentelemetry.semconv:opentelemetry-semconv": { "shasums": { - "jar": "745a86a75ecb5e03f464f05ea2dc76e0f04d07273c5509fa74f393bff9b222b7", - "sources": "58a375cd34943d8dd4f64233b19fee6a5094e3ae533f77d527e75c276626d49e" + "jar": "e8ab86e93cef09e421a6213f4cf18421fcc6e1f9cf0ab94b9a31ed4460ddf553", + "sources": "b0588ae0617071c30451fe0f4916b2cde7aa8d24b542ee696a7bf59f7d7f46a8" }, - "version": "1.25.0-alpha" + "version": "1.28.0-alpha" }, "io.opentelemetry:opentelemetry-api": { "shasums": { - "jar": "4d08915aa1590bd64b3fced39bae06489e3f597c4bf7fa12f413e13c5a98be39", - "sources": "e8d0fbee6a7a19408e776bda9caecb2a4adeedf64cc196cfefd977837eb27300" + "jar": "097e2e71c8b8c813f4a13176baafbbbb124b1253f5c9fffd110bc2add74ace93", + "sources": "0d9d8c1391c2a8a79ebcb013f38c172ad4cbef6b52e690501e8cb55effabc9da" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-api-incubator": { "shasums": { - "jar": "a64d48638cdd4324e5ffab80c85784173f8c5068f059c07d8380f428d7c39ec8", - "sources": "871b4ef83803384b4a4ce794ea7b2384e0df70c8a15dc48afcf318525d7547f0" + "jar": "8dbf451ce580fa0252ee9ca77331fd21710710ca9b735a1359241ead3be8ebe5", + "sources": "400ee017921af6a987de5ca9aabd2afbd2989c1f3c9eaedc4f1ff8299eace6c1" }, - "version": "1.43.0-alpha" + "version": "1.44.1-alpha" }, "io.opentelemetry:opentelemetry-context": { "shasums": { - "jar": "83d54bed8a7aa74a8648d43974c743f470c9ceab3dea57f26a938667a2dc0160", - "sources": "6cbaf1ff211bd61fd5ac2dd5762e18db56913035c43c963c3863eeff2bb25888" + "jar": "006b3f7c3880356a86f02c40eedeba124f226a2f145fe904cc1b7def0088bab0", + "sources": "50f136587f0d1bf317fbfdd9cf5f589a321d7fd366e3cbea1dc511e458115324" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-exporter-logging": { "shasums": { - "jar": "68dff3d10b0875db8fa4c137f3e1f42f3fde8470f87463feae9c10acdcef7e32", - "sources": "652b5381cdba31eff8b8d402a296b03bdf49da423db0135251aee23794d5903d" + "jar": "9e8f887dcee2d71cab1a0215e09560f03f8d5c1d11edb41cf5512e4c75d3c483", + "sources": "97f391be2e361a7c200033418503d6bd71f09490f2aa7942cecb8bdc3e6313d5" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-sdk": { "shasums": { - "jar": "99fd821997190e9fa1a6f6820b8cedd8e38297ab727b3b98db4d86ab518c0155", - "sources": "d798a21f2338674cd9dc7249d67963f7328b9a0a702c91f65c9d20b4b1eff664" + "jar": "7c64f330ec197a1eb88059b97dc9376fdb9836695027c96a0cb4e74ef917cebe", + "sources": "567caff6fe790a8eef0195c712368c13bae2f5d69ebf51bf3f5393166be43e11" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-sdk-common": { "shasums": { - "jar": "8d0cc91322e85ea6f71dbf5d35f829808958fd0427e0c43aa3fdd2e94e56a48b", - "sources": "e240713669cc161a6898c9c405fdf0903f69ff35abde95827d1f6660df58c0cc" + "jar": "3770fc477ee0fab21e796bb559f0a996d38c744f3a170868d1b3b85b63b827d0", + "sources": "e1801125d48e0ba0cb016db0cea3445aaec57c322e6765ac788e3f9b959a3ec1" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure": { "shasums": { - "jar": "c731376048e1b2c89cf184227abfdb2e5baafb687fa4091901e97b4f3e8c6985", - "sources": "0cc04966769b3b65c8df3769ef90908eae77aa16fb6f82895d4ff80a4a198d75" + "jar": "22c312cbfefb1a6a8ab0973f3fffe82c32690898264aa5ba7941fbed333f46b7", + "sources": "948d49771e99dc47807e74f709d22d757af5a4c7d12725eeafa6d6486fab292a" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi": { "shasums": { - "jar": "ae0b08fbe8b3146ff2a8e14cc48af418d6f8f808527d00406b0778748cd07f24", - "sources": "c92792a6f691b68f513ae3b9d4a1bc97299881b08399f3fb1900e947e5434dca" + "jar": "f3478af96e4f2f5fd60283522553de4ce99c03606a16e460d07bc6eee12f9f95", + "sources": "46b251d7737595cf49cfb2f3bae905951efc4cf78085ba02c625f7fed781b89f" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-sdk-logs": { "shasums": { - "jar": "5465297bac529a32be7c3e37bc854f1f683df967551cc092397deaa2596f4462", - "sources": "234fb21e31806e054c53044cf97d82786390b3634cc94fd42b4fe5c12d86a553" + "jar": "ba4a97966ded2927dcaae6e91bf0a1707867e44cc3dd2ae4c7ef8214bdf8daf7", + "sources": "f6c63d81b3189fe1a76a712f4eff11b60300c093ce4d65ad73fee5b811648ca6" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-sdk-metrics": { "shasums": { - "jar": "b3cd4906157c559005d6890441d367730c337ad4d860adeee7ceda1106cfc245", - "sources": "d7523f6dbeb161fd4f0dabf1c6e414ab3eac153479acb95547155f5b16f8e557" + "jar": "3c09668a96f1e9443d2894ae456674c8c38b221c096c391fc81616daa672bf68", + "sources": "afe4b9c4cb2328bb2180cf4bc280293191eb3ab8b4165ab725bab9e73a194a1b" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-sdk-testing": { "shasums": { - "jar": "37512f646f55312cc0a646a0b508495d993d818aae2df5403497c5a096cd5571", - "sources": "bf62824394d155329ce095e4ad64cb6d3b2daf3f7a4b5c15dea21c5e3196ba5b" + "jar": "eff023fee9b71101eab3c70ab67cac1c28cbf41e357316eefc5dcafc161bad99", + "sources": "5e8e5636f16ce53ee91b5108a4b9fd232d171cfd98e0e6fafb4b968a2cd6e528" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.opentelemetry:opentelemetry-sdk-trace": { "shasums": { - "jar": "7e28072cf33eaa7d5e5f3ab2f8b2e51e54d24e0fe3dae3482769b0f6ff0dfcfc", - "sources": "b75d547249b04ad5163c17253018159f3f40a99d6d89719a82d11eb3d64588f1" + "jar": "ff013ab945567dccb5dde638f7a366519defbd2d138df1370936e847ef608c87", + "sources": "24f7b867a0f2f3203e4eb2069137bbd01936e7df7d08d3ec2dfcad478444ae27" }, - "version": "1.43.0" + "version": "1.44.1" }, "io.projectreactor:reactor-core": { "shasums": { - "jar": "44f055fbd033b6c976c53fb2e04b59027e79fb2312c37d2eaa54c77ea1ea80fe", - "sources": "fee913ed4e41d79ce1cf7db4526d23e848719083b65a4041dea590f91b1ef2f6" + "jar": "6e235f0be9732ebd6a42c585dfd53274065978bfbc28d721d7ecf487fde27b52", + "sources": "57e48b121636923ec362aa337556150edc8bc29ccba686c21d36016e05207b23" }, - "version": "3.6.6" + "version": "3.6.2" }, "io.reactivex.rxjava3:rxjava": { "shasums": { @@ -530,10 +522,10 @@ }, "org.apache.commons:commons-lang3": { "shasums": { - "jar": "7b96bf3ee68949abb5bc465559ac270e0551596fa34523fddf890ec418dde13c", - "sources": "ab3b86afb898f1026dbe43aaf71e9c1d719ec52d6e41887b362d86777c299b6f" + "jar": "d919d904486c037f8d193412da0c92e22a9fa24230b9d67a57855c5c31c7e94e", + "sources": "325a4551eee7d99f7616aa05b00ee3ca9d0cdc8face1b252a9864f2d945c58b3" }, - "version": "3.14.0" + "version": "3.12.0" }, "org.apache.commons:commons-text": { "shasums": { @@ -593,31 +585,31 @@ }, "org.bouncycastle:bcpkix-jdk18on": { "shasums": { - "jar": "4b48ea084e5232b9d79ebca1887b9de037b124931807cd60710748c2aee08cc9", - "sources": "ce8a110efa6f2beb40f5fa518e5a8b647cedd05d282df593f450cf5acd7d8ea2" + "jar": "3639a24ddf9ba4b7eba0659b44770e91eba816421888e571f285aadefe532cd6", + "sources": "e68973be5e2eed5c887e9e85d4ac68ceafe4d907e0f03bfb36db80964c904922" }, - "version": "1.78.1" + "version": "1.79" }, "org.bouncycastle:bcprov-jdk18on": { "shasums": { - "jar": "add5915e6acfc6ab5836e1fd8a5e21c6488536a8c1f21f386eeb3bf280b702d7", - "sources": "be87a544d921152cedcef4b740155047ef2f402544d47382b8c0b15dec11a642" + "jar": "0d81ecc3124536b539bce9aa3fe9621b7f84c9cee371b635a5b31c78b79ab1da", + "sources": "ddab0541b2490e3013cac96179c1c4a8a50685d9b39f29ce5b233b310061ed23" }, - "version": "1.78.1" + "version": "1.79" }, "org.bouncycastle:bcutil-jdk18on": { "shasums": { - "jar": "d9fa56f97b0f761ce3bc8d9d74c5d7137a987bf5bd3abfe1003f9bafa45a1d2f", - "sources": "667b6334ff25c4303d3b1af02599f8547fcc37d0d55393bcb17de4f179c78baa" + "jar": "c70b88ada58938cbc2f005d40329054078bcfa1149e6ffc03e9242eb6ab21836", + "sources": "eea160325180797639d715311a04af9702e45ceaed3dbb487ab28ca778434cb6" }, - "version": "1.78.1" + "version": "1.79" }, "org.checkerframework:checker-qual": { "shasums": { - "jar": "3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6", - "sources": "d6bdee58964cd05aabfca4e44947d3cbdada6bf617ed618b62b3b0d5a21de339" + "jar": "ab0468b1ba35bb2ae45f61a60dc4960bd887660ab8f05113a662a7e675eae776", + "sources": "cbe362ef1dfacb927e0e4bf78a97b1b92ba50ca38b4406ae58b8c11e41ef2075" }, - "version": "3.43.0" + "version": "3.9.1" }, "org.dom4j:dom4j": { "shasums": { @@ -642,17 +634,17 @@ }, "org.htmlunit:htmlunit-core-js": { "shasums": { - "jar": "70c9a224a75670a6d135e65deac885462e34a6756559170527cffcd613f3ca1a", - "sources": "87645340ab720096be5267b9ac820d60d968f690c024e8190be2942afe027309" + "jar": "709c43eaab5b407468239b49ba990a7170ee582cbaa6a11c09a6118da22fdedc", + "sources": "458acacd14d851ad0ad20310787b35d3224d0c31155bd6b17d41de2b352bb1b7" }, - "version": "4.5.0" + "version": "4.6.0" }, "org.jodd:jodd-util": { "shasums": { - "jar": "c9859921c4b94ac0c35fb2ce9a0bfc11d3e388888791c503e4cd085c5a436cf9", - "sources": "96202cfb22dc8e1832c0a9ad7731e2153594ef72b48a95decb054b79505c9767" + "jar": "e5c676715897124101f74900dd1f98ebbcad9da3ab2dffbac6e7712612094427", + "sources": "15b9eb016cc8fe52de6332cd9fb23eadba29393b0087635294aa2e23586b809f" }, - "version": "6.2.2" + "version": "6.3.0" }, "org.jspecify:jspecify": { "shasums": { @@ -719,10 +711,10 @@ }, "org.objenesis:objenesis": { "shasums": { - "jar": "02dfd0b0439a5591e35b708ed2f5474eb0948f53abf74637e959b8e4ef69bfeb", - "sources": "d06164f8ca002c8ef193cef2d682822014dd330505616af93a3fb64226fc131d" + "jar": "95488102feaf2e2858adf6b299353677dac6c15294006f8ed1c5556f8e3cd251", + "sources": "896fa899a262c2f0f7e661848025fad22349300a5247ac175510993a9a5eede9" }, - "version": "3.3" + "version": "3.4" }, "org.opentest4j:opentest4j": { "shasums": { @@ -733,10 +725,10 @@ }, "org.ow2.asm:asm": { "shasums": { - "jar": "adf46d5e34940bdf148ecdd26a9ee8eea94496a72034ff7141066b3eea5c4e9d", - "sources": "11dfd88129204be18c0f592f8e066d0c07d8a6bc001f6c7b2cce5ff0588d5d71" + "jar": "0df97574914aee92fd349d0cb4e00f3345d45b2c239e0bb50f0a90ead47888e0", + "sources": "829bc5eb0ccd705a7c8afbf7cdc4b7e9a9f733d3a1a954b9afffd99c8e063366" }, - "version": "9.7" + "version": "9.0" }, "org.ow2.asm:asm-analysis": { "shasums": { @@ -775,10 +767,10 @@ }, "org.redisson:redisson": { "shasums": { - "jar": "c9840ce1cc8ccf03e95ac6901add9e6342711caf5a1c00f52687b960d979209b", - "sources": "a26f27c9386b38d72d539e21664bc331db2c5b014b925226cb2227c9625057ee" + "jar": "6e905eabe16b5b53ee021293ac1fc4b56db2296ecdb341f6e2e27e93e8fefd22", + "sources": "654232025331ac2191a5e522f82fdf56253976c17ea54a269cf0cbcdb738d2d9" }, - "version": "3.37.0" + "version": "3.39.0" }, "org.slf4j:slf4j-api": { "shasums": { @@ -818,10 +810,10 @@ }, "org.yaml:snakeyaml": { "shasums": { - "jar": "1467931448a0817696ae2805b7b8b20bfb082652bf9c4efaed528930dc49389b", - "sources": "8f7cf911cf63db55fd980a926d155bd846317737351a2f48ef1c1088c414538a" + "jar": "63a76fe66b652360bd4c2c107e6f0258daa7d4bb492008ba8c26fcd230ff9146", + "sources": "127d0e66b80324f65821451827affb8c2f70914f0d7b7b0cb99d56d12e9901cc" }, - "version": "2.2" + "version": "2.3" }, "org.zeromq:jeromq": { "shasums": { @@ -1042,9 +1034,6 @@ "io.opentelemetry:opentelemetry-api-incubator", "io.opentelemetry:opentelemetry-sdk-common" ], - "io.projectreactor:reactor-core": [ - "org.reactivestreams:reactive-streams" - ], "io.reactivex.rxjava3:rxjava": [ "org.reactivestreams:reactive-streams" ], @@ -1182,9 +1171,6 @@ "eu.neilalexander:jnacl" ] }, - "skipped": [ - "com.google.guava:listenablefuture:jar:sources" - ], "packages": { "com.beust:jcommander": [ "com.beust.ah", @@ -1219,7 +1205,7 @@ "com.fasterxml.jackson.core.exc", "com.fasterxml.jackson.core.filter", "com.fasterxml.jackson.core.format", - "com.fasterxml.jackson.core.internal.shaded.fdp.v2_18_0", + "com.fasterxml.jackson.core.internal.shaded.fdp.v2_18_1", "com.fasterxml.jackson.core.io", "com.fasterxml.jackson.core.io.schubfach", "com.fasterxml.jackson.core.json", @@ -1391,7 +1377,6 @@ "com.google.googlejavaformat", "com.google.googlejavaformat.java", "com.google.googlejavaformat.java.filer", - "com.google.googlejavaformat.java.java17", "com.google.googlejavaformat.java.java21", "com.google.googlejavaformat.java.javadoc" ], @@ -1582,6 +1567,8 @@ "io.lettuce.core.event.jfr", "io.lettuce.core.event.metrics", "io.lettuce.core.internal", + "io.lettuce.core.json", + "io.lettuce.core.json.arguments", "io.lettuce.core.masterreplica", "io.lettuce.core.masterslave", "io.lettuce.core.metrics", @@ -1794,7 +1781,6 @@ "io.opentelemetry.sdk.trace.data", "io.opentelemetry.sdk.trace.export", "io.opentelemetry.sdk.trace.internal", - "io.opentelemetry.sdk.trace.internal.data", "io.opentelemetry.sdk.trace.samplers" ], "io.projectreactor:reactor-core": [ @@ -1957,9 +1943,6 @@ "net.bytebuddy.agent", "net.bytebuddy.agent.utility.nullability" ], - "net.bytebuddy:byte-buddy:jar:sources": [ - "net.bytebuddy.build" - ], "net.sf.saxon:Saxon-HE": [ "net.sf.saxon", "net.sf.saxon.dom", @@ -2063,8 +2046,7 @@ "org.apache.commons.lang3.text", "org.apache.commons.lang3.text.translate", "org.apache.commons.lang3.time", - "org.apache.commons.lang3.tuple", - "org.apache.commons.lang3.util" + "org.apache.commons.lang3.tuple" ], "org.apache.commons:commons-text": [ "org.apache.commons.text", @@ -2392,7 +2374,10 @@ "org.bouncycastle.jcajce.provider.asymmetric.elgamal", "org.bouncycastle.jcajce.provider.asymmetric.gost", "org.bouncycastle.jcajce.provider.asymmetric.ies", + "org.bouncycastle.jcajce.provider.asymmetric.mldsa", + "org.bouncycastle.jcajce.provider.asymmetric.mlkem", "org.bouncycastle.jcajce.provider.asymmetric.rsa", + "org.bouncycastle.jcajce.provider.asymmetric.slhdsa", "org.bouncycastle.jcajce.provider.asymmetric.util", "org.bouncycastle.jcajce.provider.asymmetric.x509", "org.bouncycastle.jcajce.provider.config", @@ -2430,18 +2415,20 @@ "org.bouncycastle.pqc.crypto.bike", "org.bouncycastle.pqc.crypto.cmce", "org.bouncycastle.pqc.crypto.crystals.dilithium", - "org.bouncycastle.pqc.crypto.crystals.kyber", "org.bouncycastle.pqc.crypto.falcon", "org.bouncycastle.pqc.crypto.frodo", "org.bouncycastle.pqc.crypto.gemss", "org.bouncycastle.pqc.crypto.hqc", "org.bouncycastle.pqc.crypto.lms", + "org.bouncycastle.pqc.crypto.mldsa", + "org.bouncycastle.pqc.crypto.mlkem", "org.bouncycastle.pqc.crypto.newhope", "org.bouncycastle.pqc.crypto.ntru", "org.bouncycastle.pqc.crypto.ntruprime", "org.bouncycastle.pqc.crypto.picnic", "org.bouncycastle.pqc.crypto.rainbow", "org.bouncycastle.pqc.crypto.saber", + "org.bouncycastle.pqc.crypto.slhdsa", "org.bouncycastle.pqc.crypto.sphincs", "org.bouncycastle.pqc.crypto.sphincsplus", "org.bouncycastle.pqc.crypto.util", @@ -2546,32 +2533,38 @@ "org.checkerframework.checker.calledmethods.qual", "org.checkerframework.checker.compilermsgs.qual", "org.checkerframework.checker.fenum.qual", + "org.checkerframework.checker.formatter", "org.checkerframework.checker.formatter.qual", "org.checkerframework.checker.guieffect.qual", "org.checkerframework.checker.i18n.qual", + "org.checkerframework.checker.i18nformatter", "org.checkerframework.checker.i18nformatter.qual", "org.checkerframework.checker.index.qual", "org.checkerframework.checker.initialization.qual", "org.checkerframework.checker.interning.qual", "org.checkerframework.checker.lock.qual", - "org.checkerframework.checker.mustcall.qual", + "org.checkerframework.checker.nullness", "org.checkerframework.checker.nullness.qual", "org.checkerframework.checker.optional.qual", "org.checkerframework.checker.propkey.qual", + "org.checkerframework.checker.regex", "org.checkerframework.checker.regex.qual", "org.checkerframework.checker.signature.qual", + "org.checkerframework.checker.signedness", "org.checkerframework.checker.signedness.qual", "org.checkerframework.checker.tainting.qual", + "org.checkerframework.checker.units", "org.checkerframework.checker.units.qual", "org.checkerframework.common.aliasing.qual", "org.checkerframework.common.initializedfields.qual", "org.checkerframework.common.reflection.qual", "org.checkerframework.common.returnsreceiver.qual", "org.checkerframework.common.subtyping.qual", - "org.checkerframework.common.util.count.report.qual", + "org.checkerframework.common.util.report.qual", "org.checkerframework.common.value.qual", "org.checkerframework.dataflow.qual", - "org.checkerframework.framework.qual" + "org.checkerframework.framework.qual", + "org.checkerframework.framework.util" ], "org.dom4j:dom4j": [ "org.dom4j", diff --git a/java/spotbugs-excludes.xml b/java/spotbugs-excludes.xml index d62598f910a600..2ae98dc7e6050b 100644 --- a/java/spotbugs-excludes.xml +++ b/java/spotbugs-excludes.xml @@ -54,6 +54,11 @@ + + + + + diff --git a/java/src/org/openqa/selenium/devtools/v128/BUILD.bazel b/java/src/org/openqa/selenium/devtools/v131/BUILD.bazel similarity index 98% rename from java/src/org/openqa/selenium/devtools/v128/BUILD.bazel rename to java/src/org/openqa/selenium/devtools/v131/BUILD.bazel index 18d0136322a529..acf72d7a52e007 100644 --- a/java/src/org/openqa/selenium/devtools/v128/BUILD.bazel +++ b/java/src/org/openqa/selenium/devtools/v131/BUILD.bazel @@ -2,7 +2,7 @@ load("//common:defs.bzl", "copy_file") load("//java:defs.bzl", "java_export", "java_library") load("//java:version.bzl", "SE_VERSION") -cdp_version = "v128" +cdp_version = "v131" java_export( name = cdp_version, diff --git a/java/src/org/openqa/selenium/devtools/v128/v128CdpInfo.java b/java/src/org/openqa/selenium/devtools/v131/v131CdpInfo.java similarity index 86% rename from java/src/org/openqa/selenium/devtools/v128/v128CdpInfo.java rename to java/src/org/openqa/selenium/devtools/v131/v131CdpInfo.java index f721fa6e7f83aa..399ff1ba568ac8 100644 --- a/java/src/org/openqa/selenium/devtools/v128/v128CdpInfo.java +++ b/java/src/org/openqa/selenium/devtools/v131/v131CdpInfo.java @@ -15,15 +15,15 @@ // specific language governing permissions and limitations // under the License. -package org.openqa.selenium.devtools.v128; +package org.openqa.selenium.devtools.v131; import com.google.auto.service.AutoService; import org.openqa.selenium.devtools.CdpInfo; @AutoService(CdpInfo.class) -public class v128CdpInfo extends CdpInfo { +public class v131CdpInfo extends CdpInfo { - public v128CdpInfo() { - super(128, v128Domains::new); + public v131CdpInfo() { + super(131, v131Domains::new); } } diff --git a/java/src/org/openqa/selenium/devtools/v128/v128Domains.java b/java/src/org/openqa/selenium/devtools/v131/v131Domains.java similarity index 77% rename from java/src/org/openqa/selenium/devtools/v128/v128Domains.java rename to java/src/org/openqa/selenium/devtools/v131/v131Domains.java index e6bfa0a3ad0a58..f5a796cd476b1d 100644 --- a/java/src/org/openqa/selenium/devtools/v128/v128Domains.java +++ b/java/src/org/openqa/selenium/devtools/v131/v131Domains.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.openqa.selenium.devtools.v128; +package org.openqa.selenium.devtools.v131; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.idealized.Domains; @@ -26,21 +26,21 @@ import org.openqa.selenium.devtools.idealized.target.Target; import org.openqa.selenium.internal.Require; -public class v128Domains implements Domains { +public class v131Domains implements Domains { - private final v128Javascript js; - private final v128Events events; - private final v128Log log; - private final v128Network network; - private final v128Target target; + private final v131Javascript js; + private final v131Events events; + private final v131Log log; + private final v131Network network; + private final v131Target target; - public v128Domains(DevTools devtools) { + public v131Domains(DevTools devtools) { Require.nonNull("DevTools", devtools); - events = new v128Events(devtools); - js = new v128Javascript(devtools); - log = new v128Log(); - network = new v128Network(devtools); - target = new v128Target(); + events = new v131Events(devtools); + js = new v131Javascript(devtools); + log = new v131Log(); + network = new v131Network(devtools); + target = new v131Target(); } @Override diff --git a/java/src/org/openqa/selenium/devtools/v128/v128Events.java b/java/src/org/openqa/selenium/devtools/v131/v131Events.java similarity index 86% rename from java/src/org/openqa/selenium/devtools/v128/v128Events.java rename to java/src/org/openqa/selenium/devtools/v131/v131Events.java index cf237296b0fc19..128be8849d4b9f 100644 --- a/java/src/org/openqa/selenium/devtools/v128/v128Events.java +++ b/java/src/org/openqa/selenium/devtools/v131/v131Events.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.openqa.selenium.devtools.v128; +package org.openqa.selenium.devtools.v131; import java.time.Instant; import java.util.List; @@ -28,15 +28,15 @@ import org.openqa.selenium.devtools.events.ConsoleEvent; import org.openqa.selenium.devtools.idealized.Events; import org.openqa.selenium.devtools.idealized.runtime.model.RemoteObject; -import org.openqa.selenium.devtools.v128.runtime.Runtime; -import org.openqa.selenium.devtools.v128.runtime.model.ConsoleAPICalled; -import org.openqa.selenium.devtools.v128.runtime.model.ExceptionDetails; -import org.openqa.selenium.devtools.v128.runtime.model.ExceptionThrown; -import org.openqa.selenium.devtools.v128.runtime.model.StackTrace; +import org.openqa.selenium.devtools.v131.runtime.Runtime; +import org.openqa.selenium.devtools.v131.runtime.model.ConsoleAPICalled; +import org.openqa.selenium.devtools.v131.runtime.model.ExceptionDetails; +import org.openqa.selenium.devtools.v131.runtime.model.ExceptionThrown; +import org.openqa.selenium.devtools.v131.runtime.model.StackTrace; -public class v128Events extends Events { +public class v131Events extends Events { - public v128Events(DevTools devtools) { + public v131Events(DevTools devtools) { super(devtools); } @@ -77,7 +77,7 @@ protected ConsoleEvent toConsoleEvent(ConsoleAPICalled event) { protected JavascriptException toJsException(ExceptionThrown event) { ExceptionDetails details = event.getExceptionDetails(); Optional maybeTrace = details.getStackTrace(); - Optional maybeException = + Optional maybeException = details.getException(); String message = diff --git a/java/src/org/openqa/selenium/devtools/v128/v128Javascript.java b/java/src/org/openqa/selenium/devtools/v131/v131Javascript.java similarity index 85% rename from java/src/org/openqa/selenium/devtools/v128/v128Javascript.java rename to java/src/org/openqa/selenium/devtools/v131/v131Javascript.java index 658413ddac340b..8d10c51773831d 100644 --- a/java/src/org/openqa/selenium/devtools/v128/v128Javascript.java +++ b/java/src/org/openqa/selenium/devtools/v131/v131Javascript.java @@ -15,21 +15,21 @@ // specific language governing permissions and limitations // under the License. -package org.openqa.selenium.devtools.v128; +package org.openqa.selenium.devtools.v131; import java.util.Optional; import org.openqa.selenium.devtools.Command; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.Event; import org.openqa.selenium.devtools.idealized.Javascript; -import org.openqa.selenium.devtools.v128.page.Page; -import org.openqa.selenium.devtools.v128.page.model.ScriptIdentifier; -import org.openqa.selenium.devtools.v128.runtime.Runtime; -import org.openqa.selenium.devtools.v128.runtime.model.BindingCalled; +import org.openqa.selenium.devtools.v131.page.Page; +import org.openqa.selenium.devtools.v131.page.model.ScriptIdentifier; +import org.openqa.selenium.devtools.v131.runtime.Runtime; +import org.openqa.selenium.devtools.v131.runtime.model.BindingCalled; -public class v128Javascript extends Javascript { +public class v131Javascript extends Javascript { - public v128Javascript(DevTools devtools) { + public v131Javascript(DevTools devtools) { super(devtools); } diff --git a/java/src/org/openqa/selenium/devtools/v128/v128Log.java b/java/src/org/openqa/selenium/devtools/v131/v131Log.java similarity index 89% rename from java/src/org/openqa/selenium/devtools/v128/v128Log.java rename to java/src/org/openqa/selenium/devtools/v131/v131Log.java index 888f06076e022c..1f864978660f68 100644 --- a/java/src/org/openqa/selenium/devtools/v128/v128Log.java +++ b/java/src/org/openqa/selenium/devtools/v131/v131Log.java @@ -15,19 +15,19 @@ // specific language governing permissions and limitations // under the License. -package org.openqa.selenium.devtools.v128; +package org.openqa.selenium.devtools.v131; import java.util.function.Function; import java.util.logging.Level; import org.openqa.selenium.devtools.Command; import org.openqa.selenium.devtools.ConverterFunctions; import org.openqa.selenium.devtools.Event; -import org.openqa.selenium.devtools.v128.log.Log; -import org.openqa.selenium.devtools.v128.log.model.LogEntry; -import org.openqa.selenium.devtools.v128.runtime.model.Timestamp; +import org.openqa.selenium.devtools.v131.log.Log; +import org.openqa.selenium.devtools.v131.log.model.LogEntry; +import org.openqa.selenium.devtools.v131.runtime.model.Timestamp; import org.openqa.selenium.json.JsonInput; -public class v128Log implements org.openqa.selenium.devtools.idealized.log.Log { +public class v131Log implements org.openqa.selenium.devtools.idealized.log.Log { @Override public Command enable() { diff --git a/java/src/org/openqa/selenium/devtools/v128/v128Network.java b/java/src/org/openqa/selenium/devtools/v131/v131Network.java similarity index 92% rename from java/src/org/openqa/selenium/devtools/v128/v128Network.java rename to java/src/org/openqa/selenium/devtools/v131/v131Network.java index ccbdcee9426f3e..5994a2a6d7af99 100644 --- a/java/src/org/openqa/selenium/devtools/v128/v128Network.java +++ b/java/src/org/openqa/selenium/devtools/v131/v131Network.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.openqa.selenium.devtools.v128; +package org.openqa.selenium.devtools.v131; import static java.net.HttpURLConnection.HTTP_OK; @@ -30,35 +30,35 @@ import org.openqa.selenium.devtools.DevToolsException; import org.openqa.selenium.devtools.Event; import org.openqa.selenium.devtools.idealized.Network; -import org.openqa.selenium.devtools.v128.fetch.Fetch; -import org.openqa.selenium.devtools.v128.fetch.model.*; -import org.openqa.selenium.devtools.v128.network.model.Request; +import org.openqa.selenium.devtools.v131.fetch.Fetch; +import org.openqa.selenium.devtools.v131.fetch.model.*; +import org.openqa.selenium.devtools.v131.network.model.Request; import org.openqa.selenium.internal.Either; import org.openqa.selenium.remote.http.HttpRequest; import org.openqa.selenium.remote.http.HttpResponse; -public class v128Network extends Network { +public class v131Network extends Network { - private static final Logger LOG = Logger.getLogger(v128Network.class.getName()); + private static final Logger LOG = Logger.getLogger(v131Network.class.getName()); - public v128Network(DevTools devTools) { + public v131Network(DevTools devTools) { super(devTools); } @Override protected Command setUserAgentOverride(UserAgent userAgent) { - return org.openqa.selenium.devtools.v128.network.Network.setUserAgentOverride( + return org.openqa.selenium.devtools.v131.network.Network.setUserAgentOverride( userAgent.userAgent(), userAgent.acceptLanguage(), userAgent.platform(), Optional.empty()); } @Override protected Command enableNetworkCaching() { - return org.openqa.selenium.devtools.v128.network.Network.setCacheDisabled(false); + return org.openqa.selenium.devtools.v131.network.Network.setCacheDisabled(false); } @Override protected Command disableNetworkCaching() { - return org.openqa.selenium.devtools.v128.network.Network.setCacheDisabled(true); + return org.openqa.selenium.devtools.v131.network.Network.setCacheDisabled(true); } @Override diff --git a/java/src/org/openqa/selenium/devtools/v128/v128Target.java b/java/src/org/openqa/selenium/devtools/v131/v131Target.java similarity index 83% rename from java/src/org/openqa/selenium/devtools/v128/v128Target.java rename to java/src/org/openqa/selenium/devtools/v131/v131Target.java index 67b1082920ff94..7c8ed6dc5ce427 100644 --- a/java/src/org/openqa/selenium/devtools/v128/v128Target.java +++ b/java/src/org/openqa/selenium/devtools/v131/v131Target.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.openqa.selenium.devtools.v128; +package org.openqa.selenium.devtools.v131; import java.util.List; import java.util.Map; @@ -28,21 +28,21 @@ import org.openqa.selenium.devtools.idealized.browser.model.BrowserContextID; import org.openqa.selenium.devtools.idealized.target.model.SessionID; import org.openqa.selenium.devtools.idealized.target.model.TargetID; -import org.openqa.selenium.devtools.v128.target.Target; -import org.openqa.selenium.devtools.v128.target.model.TargetInfo; +import org.openqa.selenium.devtools.v131.target.Target; +import org.openqa.selenium.devtools.v131.target.model.TargetInfo; import org.openqa.selenium.json.JsonInput; import org.openqa.selenium.json.TypeToken; -public class v128Target implements org.openqa.selenium.devtools.idealized.target.Target { +public class v131Target implements org.openqa.selenium.devtools.idealized.target.Target { @Override public Command detachFromTarget( Optional sessionId, Optional targetId) { return Target.detachFromTarget( sessionId.map( - id -> new org.openqa.selenium.devtools.v128.target.model.SessionID(id.toString())), + id -> new org.openqa.selenium.devtools.v131.target.model.SessionID(id.toString())), targetId.map( - id -> new org.openqa.selenium.devtools.v128.target.model.TargetID(id.toString()))); + id -> new org.openqa.selenium.devtools.v131.target.model.TargetID(id.toString()))); } @Override @@ -74,19 +74,19 @@ public Command detachFromTarget( @Override public Command attachToTarget(TargetID targetId) { - Function mapper = + Function mapper = ConverterFunctions.map( - "sessionId", org.openqa.selenium.devtools.v128.target.model.SessionID.class); + "sessionId", org.openqa.selenium.devtools.v131.target.model.SessionID.class); return new Command<>( "Target.attachToTarget", Map.of( "targetId", - new org.openqa.selenium.devtools.v128.target.model.TargetID(targetId.toString()), + new org.openqa.selenium.devtools.v131.target.model.TargetID(targetId.toString()), "flatten", true), input -> { - org.openqa.selenium.devtools.v128.target.model.SessionID id = mapper.apply(input); + org.openqa.selenium.devtools.v131.target.model.SessionID id = mapper.apply(input); return new SessionID(id.toString()); }); } @@ -101,9 +101,9 @@ public Event detached() { return new Event<>( "Target.detachedFromTarget", input -> { - Function converter = + Function converter = ConverterFunctions.map( - "targetId", org.openqa.selenium.devtools.v128.target.model.TargetID.class); + "targetId", org.openqa.selenium.devtools.v131.target.model.TargetID.class); return new TargetID(converter.apply(input).toString()); }); } diff --git a/java/src/org/openqa/selenium/devtools/versions.bzl b/java/src/org/openqa/selenium/devtools/versions.bzl index 59129be697b127..a56339287b69e4 100644 --- a/java/src/org/openqa/selenium/devtools/versions.bzl +++ b/java/src/org/openqa/selenium/devtools/versions.bzl @@ -1,6 +1,6 @@ CDP_VERSIONS = [ "v85", # Required by Firefox - "v128", + "v131", "v129", "v130", ] diff --git a/java/src/org/openqa/selenium/manager/SeleniumManager.java b/java/src/org/openqa/selenium/manager/SeleniumManager.java index b907d8ab755ec3..97e23c85f4cb6a 100644 --- a/java/src/org/openqa/selenium/manager/SeleniumManager.java +++ b/java/src/org/openqa/selenium/manager/SeleniumManager.java @@ -123,7 +123,10 @@ private static Result runCommand(Path binary, List arguments) { String output; int code; try { - ExternalProcess.Builder processBuilder = ExternalProcess.builder(); + ExternalProcess.Builder processBuilder = + ExternalProcess.builder() + // keep all output of the process to avoid JSON syntax errors while parsing + .bufferSize(-1); Properties properties = System.getProperties(); for (String name : properties.stringPropertyNames()) { diff --git a/java/src/org/openqa/selenium/os/ExternalProcess.java b/java/src/org/openqa/selenium/os/ExternalProcess.java index 2bbb7ceb01b9c9..e4ae0ec9c46fa2 100644 --- a/java/src/org/openqa/selenium/os/ExternalProcess.java +++ b/java/src/org/openqa/selenium/os/ExternalProcess.java @@ -19,6 +19,7 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -159,8 +160,8 @@ public Builder directory(File directory) { } /** - * Where to copy the combined stdout and stderr output to, {@code OsProcess#getOutput} is still - * working when called. + * Where to copy the combined stdout and stderr output to, {@code ExternalProcess#getOutput} is + * still working when called. * * @param stream where to copy the combined output to * @return this instance to continue building @@ -172,9 +173,9 @@ public Builder copyOutputTo(OutputStream stream) { } /** - * The number of bytes to buffer for {@code OsProcess#getOutput} calls. + * The number of bytes to buffer for {@code ExternalProcess#getOutput} calls. * - * @param toKeep the number of bytes, default is 4096 + * @param toKeep the number of bytes, default is 32768 * @return this instance to continue building */ public Builder bufferSize(int toKeep) { @@ -195,13 +196,19 @@ public ExternalProcess start() throws UncheckedIOException { } try { - CircularOutputStream circular = new CircularOutputStream(bufferSize); + OutputStream buffer; + + if (bufferSize != -1) { + buffer = new CircularOutputStream(bufferSize); + } else { + buffer = new ByteArrayOutputStream(); + } Thread worker = new Thread( () -> { // copyOutputTo might be system.out or system.err, do not to close - OutputStream output = new MultiOutputStream(circular, copyOutputTo); + OutputStream output = new MultiOutputStream(buffer, copyOutputTo); // closing the InputStream does somehow disturb the process, do not to close InputStream input = process.getInputStream(); // use the CircularOutputStream as mandatory, we know it will never raise a @@ -221,7 +228,7 @@ public ExternalProcess start() throws UncheckedIOException { worker.setDaemon(true); worker.start(); - return new ExternalProcess(process, circular, worker); + return new ExternalProcess(process, buffer, worker); } catch (Throwable t) { // ensure we do not leak a process in case of failures try { @@ -239,10 +246,10 @@ public static Builder builder() { } private final Process process; - private final CircularOutputStream outputStream; + private final OutputStream outputStream; private final Thread worker; - public ExternalProcess(Process process, CircularOutputStream outputStream, Thread worker) { + public ExternalProcess(Process process, OutputStream outputStream, Thread worker) { this.process = process; this.outputStream = outputStream; this.worker = worker; @@ -250,7 +257,7 @@ public ExternalProcess(Process process, CircularOutputStream outputStream, Threa /** * The last N bytes of the combined stdout and stderr as String, the value of N is set while - * building the OsProcess. + * building the ExternalProcess. * * @return stdout and stderr as String in Charset.defaultCharset() encoding */ @@ -260,13 +267,20 @@ public String getOutput() { /** * The last N bytes of the combined stdout and stderr as String, the value of N is set while - * building the OsProcess. + * building the ExternalProcess. * * @param encoding the encoding to decode the stream * @return stdout and stderr as String in the given encoding */ public String getOutput(Charset encoding) { - return outputStream.toString(encoding); + if (outputStream instanceof CircularOutputStream) { + return ((CircularOutputStream) outputStream).toString(encoding); + } else if (outputStream instanceof ByteArrayOutputStream) { + return ((ByteArrayOutputStream) outputStream).toString(encoding); + } else { + throw new IllegalStateException( + "unexpected OutputStream implementation: " + outputStream.getClass().getSimpleName()); + } } public boolean isAlive() { diff --git a/java/src/org/openqa/selenium/remote/HttpCommandExecutor.java b/java/src/org/openqa/selenium/remote/HttpCommandExecutor.java index 03fc84bc45b190..1eb3283eae014e 100644 --- a/java/src/org/openqa/selenium/remote/HttpCommandExecutor.java +++ b/java/src/org/openqa/selenium/remote/HttpCommandExecutor.java @@ -25,6 +25,8 @@ import java.io.IOException; import java.net.URL; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import org.openqa.selenium.NoSuchSessionException; import org.openqa.selenium.SessionNotCreatedException; @@ -109,11 +111,34 @@ public HttpCommandExecutor( ClientConfig config, HttpClient.Factory httpClientFactory) { remoteServer = Require.nonNull("HTTP client configuration", config).baseUrl(); - this.additionalCommands = Require.nonNull("Additional commands", additionalCommands); + this.additionalCommands = + new HashMap<>(Require.nonNull("Additional commands", additionalCommands)); this.httpClientFactory = Require.nonNull("HTTP client factory", httpClientFactory); this.client = this.httpClientFactory.createClient(config); } + /** + * Returns an immutable view of the additional commands. + * + * @return an unmodifiable map of additional commands. + */ + public Map getAdditionalCommands() { + return Collections.unmodifiableMap(additionalCommands); + } + + /** + * Adds or updates additional commands. This method is protected to allow subclasses to define + * their commands. + * + * @param commandName the name of the command to add or update. + * @param info the CommandInfo for the command. + */ + protected void addAdditionalCommand(String commandName, CommandInfo info) { + Require.nonNull("Command name", commandName); + Require.nonNull("Command info", info); + this.additionalCommands.put(commandName, info); + } + /** * It may be useful to extend the commands understood by this {@code HttpCommandExecutor} at run * time, and this can be achieved via this method. Note, this is protected, and expected usage is diff --git a/java/test/org/openqa/selenium/NoSuchShadowRootTest.java b/java/test/org/openqa/selenium/NoSuchShadowRootTest.java index 4fe1be1ecec08e..f945aa6d4561ec 100644 --- a/java/test/org/openqa/selenium/NoSuchShadowRootTest.java +++ b/java/test/org/openqa/selenium/NoSuchShadowRootTest.java @@ -18,13 +18,18 @@ package org.openqa.selenium; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.openqa.selenium.testing.drivers.Browser.CHROME; +import static org.openqa.selenium.testing.drivers.Browser.EDGE; import org.junit.jupiter.api.Test; +import org.openqa.selenium.testing.Ignore; import org.openqa.selenium.testing.JupiterTestBase; public class NoSuchShadowRootTest extends JupiterTestBase { @Test + @Ignore(value = CHROME, reason = "https://issues.chromium.org/issues/375892677") + @Ignore(value = EDGE, reason = "https://issues.chromium.org/issues/375892677") public void getNoSuchShadowRoot() { driver.get(pages.shadowRootPage); WebElement nonExistentShadowRootElement = driver.findElement(By.id("noShadowRoot")); diff --git a/java/test/org/openqa/selenium/remote/RemoteWebDriverInitializationTest.java b/java/test/org/openqa/selenium/remote/RemoteWebDriverInitializationTest.java index 111cac68e5085f..8c01983488ed3c 100644 --- a/java/test/org/openqa/selenium/remote/RemoteWebDriverInitializationTest.java +++ b/java/test/org/openqa/selenium/remote/RemoteWebDriverInitializationTest.java @@ -51,6 +51,7 @@ import org.openqa.selenium.remote.http.ClientConfig; import org.openqa.selenium.remote.http.Contents; import org.openqa.selenium.remote.http.HttpClient; +import org.openqa.selenium.remote.http.HttpMethod; import org.openqa.selenium.remote.http.HttpResponse; @Tag("UnitTests") @@ -234,4 +235,22 @@ public void quit() { quitCalled = true; } } + + @Test + void additionalCommandsCanBeModified() throws MalformedURLException { + HttpClient client = mock(HttpClient.class); + HttpClient.Factory factory = mock(HttpClient.Factory.class); + + when(factory.createClient(any(ClientConfig.class))).thenReturn(client); + + URL url = new URL("http://localhost:4444/"); + HttpCommandExecutor executor = + new HttpCommandExecutor(emptyMap(), ClientConfig.defaultConfig().baseUrl(url), factory); + + String commandName = "customCommand"; + CommandInfo commandInfo = new CommandInfo("/session/:sessionId/custom", HttpMethod.GET); + executor.addAdditionalCommand(commandName, commandInfo); + + assertThat(executor.getAdditionalCommands()).containsEntry(commandName, commandInfo); + } } diff --git a/java/version.bzl b/java/version.bzl index f882c57e1cd553..2ccba1f975dd33 100644 --- a/java/version.bzl +++ b/java/version.bzl @@ -1,2 +1,2 @@ -SE_VERSION = "4.27.0-SNAPSHOT" +SE_VERSION = "4.28.0-SNAPSHOT" TOOLS_JAVA_VERSION = "17" diff --git a/javascript/node/selenium-webdriver/BUILD.bazel b/javascript/node/selenium-webdriver/BUILD.bazel index 874c0b18b8bb18..bc6e68042597d0 100644 --- a/javascript/node/selenium-webdriver/BUILD.bazel +++ b/javascript/node/selenium-webdriver/BUILD.bazel @@ -11,11 +11,11 @@ load("//javascript/private:browsers.bzl", "BROWSERS") npm_link_all_packages(name = "node_modules") -VERSION = "4.27.0-nightly202410301443" +VERSION = "4.28.0-nightly202411252022" BROWSER_VERSIONS = [ "v85", - "v128", + "v131", "v129", "v130", ] diff --git a/javascript/node/selenium-webdriver/CHANGES.md b/javascript/node/selenium-webdriver/CHANGES.md index 451efc75eb7019..287f3adc8e205f 100644 --- a/javascript/node/selenium-webdriver/CHANGES.md +++ b/javascript/node/selenium-webdriver/CHANGES.md @@ -1,3 +1,12 @@ +## 4.27.0 + +- Add CDP for Chrome 131 and remove 128 +- Add Firefox CDP deprecation warnings +- Update supported versions for Chrome DevTools +- [bidi] Allow passing in uri for authentication handlers (#14386) +- [bidi] Enable locate node tests for Chrome and Edge +- [bidi] Ensure start nodes are serialized + ## 4.26.0 - Add CDP for Chrome 130 and remove 127 diff --git a/javascript/node/selenium-webdriver/package.json b/javascript/node/selenium-webdriver/package.json index aaa10a9f2a6820..c19e244758cf48 100644 --- a/javascript/node/selenium-webdriver/package.json +++ b/javascript/node/selenium-webdriver/package.json @@ -1,6 +1,6 @@ { "name": "selenium-webdriver", - "version": "4.27.0-nightly202410301443", + "version": "4.28.0-nightly202411252022", "description": "The official WebDriver JavaScript bindings from the Selenium project", "license": "Apache-2.0", "keywords": [ diff --git a/py/BUILD.bazel b/py/BUILD.bazel index 25c084a6f745dc..47158c4ab59ed3 100644 --- a/py/BUILD.bazel +++ b/py/BUILD.bazel @@ -62,11 +62,11 @@ compile_pip_requirements( ], ) -SE_VERSION = "4.27.0.202410311942" +SE_VERSION = "4.28.0.202411261607" BROWSER_VERSIONS = [ "v85", - "v128", + "v131", "v129", "v130", ] diff --git a/py/CHANGES b/py/CHANGES index b7dabbf9d6b9b7..ea3cdf8db4397a 100644 --- a/py/CHANGES +++ b/py/CHANGES @@ -1,3 +1,17 @@ +Selenium 4.27.1 +* Fix `pyproject.toml` for installable from sdist (#14806) +* Revert the Deprecation warnings of WebElement.get_attribute() (#14808) + +Selenium 4.27.0 +* Add CDP for Chrome 131 and remove 128 +* Add Firefox CDP deprecation warnings (#14787) +* Cleaned up Py doc sphinx warnings/errors and added README (#14191) +* Added Deprecation of WebElement.get_attribute() per #13334 (#14675) +* Fix TypeError when init Safari webdriver (#14699) +* Set user_agent and extra_headers via ClientConfig (#14718) +* Updated Handling for DetachedShadowRoot Exception (#14677) +* Support FedCM commands (#14710) + Selenium 4.26.1 * DeprecationWarning raised in default webdriver init (#14690) * Remote connection use timeout from ClientConfig (#14692) diff --git a/py/docs/source/conf.py b/py/docs/source/conf.py index 41a620b3682480..2cf687329c477c 100644 --- a/py/docs/source/conf.py +++ b/py/docs/source/conf.py @@ -56,9 +56,9 @@ # built documents. # # The short X.Y version. -version = '4.27' +version = '4.28' # The full version, including alpha/beta/rc tags. -release = '4.27.0.202410311942' +release = '4.28.0.202411261607' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/py/pyproject.toml b/py/pyproject.toml index 6488cda070f564..e99a03cd5d7a25 100644 --- a/py/pyproject.toml +++ b/py/pyproject.toml @@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta" [project] name = "selenium" -version = "4.27.0.202410311942" -license = "Apache 2.0" +version = "4.28.0.202411261607" +license = { text = "Apache 2.0" } description = "Official Python bindings for Selenium WebDriver." readme = "README.rst" requires-python = "~=3.8" @@ -24,6 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "urllib3[socks]>=1.26,<3", @@ -40,7 +41,7 @@ zip-safe = false [tool.setuptools.packages.find] include = ["selenium*"] exclude = ["test*"] -namespace = false +namespaces = false # include-package-data is `true` by default in pyproject.toml [project.urls] diff --git a/py/selenium/__init__.py b/py/selenium/__init__.py index 8fa1fd3219d4d6..af337bd8b7304a 100644 --- a/py/selenium/__init__.py +++ b/py/selenium/__init__.py @@ -16,4 +16,4 @@ # under the License. -__version__ = "4.27.0.202410311942" +__version__ = "4.28.0.202411261607" diff --git a/py/selenium/webdriver/__init__.py b/py/selenium/webdriver/__init__.py index c57217aefb69f9..4ae671ba788b16 100644 --- a/py/selenium/webdriver/__init__.py +++ b/py/selenium/webdriver/__init__.py @@ -44,7 +44,7 @@ from .wpewebkit.service import Service as WPEWebKitService # noqa from .wpewebkit.webdriver import WebDriver as WPEWebKit # noqa -__version__ = "4.27.0.202410311942" +__version__ = "4.28.0.202411261607" # We need an explicit __all__ because the above won't otherwise be exported. __all__ = [ diff --git a/py/selenium/webdriver/common/fedcm/__init__.py b/py/selenium/webdriver/common/fedcm/__init__.py new file mode 100644 index 00000000000000..a5b1e6f85a09e5 --- /dev/null +++ b/py/selenium/webdriver/common/fedcm/__init__.py @@ -0,0 +1,16 @@ +# 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. diff --git a/py/selenium/webdriver/remote/webelement.py b/py/selenium/webdriver/remote/webelement.py index e5a3adad0d7b42..08c772eaad56ee 100644 --- a/py/selenium/webdriver/remote/webelement.py +++ b/py/selenium/webdriver/remote/webelement.py @@ -173,13 +173,6 @@ def get_attribute(self, name) -> str | None: # Check if the "active" CSS class is applied to an element. is_active = "active" in target_element.get_attribute("class") """ - - warnings.warn( - "using WebElement.get_attribute() has been deprecated. Please use get_dom_attribute() instead.", - DeprecationWarning, - stacklevel=2, - ) - if getAttribute_js is None: _load_js() attribute_value = self.parent.execute_script( diff --git a/py/tox.ini b/py/tox.ini index 3ba7d4be20ccc0..083da94651e71b 100644 --- a/py/tox.ini +++ b/py/tox.ini @@ -1,5 +1,13 @@ [tox] -envlist = docs, flake8, isort +envlist = docs, flake8, isort, validate-pyproject + +[testenv:validate-pyproject] +skip_install = true +deps = + validate-pyproject==0.23 + packaging==24.2 +commands = + validate-pyproject ./pyproject.toml [testenv:docs] skip_install = true @@ -7,10 +15,10 @@ deps = -r {toxinidir}/docs/requirements.txt -r {toxinidir}/requirements.txt -commands = +commands = ; regenerate autodoc stub pages sphinx-autogen docs/source/api.rst - ; build api docs + ; build api docs sphinx-build -b html -d ../build/docs/doctrees docs/source ../build/docs/api/py {posargs} setenv = PYTHONPATH = {toxinidir}/. diff --git a/rb/CHANGES b/rb/CHANGES index 00357fb0c0c52f..f3811e1de8cc36 100644 --- a/rb/CHANGES +++ b/rb/CHANGES @@ -1,3 +1,14 @@ +4.27.0 (2024-11-21) +========================= +* Add CDP for Chrome 131 and remove 128 +* Add Firefox CDP deprecation warnings (#14763) +* Add Bidi network commands for authentication and interception (#14523) +* Handle graceful webdriver shutdown (#14430) +* Reduce RBS errors to 0 (#14661) +* Resolve `uri` gem deprecation warning (#14770) +* Update minimum Ruby to 3.1 (#14685) +* Implement navigation commands with BiDi (#14094) + 4.26.0 (2024-10-28) ========================= * Add CDP for Chrome 130 and remove 127 diff --git a/rb/Gemfile.lock b/rb/Gemfile.lock index 495e79ef76e86c..3c9f67c9bf9f87 100644 --- a/rb/Gemfile.lock +++ b/rb/Gemfile.lock @@ -1,9 +1,9 @@ PATH remote: . specs: - selenium-devtools (0.130.0) + selenium-devtools (0.131.0) selenium-webdriver (~> 4.2) - selenium-webdriver (4.27.0.nightly) + selenium-webdriver (4.28.0.nightly) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) @@ -13,7 +13,7 @@ PATH GEM remote: https://rubygems.org/ specs: - activesupport (7.2.2) + activesupport (8.0.0) base64 benchmark (>= 0.3) bigdecimal @@ -25,6 +25,7 @@ GEM minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) addressable (2.8.7) public_suffix (>= 2.0.2, < 7.0) ast (2.4.2) @@ -51,7 +52,7 @@ GEM git (1.19.1) addressable (~> 2.8) rchardet (~> 1.8) - hashdiff (1.1.1) + hashdiff (1.1.2) i18n (1.14.6) concurrent-ruby (~> 1.0) io-console (0.7.2) @@ -60,8 +61,8 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) jar-dependencies (0.4.1) - json (2.8.1) - json (2.8.1-java) + json (2.8.2) + json (2.8.2-java) language_server-protocol (3.17.0.3) listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) @@ -88,7 +89,7 @@ GEM rbs (3.6.1) logger rchardet (1.8.0) - rdoc (6.7.0) + rdoc (6.8.1) psych (>= 4.0.0) regexp_parser (2.9.2) reline (0.5.11) @@ -117,13 +118,13 @@ GEM rubocop-ast (>= 1.32.2, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.34.1) + rubocop-ast (1.36.1) parser (>= 3.3.1.0) rubocop-capybara (2.21.0) rubocop (~> 1.41) rubocop-factory_bot (2.26.1) rubocop (~> 1.61) - rubocop-performance (1.22.1) + rubocop-performance (1.23.0) rubocop (>= 1.48.1, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) rubocop-rake (0.6.0) @@ -161,6 +162,7 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.6.0) + uri (1.0.2) webmock (3.24.0) addressable (>= 2.8.0) crack (>= 0.3.2) diff --git a/rb/lib/selenium/devtools/BUILD.bazel b/rb/lib/selenium/devtools/BUILD.bazel index c974adf9ba3171..9a045e89da29f9 100644 --- a/rb/lib/selenium/devtools/BUILD.bazel +++ b/rb/lib/selenium/devtools/BUILD.bazel @@ -5,7 +5,7 @@ package(default_visibility = ["//rb:__subpackages__"]) CDP_VERSIONS = [ "v85", - "v128", + "v131", "v129", "v130", ] diff --git a/rb/lib/selenium/devtools/version.rb b/rb/lib/selenium/devtools/version.rb index d75521bb415aa5..c12441f05fd4b4 100644 --- a/rb/lib/selenium/devtools/version.rb +++ b/rb/lib/selenium/devtools/version.rb @@ -19,6 +19,6 @@ module Selenium module DevTools - VERSION = '0.130.0' + VERSION = '0.131.0' end # DevTools end # Selenium diff --git a/rb/lib/selenium/webdriver/version.rb b/rb/lib/selenium/webdriver/version.rb index 3a8d951f55562c..cdf4ebe9ed2524 100644 --- a/rb/lib/selenium/webdriver/version.rb +++ b/rb/lib/selenium/webdriver/version.rb @@ -19,6 +19,6 @@ module Selenium module WebDriver - VERSION = '4.27.0.nightly' + VERSION = '4.28.0.nightly' end # WebDriver end # Selenium diff --git a/rust/CHANGELOG.md b/rust/CHANGELOG.md index 12049809f5d180..0c032578b8be31 100644 --- a/rust/CHANGELOG.md +++ b/rust/CHANGELOG.md @@ -1,3 +1,10 @@ +0.4.27 +====== +* Use endpoint for stable versions first to manage Firefox (#14536) (#14613) +* Selenium Manager honors full browser version (#13419) (#14619) +* Selenium Manager honors full browser version (#13419) +* Minor change related to variable name + 0.4.26 ====== * Selenium Manager checks invalid browser version (#14511)