diff --git a/.bazelversion b/.bazelversion
index 0ee843cc60466..643916c03f1f6 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-7.2.0
+7.3.1
diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml
index fb2d19a97a272..40253a37a5f77 100644
--- a/.github/workflows/pre-release.yml
+++ b/.github/workflows/pre-release.yml
@@ -72,6 +72,8 @@ jobs:
with:
ruby-version: '3.1'
working-directory: 'rb'
+ - name: Setup curl for Ubuntu
+ run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev
- name: "Prep git"
run: |
git config --local user.email "selenium-ci@users.noreply.github.com"
diff --git a/.github/workflows/stage-release.yml b/.github/workflows/stage-release.yml
index 6d15a040cfdc0..b40f7690347ee 100644
--- a/.github/workflows/stage-release.yml
+++ b/.github/workflows/stage-release.yml
@@ -2,7 +2,12 @@ name: Release Staging
on:
pull_request:
- types: [closed]
+ types: [ closed ]
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Selenium version to release'
+ required: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -11,52 +16,56 @@ env:
jobs:
github-release:
if: >
- github.event.pull_request.merged == true &&
+ (github.event.pull_request.merged == true &&
github.repository_owner == 'seleniumhq' &&
- startsWith(github.event.pull_request.head.ref, 'release-preparation-')
+ startsWith(github.event.pull_request.head.ref, 'release-preparation-')) ||
+ (github.event_name == 'workflow_dispatch' &&
+ github.event.inputs.version != '' &&
+ github.repository_owner == 'seleniumhq')
runs-on: ubuntu-latest
+ permissions: write-all
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Extract version from branch name
- id: extract_version
+ if: github.event.pull_request.merged == true
run: |
VERSION=$(echo $BRANCH_NAME | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
echo "VERSION=$VERSION" >> $GITHUB_ENV
+ - name: Extract version from workflow input
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ VERSION=${{ inputs.version }}
+ echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Prep git
run: |
git config --local user.email "selenium-ci@users.noreply.github.com"
git config --local user.name "Selenium CI Bot"
- - name: Tag Release
- run: |
- git tag selenium-${{ env.VERSION }}
- git push origin selenium-${{ env.VERSION }}
- - name: Update Nightly Tag to Remove pre-release
- run: |
- git fetch --tags
- git tag -d nightly || echo "Nightly tag not found"
- git tag nightly
- git push origin refs/tags/nightly --force
+ # - name: Tag Release
+ # run: |
+ # git tag selenium-${{ env.VERSION }} || echo "Tag already exists"
+ # git push origin selenium-${{ env.VERSION }} || echo "Tag already exists remotely"
- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: 17
distribution: 'temurin'
+ - name: Setup curl for Ubuntu
+ run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev
- name: Build and Stage Packages
run: ./go all:package[--config=release]
- name: Generate Draft Release
- uses: softprops/action-gh-release@v2
+ uses: ncipollo/release-action@v1
with:
- name: Selenium ${{ env.VERSION }}
- body: |
- ## Detailed Changelogs by Component
-
**[Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG)** |
**[Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES)** |
**[DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG)** |
**[Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)** |
**[JavaScript](https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/node/selenium-webdriver/CHANGES.md)** |
**[IEDriver](https://github.com/SeleniumHQ/selenium/blob/trunk/cpp/iedriverserver/CHANGELOG)**
-
- tag_name: selenium-${{ env.VERSION }}
+ artifacts: "build/dist/*.*"
+ bodyFile: "scripts/github-actions/release_header.md"
draft: true
- generate_release_notes: true
+ generateReleaseNotes: true
+ name: "Selenium ${{ env.VERSION }}"
prerelease: false
- files: build/dist/*.*
+ skipIfReleaseExists: true
+ tag: "selenium-${{ env.VERSION }}"
+ commit: "${{ github.sha }}"
update-documentation:
needs: github-release
diff --git a/.gitignore b/.gitignore
index 259551ffd4482..0a10c80ea2aae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -78,6 +78,7 @@ py/docs/source/**/*
py/build/
py/LICENSE
py/pytestdebug.log
+py/python.iml
selenium.egg-info/
third_party/java/jetty/jetty-repacked.jar
*.user
@@ -140,3 +141,4 @@ javascript/node/selenium-webdriver/.vscode/settings.json
dotnet-bin
.metadata/
+.npmrc
diff --git a/AUTHORS b/AUTHORS
index de3df458c7739..6ed08840399de 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -23,7 +23,6 @@ Ahmed Ashour
AJ
Ajay Kemparaj
Akhil Lb
-Ákos Lukács
Akuli
Al Sutton
Alan Baird
@@ -137,7 +136,6 @@ Carlos Ortega
Carlos Villela
Carson McDonald
ce86f3bb9faf71e <118820152+ce86f3bb9faf71e@users.noreply.github.com>
-Cédric Boutillier
Cervac Petru
cezarelnazli
ch-saeki <31008335+ch-saeki@users.noreply.github.com>
@@ -174,6 +172,7 @@ Coty Rosenblath
Craig Nishina
CsolG
customcommander
+Cédric Boutillier
Dakkaron
Damien Allison
Damir
@@ -232,6 +231,7 @@ Dmitry Tokarev
Dmytro Shpakovskyi
dnknitro
doctor-house <66467615+doctor-house@users.noreply.github.com>
+Dominic Evans <8060970+dnwe@users.noreply.github.com>
Dominik Dary
Dominik Rauch
Dominik Stadler
@@ -267,7 +267,6 @@ Eric Plaster
Erik Beans
Erik E. Beerepoot
Erik Kuefler
-Étienne Barrié
Evan Sangaline
Evgeniy Roldukhin
EwaMarek
@@ -279,10 +278,10 @@ Florian LOPES
Florian Mutter <32459530+florianmutter@users.noreply.github.com>
Florian Zipperle
Francis Bergin
+Franz Liedke
François Freitag
François JACQUES
François Reynaud
-Franz Liedke
Frederik Carlier
Fredrik Wollsén
freynaud
@@ -425,7 +424,6 @@ Jim van Musscher
jkbzh <3439365+jkbzh@users.noreply.github.com>
jkohls
jmuramatsu
-João Luca Ripardo
Joaquín Romero
jochenberger
Joe Bandenburg
@@ -457,12 +455,12 @@ Jonathan Lipps
Jonathon Kereliuk
Jongkuen Hong
Jordan Mace
-Jörg Sautter
josephg
Josh Goldberg
Joshua Bruning
Joshua Fehler
Joshua Grant
+João Luca Ripardo
JT Archie
jugglinmike
Julian Didier
@@ -477,6 +475,7 @@ Justin Tulloss
Justine Tunney
justinwoolley@gmail.com
jwoolley <19597672+jwoolley@users.noreply.github.com>
+Jörg Sautter
Kamen Litchev
Karl Kuehn
Karl-Philipp Richter
@@ -530,10 +529,10 @@ Lucas Diniz
Lucas Tierney
Luis Correia
Luis Pflamminger
-Lukáš Linhart
Luke Hill
Luke Inman-Semerau
lukec
+Lukáš Linhart
Lyudmil Latinov
Machinexa2 <60662297+machinexa2@users.noreply.github.com>
Maciej Pakulski
@@ -809,15 +808,16 @@ Stuart Knightly
sufyanAbbasi
sugama
sunnyyukaige
+Swastik Baranwal
symonk
Take
take0x <89313929+take0x@users.noreply.github.com>
Takeshi Kishi
Takuho NAKANO
Takuma Chiba
-Tamás Buka
Tamas Utasi <3823780+utamas@users.noreply.github.com>
Tamsil Sajid Amani
+Tamás Buka
Tatsuya Hoshino
Terence Haddock
thecr8tr
@@ -860,7 +860,6 @@ Ulf Adams
Ulrich Buchgraber
User253489
V24 <55334829+umarfarouk98@users.noreply.github.com>
-Václav Votípka
Valery Yatsynovich
Varun Menon
varunsurapaneni <67070327+varunsurapaneni@users.noreply.github.com>
@@ -885,6 +884,7 @@ Vladimir Támara Patiño
VladimirPodolyan <36446855+VladimirPodolyan@users.noreply.github.com>
Vladislav Velichko <111522705+vlad8x8@users.noreply.github.com>
Vyvyan Codd
+Václav Votípka
Werner Robitza
wiggin15
wildloop
@@ -906,4 +906,6 @@ Zhuo Peng
Ziyu
Zoltar - Knower of All
zsong
+Ákos Lukács
+Étienne Barrié
保木本将之
diff --git a/MODULE.bazel b/MODULE.bazel
index 7ee21c50a99db..348c66a2bf10d 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -1,10 +1,10 @@
module(name = "selenium")
-bazel_dep(name = "apple_rules_lint", version = "0.3.2")
-bazel_dep(name = "aspect_bazel_lib", version = "2.7.9")
-bazel_dep(name = "aspect_rules_esbuild", version = "0.20.1")
-bazel_dep(name = "aspect_rules_js", version = "1.42.3")
-bazel_dep(name = "aspect_rules_ts", version = "2.4.2")
+bazel_dep(name = "apple_rules_lint", version = "0.4.0")
+bazel_dep(name = "aspect_bazel_lib", version = "2.8.1")
+bazel_dep(name = "aspect_rules_esbuild", version = "0.21.0")
+bazel_dep(name = "aspect_rules_js", version = "2.0.1")
+bazel_dep(name = "aspect_rules_ts", version = "3.1.0")
bazel_dep(name = "bazel_features", version = "1.13.0")
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "buildifier_prebuilt", version = "6.4.0")
@@ -18,8 +18,8 @@ bazel_dep(name = "protobuf", version = "21.7", dev_dependency = True, repo_name
bazel_dep(name = "rules_cc", version = "0.0.9", dev_dependency = True)
bazel_dep(name = "rules_dotnet", version = "0.15.1")
-bazel_dep(name = "rules_java", version = "7.6.3")
-bazel_dep(name = "rules_jvm_external", version = "6.1")
+bazel_dep(name = "rules_java", version = "7.11.1")
+bazel_dep(name = "rules_jvm_external", version = "6.3")
bazel_dep(name = "rules_nodejs", version = "6.2.0")
bazel_dep(name = "rules_oci", version = "1.7.6")
bazel_dep(name = "rules_pkg", version = "0.10.1")
@@ -169,7 +169,7 @@ maven.install(
name = "maven",
artifacts = [
"com.beust:jcommander:1.82",
- "com.github.javaparser:javaparser-core:3.26.1",
+ "com.github.javaparser:javaparser-core:3.26.2",
"com.github.spotbugs:spotbugs:4.8.6",
"com.github.stephenc.jcip:jcip-annotations:1.0-1",
"com.google.code.gson:gson:2.11.0",
@@ -183,29 +183,29 @@ maven.install(
"dev.failsafe:failsafe:3.3.2",
"io.grpc:grpc-context:1.66.0",
"io.lettuce:lettuce-core:6.4.0.RELEASE",
- "io.netty:netty-buffer:4.1.112.Final",
- "io.netty:netty-codec-http:4.1.112.Final",
- "io.netty:netty-codec-http2:4.1.112.Final",
- "io.netty:netty-common:4.1.112.Final",
- "io.netty:netty-handler:4.1.112.Final",
- "io.netty:netty-handler-proxy:4.1.112.Final",
- "io.netty:netty-transport:4.1.112.Final",
- "io.opentelemetry:opentelemetry-api:1.41.0",
- "io.opentelemetry:opentelemetry-context:1.41.0",
- "io.opentelemetry:opentelemetry-exporter-logging:1.41.0",
- "io.opentelemetry:opentelemetry-sdk:1.41.0",
- "io.opentelemetry:opentelemetry-sdk-common:1.41.0",
- "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.41.0",
- "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.41.0",
- "io.opentelemetry:opentelemetry-sdk-testing:1.41.0",
- "io.opentelemetry:opentelemetry-sdk-trace:1.41.0",
+ "io.netty:netty-buffer:4.1.113.Final",
+ "io.netty:netty-codec-http:4.1.113.Final",
+ "io.netty:netty-codec-http2:4.1.113.Final",
+ "io.netty:netty-common:4.1.113.Final",
+ "io.netty:netty-handler:4.1.113.Final",
+ "io.netty:netty-handler-proxy:4.1.113.Final",
+ "io.netty:netty-transport:4.1.113.Final",
+ "io.opentelemetry:opentelemetry-api:1.42.1",
+ "io.opentelemetry:opentelemetry-context:1.42.1",
+ "io.opentelemetry:opentelemetry-exporter-logging:1.42.1",
+ "io.opentelemetry:opentelemetry-sdk:1.42.1",
+ "io.opentelemetry:opentelemetry-sdk-common:1.42.1",
+ "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.42.1",
+ "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.42.1",
+ "io.opentelemetry:opentelemetry-sdk-testing:1.42.1",
+ "io.opentelemetry:opentelemetry-sdk-trace:1.42.1",
"io.opentelemetry.semconv:opentelemetry-semconv:1.25.0-alpha",
"io.ous:jtoml:2.0.0",
"it.ozimov:embedded-redis:0.7.3",
- "net.bytebuddy:byte-buddy:1.15.0",
+ "net.bytebuddy:byte-buddy:1.15.1",
"org.htmlunit:htmlunit-core-js:4.4.0",
"org.apache.commons:commons-exec:1.4.0",
- "org.apache.logging.log4j:log4j-core:2.23.1",
+ "org.apache.logging.log4j:log4j-core:2.24.0",
"org.assertj:assertj-core:3.26.3",
"org.bouncycastle:bcpkix-jdk18on:1.78.1",
"org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5",
@@ -218,8 +218,8 @@ maven.install(
"org.junit.platform:junit-platform-reporting:1.11.0",
"org.junit.platform:junit-platform-commons:1.11.0",
"org.junit.platform:junit-platform-engine:1.11.0",
- "org.mockito:mockito-core:5.12.0",
- "org.redisson:redisson:3.35.0",
+ "org.mockito:mockito-core:5.13.0",
+ "org.redisson:redisson:3.36.0",
"org.slf4j:slf4j-api:2.0.16",
"org.slf4j:slf4j-jdk14:2.0.16",
"org.zeromq:jeromq:0.6.0",
diff --git a/Rakefile b/Rakefile
index a1b77c50b28b3..5c2ca0fe42ccb 100644
--- a/Rakefile
+++ b/Rakefile
@@ -98,7 +98,7 @@ 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/v126:v126.publish
+ //java/src/org/openqa/selenium/devtools/v129:v129.publish
//java/src/org/openqa/selenium/devtools/v127:v127.publish
//java/src/org/openqa/selenium/devtools/v85:v85.publish
//java/src/org/openqa/selenium/edge:edge.publish
@@ -753,7 +753,7 @@ namespace :dotnet do
args = arguments.to_a.compact
nightly = args.delete('nightly')
Rake::Task['dotnet:version'].invoke('nightly') if nightly
- Rake::Task['dotnet:package'].invoke('--config=remote_release')
+ Rake::Task['dotnet:package'].invoke('--config=release')
api_key = ENV.fetch('NUGET_API_KEY', nil)
push_destination = 'https://api.nuget.org/v3/index.json'
diff --git a/common/devtools/chromium/v127/browser_protocol.pdl b/common/devtools/chromium/v127/browser_protocol.pdl
index 0db3f7a0e9824..f1ac9eeb5d46c 100644
--- a/common/devtools/chromium/v127/browser_protocol.pdl
+++ b/common/devtools/chromium/v127/browser_protocol.pdl
@@ -12340,7 +12340,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://fedidcg.github.io/FedCM/#browser-api-rp-sign-in)
+ # (step 4 of https://w3c-fedid.github.io/FedCM/#browser-api-rp-sign-in)
optional boolean disableRejectionDelay
command disable
diff --git a/common/devtools/chromium/v128/browser_protocol.pdl b/common/devtools/chromium/v128/browser_protocol.pdl
index ce45403da9045..95b6a8e9e021c 100644
--- a/common/devtools/chromium/v128/browser_protocol.pdl
+++ b/common/devtools/chromium/v128/browser_protocol.pdl
@@ -12447,7 +12447,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://fedidcg.github.io/FedCM/#browser-api-rp-sign-in)
+ # (step 4 of https://w3c-fedid.github.io/FedCM/#browser-api-rp-sign-in)
optional boolean disableRejectionDelay
command disable
diff --git a/common/devtools/chromium/v126/BUILD.bazel b/common/devtools/chromium/v129/BUILD.bazel
similarity index 100%
rename from common/devtools/chromium/v126/BUILD.bazel
rename to common/devtools/chromium/v129/BUILD.bazel
diff --git a/common/devtools/chromium/v126/browser_protocol.pdl b/common/devtools/chromium/v129/browser_protocol.pdl
similarity index 96%
rename from common/devtools/chromium/v126/browser_protocol.pdl
rename to common/devtools/chromium/v129/browser_protocol.pdl
index 31028c8b42049..3a8d01b4b95e8 100644
--- a/common/devtools/chromium/v126/browser_protocol.pdl
+++ b/common/devtools/chromium/v129/browser_protocol.pdl
@@ -156,6 +156,7 @@ experimental domain Accessibility
flowto
labelledby
owns
+ url
# A node in the accessibility tree.
type AXNode extends object
@@ -622,6 +623,8 @@ experimental domain Audits
CoopSandboxedIFrameCannotNavigateToCoopPage
CorpNotSameOrigin
CorpNotSameOriginAfterDefaultedToSameOriginByCoep
+ CorpNotSameOriginAfterDefaultedToSameOriginByDip
+ CorpNotSameOriginAfterDefaultedToSameOriginByCoepAndDip
CorpNotSameSite
# Details for a request that has been blocked with the BLOCKED_BY_RESPONSE
@@ -800,7 +803,6 @@ experimental domain Audits
type GenericIssueErrorType extends string
enum
- CrossOriginPortalPostMessageError
FormLabelForNameError
FormDuplicateIdForInputError
FormInputWithNoLabelError
@@ -889,7 +891,9 @@ experimental domain Audits
ClientMetadataNoResponse
ClientMetadataInvalidResponse
ClientMetadataInvalidContentType
+ IdpNotPotentiallyTrustworthy
DisabledInSettings
+ DisabledInFlags
ErrorFetchingSignin
InvalidSigninResponse
AccountsHttpNotFound
@@ -912,6 +916,9 @@ experimental domain Audits
NotSignedInWithIdp
MissingTransientUserActivation
ReplacedByButtonMode
+ InvalidFieldsSpecified
+ RelyingPartyOriginIsOpaque
+ TypeNotMatching
type FederatedAuthUserInfoRequestIssueDetails extends object
properties
@@ -1095,13 +1102,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.
@@ -1109,6 +1123,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
@@ -1362,6 +1414,8 @@ domain Browser
optional boolean userVisibleOnly
# For "clipboard" permission, may specify allowWithoutSanitization.
optional boolean allowWithoutSanitization
+ # For "fullscreen" permission, must specify allowWithoutGesture:true.
+ optional boolean allowWithoutGesture
# For "camera" permission, may specify panTiltZoom.
optional boolean panTiltZoom
@@ -2002,13 +2056,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
@@ -2021,6 +2068,7 @@ experimental domain CSS
StyleSheetOrigin origin
# Associated style declaration.
CSSStyle style
+ boolean active
# CSS keyframes rule representation.
type CSSKeyframesRule extends object
@@ -2194,10 +2242,11 @@ 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-options property.
+ # 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,
+ # will not be set if there is no active position-try fallback.
+ optional integer activePositionFallbackIndex
# A list of CSS at-property rules matching this node.
optional array of CSSPropertyRule cssPropertyRules
# A list of CSS property registrations matching this node.
@@ -2636,7 +2685,9 @@ domain DOM
highlight
first-line-inherited
scroll-marker
- scroll-markers
+ scroll-marker-group
+ scroll-next-button
+ scroll-prev-button
scrollbar
scrollbar-thumb
scrollbar-button
@@ -2755,6 +2806,12 @@ domain DOM
optional CompatibilityMode compatibilityMode
optional BackendNode assignedSlot
+ # 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
properties
@@ -3265,6 +3322,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
@@ -3336,6 +3399,21 @@ domain DOM
# Descendant nodes with container queries against the given container.
array of NodeId nodeIds
+ # Returns the target anchor element of the given anchor query according to
+ # https://www.w3.org/TR/css-anchor-position-1/#target.
+ experimental command getAnchorElement
+ parameters
+ # Id of the positioned element from which to find the anchor.
+ NodeId nodeId
+ # An optional anchor specifier, as defined in
+ # https://www.w3.org/TR/css-anchor-position-1/#anchor-specifier.
+ # If not provided, it will return the implicit anchor element for
+ # the given positioned element.
+ optional string anchorSpecifier
+ returns
+ # The anchor element of the given anchor query.
+ NodeId nodeId
+
# Fired when `Element`'s attribute is modified.
event attributeModified
parameters
@@ -4157,6 +4235,21 @@ domain Emulation
optional SensorReadingXYZ xyz
optional SensorReadingQuaternion quaternion
+ experimental type PressureSource extends string
+ enum
+ cpu
+
+ experimental type PressureState extends string
+ enum
+ nominal
+ fair
+ serious
+ critical
+
+ experimental type PressureMetadata extends object
+ properties
+ optional boolean available
+
# Tells whether emulation is supported.
deprecated command canEmulate
returns
@@ -4326,6 +4419,24 @@ domain Emulation
SensorType type
SensorReading reading
+ # Overrides a pressure source of a given type, as used by the Compute
+ # Pressure API, so that updates to PressureObserver.observe() are provided
+ # via setPressureStateOverride instead of being retrieved from
+ # platform-provided telemetry data.
+ experimental command setPressureSourceOverrideEnabled
+ parameters
+ boolean enabled
+ PressureSource source
+ optional PressureMetadata metadata
+
+ # Provides a given pressure state that will be processed and eventually be
+ # delivered to PressureObserver users. |source| must have been previously
+ # overridden by setPressureSourceOverrideEnabled.
+ experimental command setPressureStateOverride
+ parameters
+ PressureSource source
+ PressureState state
+
# Overrides the Idle state.
command setIdleOverride
parameters
@@ -4534,6 +4645,42 @@ domain IO
# UUID of the specified Blob.
string uuid
+experimental domain FileSystem
+ depends on Network
+ depends on Storage
+
+ type File extends object
+ properties
+ string name
+ # Timestamp
+ Network.TimeSinceEpoch lastModified
+ # Size in bytes
+ number size
+ string type
+
+ type Directory extends object
+ properties
+ string name
+ array of string nestedDirectories
+ # Files that are directly nested under this directory.
+ array of File nestedFiles
+
+ type BucketFileSystemLocator extends object
+ properties
+ # Storage key
+ Storage.SerializedStorageKey storageKey
+ # Bucket name. Not passing a `bucketName` will retrieve the default Bucket. (https://developer.mozilla.org/en-US/docs/Web/API/Storage_API#storage_buckets)
+ optional string bucketName
+ # Path to the directory using each path component as an array item.
+ array of string pathComponents
+
+ command getDirectory
+ parameters
+ BucketFileSystemLocator bucketFileSystemLocator
+ returns
+ # Returns the directory object at the path.
+ Directory directory
+
experimental domain IndexedDB
depends on Runtime
depends on Storage
@@ -5589,6 +5736,10 @@ domain Network
experimental number workerFetchStart
# Settled fetch event respondWith promise.
experimental number workerRespondWithSettled
+ # Started ServiceWorker static routing source evaluation.
+ experimental optional number workerRouterEvaluationStart
+ # Started cache lookup when the source was evaluated to `cache`.
+ experimental optional number workerCacheLookupStart
# Started sending request.
number sendStart
# Finished sending request.
@@ -5735,6 +5886,8 @@ domain Network
coop-sandboxed-iframe-cannot-navigate-to-coop-page
corp-not-same-origin
corp-not-same-origin-after-defaulted-to-same-origin-by-coep
+ corp-not-same-origin-after-defaulted-to-same-origin-by-dip
+ corp-not-same-origin-after-defaulted-to-same-origin-by-coep-and-dip
corp-not-same-site
# The reason why request was blocked.
@@ -5874,6 +6027,8 @@ domain Network
# The router source of the matched rule. If there is a matched rule, this
# field will be set, otherwise no value will be set.
optional ServiceWorkerRouterSource matchedSourceType
+ # The actual router source used.
+ optional ServiceWorkerRouterSource actualSourceType
# HTTP response data.
type Response extends object
@@ -6006,6 +6161,16 @@ domain Network
# Set if another request triggered this request (e.g. preflight).
optional RequestId requestId
+ # cookiePartitionKey object
+ # The representation of the components of the key that are created by the cookiePartitionKey class contained in net/cookies/cookie_partition_key.h.
+ experimental type CookiePartitionKey extends object
+ properties
+ # The site of the top-level URL the browser was visiting at the start
+ # of the request to the endpoint that set the cookie.
+ string topLevelSite
+ # Indicates if the cookie has any ancestors that are cross-site to the topLevelSite.
+ boolean hasCrossSiteAncestor
+
# Cookie object
type Cookie extends object
properties
@@ -6039,9 +6204,8 @@ domain Network
# An unspecified port value allows protocol clients to emulate legacy cookie scope for the port.
# This is a temporary ability and it will be removed in the future.
experimental integer sourcePort
- # Cookie partition key. The site of the top-level URL the browser was visiting at the start
- # of the request to the endpoint that set the cookie.
- experimental optional string partitionKey
+ # Cookie partition key.
+ experimental optional CookiePartitionKey partitionKey
# True if cookie partition key is opaque.
experimental optional boolean partitionKeyOpaque
@@ -6186,6 +6350,8 @@ domain Network
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
# A cookie which was not stored from a response with the corresponding reason.
experimental type BlockedSetCookieWithReason extends object
@@ -6255,10 +6421,8 @@ domain Network
# An unspecified port value allows protocol clients to emulate legacy cookie scope for the port.
# This is a temporary ability and it will be removed in the future.
experimental optional integer sourcePort
- # Cookie partition key. The site of the top-level URL the browser was visiting at the start
- # of the request to the endpoint that set the cookie.
- # If not set, the cookie will be set as not partitioned.
- experimental optional string partitionKey
+ # Cookie partition key. If not set, the cookie will be set as not partitioned.
+ experimental optional CookiePartitionKey partitionKey
# Authorization challenge for HTTP status code 401 or 407.
experimental type AuthChallenge extends object
@@ -6461,9 +6625,9 @@ domain Network
optional string domain
# If specified, deletes only cookies with the exact path.
optional string path
- # If specified, deletes only cookies with the the given name and partitionKey where domain
- # matches provided URL.
- experimental optional string partitionKey
+ # If specified, deletes only cookies with the the given name and partitionKey where
+ # all partition key attributes match the cookie partition key attribute.
+ experimental optional CookiePartitionKey partitionKey
# Disables network tracking, prevents network events from being sent to the client.
command disable
@@ -6640,10 +6804,8 @@ domain Network
# An unspecified port value allows protocol clients to emulate legacy cookie scope for the port.
# This is a temporary ability and it will be removed in the future.
experimental optional integer sourcePort
- # Cookie partition key. The site of the top-level URL the browser was visiting at the start
- # of the request to the endpoint that set the cookie.
- # If not set, the cookie will be set as not partitioned.
- experimental optional string partitionKey
+ # Cookie partition key. If not set, the cookie will be set as not partitioned.
+ experimental optional CookiePartitionKey partitionKey
returns
# Always set to true. If an error occurs, the response indicates protocol error.
deprecated boolean success
@@ -7035,7 +7197,7 @@ domain Network
optional string headersText
# The cookie partition key that will be used to store partitioned cookies set in this response.
# Only sent when partitioned cookies are enabled.
- optional string cookiePartitionKey
+ experimental optional CookiePartitionKey cookiePartitionKey
# True if partitioned cookies are enabled, but the partition key is not serializable to string.
optional boolean cookiePartitionKeyOpaque
# A list of cookies which should have been blocked by 3PCD but are exempted and stored from
@@ -7069,7 +7231,7 @@ domain Network
FailedPrecondition
ResourceExhausted
AlreadyExists
- Unavailable
+ ResourceLimited
Unauthorized
BadResponse
InternalError
@@ -7084,6 +7246,9 @@ domain Network
# The number of obtained Trust Tokens on a successful "Issuance" operation.
optional integer issuedTokenCount
+ # Fired once security policy has been updated.
+ experimental event policyUpdated
+
# Fired once when parsing the .wbn file has succeeded.
# The event contains the information about the web bundle contents.
experimental event subresourceWebBundleMetadataReceived
@@ -7136,6 +7301,7 @@ domain Network
UnsafeNone
SameOriginPlusCoep
RestrictPropertiesPlusCoep
+ NoopenerAllowPopups
experimental type CrossOriginOpenerPolicyStatus extends object
properties
@@ -7848,6 +8014,7 @@ domain Page
experimental type PermissionsPolicyFeature extends string
enum
accelerometer
+ all-screens-capture
ambient-light-sensor
attribution-reporting
autoplay
@@ -7882,6 +8049,8 @@ domain Page
clipboard-write
compute-pressure
cross-origin-isolated
+ deferred-fetch
+ digital-credentials-get
direct-sockets
display-capture
document-domain
@@ -7902,6 +8071,7 @@ domain Page
keyboard-map
local-fonts
magnetometer
+ media-playback-while-not-visible
microphone
midi
otp-credentials
@@ -8239,14 +8409,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
@@ -9214,6 +9386,11 @@ domain Page
HTTPAuthRequired
CookieFlushed
BroadcastChannelOnMessage
+ WebViewSettingsChanged
+ WebViewJavaScriptObjectChanged
+ WebViewMessageListenerInjected
+ WebViewSafeBrowsingAllowlistChanged
+ WebViewDocumentStartJavascriptChanged
#Blocklisted features
WebSocket
WebTransport
@@ -9244,7 +9421,6 @@ domain Page
Printing
WebDatabase
PictureInPicture
- Portal
SpeechRecognizer
IdleManager
PaymentManager
@@ -9362,6 +9538,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
@@ -10434,6 +10619,23 @@ experimental domain Storage
exact
modulus
+ experimental type AttributionReportingAggregatableDebugReportingData extends object
+ properties
+ UnsignedInt128AsBase16 keyPiece
+ # number instead of integer because not all uint32 can be represented by
+ # int
+ number value
+ array of string types
+
+ experimental type AttributionReportingAggregatableDebugReportingConfig extends object
+ properties
+ # number instead of integer because not all uint32 can be represented by
+ # int, only present for source registrations
+ optional number budget
+ UnsignedInt128AsBase16 keyPiece
+ array of AttributionReportingAggregatableDebugReportingData debugData
+ optional string aggregationCoordinatorOrigin
+
experimental type AttributionReportingSourceRegistration extends object
properties
Network.TimeSinceEpoch time
@@ -10452,6 +10654,8 @@ experimental domain Storage
array of AttributionReportingAggregationKeysEntry aggregationKeys
optional UnsignedInt64AsBase10 debugKey
AttributionReportingTriggerDataMatching triggerDataMatching
+ SignedInt64AsBase10 destinationLimitPriority
+ AttributionReportingAggregatableDebugReportingConfig aggregatableDebugReportingConfig
experimental type AttributionReportingSourceRegistrationResult extends string
enum
@@ -10468,6 +10672,7 @@ experimental domain Storage
reportingOriginsPerSiteLimitReached
exceedsMaxChannelCapacity
exceedsMaxTriggerStateCardinality
+ destinationPerDayReportingLimitReached
experimental event attributionReportingSourceRegistered
parameters
@@ -10485,6 +10690,8 @@ experimental domain Storage
# number instead of integer because not all uint32 can be represented by
# int
number value
+ UnsignedInt64AsBase10 filteringId
+
experimental type AttributionReportingAggregatableValueEntry extends object
properties
@@ -10517,10 +10724,12 @@ experimental domain Storage
array of AttributionReportingEventTriggerData eventTriggerData
array of AttributionReportingAggregatableTriggerData aggregatableTriggerData
array of AttributionReportingAggregatableValueEntry aggregatableValues
+ integer aggregatableFilteringIdMaxBytes
boolean debugReporting
optional string aggregationCoordinatorOrigin
AttributionReportingSourceRegistrationTimeConfig sourceRegistrationTimeConfig
optional string triggerContextId
+ AttributionReportingAggregatableDebugReportingConfig aggregatableDebugReportingConfig
experimental type AttributionReportingEventLevelResult extends string
enum
@@ -10748,7 +10957,7 @@ domain Target
experimental optional Page.FrameId openerFrameId
experimental optional Browser.BrowserContextID browserContextId
# Provides additional details for specific target types. For example, for
- # the type of "page", this may be set to "portal" or "prerender".
+ # the type of "page", this may be set to "prerender".
experimental optional string subtype
# A filter used by target query/discovery/auto-attach operations.
@@ -12136,6 +12345,9 @@ experimental domain Preload
JavaScriptInterfaceAdded
JavaScriptInterfaceRemoved
AllPrerenderingCanceled
+ WindowClosed
+ SlowNetwork
+ OtherPrerenderedPageActivated
# Fired when a preload enabled state is updated.
event preloadEnabledStateUpdated
@@ -12376,15 +12588,14 @@ experimental domain PWA
# manifestId.
optional string installUrlOrBundleUrl
- # Uninstals the given manifest_id and closes any opened app windows.
+ # Uninstalls the given manifest_id and closes any opened app windows.
command uninstall
parameters
string manifestId
# Launches the installed web app, or an url in the same web app instead of the
- # default start url if it is provided. Returns a tab / web contents based
- # Target.TargetID which can be used to attach to via Target.attachToTarget or
- # similar APIs.
+ # default start url if it is provided. Returns a page Target.TargetID which
+ # can be used to attach to via Target.attachToTarget or similar APIs.
command launch
parameters
string manifestId
@@ -12392,3 +12603,127 @@ experimental domain PWA
returns
# ID of the tab target created as a result.
Target.TargetID targetId
+
+ # Opens one or more local files from an installed web app identified by its
+ # manifestId. The web app needs to have file handlers registered to process
+ # the files. The API returns one or more page Target.TargetIDs which can be
+ # used to attach to via Target.attachToTarget or similar APIs.
+ # If some files in the parameters cannot be handled by the web app, they will
+ # be ignored. If none of the files can be handled, this API returns an error.
+ # If no files are provided as the parameter, this API also returns an error.
+ #
+ # According to the definition of the file handlers in the manifest file, one
+ # Target.TargetID may represent a page handling one or more files. The order
+ # of the returned Target.TargetIDs is not guaranteed.
+ #
+ # TODO(crbug.com/339454034): Check the existences of the input files.
+ command launchFilesInApp
+ parameters
+ string manifestId
+ array of string files
+ returns
+ # IDs of the tab targets created as the result.
+ array of Target.TargetID targetIds
+
+ # Opens the current page in its web app identified by the manifest id, needs
+ # to be called on a page target. This function returns immediately without
+ # waiting for the app to finish loading.
+ command openCurrentPageInApp
+ parameters
+ string manifestId
+
+ # If user prefers opening the app in browser or an app window.
+ type DisplayMode extends string
+ enum
+ standalone
+ browser
+
+ # Changes user settings of the web app identified by its manifestId. If the
+ # app was not installed, this command returns an error. Unset parameters will
+ # be ignored; unrecognized values will cause an error.
+ #
+ # Unlike the ones defined in the manifest files of the web apps, these
+ # settings are provided by the browser and controlled by the users, they
+ # impact the way the browser handling the web apps.
+ #
+ # See the comment of each parameter.
+ command changeAppUserSettings
+ parameters
+ string manifestId
+ # If user allows the links clicked on by the user in the app's scope, or
+ # extended scope if the manifest has scope extensions and the flags
+ # `DesktopPWAsLinkCapturingWithScopeExtensions` and
+ # `WebAppEnableScopeExtensions` are enabled.
+ #
+ # Note, the API does not support resetting the linkCapturing to the
+ # initial value, uninstalling and installing the web app again will reset
+ # it.
+ #
+ # TODO(crbug.com/339453269): Setting this value on ChromeOS is not
+ # 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/v126/js_protocol.pdl b/common/devtools/chromium/v129/js_protocol.pdl
similarity index 100%
rename from common/devtools/chromium/v126/js_protocol.pdl
rename to common/devtools/chromium/v129/js_protocol.pdl
diff --git a/common/mirror/selenium b/common/mirror/selenium
index 2cf5b54c309b9..eeffcbd977915 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.24.0-SNAPSHOT.zip"
+ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-java-4.25.0.zip"
},
{
- "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-server-4.24.0-SNAPSHOT.jar"
+ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-server-4.25.0.jar"
},
{
- "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-server-4.24.0-SNAPSHOT.zip"
+ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/nightly/selenium-server-4.25.0.zip"
+ }
+ ]
+ },
+ {
+ "tag_name": "selenium-4.24.0",
+ "assets": [
+ {
+ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.24.0/selenium-dotnet-4.24.0.zip"
+ },
+ {
+ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.24.0/selenium-dotnet-strongnamed-4.24.0.zip"
+ },
+ {
+ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.24.0/selenium-java-4.24.0.zip"
+ },
+ {
+ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.24.0/selenium-server-4.24.0.jar"
+ },
+ {
+ "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.24.0/selenium-server-4.24.0.zip"
}
]
},
@@ -938,19 +958,5 @@
"browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-beta-4/selenium-server-4.0.0-beta-4.jar"
}
]
- },
- {
- "tag_name": "selenium-4.0.0-beta-3",
- "assets": [
- {
- "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-beta-3/selenium-html-runner-4.0.0-beta-3.jar"
- },
- {
- "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-beta-3/selenium-java-4.0.0-beta-3.zip"
- },
- {
- "browser_download_url": "https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-beta-3/selenium-server-4.0.0-beta-3.jar"
- }
- ]
}
]
diff --git a/common/repositories.bzl b/common/repositories.bzl
index e5fe36194e6d2..2b68a39f8cd05 100644
--- a/common/repositories.bzl
+++ b/common/repositories.bzl
@@ -11,8 +11,8 @@ def pin_browsers():
http_archive(
name = "linux_firefox",
- url = "https://ftp.mozilla.org/pub/firefox/releases/129.0.2/linux-x86_64/en-US/firefox-129.0.2.tar.bz2",
- sha256 = "abc39c9deb686084933371bbe0546001f7bfab46c9d7a0cf4b1a4a025886cd5e",
+ url = "https://ftp.mozilla.org/pub/firefox/releases/130.0.1/linux-x86_64/en-US/firefox-130.0.1.tar.bz2",
+ sha256 = "3b9cd7fe7d22f0960ee5a058e3c9e6b507814958ec5a9ac691cbd5ebd0895c93",
build_file_content = """
load("@aspect_rules_js//js:defs.bzl", "js_library")
package(default_visibility = ["//visibility:public"])
@@ -33,8 +33,8 @@ js_library(
dmg_archive(
name = "mac_firefox",
- url = "https://ftp.mozilla.org/pub/firefox/releases/129.0.2/mac/en-US/Firefox%20129.0.2.dmg",
- sha256 = "04e84a82ade99d031f8b28bd36e9b9606b83dc09905aac42e992c8e59a289539",
+ url = "https://ftp.mozilla.org/pub/firefox/releases/130.0.1/mac/en-US/Firefox%20130.0.1.dmg",
+ sha256 = "63ed878485d5498c269d95ba7e64f1104ed085b8e330b0ef0a565f85cc603426",
build_file_content = """
load("@aspect_rules_js//js:defs.bzl", "js_library")
package(default_visibility = ["//visibility:public"])
@@ -50,8 +50,8 @@ js_library(
http_archive(
name = "linux_beta_firefox",
- url = "https://ftp.mozilla.org/pub/firefox/releases/130.0b8/linux-x86_64/en-US/firefox-130.0b8.tar.bz2",
- sha256 = "5546eeeec1ef74632380045485fe21fe4b70529e144b7796f6379fa2886d20b3",
+ url = "https://ftp.mozilla.org/pub/firefox/releases/131.0b8/linux-x86_64/en-US/firefox-131.0b8.tar.bz2",
+ sha256 = "53a6c775688243908d5d010c9c14eda488d20faabb966be31fd49d711b89f1e1",
build_file_content = """
load("@aspect_rules_js//js:defs.bzl", "js_library")
package(default_visibility = ["//visibility:public"])
@@ -72,8 +72,8 @@ js_library(
dmg_archive(
name = "mac_beta_firefox",
- url = "https://ftp.mozilla.org/pub/firefox/releases/130.0b8/mac/en-US/Firefox%20130.0b8.dmg",
- sha256 = "ce43a790b96838e6866930ac8c8be47a4db43029c9cff8c7248816b50dfdec65",
+ url = "https://ftp.mozilla.org/pub/firefox/releases/131.0b8/mac/en-US/Firefox%20131.0b8.dmg",
+ sha256 = "8acb3265bdf9859abfbb58604f5b253a0efe1fab7b82d4ae7d3983706ac5427b",
build_file_content = """
load("@aspect_rules_js//js:defs.bzl", "js_library")
package(default_visibility = ["//visibility:public"])
@@ -123,10 +123,10 @@ js_library(
pkg_archive(
name = "mac_edge",
- url = "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/a0405b5e-b043-4a22-bc5a-34c762d62c1e/MicrosoftEdge-128.0.2739.42.pkg",
- sha256 = "091c611cd1920e93cf6998309d54f35843d4217b1d3f548ab258692150a5cbe6",
+ url = "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/28b1932d-413c-4868-b79f-f72482800efb/MicrosoftEdge-128.0.2739.79.pkg",
+ sha256 = "8bcdd29a37414136e46860acb6c151d3ae1f9ef1ee62464a0d00a7eda71b5e29",
move = {
- "MicrosoftEdge-128.0.2739.42.pkg/Payload/Microsoft Edge.app": "Edge.app",
+ "MicrosoftEdge-128.0.2739.79.pkg/Payload/Microsoft Edge.app": "Edge.app",
},
build_file_content = """
load("@aspect_rules_js//js:defs.bzl", "js_library")
@@ -143,8 +143,8 @@ js_library(
deb_archive(
name = "linux_edge",
- url = "https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/microsoft-edge-stable_128.0.2739.42-1_amd64.deb",
- sha256 = "0307595f6127b36fab8472d857479f62c5d8053b366b9ec7c86cf693e20331e4",
+ url = "https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/microsoft-edge-stable_128.0.2739.79-1_amd64.deb",
+ sha256 = "6238024b9d240927b76bb199021fe6e804d04759b61992638871755f5cc444f5",
build_file_content = """
load("@aspect_rules_js//js:defs.bzl", "js_library")
package(default_visibility = ["//visibility:public"])
@@ -165,8 +165,8 @@ js_library(
http_archive(
name = "linux_edgedriver",
- url = "https://msedgedriver.azureedge.net/128.0.2739.22/edgedriver_linux64.zip",
- sha256 = "466f3d9753ce50057df555a9555decfc4b883857636eb02fe928701495647f80",
+ url = "https://msedgedriver.azureedge.net/128.0.2739.81/edgedriver_linux64.zip",
+ sha256 = "66a7b7fca41920c813263642ee5be105bb3b18f89fa09319a3b681ccf608aeb5",
build_file_content = """
load("@aspect_rules_js//js:defs.bzl", "js_library")
package(default_visibility = ["//visibility:public"])
@@ -182,8 +182,8 @@ js_library(
http_archive(
name = "mac_edgedriver",
- url = "https://msedgedriver.azureedge.net/128.0.2739.22/edgedriver_mac64.zip",
- sha256 = "42524ae9681ecc0f216ce23ddbda7cea2e37882417f2eecee6b884b1207ab645",
+ url = "https://msedgedriver.azureedge.net/128.0.2739.81/edgedriver_mac64.zip",
+ sha256 = "554b60f5863f13db237bbba75fa8bac52517c364104dc859df0b457804ed10c9",
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/128.0.6613.84/linux64/chrome-linux64.zip",
- sha256 = "fb27db71f2d42afbf85dbdb722e3d2d28d8bc6985f5bb3c9dc153596e86342d9",
+ url = "https://storage.googleapis.com/chrome-for-testing-public/129.0.6668.58/linux64/chrome-linux64.zip",
+ sha256 = "0918cb647b186f6e429a90e67a716489cf96d0295da8a3a8c40a441379708ba9",
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/128.0.6613.84/mac-x64/chrome-mac-x64.zip",
- sha256 = "c71bcfac84865449b84f21bc0ee4ca46018012b2ea2dfdec5ab87fcfac60724e",
+ url = "https://storage.googleapis.com/chrome-for-testing-public/129.0.6668.58/mac-x64/chrome-mac-x64.zip",
+ sha256 = "2f1c317cde0ba19be2f4e731cb77fc0b45ec423781c099ae5208228abedd1359",
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/128.0.6613.84/linux64/chromedriver-linux64.zip",
- sha256 = "aa1a13b603cdaecda330455b56e55902c403ca09bbdb17e15af8430bf9835337",
+ url = "https://storage.googleapis.com/chrome-for-testing-public/129.0.6668.58/linux64/chromedriver-linux64.zip",
+ sha256 = "0fc68a18a9db153e98521ca1654bb3fd7842ad4552f98ec8ec6688e907efd9b1",
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/128.0.6613.84/mac-x64/chromedriver-mac-x64.zip",
- sha256 = "e30a779e51a4b8d0e5985fb76e624e99a31c71072c5c165a54ef7949ee958f53",
+ url = "https://storage.googleapis.com/chrome-for-testing-public/129.0.6668.58/mac-x64/chromedriver-mac-x64.zip",
+ sha256 = "df4df07aa534e1c082c252e54959c4caf2af1eed3d4631852e683971ffdec6cb",
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 816e69a03802e..bb0133c12e949 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 = "b53480279b2322ec7b57cdaaa4d828c699dddb6d60803cb30770f6ff59a74cbb",
- url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-24a949d/selenium-manager-linux",
+ sha256 = "d4d775c38f5403d4a719e69903e6f70d15d2454d03da80ad6b82515a4ebfb986",
+ url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-dffb534/selenium-manager-linux",
)
http_file(
name = "download_sm_macos",
executable = True,
- sha256 = "a8c0c55d1e58cb84c2ac691c469bb988181cc077cdded395093363fca455094e",
- url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-24a949d/selenium-manager-macos",
+ sha256 = "2d6b20c603c4ca913423b3725cdc7ffa7e6a1554c9c161e3da226b186ba71054",
+ url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-dffb534/selenium-manager-macos",
)
http_file(
name = "download_sm_windows",
executable = True,
- sha256 = "070cfa94ac3edd88fa3e467f8e929f93551655a7dff4ad476737de023c2b037f",
- url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-24a949d/selenium-manager-windows.exe",
+ sha256 = "58c47a131fd4323c647a95cb37baeafc5a14a536885ccc152457e87a4fd2188d",
+ url = "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/download/selenium-manager-dffb534/selenium-manager-windows.exe",
)
def _selenium_manager_artifacts_impl(_ctx):
diff --git a/dotnet/CHANGELOG b/dotnet/CHANGELOG
index 0ed2549a9559d..a237ec48e7f02 100644
--- a/dotnet/CHANGELOG
+++ b/dotnet/CHANGELOG
@@ -1,3 +1,15 @@
+v4.25.0
+======
+* Add CDP for Chrome 129 and remove 126
+* BiDi implementation (#14318)
+* Add BiDi OriginalOpener in browsing context info
+* [bidi] Forward subscription options in browser context for log module
+* [bidi] Enable implicit ways to specify page ranges for printing
+* Workaround using pre-processor directive (#14499)
+* [bidi] Simplify browsing context type enumeration
+* [bidi] Expose BiDi associated reference in browsing context
+* [bidi] Rename entry point AsBidirectional to AsBiDirectional
+
v4.24.0
======
* Migration from `Newtonsoft.Json` to `System.Text.Json` package (#14292)
diff --git a/dotnet/selenium-dotnet-version.bzl b/dotnet/selenium-dotnet-version.bzl
index 94cd7ea71b924..679825b8a64ec 100644
--- a/dotnet/selenium-dotnet-version.bzl
+++ b/dotnet/selenium-dotnet-version.bzl
@@ -1,13 +1,13 @@
# BUILD FILE SYNTAX: STARLARK
-SE_VERSION = "4.24.0"
+SE_VERSION = "4.25.0"
ASSEMBLY_VERSION = "4.0.0.0"
SUPPORTED_NET_STANDARD_VERSIONS = ["netstandard2.0"]
SUPPORTED_DEVTOOLS_VERSIONS = [
"v85",
"v128",
- "v126",
+ "v129",
"v127",
]
diff --git a/dotnet/src/webdriver/BUILD.bazel b/dotnet/src/webdriver/BUILD.bazel
index 2e1c41bfb56df..1f23755fa1025 100644
--- a/dotnet/src/webdriver/BUILD.bazel
+++ b/dotnet/src/webdriver/BUILD.bazel
@@ -52,6 +52,8 @@ csharp_library(
],
deps = [
framework("nuget", "NETStandard.Library"),
+ framework("nuget", "Microsoft.Bcl.AsyncInterfaces"),
+ framework("nuget", "System.Threading.Tasks.Extensions"),
framework("nuget", "System.Memory"),
framework("nuget", "System.Text.Json"),
],
@@ -65,6 +67,9 @@ csharp_library(
"**/*.cs",
]) + devtools_version_targets(),
out = "WebDriver",
+ defines = [
+ "NET8_0_OR_GREATER",
+ ],
internals_visible_to = [
"WebDriver.Common.Tests",
],
@@ -111,6 +116,8 @@ csharp_library(
],
deps = [
framework("nuget", "NETStandard.Library"),
+ framework("nuget", "Microsoft.Bcl.AsyncInterfaces"),
+ framework("nuget", "System.Threading.Tasks.Extensions"),
framework("nuget", "System.Memory"),
framework("nuget", "System.Text.Json"),
],
@@ -124,6 +131,9 @@ csharp_library(
"**/*.cs",
]) + devtools_version_targets(),
out = "WebDriver.StrongNamed",
+ defines = [
+ "NET8_0_OR_GREATER",
+ ],
keyfile = "//dotnet:WebDriver.snk",
langversion = "12.0",
resources = [
diff --git a/dotnet/src/webdriver/BiDi/BiDi.cs b/dotnet/src/webdriver/BiDi/BiDi.cs
new file mode 100644
index 0000000000000..db53571e8ad8c
--- /dev/null
+++ b/dotnet/src/webdriver/BiDi/BiDi.cs
@@ -0,0 +1,124 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using OpenQA.Selenium.BiDi.Communication;
+using OpenQA.Selenium.BiDi.Communication.Transport;
+
+namespace OpenQA.Selenium.BiDi;
+
+public class BiDi : IAsyncDisposable
+{
+ private readonly ITransport _transport;
+ private readonly Broker _broker;
+
+ private readonly Lazy _sessionModule;
+ private readonly Lazy _browsingContextModule;
+ private readonly Lazy _browserModule;
+ private readonly Lazy _networkModule;
+ private readonly Lazy _inputModule;
+ private readonly Lazy _scriptModule;
+ private readonly Lazy _logModule;
+ private readonly Lazy _storageModule;
+
+ internal BiDi(string url)
+ {
+ var uri = new Uri(url);
+
+ _transport = new WebSocketTransport(new Uri(url));
+ _broker = new Broker(this, _transport);
+
+ _sessionModule = new Lazy(() => new Modules.Session.SessionModule(_broker));
+ _browsingContextModule = new Lazy(() => new Modules.BrowsingContext.BrowsingContextModule(_broker));
+ _browserModule = new Lazy(() => new Modules.Browser.BrowserModule(_broker));
+ _networkModule = new Lazy(() => new Modules.Network.NetworkModule(_broker));
+ _inputModule = new Lazy(() => new Modules.Input.InputModule(_broker));
+ _scriptModule = new Lazy(() => new Modules.Script.ScriptModule(_broker));
+ _logModule = new Lazy(() => new Modules.Log.LogModule(_broker));
+ _storageModule = new Lazy(() => new Modules.Storage.StorageModule(_broker));
+ }
+
+ internal Modules.Session.SessionModule SessionModule => _sessionModule.Value;
+ internal Modules.BrowsingContext.BrowsingContextModule BrowsingContextModule => _browsingContextModule.Value;
+ public Modules.Browser.BrowserModule Browser => _browserModule.Value;
+ public Modules.Network.NetworkModule Network => _networkModule.Value;
+ internal Modules.Input.InputModule InputModule => _inputModule.Value;
+ internal Modules.Script.ScriptModule ScriptModule => _scriptModule.Value;
+ public Modules.Log.LogModule Log => _logModule.Value;
+ public Modules.Storage.StorageModule Storage => _storageModule.Value;
+
+ public Task StatusAsync()
+ {
+ return SessionModule.StatusAsync();
+ }
+
+ public static async Task ConnectAsync(string url)
+ {
+ var bidi = new BiDi(url);
+
+ await bidi._broker.ConnectAsync(default).ConfigureAwait(false);
+
+ return bidi;
+ }
+
+ public Task CreateContextAsync(Modules.BrowsingContext.ContextType type, Modules.BrowsingContext.CreateOptions? options = null)
+ {
+ return BrowsingContextModule.CreateAsync(type, options);
+ }
+
+ public Task> GetTreeAsync(Modules.BrowsingContext.GetTreeOptions? options = null)
+ {
+ return BrowsingContextModule.GetTreeAsync(options);
+ }
+
+ public Task EndAsync(Modules.Session.EndOptions? options = null)
+ {
+ return SessionModule.EndAsync(options);
+ }
+
+ public async ValueTask DisposeAsync()
+ {
+ await _broker.DisposeAsync().ConfigureAwait(false);
+
+ _transport?.Dispose();
+ }
+
+ public Task OnContextCreatedAsync(Func handler, BrowsingContextsSubscriptionOptions? options = null)
+ {
+ return BrowsingContextModule.OnContextCreatedAsync(handler, options);
+ }
+
+ public Task OnContextCreatedAsync(Action handler, BrowsingContextsSubscriptionOptions? options = null)
+ {
+ return BrowsingContextModule.OnContextCreatedAsync(handler, options);
+ }
+
+ public Task OnContextDestroyedAsync(Func handler, BrowsingContextsSubscriptionOptions? options = null)
+ {
+ return BrowsingContextModule.OnContextDestroyedAsync(handler, options);
+ }
+
+ public Task OnContextDestroyedAsync(Action handler, BrowsingContextsSubscriptionOptions? options = null)
+ {
+ return BrowsingContextModule.OnContextDestroyedAsync(handler, options);
+ }
+
+ public Task OnUserPromptOpenedAsync(Func handler, BrowsingContextsSubscriptionOptions? options = null)
+ {
+ return BrowsingContextModule.OnUserPromptOpenedAsync(handler, options);
+ }
+
+ public Task OnUserPromptOpenedAsync(Action handler, BrowsingContextsSubscriptionOptions? options = null)
+ {
+ return BrowsingContextModule.OnUserPromptOpenedAsync(handler, options);
+ }
+
+ public Task OnUserPromptClosedAsync(Func handler, BrowsingContextsSubscriptionOptions? options = null)
+ {
+ return BrowsingContextModule.OnUserPromptClosedAsync(handler, options);
+ }
+
+ public Task OnUserPromptClosedAsync(Action handler, BrowsingContextsSubscriptionOptions? options = null)
+ {
+ return BrowsingContextModule.OnUserPromptClosedAsync(handler, options);
+ }
+}
diff --git a/dotnet/src/webdriver/BiDi/BiDiException.cs b/dotnet/src/webdriver/BiDi/BiDiException.cs
new file mode 100644
index 0000000000000..7f2ddd5b59cbc
--- /dev/null
+++ b/dotnet/src/webdriver/BiDi/BiDiException.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace OpenQA.Selenium.BiDi;
+
+public class BiDiException : Exception
+{
+ public BiDiException(string message) : base(message)
+ {
+ }
+}
diff --git a/dotnet/src/webdriver/BiDi/Communication/Broker.cs b/dotnet/src/webdriver/BiDi/Communication/Broker.cs
new file mode 100644
index 0000000000000..82549d1d5c5b1
--- /dev/null
+++ b/dotnet/src/webdriver/BiDi/Communication/Broker.cs
@@ -0,0 +1,265 @@
+using OpenQA.Selenium.BiDi.Communication.Json.Converters;
+using OpenQA.Selenium.BiDi.Communication.Transport;
+using OpenQA.Selenium.Internal.Logging;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace OpenQA.Selenium.BiDi.Communication;
+
+public class Broker : IAsyncDisposable
+{
+ private readonly ILogger _logger = Log.GetLogger();
+
+ private readonly BiDi _bidi;
+ private readonly ITransport _transport;
+
+ private readonly ConcurrentDictionary> _pendingCommands = new();
+ private readonly BlockingCollection _pendingEvents = [];
+
+ private readonly ConcurrentDictionary> _eventHandlers = new();
+
+ private int _currentCommandId;
+
+ private static readonly TaskFactory _myTaskFactory = new(CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskContinuationOptions.None, TaskScheduler.Default);
+
+ private Task? _receivingMessageTask;
+ private Task? _eventEmitterTask;
+ private CancellationTokenSource? _receiveMessagesCancellationTokenSource;
+
+ private readonly JsonSerializerOptions _jsonSerializerOptions;
+
+ public Broker(BiDi bidi, ITransport transport)
+ {
+ _bidi = bidi;
+ _transport = transport;
+
+ _jsonSerializerOptions = new JsonSerializerOptions
+ {
+ PropertyNameCaseInsensitive = true,
+ PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
+ DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
+ Converters =
+ {
+ new BrowsingContextConverter(_bidi),
+ new BrowserUserContextConverter(bidi),
+ new NavigationConverter(),
+ new InterceptConverter(_bidi),
+ new RequestConverter(_bidi),
+ new ChannelConverter(_bidi),
+ new HandleConverter(_bidi),
+ new InternalIdConverter(_bidi),
+ new PreloadScriptConverter(_bidi),
+ new RealmConverter(_bidi),
+ new RealmTypeConverter(),
+ new DateTimeOffsetConverter(),
+ new PrintPageRangeConverter(),
+ new JsonStringEnumConverter(JsonNamingPolicy.CamelCase),
+
+ // https://github.com/dotnet/runtime/issues/72604
+ new Json.Converters.Polymorphic.MessageConverter(),
+ new Json.Converters.Polymorphic.EvaluateResultConverter(),
+ new Json.Converters.Polymorphic.RemoteValueConverter(),
+ new Json.Converters.Polymorphic.RealmInfoConverter(),
+ new Json.Converters.Polymorphic.LogEntryConverter(),
+ //
+ }
+ };
+ }
+
+ public async Task ConnectAsync(CancellationToken cancellationToken)
+ {
+ await _transport.ConnectAsync(cancellationToken).ConfigureAwait(false);
+
+ _receiveMessagesCancellationTokenSource = new CancellationTokenSource();
+ _receivingMessageTask = _myTaskFactory.StartNew(async () => await ReceiveMessagesAsync(_receiveMessagesCancellationTokenSource.Token), TaskCreationOptions.LongRunning).Unwrap();
+ _eventEmitterTask = _myTaskFactory.StartNew(async () => await ProcessEventsAwaiterAsync(), TaskCreationOptions.LongRunning).Unwrap();
+ }
+
+ private async Task ReceiveMessagesAsync(CancellationToken cancellationToken)
+ {
+ while (!cancellationToken.IsCancellationRequested)
+ {
+ var message = await _transport.ReceiveAsJsonAsync(_jsonSerializerOptions, cancellationToken);
+
+ switch (message)
+ {
+ case MessageSuccess messageSuccess:
+ _pendingCommands[messageSuccess.Id].SetResult(messageSuccess.Result);
+ _pendingCommands.TryRemove(messageSuccess.Id, out _);
+ break;
+ case MessageEvent messageEvent:
+ _pendingEvents.Add(messageEvent);
+ break;
+ case MessageError mesageError:
+ _pendingCommands[mesageError.Id].SetException(new BiDiException($"{mesageError.Error}: {mesageError.Message}"));
+ _pendingCommands.TryRemove(mesageError.Id, out _);
+ break;
+ }
+ }
+ }
+
+ private async Task ProcessEventsAwaiterAsync()
+ {
+ foreach (var result in _pendingEvents.GetConsumingEnumerable())
+ {
+ try
+ {
+ if (_eventHandlers.TryGetValue(result.Method, out var eventHandlers))
+ {
+ if (eventHandlers is not null)
+ {
+ foreach (var handler in eventHandlers.ToArray()) // copy handlers avoiding modified collection while iterating
+ {
+ var args = (EventArgs)result.Params.Deserialize(handler.EventArgsType, _jsonSerializerOptions)!;
+
+ args.BiDi = _bidi;
+
+ // handle browsing context subscriber
+ if (handler.Contexts is not null && args is BrowsingContextEventArgs browsingContextEventArgs && handler.Contexts.Contains(browsingContextEventArgs.Context))
+ {
+ await handler.InvokeAsync(args).ConfigureAwait(false);
+ }
+ // handle only session subscriber
+ else if (handler.Contexts is null)
+ {
+ await handler.InvokeAsync(args).ConfigureAwait(false);
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ if (_logger.IsEnabled(LogEventLevel.Error))
+ {
+ _logger.Error($"Unhandled error processing BiDi event: {ex}");
+ }
+ }
+ }
+ }
+
+ public async Task ExecuteCommandAsync(Command command, CommandOptions? options)
+ {
+ var result = await ExecuteCommandCoreAsync(command, options).ConfigureAwait(false);
+
+ return (TResult)((JsonElement)result).Deserialize(typeof(TResult), _jsonSerializerOptions)!;
+ }
+
+ public async Task ExecuteCommandAsync(Command command, CommandOptions? options)
+ {
+ await ExecuteCommandCoreAsync(command, options).ConfigureAwait(false);
+ }
+
+ private async Task