diff --git a/.bazelrc b/.bazelrc index f0031fc19eab8..e4834f9759d01 100644 --- a/.bazelrc +++ b/.bazelrc @@ -30,10 +30,12 @@ build --tool_java_runtime_version=remotejdk_17 build --javacopt="--release 11" # Require java dependencies to be used and first-order - build --experimental_strict_java_deps=strict build --explicit_java_test_deps +# Avoid ErrorProne getting annoyed about "impossible null checks" +build --javacopt="-Xep:ImpossibleNullComparison:OFF" + # Allow spaces in runfile paths build --nobuild_runfile_links @@ -55,6 +57,11 @@ query --@aspect_rules_ts//ts:default_to_tsc_transpiler build --incompatible_strict_action_env +# Required to get `protobuf` compiling, which is required for `rules_closure` +build --incompatible_enable_cc_toolchain_resolution +build --cxxopt=-std=c++14 +build --host_cxxopt=-std=c++14 + # For build stamping build --enable_platform_specific_config diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index 7b86e983e85d1..96e845c5c118c 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -82,6 +82,12 @@ jobs: steps: - name: Checkout source tree uses: actions/checkout@v4 + - name: Pull latest changes from head ref for PRs + if: contains(github.head_ref, 'renovate/') + run: git pull origin ${{ github.head_ref }} + - name: Pull latest changes from ref for branch pushes + if: contains(github.ref, 'renovate/') + run: git pull origin ${{ github.ref }} - name: Free space if: inputs.os != 'windows' run: ./scripts/github-actions/free-disk-space.sh diff --git a/.github/workflows/ci-rbe.yml b/.github/workflows/ci-rbe.yml index 2e15949925580..e5b89ac0b7f59 100644 --- a/.github/workflows/ci-rbe.yml +++ b/.github/workflows/ci-rbe.yml @@ -10,7 +10,7 @@ on: jobs: format: name: Format - if: github.repository_owner == 'seleniumhq' + if: github.repository_owner == 'seleniumhq' && startsWith(github.head_ref, 'renovate/') != true uses: ./.github/workflows/bazel.yml with: name: Check format script run @@ -20,7 +20,7 @@ jobs: test: name: Test - if: github.repository_owner == 'seleniumhq' + if: github.repository_owner == 'seleniumhq' && startsWith(github.head_ref, 'renovate/') != true uses: ./.github/workflows/bazel.yml with: name: All RBE tests diff --git a/.github/workflows/ci-renovate-rbe.yml b/.github/workflows/ci-renovate-rbe.yml new file mode 100644 index 0000000000000..46d5617758ddb --- /dev/null +++ b/.github/workflows/ci-renovate-rbe.yml @@ -0,0 +1,68 @@ +name: CI - Renovate - RBE + +on: + push: + branches: + - renovate/* + workflow_dispatch: + +jobs: + pin: + runs-on: ubuntu-latest + if: github.repository_owner == 'seleniumhq' + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + - name: java - repin dependencies + if: contains(join(github.event.commits.*.message), '[java]') + run: RULES_JVM_EXTERNAL_REPIN=1 bazel run @maven//:pin + - name: rust - repin dependencies + if: contains(join(github.event.commits.*.message), '[rust]') + run: CARGO_BAZEL_REPIN=true bazel sync --only=crates + - name: js - repin dependencies + if: contains(join(github.event.commits.*.message), '[js]') + run: bazel run -- @pnpm//:pnpm install --dir $PWD --lockfile-only + - name: dotnet - repin dependencies + if: contains(join(github.event.commits.*.message), '[dotnet]') + run: ./dotnet/update-deps.sh + - name: py - repin dependencies + if: contains(join(github.event.commits.*.message), '[py]') + run: bazel run //py:requirements.update + - name: Commit files + run: | + export CHANGES=$(git status -s) + if [ -n "$CHANGES" ]; then + git config --local user.email "selenium-ci@users.noreply.github.com" + git config --local user.name "Selenium CI Bot" + git add . + git commit -m 'Repin dependencies' + git push + fi + + check-format: + needs: pin + name: Check format + if: github.repository_owner == 'seleniumhq' + uses: ./.github/workflows/bazel.yml + with: + name: Check format script run + caching: false + ruby-version: jruby-9.4.8.0 + run: ./scripts/github-actions/check-format.sh + + test: + name: Test + needs: pin + if: github.repository_owner == 'seleniumhq' + uses: ./.github/workflows/bazel.yml + with: + name: All RBE tests + caching: false + ruby-version: jruby-9.4.8.0 + run: ./scripts/github-actions/ci-build.sh + + ci-gh: + name: CI - GitHub + needs: pin + if: github.repository_owner == 'seleniumhq' + uses: ./.github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db2c0a78857de..e200aa574f880 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,10 +8,14 @@ on: schedule: - cron: "0 */12 * * *" workflow_dispatch: + workflow_call: jobs: check: name: Check + if: > + github.repository_owner == 'seleniumhq' && + (startsWith(github.head_ref, 'renovate/') != true || github.event_name == 'workflow_call') runs-on: ubuntu-latest outputs: targets: ${{ steps.check-targets.outputs.bazel-targets }} @@ -44,6 +48,7 @@ jobs: if: > github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || + github.event_name == 'workflow_call' || contains(needs.check.outputs.targets, '//dotnet') || contains(join(github.event.commits.*.message), '[dotnet]') || contains(github.event.pull_request.title, '[dotnet]') @@ -55,6 +60,7 @@ jobs: if: > github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || + github.event_name == 'workflow_call' || contains(needs.check.outputs.targets, '//java') || contains(join(github.event.commits.*.message), '[java]') || contains(github.event.pull_request.title, '[java]') @@ -66,6 +72,7 @@ jobs: if: > github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || + github.event_name == 'workflow_call' || contains(needs.check.outputs.targets, '//py') || contains(join(github.event.commits.*.message), '[py]') || contains(github.event.pull_request.title, '[py]') @@ -77,6 +84,7 @@ jobs: if: > github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || + github.event_name == 'workflow_call' || contains(needs.check.outputs.targets, '//rb') || contains(join(github.event.commits.*.message), '[rb]') || contains(github.event.pull_request.title, '[rb]') @@ -90,6 +98,7 @@ jobs: if: > github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || + github.event_name == 'workflow_call' || contains(needs.check.outputs.targets, '//rust') || contains(join(github.event.commits.*.message), '[rust]') || contains(github.event.pull_request.title, '[rust]') diff --git a/.skipped-tests b/.skipped-tests index 3a6807a2cbb1d..2f8b21cfba2c2 100644 --- a/.skipped-tests +++ b/.skipped-tests @@ -5,7 +5,6 @@ -//java/test/org/openqa/selenium/edge:EdgeDriverFunctionalTest -//java/test/org/openqa/selenium/edge:EdgeDriverFunctionalTest-edge -//java/test/org/openqa/selenium/edge:EdgeDriverFunctionalTest-remote --//java/test/org/openqa/selenium/federatedcredentialmanagement:FederatedCredentialManagementTest -//java/test/org/openqa/selenium/firefox:FirefoxDriverBuilderTest -//java/test/org/openqa/selenium/grid/gridui:OverallGridTest -//java/test/org/openqa/selenium/grid/router:RemoteWebDriverDownloadTest diff --git a/MODULE.bazel b/MODULE.bazel index 9a98a3348bb0d..c1079592bf736 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -12,19 +12,19 @@ bazel_dep(name = "contrib_rules_jvm", version = "0.27.0") bazel_dep(name = "platforms", version = "0.0.10") # Required for the closure rules -bazel_dep(name = "protobuf", version = "21.7", dev_dependency = True, repo_name = "com_google_protobuf") +bazel_dep(name = "protobuf", version = "29.1", dev_dependency = True, repo_name = "com_google_protobuf") # Required for rules_rust to import the crates properly 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") bazel_dep(name = "rules_python", version = "0.33.0") -bazel_dep(name = "rules_proto", version = "6.0.0") +bazel_dep(name = "rules_proto", version = "6.0.2") bazel_dep(name = "rules_ruby", version = "0.13.0") linter = use_extension("@apple_rules_lint//lint:extensions.bzl", "linter") @@ -169,7 +169,7 @@ maven.install( name = "maven", artifacts = [ "com.beust:jcommander:1.82", - "com.github.javaparser:javaparser-core:3.26.2", + "com.github.javaparser:javaparser-core:3.26.3", "com.github.spotbugs:spotbugs:4.8.6", "com.github.stephenc.jcip:jcip-annotations:1.0-1", "com.google.code.gson:gson:2.11.0", @@ -181,41 +181,41 @@ maven.install( "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.5.0.RELEASE", - "io.netty:netty-buffer:4.1.115.Final", - "io.netty:netty-codec-http:4.1.115.Final", - "io.netty:netty-codec-http2:4.1.115.Final", - "io.netty:netty-common:4.1.115.Final", - "io.netty:netty-handler:4.1.115.Final", - "io.netty:netty-handler-proxy:4.1.115.Final", - "io.netty:netty-transport:4.1.115.Final", - "io.opentelemetry:opentelemetry-api:1.44.1", - "io.opentelemetry:opentelemetry-context:1.44.1", - "io.opentelemetry:opentelemetry-exporter-logging:1.44.1", - "io.opentelemetry:opentelemetry-sdk:1.44.1", - "io.opentelemetry:opentelemetry-sdk-common:1.44.1", - "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.44.1", - "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.44.1", - "io.opentelemetry:opentelemetry-sdk-testing:1.44.1", - "io.opentelemetry:opentelemetry-sdk-trace:1.44.1", - "io.opentelemetry.semconv:opentelemetry-semconv:1.25.0-alpha", + "io.lettuce:lettuce-core:6.5.1.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", + "net.bytebuddy:byte-buddy:1.15.11", "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.apache.logging.log4j:log4j-core:2.24.3", "org.assertj:assertj-core:3.26.3", "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.39.0", "org.slf4j:slf4j-api:2.0.16", @@ -223,6 +223,11 @@ maven.install( "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/README.md b/README.md index fe7ce42b18ccb..07feb7d568351 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Selenium [![CI](https://github.com/SeleniumHQ/selenium/actions/workflows/ci.yml/badge.svg?branch=trunk&event=schedule)](https://github.com/SeleniumHQ/selenium/actions/workflows/ci.yml) +[![CI - RBE](https://github.com/SeleniumHQ/selenium/actions/workflows/ci-rbe.yml/badge.svg?branch=trunk&event=schedule)](https://github.com/SeleniumHQ/selenium/actions/workflows/ci-rbe.yml) [![Releases downloads](https://img.shields.io/github/downloads/SeleniumHQ/selenium/total.svg)](https://github.com/SeleniumHQ/selenium/releases) Selenium Logo diff --git a/Rakefile b/Rakefile index 7ee7099acb135..24bb5ace8e78b 100644 --- a/Rakefile +++ b/Rakefile @@ -585,8 +585,7 @@ namespace :py do nightly = ".#{Time.now.strftime('%Y%m%d%H%M')}" new_version = updated_version(old_version, arguments[:version], nightly) - ['py/setup.py', - 'py/pyproject.toml', + ['py/pyproject.toml', 'py/BUILD.bazel', 'py/selenium/__init__.py', 'py/selenium/webdriver/__init__.py', @@ -1048,7 +1047,6 @@ namespace :all do 'py/selenium/webdriver/__init__.py', 'py/selenium/__init__.py', 'py/BUILD.bazel', - 'py/setup.py', 'rb/lib/selenium/webdriver/version.rb', 'rb/Gemfile.lock']) @@ -1110,7 +1108,6 @@ namespace :all do 'py/selenium/webdriver/__init__.py', 'py/BUILD.bazel', 'py/CHANGES', - 'py/setup.py', 'rb/lib/selenium/webdriver/version.rb', 'rb/CHANGES', 'rb/Gemfile.lock', diff --git a/WORKSPACE b/WORKSPACE index 98cec87d366b7..b33f16328442d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -6,17 +6,8 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "io_bazel_rules_closure", - patch_args = [ - "-p1", - ], - patches = [ - "//javascript:rules_closure_shell.patch", - ], - sha256 = "d66deed38a0bb20581c15664f0ab62270af5940786855c7adc3087b27168b529", - strip_prefix = "rules_closure-0.11.0", - urls = [ - "https://github.com/bazelbuild/rules_closure/archive/0.11.0.tar.gz", - ], + strip_prefix = "rules_closure-0.12.0", + url = "https://github.com/bazelbuild/rules_closure/archive/refs/tags/0.12.0.tar.gz", ) load("@io_bazel_rules_closure//closure:repositories.bzl", "rules_closure_dependencies", "rules_closure_toolchains") @@ -34,8 +25,8 @@ rules_closure_toolchains() http_archive( name = "rules_rust", - integrity = "sha256-Zx3bP+Xrz53TTQUeynNS+68z+lO/Ye7Qt1pMNIKeVIA=", - urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.52.2/rules_rust-v0.52.2.tar.gz"], + integrity = "sha256-eEXiHXSGUH6qD1bdI5KXZ/B04m0wIUeoyM7pmujzbbQ=", + urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.55.5/rules_rust-0.55.5.tar.gz"], ) load("@rules_rust//rust:repositories.bzl", "rules_rust_dependencies", "rust_register_toolchains") diff --git a/common/repositories.bzl b/common/repositories.bzl index ba420b18bf293..519f86f933c93 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/132.0.2/linux-x86_64/en-US/firefox-132.0.2.tar.bz2", - sha256 = "777d47f8b8710ab450582dc0dc0cdf8f43c2291249b3eaf740ee28ee34cda139", + url = "https://ftp.mozilla.org/pub/firefox/releases/133.0.3/linux-x86_64/en-US/firefox-133.0.3.tar.bz2", + sha256 = "43713e238d0153fdbf1ab46dd76c6b01ab83fae197b5dc3a95087f51907ba44d", 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/132.0.2/mac/en-US/Firefox%20132.0.2.dmg", - sha256 = "233251c46eb4964868d815a9233cab855ac6160736310771a67af93a9b78224d", + url = "https://ftp.mozilla.org/pub/firefox/releases/133.0.3/mac/en-US/Firefox%20133.0.3.dmg", + sha256 = "9ceb4fa2120228f287e6c654cef7898b4cce0a659270056276b8884581267d3b", 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/133.0b9/linux-x86_64/en-US/firefox-133.0b9.tar.bz2", - sha256 = "5c9f79912bfbf892d2b676973a26ffc078ee9b8fd9b791bfa856db030e657750", + url = "https://ftp.mozilla.org/pub/firefox/releases/134.0b10/linux-x86_64/en-US/firefox-134.0b10.tar.bz2", + sha256 = "b933fec8e13c6a1ad42053881f9210aedd22c51d303bd41b1402f0f7db43a1ab", 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/133.0b9/mac/en-US/Firefox%20133.0b9.dmg", - sha256 = "0eb0fabe9216dc80c2ca403dd2eba935d71f2bdc1dea1d1cc37f03666ef094d1", + url = "https://ftp.mozilla.org/pub/firefox/releases/134.0b10/mac/en-US/Firefox%20134.0b10.dmg", + sha256 = "d6e74c4f89b4a6d2c0cd81f322ffc45c1e8b391d646fbc61533fc618b8f12ead", 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/08b226c9-fbe8-43c0-94fe-ed9c3eeb8f59/MicrosoftEdge-131.0.2903.51.pkg", - sha256 = "5bc1eab86bb315aa9f2cd2b7d9afe072df35280f6e6d1a9ca9c108d95bda8acd", + url = "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/3e7ebcc4-eac0-41fe-b43b-4d1aa1ba237c/MicrosoftEdge-131.0.2903.112.pkg", + sha256 = "648233d6654a3b0a9b651f31c33260125b6410e956b698970b8b789ad4fa7d16", move = { - "MicrosoftEdge-131.0.2903.51.pkg/Payload/Microsoft Edge.app": "Edge.app", + "MicrosoftEdge-131.0.2903.112.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_131.0.2903.51-1_amd64.deb", - sha256 = "8aad12c97bcae417ff9cc4251b75211eeda7f1513312dc57b2f744e824e028c0", + url = "https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/microsoft-edge-stable_131.0.2903.112-1_amd64.deb", + sha256 = "e2a40d728057392e14cfe311e2322d3a072730aa81e89e78d5cbeb6f999dfe87", 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/131.0.2903.52/edgedriver_linux64.zip", - sha256 = "ddbeda7cec5ed16b96c3cf0f6759de30e4f3726da9da31bfba1371ccd8fcfd14", + url = "https://msedgedriver.azureedge.net/131.0.2903.112/edgedriver_linux64.zip", + sha256 = "1a262ac6b21d6c59e94b23dd6674d050e570b239f008d31c4701a009e759333f", 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/131.0.2903.56/edgedriver_mac64.zip", - sha256 = "4f4d1d5b45849677f8d8e706f7b5ca9ebb99f40ed3b4ee203c2535a3429e0d5b", + url = "https://msedgedriver.azureedge.net/131.0.2903.112/edgedriver_mac64.zip", + sha256 = "55c3a1445a72dfad0be7285dae3e36540d8eb22f9fd69f4abfdc35370b1f1440", 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.85/linux64/chrome-linux64.zip", - sha256 = "3a6d928b0002ec012a53b6bb65dcaf95add008adc223c961d566d824982a767e", + url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.204/linux64/chrome-linux64.zip", + sha256 = "fba7d5e87cdcf0dc974c9ac8a0a9dbcf5686c935455d5e6beed337c6ada88bc2", 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.85/mac-x64/chrome-mac-x64.zip", - sha256 = "e26a606e2a3da403c6e1e93617a7b51ee010706614eb88de5b16470276e0896b", + url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.204/mac-x64/chrome-mac-x64.zip", + sha256 = "c964e23fe9793e82bcf98b2e90e92862b6dae823a5819c05ee0d5fa511c60684", 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.85/linux64/chromedriver-linux64.zip", - sha256 = "33910b16568feabd2b50a26a2c4456d154c760d6e28347427f99c025661a4f3e", + url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.204/linux64/chromedriver-linux64.zip", + sha256 = "7a444e38b944dee838f6063712382c3dff7ccae395821dbb9dbde28ec5d08468", 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.85/mac-x64/chromedriver-mac-x64.zip", - sha256 = "ee194eba1d52dea61dfbf08b05a2ce139660e9c7d20d15024c3a0757ac4a5fcb", + url = "https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.204/mac-x64/chromedriver-mac-x64.zip", + sha256 = "5dcaf1bbc39d06eb7c2b5a8a2c43946d6d785648e1b392267790d11bc5a119d9", strip_prefix = "chromedriver-mac-x64", build_file_content = """ load("@aspect_rules_js//js:defs.bzl", "js_library") diff --git a/common/src/web/fedcm/fedcm.json b/common/src/web/fedcm/config.json similarity index 50% rename from common/src/web/fedcm/fedcm.json rename to common/src/web/fedcm/config.json index 0bb2ca15f0d1f..45755f6b0f9be 100644 --- a/common/src/web/fedcm/fedcm.json +++ b/common/src/web/fedcm/config.json @@ -1,7 +1,7 @@ { "accounts_endpoint": "accounts.json", "client_metadata_endpoint": "client_metadata.json", - "id_assertion_endpoint": "id_assertion", - "signin_url": "/signin", - "login_url": "/login" + "id_assertion_endpoint": "id_assertion.json", + "signin_url": "signin", + "login_url": "login" } diff --git a/common/src/web/fedcm/fedcm.html b/common/src/web/fedcm/fedcm.html index bdf10e2fa8f2d..62e9e53a616cd 100644 --- a/common/src/web/fedcm/fedcm.html +++ b/common/src/web/fedcm/fedcm.html @@ -1,7 +1,7 @@ + \ No newline at end of file diff --git a/common/src/web/fedcm/fedcm_async.html b/common/src/web/fedcm/fedcm_async.html new file mode 100644 index 0000000000000..2c10510ad9caa --- /dev/null +++ b/common/src/web/fedcm/fedcm_async.html @@ -0,0 +1,37 @@ + + + + FedCM Example + + + +
+ + + + \ No newline at end of file diff --git a/common/src/web/fedcm/login.html b/common/src/web/fedcm/login.html new file mode 100644 index 0000000000000..10329a440bc66 --- /dev/null +++ b/common/src/web/fedcm/login.html @@ -0,0 +1,11 @@ + + + + Login + + +

Login Page

+

Login successful! This is a placeholder for the login process.

+ Return to Home + + \ No newline at end of file diff --git a/common/src/web/fedcm/signin.html b/common/src/web/fedcm/signin.html new file mode 100644 index 0000000000000..90fd68e1a6dc5 --- /dev/null +++ b/common/src/web/fedcm/signin.html @@ -0,0 +1,19 @@ + + + + Sign In + + +

Sign In Page

+

This is a placeholder for the sign-in page.

+
+ + +

+ + +

+ +
+ + \ No newline at end of file diff --git a/common/src/web/locators_tests/locators.html b/common/src/web/locators_tests/locators.html new file mode 100644 index 0000000000000..881bcba2d95da --- /dev/null +++ b/common/src/web/locators_tests/locators.html @@ -0,0 +1,30 @@ + + + +

Contact Selenium

+ +
+ Male   + Female
+
+
+

+
+

+ +

+ +
+ +

To know more about Selenium, visit the official page +Selenium Official Page +

+ + + diff --git a/dotnet/paket.nuget.bzl b/dotnet/paket.nuget.bzl index abb3561080e65..d2930cfef4b7e 100644 --- a/dotnet/paket.nuget.bzl +++ b/dotnet/paket.nuget.bzl @@ -50,7 +50,7 @@ def nuget(): {"name": "System.Security.Principal.Windows", "id": "System.Security.Principal.Windows", "version": "5.0.0", "sha512": "sha512-RKkgqq8ishctQTGbtXqyuOGkUx1fAhkqb1OoHYdRJRlbYLoLWkSkWYHRN/17DzplsSlZtf2Xr8BXjNhO8nRnzQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "netcoreapp1.0": ["System.Reflection", "System.Runtime", "System.Runtime.Handles", "System.Runtime.InteropServices", "System.Text.Encoding"], "netcoreapp1.1": ["System.Reflection", "System.Runtime", "System.Runtime.Handles", "System.Runtime.InteropServices", "System.Text.Encoding"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": ["System.Reflection", "System.Runtime", "System.Runtime.Handles", "System.Runtime.InteropServices", "System.Text.Encoding"], "netstandard1.4": ["System.Reflection", "System.Runtime", "System.Runtime.Handles", "System.Runtime.InteropServices", "System.Text.Encoding"], "netstandard1.5": ["System.Reflection", "System.Runtime", "System.Runtime.Handles", "System.Runtime.InteropServices", "System.Text.Encoding"], "netstandard1.6": ["System.Reflection", "System.Runtime", "System.Runtime.Handles", "System.Runtime.InteropServices", "System.Text.Encoding"], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "System.Text.Encoding", "id": "System.Text.Encoding", "version": "4.3.0", "sha512": "sha512-b/f+7HMTpxIfeV7H03bkuHKMFylCGfr9/U6gePnfFFW0aF8LOWLDgQCY6V1oWUqDksC3mdNuyChM1vy9TP4sZw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard": [], "netstandard1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "System.Text.Encodings.Web", "id": "System.Text.Encodings.Web", "version": "8.0.0", "sha512": "sha512-uggiw4w7ZYq6lJVkLSaeiCuCfjvkrS3BQm2Kl9PLxaInfF+AhH0MuTgQeK8BUjMoxJksqgWBRtXY7muKCGCcMg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Runtime.CompilerServices.Unsafe"], "net7.0": [], "net8.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Text.Json", "id": "System.Text.Json", "version": "8.0.4", "sha512": "sha512-n4fuKjm6T2AqKz7HWEuKosA6f22x4wP0giTbwTndvzyxAZC+BO/h0VkrC/Wy/Zf22PiP1JKkX3eLhP0+YTrLAA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net6.0": ["System.Text.Encodings.Web", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Text.Encodings.Web"], "net8.0": ["System.Text.Encodings.Web"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, + {"name": "System.Text.Json", "id": "System.Text.Json", "version": "8.0.5", "sha512": "sha512-E1iQIa4+gfVMh3q/YTzpMcwkyle/EnrxBjzMHrTcV6bMIjph5kUiB/XQ3ORTtmJ0MOMeQUPHjnHptd1kf2gKvw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net6.0": ["System.Text.Encodings.Web", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Text.Encodings.Web"], "net8.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Text.Encodings.Web", "System.Buffers", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "System.Threading.Tasks", "id": "System.Threading.Tasks", "version": "4.3.0", "sha512": "sha512-fUiP+CyyCjs872OA8trl6p97qma/da1xGq3h4zAbJZk8zyaU4zyEfqW5vbkP80xG/Nimun1vlWBboMEk7XxdEw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard": [], "netstandard1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "System.Threading.Tasks.Extensions", "id": "System.Threading.Tasks.Extensions", "version": "4.5.4", "sha512": "sha512-aAUghud9PHGYc3o9oWPWd0C3xE+TJQw5ZZs78htlR6mr9ky/QEgfXHjyQ2GvOq9H1S0YizcVVKCSin92ZcH8FA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": ["System.Runtime.CompilerServices.Unsafe"], "net451": ["System.Runtime.CompilerServices.Unsafe"], "net452": ["System.Runtime.CompilerServices.Unsafe"], "net46": ["System.Runtime.CompilerServices.Unsafe"], "net461": ["System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "netcoreapp1.0": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netcoreapp1.1": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netcoreapp2.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netstandard1.1": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netstandard1.2": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netstandard1.3": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netstandard1.4": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netstandard1.5": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netstandard1.6": ["System.Runtime", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks"], "netstandard2.0": ["System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, ], diff --git a/dotnet/src/support/Events/EventFiringWebDriver.cs b/dotnet/src/support/Events/EventFiringWebDriver.cs index cfcc7d0cc5154..e68b261e387c3 100644 --- a/dotnet/src/support/Events/EventFiringWebDriver.cs +++ b/dotnet/src/support/Events/EventFiringWebDriver.cs @@ -1613,7 +1613,6 @@ 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/Alert.cs b/dotnet/src/webdriver/Alert.cs index 11e860af922a7..d7637b7465a6b 100644 --- a/dotnet/src/webdriver/Alert.cs +++ b/dotnet/src/webdriver/Alert.cs @@ -20,6 +20,8 @@ using System; using System.Collections.Generic; +#nullable enable + namespace OpenQA.Selenium { /// @@ -27,7 +29,7 @@ namespace OpenQA.Selenium /// internal class Alert : IAlert { - private WebDriver driver; + private readonly WebDriver driver; /// /// Initializes a new instance of the class. @@ -41,12 +43,12 @@ public Alert(WebDriver driver) /// /// Gets the text of the alert. /// - public string Text + public string? Text { get { Response commandResponse = this.driver.InternalExecute(DriverCommand.GetAlertText, null); - return commandResponse.Value.ToString(); + return (string?)commandResponse.Value; } } @@ -70,9 +72,10 @@ public void Accept() /// Sends keys to the alert. /// /// The keystrokes to send. + /// If is . public void SendKeys(string keysToSend) { - if (keysToSend == null) + if (keysToSend is null) { throw new ArgumentNullException(nameof(keysToSend), "Keys to send must not be null."); } diff --git a/dotnet/src/webdriver/BiDi/Modules/BrowsingContext/CaptureScreenshotCommand.cs b/dotnet/src/webdriver/BiDi/Modules/BrowsingContext/CaptureScreenshotCommand.cs index 140d01e4b9bad..9d666f8427e53 100644 --- a/dotnet/src/webdriver/BiDi/Modules/BrowsingContext/CaptureScreenshotCommand.cs +++ b/dotnet/src/webdriver/BiDi/Modules/BrowsingContext/CaptureScreenshotCommand.cs @@ -62,7 +62,7 @@ public abstract record ClipRectangle { public record Box(double X, double Y, double Width, double Height) : ClipRectangle; - public record Element([property: JsonPropertyName("element")] Script.SharedReference SharedReference) : ClipRectangle; + public record Element([property: JsonPropertyName("element")] Script.ISharedReference SharedReference) : ClipRectangle; } public record CaptureScreenshotResult(string Data) diff --git a/dotnet/src/webdriver/BiDi/Modules/BrowsingContext/LocateNodesCommand.cs b/dotnet/src/webdriver/BiDi/Modules/BrowsingContext/LocateNodesCommand.cs index 82ffd4c1fb301..cdf14ecbf1333 100644 --- a/dotnet/src/webdriver/BiDi/Modules/BrowsingContext/LocateNodesCommand.cs +++ b/dotnet/src/webdriver/BiDi/Modules/BrowsingContext/LocateNodesCommand.cs @@ -33,7 +33,7 @@ internal record LocateNodesCommandParameters(BrowsingContext Context, Locator Lo public Script.SerializationOptions? SerializationOptions { get; set; } - public IEnumerable? StartNodes { get; set; } + public IEnumerable? StartNodes { get; set; } } public record LocateNodesOptions : CommandOptions @@ -42,7 +42,7 @@ public record LocateNodesOptions : CommandOptions public Script.SerializationOptions? SerializationOptions { get; set; } - public IEnumerable? StartNodes { get; set; } + public IEnumerable? StartNodes { get; set; } } public record LocateNodesResult : IReadOnlyList diff --git a/dotnet/src/webdriver/BiDi/Modules/Input/Origin.cs b/dotnet/src/webdriver/BiDi/Modules/Input/Origin.cs index c4880aa356e4b..ad717c9427133 100644 --- a/dotnet/src/webdriver/BiDi/Modules/Input/Origin.cs +++ b/dotnet/src/webdriver/BiDi/Modules/Input/Origin.cs @@ -29,7 +29,7 @@ public record Viewport() : Origin; public record Pointer() : Origin; - public record Element([property: JsonPropertyName("element")] Script.SharedReference SharedReference) : Origin + public record Element([property: JsonPropertyName("element")] Script.ISharedReference SharedReference) : Origin { public string Type { get; } = "element"; } diff --git a/dotnet/src/webdriver/BiDi/Modules/Script/RemoteReference.cs b/dotnet/src/webdriver/BiDi/Modules/Script/IRemoteReference.cs similarity index 77% rename from dotnet/src/webdriver/BiDi/Modules/Script/RemoteReference.cs rename to dotnet/src/webdriver/BiDi/Modules/Script/IRemoteReference.cs index 4d6e4e3e12d55..bf48a8534f15b 100644 --- a/dotnet/src/webdriver/BiDi/Modules/Script/RemoteReference.cs +++ b/dotnet/src/webdriver/BiDi/Modules/Script/IRemoteReference.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 @@ -21,14 +21,18 @@ namespace OpenQA.Selenium.BiDi.Modules.Script; -public abstract record RemoteReference : LocalValue; +public interface IRemoteReference; -public record SharedReference(string SharedId) : RemoteReference +public interface ISharedReference : IRemoteReference { + public string SharedId { get; } + public Handle? Handle { get; set; } } -public record RemoteObjectReference(Handle Handle) : RemoteReference +public interface IRemoteObjectReference : IRemoteReference { + public Handle Handle { get; } + public string? SharedId { get; set; } } diff --git a/dotnet/src/webdriver/BiDi/Modules/Script/RemoteValue.cs b/dotnet/src/webdriver/BiDi/Modules/Script/RemoteValue.cs index 9cce784f77517..a99855b78d957 100644 --- a/dotnet/src/webdriver/BiDi/Modules/Script/RemoteValue.cs +++ b/dotnet/src/webdriver/BiDi/Modules/Script/RemoteValue.cs @@ -246,7 +246,7 @@ public record HtmlCollection : RemoteValue public IReadOnlyList? Value { get; set; } } - public record Node : RemoteValue + public record Node : RemoteValue, ISharedReference { [JsonInclude] public string? SharedId { get; internal set; } diff --git a/dotnet/src/webdriver/BiDi/Modules/Session/ProxyConfiguration.cs b/dotnet/src/webdriver/BiDi/Modules/Session/ProxyConfiguration.cs index aecc837d5598b..b2e14e58dc82b 100644 --- a/dotnet/src/webdriver/BiDi/Modules/Session/ProxyConfiguration.cs +++ b/dotnet/src/webdriver/BiDi/Modules/Session/ProxyConfiguration.cs @@ -24,14 +24,14 @@ namespace OpenQA.Selenium.BiDi.Modules.Session; [JsonPolymorphic(TypeDiscriminatorPropertyName = "proxyType")] -[JsonDerivedType(typeof(Autodetect), "autodetect")] +[JsonDerivedType(typeof(AutoDetect), "autodetect")] [JsonDerivedType(typeof(Direct), "direct")] [JsonDerivedType(typeof(Manual), "manual")] [JsonDerivedType(typeof(Pac), "pac")] [JsonDerivedType(typeof(System), "system")] public abstract record ProxyConfiguration { - public record Autodetect : ProxyConfiguration; + public record AutoDetect : ProxyConfiguration; public record Direct : ProxyConfiguration; @@ -48,7 +48,7 @@ public record Manual : ProxyConfiguration public long? SocksVersion { get; set; } } - public record Pac(string ProxyAutoconfigUrl) : ProxyConfiguration; + public record Pac(string ProxyAutoConfigUrl) : ProxyConfiguration; public record System : ProxyConfiguration; } diff --git a/dotnet/src/webdriver/Chromium/ChromiumDriverService.cs b/dotnet/src/webdriver/Chromium/ChromiumDriverService.cs index 04a4e8994118f..95958e44812f4 100644 --- a/dotnet/src/webdriver/Chromium/ChromiumDriverService.cs +++ b/dotnet/src/webdriver/Chromium/ChromiumDriverService.cs @@ -208,7 +208,7 @@ protected static string ChromiumDriverServiceFileName(string fileName = DefaultC // straightforward as you might hope. // See: http://mono.wikia.com/wiki/Detecting_the_execution_platform // and https://msdn.microsoft.com/en-us/library/3a8hyw88(v=vs.110).aspx - const int PlatformMonoUnixValue = 128; + const PlatformID PlatformIDMonoUnix = (PlatformID)128; switch (Environment.OSVersion.Platform) { @@ -221,17 +221,14 @@ protected static string ChromiumDriverServiceFileName(string fileName = DefaultC case PlatformID.MacOSX: case PlatformID.Unix: + case PlatformIDMonoUnix: break; // Don't handle the Xbox case. Let default handle it. // case PlatformID.Xbox: // break; - default: - if ((int)Environment.OSVersion.Platform == PlatformMonoUnixValue) - { - break; - } + default: throw new WebDriverException("Unsupported platform: " + Environment.OSVersion.Platform); } diff --git a/dotnet/src/webdriver/CommandInfoRepository.cs b/dotnet/src/webdriver/CommandInfoRepository.cs index 1b2d0486e7718..fa184c60bda5c 100644 --- a/dotnet/src/webdriver/CommandInfoRepository.cs +++ b/dotnet/src/webdriver/CommandInfoRepository.cs @@ -21,6 +21,8 @@ using System.Collections.Generic; using System.Globalization; +#nullable enable + namespace OpenQA.Selenium { /// @@ -56,6 +58,7 @@ protected CommandInfoRepository() /// /// The name of the command to check. /// if the command name is defined + /// If is . public bool IsCommandNameDefined(string commandName) { return this.commandDictionary.ContainsKey(commandName); @@ -66,7 +69,7 @@ public bool IsCommandNameDefined(string commandName) /// /// The object for which to find the command name. /// The name of the command defined by the command info, or if the command is not defined. - public string FindCommandName(CommandInfo commandInfo) + public string? FindCommandName(CommandInfo commandInfo) { foreach (KeyValuePair pair in this.commandDictionary) { @@ -83,13 +86,13 @@ public string FindCommandName(CommandInfo commandInfo) /// Gets the for a . /// /// The for which to get the information. - /// The for the specified command. - public T GetCommandInfo(string commandName) where T : CommandInfo + /// The for the specified command, or if not found or value is not . + public T? GetCommandInfo(string commandName) where T : CommandInfo { - T toReturn = default(T); - if (this.commandDictionary.ContainsKey(commandName)) + T? toReturn = default; + if (this.commandDictionary.TryGetValue(commandName, out CommandInfo? info)) { - toReturn = this.commandDictionary[commandName] as T; + toReturn = info as T; } return toReturn; @@ -106,6 +109,12 @@ public T GetCommandInfo(string commandName) where T : CommandInfo /// This method will not overwrite existing commands for a specific name, and will return /// in that case. /// + /// + /// If is or . + /// -or- + /// If is . + /// + /// If is not a valid command type for this repository. public bool TryAddCommand(string commandName, T commandInfo) where T : CommandInfo { if (string.IsNullOrEmpty(commandName)) diff --git a/dotnet/src/webdriver/Cookie.cs b/dotnet/src/webdriver/Cookie.cs index 693012815d699..b15dca6d196fe 100644 --- a/dotnet/src/webdriver/Cookie.cs +++ b/dotnet/src/webdriver/Cookie.cs @@ -351,14 +351,12 @@ public override string ToString() public override bool Equals(object obj) { // Two cookies are equal if the name and value match - Cookie cookie = obj as Cookie; - if (this == obj) { return true; } - if (cookie == null) + if (obj is not Cookie cookie) { return false; } @@ -368,7 +366,7 @@ public override bool Equals(object obj) return false; } - return !(this.cookieValue != null ? !this.cookieValue.Equals(cookie.cookieValue) : cookie.Value != null); + return string.Equals(this.cookieValue, cookie.cookieValue); } /// diff --git a/dotnet/src/webdriver/CookieJar.cs b/dotnet/src/webdriver/CookieJar.cs index e4f681e11908a..8ae324fa6961f 100644 --- a/dotnet/src/webdriver/CookieJar.cs +++ b/dotnet/src/webdriver/CookieJar.cs @@ -21,64 +21,92 @@ using System.Collections.Generic; using System.Collections.ObjectModel; +#nullable enable + namespace OpenQA.Selenium { - /// - /// Defines an interface allowing the user to manipulate cookies on the current page. - /// - internal class CookieJar : ICookieJar + internal sealed class CookieJar(WebDriver driver) : ICookieJar { - private WebDriver driver; - - /// - /// Initializes a new instance of the class. - /// - /// The driver that is currently in use - public CookieJar(WebDriver driver) - { - this.driver = driver; - } - /// /// Gets all cookies defined for the current page. /// public ReadOnlyCollection AllCookies { - get { return this.GetAllCookies(); } + get + { + Response response = driver.InternalExecute(DriverCommand.GetAllCookies, new Dictionary()); + + try + { + List toReturn = new List(); + if (response.Value is object?[] cookies) + { + foreach (object? rawCookie in cookies) + { + if (rawCookie != null) + { + Cookie newCookie = Cookie.FromDictionary((Dictionary)rawCookie); + toReturn.Add(newCookie); + } + } + } + + return new ReadOnlyCollection(toReturn); + } + catch (Exception e) + { + throw new WebDriverException("Unexpected problem getting cookies", e); + } + } } /// /// Method for creating a cookie in the browser /// /// that represents a cookie in the browser + /// If is . public void AddCookie(Cookie cookie) { + if (cookie is null) + { + throw new ArgumentNullException(nameof(cookie)); + } + Dictionary parameters = new Dictionary(); parameters.Add("cookie", cookie); - this.driver.InternalExecute(DriverCommand.AddCookie, parameters); + driver.InternalExecute(DriverCommand.AddCookie, parameters); } /// /// Delete the cookie by passing in the name of the cookie /// /// The name of the cookie that is in the browser + /// If is . public void DeleteCookieNamed(string name) { + if (name is null) + { + throw new ArgumentNullException(nameof(name)); + } + Dictionary parameters = new Dictionary(); parameters.Add("name", name); - this.driver.InternalExecute(DriverCommand.DeleteCookie, parameters); + driver.InternalExecute(DriverCommand.DeleteCookie, parameters); } /// /// Delete a cookie in the browser by passing in a copy of a cookie /// /// An object that represents a copy of the cookie that needs to be deleted + /// If is . public void DeleteCookie(Cookie cookie) { - if (cookie != null) + if (cookie is null) { - this.DeleteCookieNamed(cookie.Name); + throw new ArgumentNullException(nameof(cookie)); } + + this.DeleteCookieNamed(cookie.Name); } /// @@ -86,63 +114,32 @@ public void DeleteCookie(Cookie cookie) /// public void DeleteAllCookies() { - this.driver.InternalExecute(DriverCommand.DeleteAllCookies, null); + driver.InternalExecute(DriverCommand.DeleteAllCookies, null); } /// /// Method for returning a getting a cookie by name /// /// name of the cookie that needs to be returned - /// A Cookie from the name - public Cookie GetCookieNamed(string name) + /// A Cookie from the name; or if not found. + public Cookie? GetCookieNamed(string name) { - Cookie cookieToReturn = null; - if (name != null) + if (name is null) { - ReadOnlyCollection allCookies = this.AllCookies; - foreach (Cookie currentCookie in allCookies) - { - if (name.Equals(currentCookie.Name)) - { - cookieToReturn = currentCookie; - break; - } - } + throw new ArgumentNullException(nameof(name)); } - return cookieToReturn; - } - /// - /// Method for getting a Collection of Cookies that are present in the browser - /// - /// ReadOnlyCollection of Cookies in the browser - private ReadOnlyCollection GetAllCookies() - { - List toReturn = new List(); - object returned = this.driver.InternalExecute(DriverCommand.GetAllCookies, new Dictionary()).Value; - - try + foreach (Cookie currentCookie in this.AllCookies) { - object[] cookies = returned as object[]; - if (cookies != null) + if (name.Equals(currentCookie.Name)) { - foreach (object rawCookie in cookies) - { - Dictionary cookieDictionary = rawCookie as Dictionary; - if (rawCookie != null) - { - toReturn.Add(Cookie.FromDictionary(cookieDictionary)); - } - } + return currentCookie; } - return new ReadOnlyCollection(toReturn); - } - catch (Exception e) - { - throw new WebDriverException("Unexpected problem getting cookies", e); } + + return null; } } } diff --git a/dotnet/src/webdriver/DevTools/DevToolsSession.cs b/dotnet/src/webdriver/DevTools/DevToolsSession.cs index b58de1097888c..4ec62289873db 100644 --- a/dotnet/src/webdriver/DevTools/DevToolsSession.cs +++ b/dotnet/src/webdriver/DevTools/DevToolsSession.cs @@ -542,6 +542,11 @@ private void MonitorMessageQueue() } catch (Exception ex) { + if (logger.IsEnabled(LogEventLevel.Error)) + { + logger.Error($"Unexpected error occured while processing message: {ex}"); + } + LogError("Unexpected error occured while processing message: {0}", ex); } } @@ -578,6 +583,11 @@ private void ProcessMessage(string message) } else { + if (logger.IsEnabled(LogEventLevel.Error)) + { + logger.Error($"Recieved Unknown Response {commandId}: {message}"); + } + LogError("Recieved Unknown Response {0}: {1}", commandId, message); } diff --git a/dotnet/src/webdriver/Firefox/FirefoxDriverService.cs b/dotnet/src/webdriver/Firefox/FirefoxDriverService.cs index 6c58457461a22..3d35057e69e64 100644 --- a/dotnet/src/webdriver/Firefox/FirefoxDriverService.cs +++ b/dotnet/src/webdriver/Firefox/FirefoxDriverService.cs @@ -263,7 +263,7 @@ private static string FirefoxDriverServiceFileName() // straightforward as you might hope. // See: http://mono.wikia.com/wiki/Detecting_the_execution_platform // and https://msdn.microsoft.com/en-us/library/3a8hyw88(v=vs.110).aspx - const int PlatformMonoUnixValue = 128; + const PlatformID PlatformIDMonoUnix = (PlatformID)128; switch (Environment.OSVersion.Platform) { @@ -276,17 +276,13 @@ private static string FirefoxDriverServiceFileName() case PlatformID.MacOSX: case PlatformID.Unix: + case PlatformIDMonoUnix: break; // Don't handle the Xbox case. Let default handle it. // case PlatformID.Xbox: // break; default: - if ((int)Environment.OSVersion.Platform == PlatformMonoUnixValue) - { - break; - } - throw new WebDriverException("Unsupported platform: " + Environment.OSVersion.Platform); } diff --git a/dotnet/src/webdriver/Firefox/Internal/IniFileReader.cs b/dotnet/src/webdriver/Firefox/Internal/IniFileReader.cs index 656604a4f8635..847af73d567e1 100644 --- a/dotnet/src/webdriver/Firefox/Internal/IniFileReader.cs +++ b/dotnet/src/webdriver/Firefox/Internal/IniFileReader.cs @@ -22,19 +22,23 @@ using System.Collections.ObjectModel; using System.IO; +#nullable enable + namespace OpenQA.Selenium.Firefox.Internal { /// /// Parses and reads an INI file. /// - internal class IniFileReader + internal sealed class IniFileReader { - private Dictionary> iniFileStore = new Dictionary>(); + private readonly Dictionary> iniFileStore = new Dictionary>(); /// /// Initializes a new instance of the class. /// /// The full path to the .INI file to be read. + /// If is or . + /// If no file exists at file path . public IniFileReader(string fileName) { if (string.IsNullOrEmpty(fileName)) @@ -53,7 +57,7 @@ public IniFileReader(string fileName) string[] iniFileContent = File.ReadAllLines(fileName); foreach (string iniFileLine in iniFileContent) { - if (!string.IsNullOrEmpty(iniFileLine.Trim()) && !iniFileLine.StartsWith(";", StringComparison.OrdinalIgnoreCase)) + if (!string.IsNullOrWhiteSpace(iniFileLine) && !iniFileLine.StartsWith(";", StringComparison.OrdinalIgnoreCase)) { if (iniFileLine.StartsWith("[", StringComparison.OrdinalIgnoreCase) && iniFileLine.EndsWith("]", StringComparison.OrdinalIgnoreCase)) { @@ -86,14 +90,7 @@ public IniFileReader(string fileName) /// /// Gets a containing the names of the sections in the .INI file. /// - public ReadOnlyCollection SectionNames - { - get - { - List keyList = new List(this.iniFileStore.Keys); - return new ReadOnlyCollection(keyList); - } - } + public ReadOnlyCollection SectionNames => new ReadOnlyCollection(new List(this.iniFileStore.Keys)); /// /// Gets a value from the .INI file. @@ -101,6 +98,16 @@ public ReadOnlyCollection SectionNames /// The section in which to find the key-value pair. /// The key of the key-value pair. /// The value associated with the given section and key. + /// + /// If is or . + /// -or- + /// If is or . + /// + /// + /// If no section named exists. + /// -or- + ///If the section does not contain a value named . + /// public string GetValue(string sectionName, string valueName) { if (string.IsNullOrEmpty(sectionName)) @@ -117,19 +124,17 @@ public string GetValue(string sectionName, string valueName) string lowerCaseValueName = valueName.ToUpperInvariant(); - if (!this.iniFileStore.ContainsKey(lowerCaseSectionName)) + if (!this.iniFileStore.TryGetValue(lowerCaseSectionName, out Dictionary? section)) { throw new ArgumentException("Section does not exist: " + sectionName, nameof(sectionName)); } - Dictionary section = this.iniFileStore[lowerCaseSectionName]; - - if (!section.ContainsKey(lowerCaseValueName)) + if (!section.TryGetValue(lowerCaseValueName, out string? value)) { throw new ArgumentException("Value does not exist: " + valueName, nameof(valueName)); } - return section[lowerCaseValueName]; + return value; } } } diff --git a/dotnet/src/webdriver/IAlert.cs b/dotnet/src/webdriver/IAlert.cs index 6dd0c8db63e99..78c15d992c1b3 100644 --- a/dotnet/src/webdriver/IAlert.cs +++ b/dotnet/src/webdriver/IAlert.cs @@ -17,6 +17,10 @@ // under the License. // +using System; + +#nullable enable + namespace OpenQA.Selenium { /// @@ -27,7 +31,7 @@ public interface IAlert /// /// Gets the text of the alert. /// - string Text { get; } + string? Text { get; } /// /// Dismisses the alert. @@ -43,6 +47,7 @@ public interface IAlert /// Sends keys to the alert. /// /// The keystrokes to send. + /// If is . void SendKeys(string keysToSend); } } diff --git a/dotnet/src/webdriver/ICapabilities.cs b/dotnet/src/webdriver/ICapabilities.cs index 1a66162ffb098..df0c8a776c77e 100644 --- a/dotnet/src/webdriver/ICapabilities.cs +++ b/dotnet/src/webdriver/ICapabilities.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium { /// @@ -49,6 +51,6 @@ public interface ICapabilities /// The capability to get. /// An object associated with the capability, or /// if the capability is not set on the browser. - object GetCapability(string capability); + object? GetCapability(string capability); } } diff --git a/dotnet/src/webdriver/ICookieJar.cs b/dotnet/src/webdriver/ICookieJar.cs index a27c472a78c41..07594bf8f3173 100644 --- a/dotnet/src/webdriver/ICookieJar.cs +++ b/dotnet/src/webdriver/ICookieJar.cs @@ -17,8 +17,11 @@ // under the License. // +using System; using System.Collections.ObjectModel; +#nullable enable + namespace OpenQA.Selenium { /// @@ -35,6 +38,7 @@ public interface ICookieJar /// Adds a cookie to the current page. /// /// The object to be added. + /// If is . void AddCookie(Cookie cookie); /// @@ -43,18 +47,21 @@ public interface ICookieJar /// The name of the cookie to retrieve. /// The containing the name. Returns /// if no cookie with the specified name is found. - Cookie GetCookieNamed(string name); + /// If is . + Cookie? GetCookieNamed(string name); /// /// Deletes the specified cookie from the page. /// /// The to be deleted. + /// If is . void DeleteCookie(Cookie cookie); /// /// Deletes the cookie with the specified name from the page. /// /// The name of the cookie to be deleted. + /// If is . void DeleteCookieNamed(string name); /// diff --git a/dotnet/src/webdriver/ILogs.cs b/dotnet/src/webdriver/ILogs.cs index 1224f6d4f3666..d3f236f36c05e 100644 --- a/dotnet/src/webdriver/ILogs.cs +++ b/dotnet/src/webdriver/ILogs.cs @@ -17,8 +17,11 @@ // under the License. // +using System; using System.Collections.ObjectModel; +#nullable enable + namespace OpenQA.Selenium { /// @@ -37,6 +40,7 @@ public interface ILogs /// The log for which to retrieve the log entries. /// Log types can be found in the class. /// The list of objects for the specified log. + /// If is . ReadOnlyCollection GetLog(string logKind); } } diff --git a/dotnet/src/webdriver/IWebElement.cs b/dotnet/src/webdriver/IWebElement.cs index e96d734ca34a8..026fd8a85d9ca 100644 --- a/dotnet/src/webdriver/IWebElement.cs +++ b/dotnet/src/webdriver/IWebElement.cs @@ -172,7 +172,6 @@ public interface IWebElement : ISearchContext /// /// /// 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.")] string GetAttribute(string attributeName); /// diff --git a/dotnet/src/webdriver/Interactions/ActionSequence.cs b/dotnet/src/webdriver/Interactions/ActionSequence.cs index 6b60496e37fc1..2ad1576a084d5 100644 --- a/dotnet/src/webdriver/Interactions/ActionSequence.cs +++ b/dotnet/src/webdriver/Interactions/ActionSequence.cs @@ -72,6 +72,7 @@ public int Count /// Gets the input device for this Action sequence. /// [Obsolete("This property has been renamed to InputDevice and will be removed in a future version")] + [CLSCompliant(false)] public InputDevice inputDevice => InputDevice; /// diff --git a/dotnet/src/webdriver/Interactions/Actions.cs b/dotnet/src/webdriver/Interactions/Actions.cs index 4fc3307982a83..e3672dd5a5c7a 100644 --- a/dotnet/src/webdriver/Interactions/Actions.cs +++ b/dotnet/src/webdriver/Interactions/Actions.cs @@ -138,7 +138,7 @@ private InputDevice FindDeviceById(string name) if (id == name) { - return sequence.inputDevice; + return sequence.InputDevice; } } diff --git a/dotnet/src/webdriver/Internal/AndroidOptions.cs b/dotnet/src/webdriver/Internal/AndroidOptions.cs index e2d9e5b94763c..d002d1e6acc81 100644 --- a/dotnet/src/webdriver/Internal/AndroidOptions.cs +++ b/dotnet/src/webdriver/Internal/AndroidOptions.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Internal { /// @@ -26,14 +28,11 @@ namespace OpenQA.Selenium.Internal /// public class AndroidOptions { - private string androidPackage; - private string androidDeviceSerial; - private string androidActivity; - /// /// Initializes a new instance of the class. /// /// + /// If is or . protected AndroidOptions(string androidPackage) { if (string.IsNullOrEmpty(androidPackage)) @@ -41,33 +40,22 @@ protected AndroidOptions(string androidPackage) throw new ArgumentException("The Android package cannot be null or the empty string", nameof(androidPackage)); } - this.androidPackage = androidPackage; + this.AndroidPackage = androidPackage; } /// /// The package name of the application to automate. /// - public string AndroidPackage - { - get { return this.androidPackage; } - } + public string AndroidPackage { get; } /// /// The serial number of the device on which to launch the application. /// - public string AndroidDeviceSerial - { - get { return this.androidDeviceSerial; } - set { this.androidDeviceSerial = value; } - } + public string? AndroidDeviceSerial { get; set; } /// /// Gets or sets the name of the Activity hosting the app. /// - public string AndroidActivity - { - get { return this.androidActivity; } - set { this.androidActivity = value; } - } + public string? AndroidActivity { get; set; } } } diff --git a/dotnet/src/webdriver/Internal/Base64UrlEncoder.cs b/dotnet/src/webdriver/Internal/Base64UrlEncoder.cs index 87fb7085e86c5..c8b22e7223e8b 100644 --- a/dotnet/src/webdriver/Internal/Base64UrlEncoder.cs +++ b/dotnet/src/webdriver/Internal/Base64UrlEncoder.cs @@ -25,9 +25,9 @@ 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 + * https://github.com/SeleniumHQ/selenium/issues/14813 */ /// diff --git a/dotnet/src/webdriver/Internal/FileUtilities.cs b/dotnet/src/webdriver/Internal/FileUtilities.cs index 0d83a6927aeca..d288a58e5f296 100644 --- a/dotnet/src/webdriver/Internal/FileUtilities.cs +++ b/dotnet/src/webdriver/Internal/FileUtilities.cs @@ -23,6 +23,8 @@ using System.IO; using System.Reflection; +#nullable enable + namespace OpenQA.Selenium.Internal { /// @@ -40,7 +42,7 @@ internal static class FileUtilities /// if the copy is completed; otherwise . public static bool CopyDirectory(string sourceDirectory, string destinationDirectory) { - bool copyComplete = false; + bool copyComplete; DirectoryInfo sourceDirectoryInfo = new DirectoryInfo(sourceDirectory); DirectoryInfo destinationDirectoryInfo = new DirectoryInfo(destinationDirectory); @@ -132,7 +134,7 @@ public static string FindFile(string fileName) // If it's not in the same directory as the executing assembly, // try looking in the system path. - string systemPath = Environment.GetEnvironmentVariable("PATH"); + string? systemPath = Environment.GetEnvironmentVariable("PATH"); if (!string.IsNullOrEmpty(systemPath)) { string expandedPath = Environment.ExpandEnvironmentVariables(systemPath); @@ -165,7 +167,7 @@ public static string FindFile(string fileName) public static string GetCurrentDirectory() { Assembly executingAssembly = typeof(FileUtilities).Assembly; - string location = null; + string? location = null; // Make sure not to call Path.GetDirectoryName if assembly location is null or empty if (!string.IsNullOrEmpty(executingAssembly.Location)) @@ -184,13 +186,13 @@ public static string GetCurrentDirectory() location = Directory.GetCurrentDirectory(); } - string currentDirectory = location; + string currentDirectory = location!; // If we're shadow copying, get the directory from the codebase instead if (AppDomain.CurrentDomain.ShadowCopyFiles) { Uri uri = new Uri(executingAssembly.CodeBase); - currentDirectory = Path.GetDirectoryName(uri.LocalPath); + currentDirectory = Path.GetDirectoryName(uri.LocalPath)!; } return currentDirectory; diff --git a/dotnet/src/webdriver/Internal/IFindsElement.cs b/dotnet/src/webdriver/Internal/IFindsElement.cs index a43055f9c91bd..7bcd08751a8fb 100644 --- a/dotnet/src/webdriver/Internal/IFindsElement.cs +++ b/dotnet/src/webdriver/Internal/IFindsElement.cs @@ -19,6 +19,8 @@ using System.Collections.ObjectModel; +#nullable enable + namespace OpenQA.Selenium.Internal { /// diff --git a/dotnet/src/webdriver/Internal/IHasCapabilitiesDictionary.cs b/dotnet/src/webdriver/Internal/IHasCapabilitiesDictionary.cs index 8c281818c4e0d..8723b5b11e580 100644 --- a/dotnet/src/webdriver/Internal/IHasCapabilitiesDictionary.cs +++ b/dotnet/src/webdriver/Internal/IHasCapabilitiesDictionary.cs @@ -19,6 +19,8 @@ using System.Collections.Generic; +#nullable enable + namespace OpenQA.Selenium.Internal { /// diff --git a/dotnet/src/webdriver/Internal/Logging/ConsoleLogHandler.cs b/dotnet/src/webdriver/Internal/Logging/ConsoleLogHandler.cs index 32a51421bf524..30a1a36efe128 100644 --- a/dotnet/src/webdriver/Internal/Logging/ConsoleLogHandler.cs +++ b/dotnet/src/webdriver/Internal/Logging/ConsoleLogHandler.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// diff --git a/dotnet/src/webdriver/Internal/Logging/FileLogHandler.cs b/dotnet/src/webdriver/Internal/Logging/FileLogHandler.cs index 8c92cf46aa3b4..7bb673486f793 100644 --- a/dotnet/src/webdriver/Internal/Logging/FileLogHandler.cs +++ b/dotnet/src/webdriver/Internal/Logging/FileLogHandler.cs @@ -20,6 +20,8 @@ using System; using System.IO; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// @@ -40,6 +42,7 @@ public class FileLogHandler : ILogHandler, IDisposable /// Initializes a new instance of the class with the specified file path. /// /// The path of the log file. + /// If is or . public FileLogHandler(string filePath) : this(filePath, overwrite: true) { @@ -51,6 +54,7 @@ public FileLogHandler(string filePath) /// /// The path of the log file. /// Specifies whether the file should be overwritten if it exists on the disk. + /// If is or . public FileLogHandler(string filePath, bool overwrite) { if (string.IsNullOrEmpty(filePath)) throw new ArgumentException("File log path cannot be null or empty.", nameof(filePath)); @@ -112,9 +116,9 @@ protected virtual void Dispose(bool disposing) if (disposing) { _streamWriter?.Dispose(); - _streamWriter = null; + _streamWriter = null!; _fileStream?.Dispose(); - _fileStream = null; + _fileStream = null!; } _isDisposed = true; diff --git a/dotnet/src/webdriver/Internal/Logging/ILogContext.cs b/dotnet/src/webdriver/Internal/Logging/ILogContext.cs index d1cc52cae4509..321c2bc99bd07 100644 --- a/dotnet/src/webdriver/Internal/Logging/ILogContext.cs +++ b/dotnet/src/webdriver/Internal/Logging/ILogContext.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// diff --git a/dotnet/src/webdriver/Internal/Logging/ILogHandler.cs b/dotnet/src/webdriver/Internal/Logging/ILogHandler.cs index 59c8133d007b3..c7ab4cc7bb0c1 100644 --- a/dotnet/src/webdriver/Internal/Logging/ILogHandler.cs +++ b/dotnet/src/webdriver/Internal/Logging/ILogHandler.cs @@ -17,6 +17,8 @@ // under the License. // +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// diff --git a/dotnet/src/webdriver/Internal/Logging/ILogHandlerList.cs b/dotnet/src/webdriver/Internal/Logging/ILogHandlerList.cs index f27b10a53b416..4930613c86957 100644 --- a/dotnet/src/webdriver/Internal/Logging/ILogHandlerList.cs +++ b/dotnet/src/webdriver/Internal/Logging/ILogHandlerList.cs @@ -19,6 +19,8 @@ using System.Collections.Generic; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// diff --git a/dotnet/src/webdriver/Internal/Logging/ILogger.cs b/dotnet/src/webdriver/Internal/Logging/ILogger.cs index a92a43e0d8445..ab2713722894b 100644 --- a/dotnet/src/webdriver/Internal/Logging/ILogger.cs +++ b/dotnet/src/webdriver/Internal/Logging/ILogger.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// diff --git a/dotnet/src/webdriver/Internal/Logging/Log.cs b/dotnet/src/webdriver/Internal/Logging/Log.cs index 884e147c8659a..01b40ac2bc9fd 100644 --- a/dotnet/src/webdriver/Internal/Logging/Log.cs +++ b/dotnet/src/webdriver/Internal/Logging/Log.cs @@ -18,6 +18,9 @@ // using System; +using System.Diagnostics.CodeAnalysis; + +#nullable enable namespace OpenQA.Selenium.Internal.Logging { @@ -65,16 +68,11 @@ public static ILogContext CreateContext(LogEventLevel minimumLevel) /// /// Gets or sets the current log context. /// + [AllowNull] internal static ILogContext CurrentContext { - get - { - return _logContextManager.CurrentContext; - } - set - { - _logContextManager.CurrentContext = value; - } + get => _logContextManager.CurrentContext; + set => _logContextManager.CurrentContext = value; } /// diff --git a/dotnet/src/webdriver/Internal/Logging/LogContext.cs b/dotnet/src/webdriver/Internal/Logging/LogContext.cs index ccf902fb9b35b..bb4d9feede2c5 100644 --- a/dotnet/src/webdriver/Internal/Logging/LogContext.cs +++ b/dotnet/src/webdriver/Internal/Logging/LogContext.cs @@ -22,6 +22,8 @@ using System.Collections.Generic; using System.Linq; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// @@ -30,15 +32,15 @@ namespace OpenQA.Selenium.Internal.Logging /// internal class LogContext : ILogContext { - private ConcurrentDictionary _loggers; + private ConcurrentDictionary? _loggers; private LogEventLevel _level; - private readonly ILogContext _parentLogContext; + private readonly ILogContext? _parentLogContext; private readonly Lazy _lazyLogHandlerList; - public LogContext(LogEventLevel level, ILogContext parentLogContext, ConcurrentDictionary loggers, IEnumerable handlers) + public LogContext(LogEventLevel level, ILogContext? parentLogContext, ConcurrentDictionary? loggers, IEnumerable? handlers) { _level = level; @@ -63,7 +65,7 @@ public ILogContext CreateContext() public ILogContext CreateContext(LogEventLevel minimumLevel) { - ConcurrentDictionary loggers = null; + ConcurrentDictionary? loggers = null; if (_loggers != null) { @@ -89,12 +91,9 @@ public ILogger GetLogger(Type type) throw new ArgumentNullException(nameof(type)); } - if (_loggers is null) - { - _loggers = new ConcurrentDictionary(); - } + _loggers ??= new ConcurrentDictionary(); - return _loggers.GetOrAdd(type, _ => new Logger(type, _level)); + return _loggers.GetOrAdd(type, type => new Logger(type, _level)); } public bool IsEnabled(ILogger logger, LogEventLevel level) diff --git a/dotnet/src/webdriver/Internal/Logging/LogContextManager.cs b/dotnet/src/webdriver/Internal/Logging/LogContextManager.cs index 41594f1125447..834e806d8b74a 100644 --- a/dotnet/src/webdriver/Internal/Logging/LogContextManager.cs +++ b/dotnet/src/webdriver/Internal/Logging/LogContextManager.cs @@ -17,45 +17,31 @@ // under the License. // +using System.Diagnostics.CodeAnalysis; using System.Threading; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { internal class LogContextManager { - private readonly ILogContext _globalLogContext; - - private readonly AsyncLocal _currentAmbientLogContext = new AsyncLocal(); + private readonly AsyncLocal _currentAmbientLogContext = new AsyncLocal(); public LogContextManager() { var defaulConsoleLogHandler = new ConsoleLogHandler(); - _globalLogContext = new LogContext(LogEventLevel.Info, null, null, new[] { defaulConsoleLogHandler }); + GlobalContext = new LogContext(LogEventLevel.Info, null, null, new[] { defaulConsoleLogHandler }); } - public ILogContext GlobalContext - { - get { return _globalLogContext; } - } + public ILogContext GlobalContext { get; } + [AllowNull] public ILogContext CurrentContext { - get - { - if (_currentAmbientLogContext.Value is null) - { - return _globalLogContext; - } - else - { - return _currentAmbientLogContext.Value; - } - } - set - { - _currentAmbientLogContext.Value = value; - } + get => _currentAmbientLogContext.Value ?? GlobalContext; + set => _currentAmbientLogContext.Value = value; } } } diff --git a/dotnet/src/webdriver/Internal/Logging/LogEvent.cs b/dotnet/src/webdriver/Internal/Logging/LogEvent.cs index 2a4f9daaf27f9..2fad19a93dc2b 100644 --- a/dotnet/src/webdriver/Internal/Logging/LogEvent.cs +++ b/dotnet/src/webdriver/Internal/Logging/LogEvent.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// @@ -33,9 +35,10 @@ public sealed class LogEvent /// The timestamp of the log event. /// The level of the log event. /// The message of the log event. + /// If is . public LogEvent(Type issuedBy, DateTimeOffset timestamp, LogEventLevel level, string message) { - IssuedBy = issuedBy; + IssuedBy = issuedBy ?? throw new ArgumentNullException(nameof(issuedBy)); Timestamp = timestamp; Level = level; Message = message; diff --git a/dotnet/src/webdriver/Internal/Logging/LogEventLevel.cs b/dotnet/src/webdriver/Internal/Logging/LogEventLevel.cs index af8b728f0d326..57090b75de4e7 100644 --- a/dotnet/src/webdriver/Internal/Logging/LogEventLevel.cs +++ b/dotnet/src/webdriver/Internal/Logging/LogEventLevel.cs @@ -17,6 +17,8 @@ // under the License. // +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// diff --git a/dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs b/dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs index 7c75c36f4b2cf..9f05d3d5c52fa 100644 --- a/dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs +++ b/dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs @@ -19,13 +19,15 @@ using System.Collections.Generic; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// /// Represents a list of log handlers. /// /// - internal class LogHandlerList : List, ILogHandlerList + internal sealed class LogHandlerList : List, ILogHandlerList { private readonly ILogContext _logContext; diff --git a/dotnet/src/webdriver/Internal/Logging/Logger.cs b/dotnet/src/webdriver/Internal/Logging/Logger.cs index 0c92d0c0f299f..058d7944af153 100644 --- a/dotnet/src/webdriver/Internal/Logging/Logger.cs +++ b/dotnet/src/webdriver/Internal/Logging/Logger.cs @@ -19,13 +19,15 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Internal.Logging { /// /// The implementation of the interface through which log messages are emitted. /// /// - internal class Logger : ILogger + internal sealed class Logger : ILogger { public Logger(Type issuer, LogEventLevel level) { diff --git a/dotnet/src/webdriver/Internal/ResourceUtilities.cs b/dotnet/src/webdriver/Internal/ResourceUtilities.cs index 2f854a70214d4..0f22a33681c83 100644 --- a/dotnet/src/webdriver/Internal/ResourceUtilities.cs +++ b/dotnet/src/webdriver/Internal/ResourceUtilities.cs @@ -22,6 +22,8 @@ using System.Reflection; using System.Runtime.InteropServices; +#nullable enable + namespace OpenQA.Selenium.Internal { /// @@ -29,8 +31,8 @@ namespace OpenQA.Selenium.Internal /// internal static class ResourceUtilities { - private static string productVersion; - private static string platformFamily; + private static string? productVersion; + private static string? platformFamily; /// /// Gets a string representing the informational version of the Selenium product. @@ -60,18 +62,7 @@ public static string ProductVersion /// /// Gets a string representing the platform family on which the Selenium assembly is executing. /// - public static string PlatformFamily - { - get - { - if (string.IsNullOrEmpty(platformFamily)) - { - platformFamily = GetPlatformString(); - } - - return platformFamily; - } - } + public static string PlatformFamily => platformFamily ??= GetPlatformString(); /// /// Gets a that contains the resource to use. @@ -94,7 +85,7 @@ public static string PlatformFamily /// public static Stream GetResourceStream(string fileName, string resourceId) { - Stream resourceStream = null; + Stream? resourceStream; string resourceFilePath = Path.Combine(FileUtilities.GetCurrentDirectory(), Path.GetFileName(fileName)); if (File.Exists(resourceFilePath)) { @@ -125,20 +116,22 @@ public static Stream GetResourceStream(string fileName, string resourceId) private static string GetPlatformString() { - string platformName = "unknown"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - platformName = "windows"; + return "windows"; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - platformName = "linux"; + return "linux"; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { - platformName = "mac"; + return "mac"; + } + else + { + return "unknown"; } - return platformName; } } } diff --git a/dotnet/src/webdriver/Internal/ResponseValueJsonConverter.cs b/dotnet/src/webdriver/Internal/ResponseValueJsonConverter.cs index 2732cebbd13a2..66b962b2878a8 100644 --- a/dotnet/src/webdriver/Internal/ResponseValueJsonConverter.cs +++ b/dotnet/src/webdriver/Internal/ResponseValueJsonConverter.cs @@ -22,6 +22,8 @@ using System.Text.Json; using System.Text.Json.Serialization; +#nullable enable + namespace OpenQA.Selenium.Internal { /// @@ -29,7 +31,7 @@ namespace OpenQA.Selenium.Internal /// internal class ResponseValueJsonConverter : JsonConverter { - public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return ProcessReadToken(ref reader, options); } @@ -67,19 +69,19 @@ public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOp } } - private static object ProcessReadToken(ref Utf8JsonReader reader, JsonSerializerOptions options) + private static object? ProcessReadToken(ref Utf8JsonReader reader, JsonSerializerOptions options) { // Recursively processes a token. This is required for elements that next other elements. - object processedObject; + object? processedObject; switch (reader.TokenType) { case JsonTokenType.StartObject: { - Dictionary dictionaryValue = []; + Dictionary dictionaryValue = []; while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) { - string elementKey = reader.GetString(); + string elementKey = reader.GetString()!; reader.Read(); dictionaryValue.Add(elementKey, ProcessReadToken(ref reader, options)); } @@ -90,7 +92,7 @@ private static object ProcessReadToken(ref Utf8JsonReader reader, JsonSerializer case JsonTokenType.StartArray: { - List arrayValue = []; + List arrayValue = []; while (reader.Read() && reader.TokenType != JsonTokenType.EndArray) { arrayValue.Add(ProcessReadToken(ref reader, options)); diff --git a/dotnet/src/webdriver/Internal/ReturnedCapabilities.cs b/dotnet/src/webdriver/Internal/ReturnedCapabilities.cs index 3bac423108923..2932b75273e84 100644 --- a/dotnet/src/webdriver/Internal/ReturnedCapabilities.cs +++ b/dotnet/src/webdriver/Internal/ReturnedCapabilities.cs @@ -22,13 +22,15 @@ using System.Collections.ObjectModel; using System.Globalization; +#nullable enable + namespace OpenQA.Selenium.Internal { /// /// Class to Create the capabilities of the browser you require for . /// If you wish to use default values use the static methods /// - internal class ReturnedCapabilities : ICapabilities, IHasCapabilitiesDictionary + internal sealed class ReturnedCapabilities : ICapabilities, IHasCapabilitiesDictionary { private readonly Dictionary capabilities = new Dictionary(); @@ -43,32 +45,26 @@ public ReturnedCapabilities() /// Initializes a new instance of the class /// /// Dictionary of items for the remote driver - public ReturnedCapabilities(Dictionary rawMap) + public ReturnedCapabilities(Dictionary? rawMap) { if (rawMap != null) { - foreach (string key in rawMap.Keys) + foreach (KeyValuePair rawItem in rawMap) { - this.capabilities[key] = rawMap[key]; + this.capabilities[rawItem.Key] = rawItem.Value; } } } /// - /// Gets the browser name + /// Gets the browser name, or if not specified. /// public string BrowserName { get { - string name = string.Empty; - object capabilityValue = this.GetCapability(CapabilityType.BrowserName); - if (capabilityValue != null) - { - name = capabilityValue.ToString(); - } - - return name; + object? capabilityValue = this.GetCapability(CapabilityType.BrowserName); + return capabilityValue?.ToString() ?? string.Empty; } } @@ -84,30 +80,24 @@ public object this[string capabilityName] { get { - if (!this.capabilities.ContainsKey(capabilityName)) + if (!this.capabilities.TryGetValue(capabilityName, out object? capabilityValue)) { throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "The capability {0} is not present in this set of capabilities", capabilityName)); } - return this.capabilities[capabilityName]; + return capabilityValue; } } /// /// Gets the underlying Dictionary for a given set of capabilities. /// - IDictionary IHasCapabilitiesDictionary.CapabilitiesDictionary - { - get { return this.CapabilitiesDictionary; } - } + IDictionary IHasCapabilitiesDictionary.CapabilitiesDictionary => this.CapabilitiesDictionary; /// /// Gets the internal capabilities dictionary. /// - internal IDictionary CapabilitiesDictionary - { - get { return new ReadOnlyDictionary(this.capabilities); } - } + internal IDictionary CapabilitiesDictionary => new ReadOnlyDictionary(this.capabilities); /// /// Gets a value indicating whether the browser has a given capability. @@ -125,15 +115,14 @@ public bool HasCapability(string capability) /// The capability to get. /// An object associated with the capability, or /// if the capability is not set on the browser. - public object GetCapability(string capability) + public object? GetCapability(string capability) { - object capabilityValue = null; - if (this.capabilities.ContainsKey(capability)) + if (this.capabilities.TryGetValue(capability, out object? capabilityValue)) { - capabilityValue = this.capabilities[capability]; + return capabilityValue; } - return capabilityValue; + return null; } /// diff --git a/dotnet/src/webdriver/LogEntry.cs b/dotnet/src/webdriver/LogEntry.cs index 1f43ac5df8a7e..d10a2f3492930 100644 --- a/dotnet/src/webdriver/LogEntry.cs +++ b/dotnet/src/webdriver/LogEntry.cs @@ -21,6 +21,8 @@ using System.Collections.Generic; using System.Globalization; +#nullable enable + namespace OpenQA.Selenium { /// @@ -28,9 +30,6 @@ namespace OpenQA.Selenium /// public class LogEntry { - private LogLevel level = LogLevel.All; - private DateTime timestamp = DateTime.MinValue; - private string message = string.Empty; /// /// Initializes a new instance of the class. @@ -42,26 +41,19 @@ private LogEntry() /// /// Gets the timestamp value of the log entry. /// - public DateTime Timestamp - { - get { return this.timestamp; } - } + public DateTime Timestamp { get; private set; } = DateTime.MinValue; /// /// Gets the logging level of the log entry. /// - public LogLevel Level - { - get { return this.level; } - } + public LogLevel Level { get; private set; } = LogLevel.All; /// /// Gets the message of the log entry. /// - public string Message - { - get { return this.message; } - } + public string Message { get; private set; } = string.Empty; + + private static readonly DateTime UnixEpoch = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); /// /// Returns a string that represents the current . @@ -69,7 +61,7 @@ public string Message /// A string that represents the current . public override string ToString() { - return string.Format(CultureInfo.InvariantCulture, "[{0:yyyy-MM-ddTHH:mm:ssZ}] [{1}] {2}", this.timestamp, this.level, this.message); + return string.Format(CultureInfo.InvariantCulture, "[{0:yyyy-MM-ddTHH:mm:ssZ}] [{1}] {2}", this.Timestamp, this.Level, this.Message); } /// @@ -78,32 +70,31 @@ public override string ToString() /// The from /// which to create the . /// A with the values in the dictionary. - internal static LogEntry FromDictionary(Dictionary entryDictionary) + internal static LogEntry FromDictionary(Dictionary entryDictionary) { LogEntry entry = new LogEntry(); - if (entryDictionary.ContainsKey("message")) + if (entryDictionary.TryGetValue("message", out object? message)) { - entry.message = entryDictionary["message"].ToString(); + entry.Message = message?.ToString() ?? string.Empty; } - if (entryDictionary.ContainsKey("timestamp")) + if (entryDictionary.TryGetValue("timestamp", out object? timestamp)) { - DateTime zeroDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); - double timestampValue = Convert.ToDouble(entryDictionary["timestamp"], CultureInfo.InvariantCulture); - entry.timestamp = zeroDate.AddMilliseconds(timestampValue); + double timestampValue = Convert.ToDouble(timestamp, CultureInfo.InvariantCulture); + entry.Timestamp = UnixEpoch.AddMilliseconds(timestampValue); } - if (entryDictionary.ContainsKey("level")) + if (entryDictionary.TryGetValue("level", out object? level)) { - string levelValue = entryDictionary["level"].ToString(); - try + if (Enum.TryParse(level?.ToString(), ignoreCase: true, out LogLevel result)) { - entry.level = (LogLevel)Enum.Parse(typeof(LogLevel), levelValue, true); + entry.Level = result; } - catch (ArgumentException) + else { // If the requested log level string is not a valid log level, // ignore it and use LogLevel.All. + entry.Level = LogLevel.All; } } diff --git a/dotnet/src/webdriver/LogLevel.cs b/dotnet/src/webdriver/LogLevel.cs index 962d32cae682e..fd5c291c3a165 100644 --- a/dotnet/src/webdriver/LogLevel.cs +++ b/dotnet/src/webdriver/LogLevel.cs @@ -17,6 +17,8 @@ // under the License. // +#nullable enable + namespace OpenQA.Selenium { /// diff --git a/dotnet/src/webdriver/Logs.cs b/dotnet/src/webdriver/Logs.cs index 74fa3102977d5..91afcc03eb6cd 100644 --- a/dotnet/src/webdriver/Logs.cs +++ b/dotnet/src/webdriver/Logs.cs @@ -21,6 +21,8 @@ using System.Collections.Generic; using System.Collections.ObjectModel; +#nullable enable + namespace OpenQA.Selenium { /// @@ -28,15 +30,16 @@ namespace OpenQA.Selenium /// public class Logs : ILogs { - private WebDriver driver; + private readonly WebDriver driver; /// /// Initializes a new instance of the class. /// /// Instance of the driver currently in use + /// If is . public Logs(WebDriver driver) { - this.driver = driver; + this.driver = driver ?? throw new ArgumentNullException(nameof(driver)); } /// @@ -50,12 +53,11 @@ public ReadOnlyCollection AvailableLogTypes try { Response commandResponse = this.driver.InternalExecute(DriverCommand.GetAvailableLogTypes, null); - object[] responseValue = commandResponse.Value as object[]; - if (responseValue != null) + if (commandResponse.Value is object[] responseValue) { foreach (object logKind in responseValue) { - availableLogTypes.Add(logKind.ToString()); + availableLogTypes.Add(logKind.ToString()!); } } } @@ -74,21 +76,25 @@ public ReadOnlyCollection AvailableLogTypes /// The log for which to retrieve the log entries. /// Log types can be found in the class. /// The list of objects for the specified log. + /// If is . public ReadOnlyCollection GetLog(string logKind) { + if (logKind is null) + { + throw new ArgumentNullException(nameof(logKind)); + } + List entries = new List(); Dictionary parameters = new Dictionary(); parameters.Add("type", logKind); Response commandResponse = this.driver.InternalExecute(DriverCommand.GetLog, parameters); - object[] responseValue = commandResponse.Value as object[]; - if (responseValue != null) + if (commandResponse.Value is object?[] responseValue) { - foreach (object rawEntry in responseValue) + foreach (object? rawEntry in responseValue) { - Dictionary entryDictionary = rawEntry as Dictionary; - if (entryDictionary != null) + if (rawEntry is Dictionary entryDictionary) { entries.Add(LogEntry.FromDictionary(entryDictionary)); } diff --git a/dotnet/src/webdriver/Platform.cs b/dotnet/src/webdriver/Platform.cs index c143fd682d3b7..4ea2cc9be61c8 100644 --- a/dotnet/src/webdriver/Platform.cs +++ b/dotnet/src/webdriver/Platform.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium { /// @@ -84,10 +86,7 @@ public enum PlatformType /// public class Platform { - private static Platform current; - private PlatformType platformTypeValue; - private int major; - private int minor; + private static Platform? current; /// /// Initializes a new instance of the class for a specific platform type. @@ -95,39 +94,39 @@ public class Platform /// The platform type. public Platform(PlatformType typeValue) { - this.platformTypeValue = typeValue; + this.PlatformType = typeValue; } private Platform() { - this.major = Environment.OSVersion.Version.Major; - this.minor = Environment.OSVersion.Version.Minor; + this.MajorVersion = Environment.OSVersion.Version.Major; + this.MinorVersion = Environment.OSVersion.Version.Minor; switch (Environment.OSVersion.Platform) { case PlatformID.Win32NT: - if (this.major == 5) + if (this.MajorVersion == 5) { - this.platformTypeValue = PlatformType.XP; + this.PlatformType = PlatformType.XP; } - else if (this.major == 6) + else if (this.MajorVersion == 6) { - this.platformTypeValue = PlatformType.Vista; + this.PlatformType = PlatformType.Vista; } else { - this.platformTypeValue = PlatformType.Windows; + this.PlatformType = PlatformType.Windows; } break; // Thanks to a bug in Mono Mac and Linux will be treated the same https://bugzilla.novell.com/show_bug.cgi?id=515570 but adding this in case case PlatformID.MacOSX: - this.platformTypeValue = PlatformType.Mac; + this.PlatformType = PlatformType.Mac; break; case PlatformID.Unix: - this.platformTypeValue = PlatformType.Unix; + this.PlatformType = PlatformType.Unix; break; } } @@ -135,87 +134,44 @@ private Platform() /// /// Gets the current platform. /// - public static Platform CurrentPlatform - { - get - { - if (current == null) - { - current = new Platform(); - } - - return current; - } - } + public static Platform CurrentPlatform => current ??= new Platform(); /// /// Gets the major version of the platform operating system. /// - public int MajorVersion - { - get { return this.major; } - } + public int MajorVersion { get; } /// /// Gets the major version of the platform operating system. /// - public int MinorVersion - { - get { return this.minor; } - } + public int MinorVersion { get; } /// /// Gets the type of the platform. /// - public PlatformType PlatformType - { - get { return this.platformTypeValue; } - } + public PlatformType PlatformType { get; } /// /// Gets the value of the platform type for transmission using the JSON Wire Protocol. /// - public string ProtocolPlatformType - { - get { return this.platformTypeValue.ToString("G").ToUpperInvariant(); } - } + public string ProtocolPlatformType => this.PlatformType.ToString("G").ToUpperInvariant(); /// /// Compares the platform to the specified type. /// - /// A value to compare to. + /// A value to compare to. /// if the platforms match; otherwise . public bool IsPlatformType(PlatformType compareTo) { - bool platformIsType = false; - switch (compareTo) + return compareTo switch { - case PlatformType.Any: - platformIsType = true; - break; - - case PlatformType.Windows: - platformIsType = this.platformTypeValue == PlatformType.Windows || this.platformTypeValue == PlatformType.XP || this.platformTypeValue == PlatformType.Vista; - break; - - case PlatformType.Vista: - platformIsType = this.platformTypeValue == PlatformType.Windows || this.platformTypeValue == PlatformType.Vista; - break; - - case PlatformType.XP: - platformIsType = this.platformTypeValue == PlatformType.Windows || this.platformTypeValue == PlatformType.XP; - break; - - case PlatformType.Linux: - platformIsType = this.platformTypeValue == PlatformType.Linux || this.platformTypeValue == PlatformType.Unix; - break; - - default: - platformIsType = this.platformTypeValue == compareTo; - break; - } - - return platformIsType; + PlatformType.Any => true, + PlatformType.Windows => this.PlatformType is PlatformType.Windows or PlatformType.XP or PlatformType.Vista, + PlatformType.Vista => this.PlatformType is PlatformType.Windows or PlatformType.Vista, + PlatformType.XP => this.PlatformType is PlatformType.Windows or PlatformType.XP, + PlatformType.Linux => this.PlatformType is PlatformType.Linux or PlatformType.Unix, + _ => this.PlatformType == compareTo, + }; } /// @@ -224,7 +180,7 @@ public bool IsPlatformType(PlatformType compareTo) /// The string value for this platform type. public override string ToString() { - return this.platformTypeValue.ToString(); + return this.PlatformType.ToString(); } /// @@ -234,18 +190,15 @@ public override string ToString() /// The Platform object represented by the string name. internal static Platform FromString(string platformName) { - PlatformType platformTypeFromString = PlatformType.Any; - try + if (Enum.TryParse(platformName, ignoreCase: true, out PlatformType platformTypeFromString)) { - platformTypeFromString = (PlatformType)Enum.Parse(typeof(PlatformType), platformName, true); - } - catch (ArgumentException) - { - // If the requested platform string is not a valid platform type, - // ignore it and use PlatformType.Any. + return new Platform(platformTypeFromString); } - return new Platform(platformTypeFromString); + // If the requested platform string is not a valid platform type, + // ignore it and use PlatformType.Any. + + return new Platform(PlatformType.Any); } } } diff --git a/dotnet/src/webdriver/Proxy.cs b/dotnet/src/webdriver/Proxy.cs index 0216c50105ce8..fbbf55a3b9c97 100644 --- a/dotnet/src/webdriver/Proxy.cs +++ b/dotnet/src/webdriver/Proxy.cs @@ -23,6 +23,8 @@ using System.Globalization; using System.Text.Json.Serialization; +#nullable enable + namespace OpenQA.Selenium { /// @@ -72,13 +74,13 @@ public class Proxy { private ProxyKind proxyKind = ProxyKind.Unspecified; private bool isAutoDetect; - private string ftpProxyLocation; - private string httpProxyLocation; - private string proxyAutoConfigUrl; - private string sslProxyLocation; - private string socksProxyLocation; - private string socksUserName; - private string socksPassword; + private string? ftpProxyLocation; + private string? httpProxyLocation; + private string? proxyAutoConfigUrl; + private string? sslProxyLocation; + private string? socksProxyLocation; + private string? socksUserName; + private string? socksPassword; private int? socksVersion; private List noProxyAddresses = new List(); @@ -93,6 +95,8 @@ public Proxy() /// Initializes a new instance of the class with the given proxy settings. /// /// A dictionary of settings to use with the proxy. + /// If is . + /// If The "noProxy" value is a list with a element. public Proxy(Dictionary settings) { if (settings == null) @@ -100,46 +104,44 @@ public Proxy(Dictionary settings) throw new ArgumentNullException(nameof(settings), "settings dictionary cannot be null"); } - if (settings.ContainsKey("proxyType") && settings["proxyType"] != null) + if (settings.TryGetValue("proxyType", out object? proxyTypeObj) && proxyTypeObj?.ToString() is string proxyType) { // Special-case "PAC" since that is the correct serialization. - if (settings["proxyType"].ToString().ToLowerInvariant() == "pac") + if (proxyType.Equals("pac", StringComparison.InvariantCultureIgnoreCase)) { this.Kind = ProxyKind.ProxyAutoConfigure; } else { - ProxyKind rawType = (ProxyKind)Enum.Parse(typeof(ProxyKind), settings["proxyType"].ToString(), true); + ProxyKind rawType = (ProxyKind)Enum.Parse(typeof(ProxyKind), proxyType, ignoreCase: true); this.Kind = rawType; } } - if (settings.ContainsKey("ftpProxy") && settings["ftpProxy"] != null) + if (settings.TryGetValue("ftpProxy", out object? ftpProxyObj) && ftpProxyObj?.ToString() is string ftpProxy) { - this.FtpProxy = settings["ftpProxy"].ToString(); + this.FtpProxy = ftpProxy; } - if (settings.ContainsKey("httpProxy") && settings["httpProxy"] != null) + if (settings.TryGetValue("httpProxy", out object? httpProxyObj) && httpProxyObj?.ToString() is string httpProxy) { - this.HttpProxy = settings["httpProxy"].ToString(); + this.HttpProxy = httpProxy; } - if (settings.ContainsKey("noProxy") && settings["noProxy"] != null) + if (settings.TryGetValue("noProxy", out object? noProxy) && noProxy != null) { List bypassAddresses = new List(); - string addressesAsString = settings["noProxy"] as string; - if (addressesAsString != null) + if (noProxy is string addressesAsString) { bypassAddresses.AddRange(addressesAsString.Split(';')); } else { - object[] addressesAsArray = settings["noProxy"] as object[]; - if (addressesAsArray != null) + if (noProxy is object?[] addressesAsArray) { - foreach (object address in addressesAsArray) + foreach (object? address in addressesAsArray) { - bypassAddresses.Add(address.ToString()); + bypassAddresses.Add(address?.ToString() ?? throw new ArgumentException("Proxy bypass address list \"noProxy\" contained a null element", nameof(settings))); } } } @@ -147,39 +149,39 @@ public Proxy(Dictionary settings) this.AddBypassAddresses(bypassAddresses); } - if (settings.ContainsKey("proxyAutoconfigUrl") && settings["proxyAutoconfigUrl"] != null) + if (settings.TryGetValue("proxyAutoconfigUrl", out object? proxyAutoconfigUrlObj) && proxyAutoconfigUrlObj?.ToString() is string proxyAutoconfigUrl) { - this.ProxyAutoConfigUrl = settings["proxyAutoconfigUrl"].ToString(); + this.ProxyAutoConfigUrl = proxyAutoconfigUrl; } - if (settings.ContainsKey("sslProxy") && settings["sslProxy"] != null) + if (settings.TryGetValue("sslProxy", out object? sslProxyObj) && sslProxyObj?.ToString() is string sslProxy) { - this.SslProxy = settings["sslProxy"].ToString(); + this.SslProxy = sslProxy; } - if (settings.ContainsKey("socksProxy") && settings["socksProxy"] != null) + if (settings.TryGetValue("socksProxy", out object? socksProxyObj) && socksProxyObj?.ToString() is string socksProxy) { - this.SocksProxy = settings["socksProxy"].ToString(); + this.SocksProxy = socksProxy; } - if (settings.ContainsKey("socksUsername") && settings["socksUsername"] != null) + if (settings.TryGetValue("socksUsername", out object? socksUsernameObj) && socksUsernameObj?.ToString() is string socksUsername) { - this.SocksUserName = settings["socksUsername"].ToString(); + this.SocksUserName = socksUsername; } - if (settings.ContainsKey("socksPassword") && settings["socksPassword"] != null) + if (settings.TryGetValue("socksPassword", out object? socksPasswordObj) && socksPasswordObj?.ToString() is string socksPassword) { - this.SocksPassword = settings["socksPassword"].ToString(); + this.SocksPassword = socksPassword; } - if (settings.ContainsKey("socksVersion") && settings["socksVersion"] != null) + if (settings.TryGetValue("socksVersion", out object? socksVersion) && socksVersion != null) { - this.SocksVersion = Convert.ToInt32(settings["socksVersion"]); + this.SocksVersion = Convert.ToInt32(socksVersion); } - if (settings.ContainsKey("autodetect") && settings["autodetect"] != null) + if (settings.TryGetValue("autodetect", out object? autodetect) && autodetect != null) { - this.IsAutoDetect = (bool)settings["autodetect"]; + this.IsAutoDetect = Convert.ToBoolean(autodetect); } } @@ -189,10 +191,7 @@ public Proxy(Dictionary settings) [JsonIgnore] public ProxyKind Kind { - get - { - return this.proxyKind; - } + get => this.proxyKind; set { @@ -224,10 +223,7 @@ public string SerializableProxyKind [JsonIgnore] public bool IsAutoDetect { - get - { - return this.isAutoDetect; - } + get => this.isAutoDetect; set { @@ -247,12 +243,9 @@ public bool IsAutoDetect /// [JsonPropertyName("ftpProxy")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public string FtpProxy + public string? FtpProxy { - get - { - return this.ftpProxyLocation; - } + get => this.ftpProxyLocation; set { @@ -267,12 +260,9 @@ public string FtpProxy /// [JsonPropertyName("httpProxy")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public string HttpProxy + public string? HttpProxy { - get - { - return this.httpProxyLocation; - } + get => this.httpProxyLocation; set { @@ -287,7 +277,7 @@ public string HttpProxy /// [JsonPropertyName("noProxy")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public ReadOnlyCollection BypassProxyAddresses + public ReadOnlyCollection? BypassProxyAddresses { get { @@ -305,12 +295,9 @@ public ReadOnlyCollection BypassProxyAddresses /// [JsonPropertyName("proxyAutoconfigUrl")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public string ProxyAutoConfigUrl + public string? ProxyAutoConfigUrl { - get - { - return this.proxyAutoConfigUrl; - } + get => this.proxyAutoConfigUrl; set { @@ -325,12 +312,9 @@ public string ProxyAutoConfigUrl /// [JsonPropertyName("sslProxy")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public string SslProxy + public string? SslProxy { - get - { - return this.sslProxyLocation; - } + get => this.sslProxyLocation; set { @@ -345,12 +329,9 @@ public string SslProxy /// [JsonPropertyName("socksProxy")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public string SocksProxy + public string? SocksProxy { - get - { - return this.socksProxyLocation; - } + get => this.socksProxyLocation; set { @@ -365,12 +346,9 @@ public string SocksProxy /// [JsonPropertyName("socksUsername")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public string SocksUserName + public string? SocksUserName { - get - { - return this.socksUserName; - } + get => this.socksUserName; set { @@ -388,10 +366,7 @@ public string SocksUserName [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public int? SocksVersion { - get - { - return this.socksVersion; - } + get => this.socksVersion; set { @@ -403,7 +378,7 @@ public int? SocksVersion { if (value.Value <= 0) { - throw new ArgumentException("SocksVersion must be a positive integer"); + throw new ArgumentOutOfRangeException(nameof(value), "SocksVersion must be a positive integer"); } this.VerifyProxyTypeCompatilibily(ProxyKind.Manual); @@ -418,12 +393,9 @@ public int? SocksVersion /// [JsonPropertyName("socksPassword")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public string SocksPassword + public string? SocksPassword { - get - { - return this.socksPassword; - } + get => this.socksPassword; set { @@ -453,7 +425,7 @@ public void AddBypassAddress(string address) /// An array of addresses to add. public void AddBypassAddresses(params string[] addressesToAdd) { - this.AddBypassAddresses(new List(addressesToAdd)); + this.AddBypassAddresses((IEnumerable)addressesToAdd); } /// @@ -478,7 +450,7 @@ public void AddBypassAddresses(IEnumerable addressesToAdd) /// /// A dictionary suitable for serializing to the W3C Specification /// dialect of the wire protocol. - internal Dictionary ToCapability() + internal Dictionary? ToCapability() { return this.AsDictionary(true); } @@ -489,17 +461,17 @@ internal Dictionary ToCapability() /// /// A dictionary suitable for serializing to the OSS dialect of the /// wire protocol. - internal Dictionary ToLegacyCapability() + internal Dictionary? ToLegacyCapability() { return this.AsDictionary(false); } - private Dictionary AsDictionary(bool isSpecCompliant) + private Dictionary? AsDictionary(bool isSpecCompliant) { - Dictionary serializedDictionary = null; + Dictionary? serializedDictionary = null; if (this.proxyKind != ProxyKind.Unspecified) { - serializedDictionary = new Dictionary(); + serializedDictionary = new Dictionary(); if (this.proxyKind == ProxyKind.ProxyAutoConfigure) { serializedDictionary["proxyType"] = "pac"; @@ -556,17 +528,12 @@ private Dictionary AsDictionary(bool isSpecCompliant) return serializedDictionary; } - private object GetNoProxyAddressList(bool isSpecCompliant) + private object? GetNoProxyAddressList(bool isSpecCompliant) { - object addresses = null; + object? addresses = null; if (isSpecCompliant) { - List addressList = new List(); - foreach (string address in this.noProxyAddresses) - { - addressList.Add(address); - } - + List addressList = [.. this.noProxyAddresses]; addresses = addressList; } else diff --git a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs index 2a374d5f5eb14..b9bb4efcf0084 100644 --- a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs @@ -20,6 +20,8 @@ using System; using System.Threading.Tasks; +#nullable enable + namespace OpenQA.Selenium.Remote { /// @@ -27,8 +29,7 @@ namespace OpenQA.Selenium.Remote /// public class DriverServiceCommandExecutor : ICommandExecutor { - private DriverService service; - private HttpCommandExecutor internalExecutor; + private readonly DriverService service; private bool isDisposed; /// @@ -36,6 +37,7 @@ public class DriverServiceCommandExecutor : ICommandExecutor /// /// The that drives the browser. /// The maximum amount of time to wait for each command. + /// If is . public DriverServiceCommandExecutor(DriverService driverService, TimeSpan commandTimeout) : this(driverService, commandTimeout, true) { @@ -48,10 +50,11 @@ public DriverServiceCommandExecutor(DriverService driverService, TimeSpan comman /// The maximum amount of time to wait for each command. /// if the KeepAlive header should be sent /// with HTTP requests; otherwise, . + /// If is . public DriverServiceCommandExecutor(DriverService driverService, TimeSpan commandTimeout, bool enableKeepAlive) { - this.service = driverService; - this.internalExecutor = new HttpCommandExecutor(driverService.ServiceUrl, commandTimeout, enableKeepAlive); + this.service = driverService ?? throw new ArgumentNullException(nameof(driverService)); + this.HttpExecutor = new HttpCommandExecutor(driverService.ServiceUrl, commandTimeout, enableKeepAlive); } /// @@ -60,10 +63,11 @@ public DriverServiceCommandExecutor(DriverService driverService, TimeSpan comman /// The that drives the browser. /// The object used to execute commands, /// communicating with the service via HTTP. + /// If or are . public DriverServiceCommandExecutor(DriverService service, HttpCommandExecutor commandExecutor) { - this.service = service; - this.internalExecutor = commandExecutor; + this.service = service ?? throw new ArgumentNullException(nameof(service)); + this.HttpExecutor = commandExecutor ?? throw new ArgumentNullException(nameof(commandExecutor)); } /// @@ -71,22 +75,19 @@ public DriverServiceCommandExecutor(DriverService service, HttpCommandExecutor c /// //public CommandInfoRepository CommandInfoRepository //{ - // get { return this.internalExecutor.CommandInfoRepository; } + // get { return this.HttpExecutor.CommandInfoRepository; } //} public bool TryAddCommand(string commandName, CommandInfo info) { - return this.internalExecutor.TryAddCommand(commandName, info); + return this.HttpExecutor.TryAddCommand(commandName, info); } /// /// Gets the that sends commands to the remote /// end WebDriver implementation. /// - public HttpCommandExecutor HttpExecutor - { - get { return this.internalExecutor; } - } + public HttpCommandExecutor HttpExecutor { get; } /// /// Executes a command @@ -110,7 +111,7 @@ public async Task ExecuteAsync(Command commandToExecute) throw new ArgumentNullException(nameof(commandToExecute), "Command to execute cannot be null"); } - Response toReturn = null; + Response toReturn; if (commandToExecute.Name == DriverCommand.NewSession) { this.service.Start(); @@ -120,7 +121,7 @@ public async Task ExecuteAsync(Command commandToExecute) // command, so that we can get the finally block. try { - toReturn = await this.internalExecutor.ExecuteAsync(commandToExecute).ConfigureAwait(false); + toReturn = await this.HttpExecutor.ExecuteAsync(commandToExecute).ConfigureAwait(false); } finally { @@ -139,6 +140,7 @@ public async Task ExecuteAsync(Command commandToExecute) public void Dispose() { this.Dispose(true); + GC.SuppressFinalize(this); } /// @@ -153,7 +155,7 @@ protected virtual void Dispose(bool disposing) { if (disposing) { - this.internalExecutor.Dispose(); + this.HttpExecutor.Dispose(); this.service.Dispose(); } diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index a5d60f67e49ff..0686239405e38 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -326,7 +326,7 @@ private Response CreateResponse(HttpResponseInfo responseInfo) } else { - response.Status = WebDriverResult.UnhandledError; + response.Status = WebDriverResult.UnknownError; response.Value = body; } } diff --git a/dotnet/src/webdriver/Remote/ICommandServer.cs b/dotnet/src/webdriver/Remote/ICommandServer.cs index 395616482f7d5..f70d536dfd042 100644 --- a/dotnet/src/webdriver/Remote/ICommandServer.cs +++ b/dotnet/src/webdriver/Remote/ICommandServer.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Remote { /// diff --git a/dotnet/src/webdriver/Remote/W3CWireProtocolCommandInfoRepository.cs b/dotnet/src/webdriver/Remote/W3CWireProtocolCommandInfoRepository.cs index 8c51b36fd6035..d800da185613e 100644 --- a/dotnet/src/webdriver/Remote/W3CWireProtocolCommandInfoRepository.cs +++ b/dotnet/src/webdriver/Remote/W3CWireProtocolCommandInfoRepository.cs @@ -19,6 +19,8 @@ using System; +#nullable enable + namespace OpenQA.Selenium.Remote { /// @@ -40,18 +42,12 @@ public W3CWireProtocolCommandInfoRepository() /// /// Gets the level of the W3C WebDriver specification that this repository supports. /// - public override int SpecificationLevel - { - get { return 1; } - } + public override int SpecificationLevel => 1; /// /// Gets the that is valid for this /// - protected override Type RepositoryCommandInfoType - { - get { return typeof(HttpCommandInfo); } - } + protected override Type RepositoryCommandInfoType => typeof(HttpCommandInfo); /// /// Initializes the dictionary of commands for the CommandInfoRepository diff --git a/dotnet/src/webdriver/Response.cs b/dotnet/src/webdriver/Response.cs index 39962a0484a1f..abe4bb2a9fcdd 100644 --- a/dotnet/src/webdriver/Response.cs +++ b/dotnet/src/webdriver/Response.cs @@ -31,16 +31,12 @@ namespace OpenQA.Selenium /// public class Response { - private readonly static JsonSerializerOptions s_jsonSerializerOptions = new() + private static readonly JsonSerializerOptions s_jsonSerializerOptions = new() { TypeInfoResolver = ResponseJsonSerializerContext.Default, Converters = { new ResponseValueJsonConverter() } // we still need it to make `Object` as `Dictionary` }; - private object responseValue; - private string responseSessionId; - private WebDriverResult responseStatus; - /// /// Initializes a new instance of the class /// @@ -56,23 +52,33 @@ public Response(SessionId sessionId) { if (sessionId != null) { - this.responseSessionId = sessionId.ToString(); + this.SessionId = sessionId.ToString(); } } - private Response(Dictionary rawResponse) + /// + /// Returns a new from a JSON-encoded string. + /// + /// The JSON string to deserialize into a . + /// A object described by the JSON string. + public static Response FromJson(string value) { + Dictionary rawResponse = JsonSerializer.Deserialize>(value, s_jsonSerializerOptions) + ?? throw new WebDriverException("JSON success response returned \"null\" value"); + + var response = new Response(); + if (rawResponse.ContainsKey("sessionId")) { if (rawResponse["sessionId"] != null) { - this.responseSessionId = rawResponse["sessionId"].ToString(); + response.SessionId = rawResponse["sessionId"].ToString(); } } - if (rawResponse.ContainsKey("value")) + if (rawResponse.TryGetValue("value", out object valueObj)) { - this.responseValue = rawResponse["value"]; + response.Value = valueObj; } // If the returned object does *not* have a "value" property @@ -80,78 +86,56 @@ private Response(Dictionary rawResponse) // TODO: Remove this if statement altogether; there should // never be a spec-compliant response that does not contain a // value property. - if (!rawResponse.ContainsKey("value") && this.responseValue == null) + if (!rawResponse.ContainsKey("value") && response.Value == null) { // Special-case for the new session command, where the "capabilities" // property of the response is the actual value we're interested in. if (rawResponse.ContainsKey("capabilities")) { - this.responseValue = rawResponse["capabilities"]; + response.Value = rawResponse["capabilities"]; } else { - this.responseValue = rawResponse; + response.Value = rawResponse; } } - Dictionary valueDictionary = this.responseValue as Dictionary; - if (valueDictionary != null) + if (response.Value is Dictionary valueDictionary) { // Special case code for the new session command. If the response contains // sessionId and capabilities properties, fix up the session ID and value members. if (valueDictionary.ContainsKey("sessionId")) { - this.responseSessionId = valueDictionary["sessionId"].ToString(); - if (valueDictionary.ContainsKey("capabilities")) + response.SessionId = valueDictionary["sessionId"].ToString(); + if (valueDictionary.TryGetValue("capabilities", out object capabilities)) { - this.responseValue = valueDictionary["capabilities"]; + response.Value = capabilities; } else { - this.responseValue = valueDictionary["value"]; + response.Value = valueDictionary["value"]; } } } + + return response; } /// /// Gets or sets the value from JSON. /// - public object Value - { - get { return this.responseValue; } - set { this.responseValue = value; } - } + public object Value { get; set; } /// /// Gets or sets the session ID. /// - public string SessionId - { - get { return this.responseSessionId; } - set { this.responseSessionId = value; } - } + public string SessionId { get; set; } /// /// Gets or sets the status value of the response. /// - public WebDriverResult Status - { - get { return this.responseStatus; } - set { this.responseStatus = value; } - } + public WebDriverResult Status { get; set; } - /// - /// Returns a new from a JSON-encoded string. - /// - /// The JSON string to deserialize into a . - /// A object described by the JSON string. - public static Response FromJson(string value) - { - Dictionary deserializedResponse = JsonSerializer.Deserialize>(value, s_jsonSerializerOptions); - Response response = new Response(deserializedResponse); - return response; - } /// /// Returns a new from a JSON-encoded string. @@ -160,7 +144,8 @@ public static Response FromJson(string value) /// A object described by the JSON string. public static Response FromErrorJson(string value) { - var deserializedResponse = JsonSerializer.Deserialize>(value, s_jsonSerializerOptions); + var deserializedResponse = JsonSerializer.Deserialize>(value, s_jsonSerializerOptions) + ?? throw new WebDriverException("JSON error response returned \"null\" value"); var response = new Response(); @@ -181,14 +166,14 @@ public static Response FromErrorJson(string value) throw new WebDriverException($"The 'value > error' property was not found in the response:{Environment.NewLine}{value}"); } - if (errorObject is not string) + if (errorObject is not string errorString) { throw new WebDriverException($"The 'value > error' property is not a string{Environment.NewLine}{value}"); } response.Value = deserializedResponse["value"]; - response.Status = WebDriverError.ResultFromError(errorObject.ToString()); + response.Status = WebDriverError.ResultFromError(errorString); return response; } @@ -213,8 +198,5 @@ public override string ToString() } [JsonSerializable(typeof(Dictionary))] - internal partial class ResponseJsonSerializerContext : JsonSerializerContext - { - - } + internal sealed partial class ResponseJsonSerializerContext : JsonSerializerContext; } diff --git a/dotnet/src/webdriver/SessionId.cs b/dotnet/src/webdriver/SessionId.cs index 7cf90da7f69d1..8f605d4731775 100644 --- a/dotnet/src/webdriver/SessionId.cs +++ b/dotnet/src/webdriver/SessionId.cs @@ -17,6 +17,10 @@ // under the License. // +using System; + +#nullable enable + namespace OpenQA.Selenium { /// @@ -24,15 +28,16 @@ namespace OpenQA.Selenium /// public class SessionId { - private string sessionOpaqueKey; + private readonly string sessionOpaqueKey; /// /// Initializes a new instance of the class /// /// Key for the session in use + /// If is . public SessionId(string opaqueKey) { - this.sessionOpaqueKey = opaqueKey; + this.sessionOpaqueKey = opaqueKey ?? throw new ArgumentNullException(nameof(opaqueKey)); } /// @@ -54,20 +59,13 @@ public override int GetHashCode() } /// - /// Compares two Sessions + /// Indicates whether the current session ID value is the same as . /// - /// Session to compare - /// True if they are equal or False if they are not - public override bool Equals(object obj) + /// The session to compare to. + /// if the values are equal; otherwise, . + public override bool Equals(object? obj) { - bool objectsAreEqual = false; - SessionId other = obj as SessionId; - if (other != null) - { - objectsAreEqual = this.sessionOpaqueKey.Equals(other.sessionOpaqueKey); - } - - return objectsAreEqual; + return obj is SessionId otherSession && this.sessionOpaqueKey.Equals(otherSession.sessionOpaqueKey); } } } diff --git a/dotnet/src/webdriver/UnknownErrorException.cs b/dotnet/src/webdriver/UnknownErrorException.cs new file mode 100644 index 0000000000000..466bc19d9c479 --- /dev/null +++ b/dotnet/src/webdriver/UnknownErrorException.cs @@ -0,0 +1,51 @@ +// +// 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. +// + +using System; + +#nullable enable + +namespace OpenQA.Selenium +{ + /// + /// An unknown error occurred in the remote end while processing the command. + /// + [Serializable] + public class UnknownErrorException : WebDriverException + { + /// + /// Initializes a new instance of the class with the specified message. + /// + /// The message of the exception. + public UnknownErrorException(string? message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class with the specified message and inner exception. + /// + /// The message of the exception. + /// The inner exception for this exception. + public UnknownErrorException(string? message, Exception? innerException) + : base(message, innerException) + { + } + } +} diff --git a/dotnet/src/webdriver/UnknownMethodException.cs b/dotnet/src/webdriver/UnknownMethodException.cs new file mode 100644 index 0000000000000..168fc2dfedbec --- /dev/null +++ b/dotnet/src/webdriver/UnknownMethodException.cs @@ -0,0 +1,49 @@ +// +// 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. +// + +using System; + +#nullable enable + +namespace OpenQA.Selenium +{ + /// + /// Exception that is thrown when the requested command matched a known URL but did not match any method for that URL. + /// + [Serializable] + public class UnknownMethodException : WebDriverException + { + /// + /// Initializes a new instance of the class with the specified message. + /// + /// The message of the exception. + public UnknownMethodException(string? message) : base(message) + { + } + + /// + /// Initializes a new instance of the class with the specified message and inner exception. + /// + /// The message of the exception. + /// The inner exception for this exception. + public UnknownMethodException(string? message, Exception? innerException) : base(message, innerException) + { + } + } +} diff --git a/dotnet/src/webdriver/UnsupportedOperationException.cs b/dotnet/src/webdriver/UnsupportedOperationException.cs new file mode 100644 index 0000000000000..a8d104400d6b3 --- /dev/null +++ b/dotnet/src/webdriver/UnsupportedOperationException.cs @@ -0,0 +1,50 @@ +// +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +using System; + +#nullable enable + +namespace OpenQA.Selenium +{ + /// + /// Indicates that a command that should have executed properly cannot be supported for some reason. + /// + public class UnsupportedOperationException : WebDriverException + { + /// + /// Initializes a new instance of the class with the specified message. + /// + /// The message of the exception. + public UnsupportedOperationException(string? message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class with the specified message and inner exception. + /// + /// The message of the exception. + /// The inner exception for this exception. + public UnsupportedOperationException(string? message, Exception? innerException) + : base(message, innerException) + { + } + } +} diff --git a/dotnet/src/webdriver/VirtualAuth/Credential.cs b/dotnet/src/webdriver/VirtualAuth/Credential.cs index 170677b12e035..57dbcbe76ff45 100644 --- a/dotnet/src/webdriver/VirtualAuth/Credential.cs +++ b/dotnet/src/webdriver/VirtualAuth/Credential.cs @@ -18,31 +18,30 @@ // using OpenQA.Selenium.Internal; +using System; using System.Collections.Generic; +#nullable enable + namespace OpenQA.Selenium.VirtualAuth { /// /// A credential stored in a virtual authenticator. - /// Refer https://w3c.github.io/webauthn/#credential-parameters + /// Refer /// - public class Credential + public sealed class Credential { private readonly byte[] id; - private readonly bool isResidentCredential; - private readonly string rpId; - private readonly string privateKey; - private readonly byte[] userHandle; - private readonly int signCount; + private readonly byte[]? userHandle; - private Credential(byte[] id, bool isResidentCredential, string rpId, string privateKey, byte[] userHandle, int signCount) + private Credential(byte[] id, bool isResidentCredential, string rpId, string privateKey, byte[]? userHandle, int signCount) { - this.id = id; - this.isResidentCredential = isResidentCredential; - this.rpId = rpId; - this.privateKey = privateKey; + this.id = id ?? throw new ArgumentNullException(nameof(id)); + this.IsResidentCredential = isResidentCredential; + this.RpId = rpId ?? throw new ArgumentNullException(nameof(rpId)); + this.PrivateKey = privateKey ?? throw new ArgumentNullException(nameof(privateKey)); this.userHandle = userHandle; - this.signCount = signCount; + this.SignCount = signCount; } /// @@ -53,6 +52,7 @@ private Credential(byte[] id, bool isResidentCredential, string rpId, string pri /// The private Key for the credentials. /// The signature counter for the credentials. /// The created instance of the Credential class. + /// If , , or are . public static Credential CreateNonResidentCredential(byte[] id, string rpId, string privateKey, int signCount) { return new Credential(id, false, rpId, privateKey, null, signCount); @@ -67,6 +67,7 @@ public static Credential CreateNonResidentCredential(byte[] id, string rpId, str /// The user handle associated to the credential. /// The signature counter for the credentials. /// The created instance of the Credential class. + /// If , , or are . public static Credential CreateResidentCredential(byte[] id, string rpId, string privateKey, byte[] userHandle, int signCount) { return new Credential(id, true, rpId, privateKey, userHandle, signCount); @@ -75,50 +76,32 @@ public static Credential CreateResidentCredential(byte[] id, string rpId, string /// /// Gets the byte array of the ID of the credential. /// - public byte[] Id - { - get { return (byte[])id.Clone(); } - } + public byte[] Id => (byte[])id.Clone(); /// /// Gets a value indicating whether this Credential is a resident credential. /// - public bool IsResidentCredential - { - get { return this.isResidentCredential; } - } + public bool IsResidentCredential { get; } /// /// Gets the ID of the relying party of this credential. /// - public string RpId - { - get { return this.rpId; } - } + public string RpId { get; } /// /// Gets the private key of the credential. /// - public string PrivateKey - { - get { return this.privateKey; } - } + public string PrivateKey { get; } /// /// Gets the user handle of the credential. /// - public byte[] UserHandle - { - get { return userHandle == null ? null : (byte[])userHandle.Clone(); } - } + public byte[]? UserHandle => (byte[]?)userHandle?.Clone(); /// /// Gets the signature counter associated to the public key credential source. /// - public int SignCount - { - get { return this.signCount; } - } + public int SignCount { get; } /// /// Creates a Credential instance from a dictionary of values. @@ -127,13 +110,14 @@ public int SignCount /// The created instance of the Credential. public static Credential FromDictionary(Dictionary dictionary) { - return new Credential( - Base64UrlEncoder.DecodeBytes((string)dictionary["credentialId"]), - (bool)dictionary["isResidentCredential"], - dictionary.ContainsKey("rpId") ? (string)dictionary["rpId"] : null, - (string)dictionary["privateKey"], - dictionary.ContainsKey("userHandle") ? Base64UrlEncoder.DecodeBytes((string)dictionary["userHandle"]) : null, - (int)((long)dictionary["signCount"])); + byte[] id = Base64UrlEncoder.DecodeBytes((string)dictionary["credentialId"]); + bool isResidentCredential = (bool)dictionary["isResidentCredential"]; + string? rpId = dictionary.TryGetValue("rpId", out object? r) ? (string)r : null; + string privateKey = (string)dictionary["privateKey"]; + byte[]? userHandle = dictionary.TryGetValue("userHandle", out object? u) ? Base64UrlEncoder.DecodeBytes((string)u) : null; + int signCount = (int)(long)dictionary["signCount"]; + + return new Credential(id, isResidentCredential, rpId, privateKey, userHandle, signCount); } /// @@ -145,11 +129,11 @@ public Dictionary ToDictionary() Dictionary toReturn = new Dictionary(); toReturn["credentialId"] = Base64UrlEncoder.Encode(this.id); - toReturn["isResidentCredential"] = this.isResidentCredential; - toReturn["rpId"] = this.rpId; - toReturn["privateKey"] = this.privateKey; - toReturn["signCount"] = this.signCount; - if (this.userHandle != null) + toReturn["isResidentCredential"] = this.IsResidentCredential; + toReturn["rpId"] = this.RpId; + toReturn["privateKey"] = this.PrivateKey; + toReturn["signCount"] = this.SignCount; + if (this.userHandle is not null) { toReturn["userHandle"] = Base64UrlEncoder.Encode(this.userHandle); } diff --git a/dotnet/src/webdriver/VirtualAuth/IHasVirtualAuthenticator.cs b/dotnet/src/webdriver/VirtualAuth/IHasVirtualAuthenticator.cs index 92619ded68acb..2d8616416f90e 100644 --- a/dotnet/src/webdriver/VirtualAuth/IHasVirtualAuthenticator.cs +++ b/dotnet/src/webdriver/VirtualAuth/IHasVirtualAuthenticator.cs @@ -17,8 +17,11 @@ // under the License. // +using System; using System.Collections.Generic; +#nullable enable + namespace OpenQA.Selenium.VirtualAuth { /// @@ -31,18 +34,23 @@ public interface IHasVirtualAuthenticator /// /// The VirtualAuthenticatorOptions to use in creating the authenticator. /// The ID of the added virtual authenticator. + /// If is . string AddVirtualAuthenticator(VirtualAuthenticatorOptions options); /// /// Removes a virtual authenticator. /// /// The ID of the virtual authenticator to remove. + /// If is . + /// If the specified virtual authenticator does not exist. void RemoveVirtualAuthenticator(string id); /// /// Adds a credential to the virtual authenticator. /// /// The credential to add to the authenticator. + /// If is . + /// If a Virtual Authenticator has not been added yet. void AddCredential(Credential credential); /// @@ -55,23 +63,29 @@ public interface IHasVirtualAuthenticator /// Removes a credential from the virtual authenticator. /// /// A byte array representing the ID of the credential to remove. + /// If is . + /// If a Virtual Authenticator has not been added yet. void RemoveCredential(byte[] credentialId); /// /// Removes a credential from the virtual authenticator. /// /// A string representing the ID of the credential to remove. + /// If is . + /// If a Virtual Authenticator has not been added yet. void RemoveCredential(string credentialId); /// /// Removes all credentials registered to this virtual authenticator. /// + /// If a Virtual Authenticator has not been added yet. void RemoveAllCredentials(); /// /// Sets whether or not a user is verified in this virtual authenticator. /// /// if the user is verified; otherwise . + /// If a Virtual Authenticator has not been added yet. void SetUserVerified(bool verified); } } diff --git a/dotnet/src/webdriver/VirtualAuth/VirtualAuthenticatorOptions.cs b/dotnet/src/webdriver/VirtualAuth/VirtualAuthenticatorOptions.cs index 6e118df89e037..502d1368f9d0f 100644 --- a/dotnet/src/webdriver/VirtualAuth/VirtualAuthenticatorOptions.cs +++ b/dotnet/src/webdriver/VirtualAuth/VirtualAuthenticatorOptions.cs @@ -20,6 +20,8 @@ using System; using System.Collections.Generic; +#nullable enable + namespace OpenQA.Selenium.VirtualAuth { /// @@ -78,10 +80,13 @@ public static class Transport private bool isUserVerified = false; /// - /// Sets the protocol the Virtual Authenticator speaks + /// Sets the Client to Authenticator Protocol (CTAP) this Virtual Authenticator speaks. /// - /// Valid protocol value - /// VirtualAuthenticatorOptions + /// The CTAP protocol identifier. + /// This options instance for chaining. + /// Valid protocols are available on the type. + /// If is not a supported protocol value. + /// public VirtualAuthenticatorOptions SetProtocol(string protocol) { if (string.Equals(Protocol.CTAP2, protocol) || string.Equals(Protocol.U2F, protocol)) @@ -92,15 +97,19 @@ public VirtualAuthenticatorOptions SetProtocol(string protocol) else { throw new ArgumentException("Enter a valid protocol value." + - "Refer to https://www.w3.org/TR/webauthn-2/#sctn-automation-virtual-authenticators for supported protocols."); + "Refer to https://www.w3.org/TR/webauthn-2/#sctn-automation-virtual-authenticators for supported protocols."); } } /// - /// Sets the transport authenticator needs to implement to communicate with clients + /// Sets the Authenticator Transport this Virtual Authenticator needs to implement, to communicate with clients. /// - /// Valid transport value - /// VirtualAuthenticatorOptions + /// Valid transport value. + /// + /// This options instance for chaining. + /// Valid protocols are available on the type. + /// If is not a supported transport value. + /// public VirtualAuthenticatorOptions SetTransport(string transport) { if (Transport.BLE == transport || Transport.INTERNAL == transport || Transport.NFC == transport || Transport.USB == transport) @@ -111,16 +120,15 @@ public VirtualAuthenticatorOptions SetTransport(string transport) else { throw new ArgumentException("Enter a valid transport value." + - "Refer to https://www.w3.org/TR/webauthn-2/#enum-transport for supported transport values."); + "Refer to https://www.w3.org/TR/webauthn-2/#enum-transport for supported transport values."); } } /// - /// If set to true the authenticator will support client-side discoverable credentials. - /// Refer https://w3c.github.io/webauthn/#client-side-discoverable-credential + /// If set to , the authenticator will support Client-side discoverable Credentials. /// - /// boolean value to set - /// VirtualAuthenticatorOptions + /// Whether authenticator will support client-side discoverable credentials. + /// This options instance for chaining. public VirtualAuthenticatorOptions SetHasResidentKey(bool hasResidentKey) { this.hasResidentKey = hasResidentKey; @@ -128,11 +136,10 @@ public VirtualAuthenticatorOptions SetHasResidentKey(bool hasResidentKey) } /// - /// If set to true, the authenticator supports user verification. - /// Refer https://w3c.github.io/webauthn/#user-verification. + /// If set to , the authenticator will support User Verification. /// - /// boolean value to set - /// + /// Whether the authenticator supports user verification. + /// This options instance for chaining. public VirtualAuthenticatorOptions SetHasUserVerification(bool hasUserVerification) { this.hasUserVerification = hasUserVerification; @@ -140,11 +147,10 @@ public VirtualAuthenticatorOptions SetHasUserVerification(bool hasUserVerificati } /// - /// If set to true, a user consent will always be granted. - /// Refer https://w3c.github.io/webauthn/#user-consent + /// If set to , a User Consent will always be granted. /// - /// boolean value to set - /// VirtualAuthenticatorOptions + /// Whether a user consent will always be granted. + /// This options instance for chaining. public VirtualAuthenticatorOptions SetIsUserConsenting(bool isUserConsenting) { this.isUserConsenting = isUserConsenting; @@ -152,11 +158,10 @@ public VirtualAuthenticatorOptions SetIsUserConsenting(bool isUserConsenting) } /// - /// If set to true, User Verification will always succeed. - /// Refer https://w3c.github.io/webauthn/#user-verification + /// If set to , User Verification will always succeed. /// - /// boolean value to set - /// VirtualAuthenticatorOptions + /// Whether User Verification will always succeed. + /// This options instance for chaining. public VirtualAuthenticatorOptions SetIsUserVerified(bool isUserVerified) { this.isUserVerified = isUserVerified; @@ -164,7 +169,7 @@ public VirtualAuthenticatorOptions SetIsUserVerified(bool isUserVerified) } /// - /// Serializes this set of options to a dictionary of key-value pairs. + /// Serializes this set of options into a dictionary of key-value pairs. /// /// The dictionary containing the values of this set of options. public Dictionary ToDictionary() diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index d9960ea97b235..57d1a2bab91fc 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -24,6 +24,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Threading.Tasks; @@ -44,7 +45,7 @@ public class WebDriver : IWebDriver, ISearchContext, IJavaScriptExecutor, IFinds private IFileDetector fileDetector = new DefaultFileDetector(); private NetworkManager network; private WebElementFactory elementFactory; - private SessionId sessionId; + private List registeredCommands = new List(); /// @@ -191,10 +192,7 @@ public bool IsActionExecutor /// /// Gets the for the current session of this driver. /// - public SessionId SessionId - { - get { return this.sessionId; } - } + public SessionId SessionId { get; private set; } /// /// Gets or sets the responsible for detecting @@ -612,7 +610,7 @@ protected virtual Response Execute(string driverCommandToExecute, /// A containing information about the success or failure of the command and any data returned by the command. protected virtual async Task ExecuteAsync(string driverCommandToExecute, Dictionary parameters) { - Command commandToExecute = new Command(this.sessionId, driverCommandToExecute, parameters); + Command commandToExecute = new Command(SessionId, driverCommandToExecute, parameters); Response commandResponse; @@ -624,7 +622,7 @@ protected virtual async Task ExecuteAsync(string driverCommandToExecut { commandResponse = new Response { - Status = WebDriverResult.UnhandledError, + Status = WebDriverResult.UnknownError, Value = e }; } @@ -641,6 +639,7 @@ protected virtual async Task ExecuteAsync(string driverCommandToExecut /// Starts a session with the driver /// /// Capabilities of the browser + [MemberNotNull(nameof(SessionId))] protected void StartSession(ICapabilities capabilities) { Dictionary parameters = new Dictionary(); @@ -679,7 +678,9 @@ protected void StartSession(ICapabilities capabilities) ReturnedCapabilities returnedCapabilities = new ReturnedCapabilities(rawCapabilities); this.capabilities = returnedCapabilities; - this.sessionId = new SessionId(response.SessionId); + + string sessionId = response.SessionId ?? throw new WebDriverException($"The remote end did not respond with ID of a session when it was required. {response.Value}"); + this.SessionId = new SessionId(sessionId); } /// @@ -723,7 +724,7 @@ protected virtual void Dispose(bool disposing) { try { - if (this.sessionId is not null) + if (this.SessionId is not null) { this.Execute(DriverCommand.Quit, null); } @@ -739,7 +740,7 @@ protected virtual void Dispose(bool disposing) } finally { - this.sessionId = null; + this.SessionId = null; } this.executor.Dispose(); } @@ -781,9 +782,6 @@ private static void UnpackAndThrowOnError(Response errorResponse, string command case WebDriverResult.ElementNotSelectable: throw new InvalidElementStateException(errorMessage); - case WebDriverResult.UnhandledError: - throw new WebDriverException(errorMessage); - case WebDriverResult.NoSuchDocument: throw new NoSuchElementException(errorMessage); @@ -853,6 +851,15 @@ private static void UnpackAndThrowOnError(Response errorResponse, string command case WebDriverResult.InsecureCertificate: throw new InsecureCertificateException(errorMessage); + case WebDriverResult.UnknownError: + throw new UnknownErrorException(errorMessage); + + case WebDriverResult.UnknownMethod: + throw new UnknownMethodException(errorMessage); + + case WebDriverResult.UnsupportedOperation: + throw new UnsupportedOperationException(errorMessage); + default: throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "{0} ({1})", errorMessage, errorResponse.Status)); } @@ -1036,44 +1043,68 @@ private object ParseJavaScriptReturnValue(object responseValue) return returnValue; } +#nullable enable + /// /// Creates a Virtual Authenticator. /// - /// VirtualAuthenticator Options (https://w3c.github.io/webauthn/#sctn-automation-virtual-authenticators) + /// Virtual Authenticator Options. /// Authenticator id as string + /// If is . public string AddVirtualAuthenticator(VirtualAuthenticatorOptions options) { + if (options is null) + { + throw new ArgumentNullException(nameof(options)); + } + Response commandResponse = this.Execute(DriverCommand.AddVirtualAuthenticator, options.ToDictionary()); - string id = commandResponse.Value.ToString(); + string id = (string)commandResponse.Value!; this.AuthenticatorId = id; - return this.AuthenticatorId; + return id; } /// /// Removes the Virtual Authenticator /// - /// Id as string that uniquely identifies a Virtual Authenticator + /// Id as string that uniquely identifies a Virtual Authenticator. + /// If is . public void RemoveVirtualAuthenticator(string authenticatorId) { + if (authenticatorId is null) + { + throw new ArgumentNullException(nameof(authenticatorId)); + } + Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.AuthenticatorId); + parameters.Add("authenticatorId", authenticatorId); + this.Execute(DriverCommand.RemoveVirtualAuthenticator, parameters); this.AuthenticatorId = null; } /// - /// Gets the virtual authenticator ID for this WebDriver instance. + /// Gets the cached virtual authenticator ID, or if no authenticator ID is set. /// - public string AuthenticatorId { get; private set; } + public string? AuthenticatorId { get; private set; } /// /// Add a credential to the Virtual Authenticator/ /// /// The credential to be stored in the Virtual Authenticator + /// If is . + /// If a Virtual Authenticator has not been added yet. public void AddCredential(Credential credential) { + if (credential is null) + { + throw new ArgumentNullException(nameof(credential)); + } + + string authenticatorId = this.AuthenticatorId ?? throw new InvalidOperationException("Virtual Authenticator needs to be added before it can perform operations"); + Dictionary parameters = new Dictionary(credential.ToDictionary()); - parameters.Add("authenticatorId", this.AuthenticatorId); + parameters.Add("authenticatorId", authenticatorId); this.Execute(driverCommandToExecute: DriverCommand.AddCredential, parameters); } @@ -1082,18 +1113,25 @@ public void AddCredential(Credential credential) /// Retrieves all the credentials stored in the Virtual Authenticator /// /// List of credentials + /// If a Virtual Authenticator has not been added yet. public List GetCredentials() { + string authenticatorId = this.AuthenticatorId ?? throw new InvalidOperationException("Virtual Authenticator needs to be added before it can perform operations"); + Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.AuthenticatorId); + parameters.Add("authenticatorId", authenticatorId); - object[] commandResponse = (object[])this.Execute(driverCommandToExecute: DriverCommand.GetCredentials, parameters).Value; + Response getCredentialsResponse = this.Execute(driverCommandToExecute: DriverCommand.GetCredentials, parameters); - List credentials = new List(); + if (getCredentialsResponse.Value is not object?[] credentialsList) + { + throw new WebDriverException($"Get credentials call succeeded, but the response was not a list of credentials: {getCredentialsResponse.Value}"); + } - foreach (object dictionary in commandResponse) + List credentials = new List(credentialsList.Length); + foreach (object? dictionary in credentialsList) { - Credential credential = Credential.FromDictionary((Dictionary)dictionary); + Credential credential = Credential.FromDictionary((Dictionary)dictionary!); credentials.Add(credential); } @@ -1104,6 +1142,8 @@ public List GetCredentials() /// Removes the credential identified by the credentialId from the Virtual Authenticator. /// /// The id as byte array that uniquely identifies a credential + /// If is . + /// If a Virtual Authenticator has not been added yet. public void RemoveCredential(byte[] credentialId) { RemoveCredential(Base64UrlEncoder.Encode(credentialId)); @@ -1113,10 +1153,19 @@ public void RemoveCredential(byte[] credentialId) /// Removes the credential identified by the credentialId from the Virtual Authenticator. /// /// The id as string that uniquely identifies a credential + /// If is . + /// If a Virtual Authenticator has not been added yet. public void RemoveCredential(string credentialId) { + if (credentialId is null) + { + throw new ArgumentNullException(nameof(credentialId)); + } + + string authenticatorId = this.AuthenticatorId ?? throw new InvalidOperationException("Virtual Authenticator needs to be added before it can perform operations"); + Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.AuthenticatorId); + parameters.Add("authenticatorId", authenticatorId); parameters.Add("credentialId", credentialId); this.Execute(driverCommandToExecute: DriverCommand.RemoveCredential, parameters); @@ -1125,10 +1174,13 @@ public void RemoveCredential(string credentialId) /// /// Removes all the credentials stored in the Virtual Authenticator. /// + /// If a Virtual Authenticator has not been added yet. public void RemoveAllCredentials() { + string authenticatorId = this.AuthenticatorId ?? throw new InvalidOperationException("Virtual Authenticator needs to be added before it can perform operations"); + Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.AuthenticatorId); + parameters.Add("authenticatorId", authenticatorId); this.Execute(driverCommandToExecute: DriverCommand.RemoveAllCredentials, parameters); } @@ -1139,8 +1191,10 @@ public void RemoveAllCredentials() /// The boolean value representing value to be set public void SetUserVerified(bool verified) { + string authenticatorId = this.AuthenticatorId ?? throw new InvalidOperationException("Virtual Authenticator needs to be added before it can perform operations"); + Dictionary parameters = new Dictionary(); - parameters.Add("authenticatorId", this.AuthenticatorId); + parameters.Add("authenticatorId", authenticatorId); parameters.Add("isUserVerified", verified); this.Execute(driverCommandToExecute: DriverCommand.SetUserVerified, parameters); diff --git a/dotnet/src/webdriver/WebDriverError.cs b/dotnet/src/webdriver/WebDriverError.cs index e87f8aeae5253..5811d924f53cb 100644 --- a/dotnet/src/webdriver/WebDriverError.cs +++ b/dotnet/src/webdriver/WebDriverError.cs @@ -27,32 +27,16 @@ namespace OpenQA.Selenium /// internal static class WebDriverError { - /// - /// Represents the detached shadow root error. - /// - public const string DetachedShadowRoot = "detached shadow root"; - /// /// Represents the element click intercepted error. /// public const string ElementClickIntercepted = "element click intercepted"; - /// - /// Represents the element not selectable error. - /// - public const string ElementNotSelectable = "element not selectable"; - /// /// Represents the element not interactable error. /// public const string ElementNotInteractable = "element not interactable"; - /// - /// Represents the element not visible error. - /// - /// TODO: Remove this string; it is no longer valid in the specification. - public const string ElementNotVisible = "element not visible"; - /// /// Represents the insecure certificate error. /// @@ -68,17 +52,6 @@ internal static class WebDriverError /// public const string InvalidCookieDomain = "invalid cookie domain"; - /// - /// Represents the invalid coordinates error. - /// - public const string InvalidCoordinates = "invalid coordinates"; - - /// - /// Represents the invalid element coordinates error. - /// - /// TODO: Remove this string; it is no longer valid in the specification. - public const string InvalidElementCoordinates = "invalid element coordinates"; - /// /// Represents the invalid element state error. /// @@ -149,6 +122,11 @@ internal static class WebDriverError /// public const string StaleElementReference = "stale element reference"; + /// + /// Represents the detached shadow root error. + /// + public const string DetachedShadowRoot = "detached shadow root"; + /// /// Represents the timeout error. /// @@ -194,16 +172,11 @@ internal static class WebDriverError static WebDriverError() { resultMap = new Dictionary(); - resultMap[DetachedShadowRoot] = WebDriverResult.DetachedShadowRoot; resultMap[ElementClickIntercepted] = WebDriverResult.ElementClickIntercepted; - resultMap[ElementNotSelectable] = WebDriverResult.ElementNotSelectable; - resultMap[ElementNotVisible] = WebDriverResult.ElementNotDisplayed; resultMap[ElementNotInteractable] = WebDriverResult.ElementNotInteractable; resultMap[InsecureCertificate] = WebDriverResult.InsecureCertificate; resultMap[InvalidArgument] = WebDriverResult.InvalidArgument; resultMap[InvalidCookieDomain] = WebDriverResult.InvalidCookieDomain; - resultMap[InvalidCoordinates] = WebDriverResult.InvalidElementCoordinates; - resultMap[InvalidElementCoordinates] = WebDriverResult.InvalidElementCoordinates; resultMap[InvalidElementState] = WebDriverResult.InvalidElementState; resultMap[InvalidSelector] = WebDriverResult.InvalidSelector; resultMap[InvalidSessionId] = WebDriverResult.NoSuchDriver; @@ -218,14 +191,15 @@ static WebDriverError() resultMap[ScriptTimeout] = WebDriverResult.AsyncScriptTimeout; resultMap[SessionNotCreated] = WebDriverResult.SessionNotCreated; resultMap[StaleElementReference] = WebDriverResult.ObsoleteElement; + resultMap[DetachedShadowRoot] = WebDriverResult.DetachedShadowRoot; resultMap[Timeout] = WebDriverResult.Timeout; resultMap[UnableToSetCookie] = WebDriverResult.UnableToSetCookie; resultMap[UnableToCaptureScreen] = WebDriverResult.UnableToCaptureScreen; resultMap[UnexpectedAlertOpen] = WebDriverResult.UnexpectedAlertOpen; resultMap[UnknownCommand] = WebDriverResult.UnknownCommand; - resultMap[UnknownError] = WebDriverResult.UnhandledError; - resultMap[UnknownMethod] = WebDriverResult.UnknownCommand; - resultMap[UnsupportedOperation] = WebDriverResult.UnhandledError; + resultMap[UnknownError] = WebDriverResult.UnknownError; + resultMap[UnknownMethod] = WebDriverResult.UnknownMethod; + resultMap[UnsupportedOperation] = WebDriverResult.UnsupportedOperation; } /// diff --git a/dotnet/src/webdriver/WebDriverResult.cs b/dotnet/src/webdriver/WebDriverResult.cs index 962c21d4bac76..a18dcce7c6a42 100644 --- a/dotnet/src/webdriver/WebDriverResult.cs +++ b/dotnet/src/webdriver/WebDriverResult.cs @@ -17,6 +17,8 @@ // under the License. // +using System; + namespace OpenQA.Selenium { /// @@ -32,115 +34,134 @@ public enum WebDriverResult /// /// The index specified for the action was out of the acceptable range. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] IndexOutOfBounds = 1, /// /// No collection was specified. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] NoCollection = 2, /// /// No string was specified. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] NoString = 3, /// /// No string length was specified. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] NoStringLength = 4, /// /// No string wrapper was specified. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] NoStringWrapper = 5, /// - /// No driver matching the criteria exists. + /// Occurs if the given session id is not in the list of active sessions, meaning the session either does not exist or that it's not active. /// NoSuchDriver = 6, /// - /// No element matching the criteria exists. + /// An element could not be located on the page using the given search parameters. /// NoSuchElement = 7, /// - /// No frame matching the criteria exists. + /// A command to switch to a frame could not be satisfied because the frame could not be found. /// NoSuchFrame = 8, /// - /// The functionality is not supported. + /// A command could not be executed because the remote end is not aware of it. /// UnknownCommand = 9, /// - /// The specified element is no longer valid. + /// A command failed because the referenced element is no longer attached to the DOM. /// ObsoleteElement = 10, /// /// The specified element is not displayed. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] ElementNotDisplayed = 11, /// - /// The specified element is not enabled. + /// A command could not be completed because the element is in an invalid state, e.g. attempting to clear an element that isn't both editable and resettable. /// InvalidElementState = 12, + /// + /// An unknown error occurred in the remote end while processing the command. + /// + UnknownError = 13, + /// /// An unhandled error occurred. /// - UnhandledError = 13, + [Obsolete("This value is no longer set for unknown errors: use UnknownError instead. Will be removed in 4.30")] + UnhandledError = UnknownError, /// /// An error occurred, but it was expected. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] ExpectedError = 14, /// /// The specified element is not selected. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] ElementNotSelectable = 15, /// /// No document matching the criteria exists. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] NoSuchDocument = 16, /// - /// An unexpected JavaScript error occurred. + /// An error occurred while executing JavaScript supplied by the user. /// UnexpectedJavaScriptError = 17, /// /// No result is available from the JavaScript execution. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] NoScriptResult = 18, /// /// The result from the JavaScript execution is not recognized. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] XPathLookupError = 19, /// /// No collection matching the criteria exists. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] NoSuchCollection = 20, /// - /// A timeout occurred. + /// An operation did not complete before its timeout expired. /// Timeout = 21, /// /// A null pointer was received. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] NullPointer = 22, /// - /// No window matching the criteria exists. + /// A command to switch to a window could not be satisfied because the window could not be found. /// NoSuchWindow = 23, @@ -150,77 +171,79 @@ public enum WebDriverResult InvalidCookieDomain = 24, /// - /// A request to set a cookie's value could not be satisfied. + /// A command to set a cookie's value could not be satisfied. /// UnableToSetCookie = 25, /// - /// An alert was found open unexpectedly. + /// A modal dialog was open, blocking this operation. /// UnexpectedAlertOpen = 26, /// - /// A request was made to switch to an alert, but no alert is currently open. + /// An attempt was made to operate on a modal dialog when one was not open. /// NoAlertPresent = 27, /// - /// An asynchronous JavaScript execution timed out. + /// A script did not complete before its timeout expired. /// AsyncScriptTimeout = 28, /// /// The coordinates of the element are invalid. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] InvalidElementCoordinates = 29, /// - /// The selector used (CSS/XPath) was invalid. + /// Argument was an invalid selector. /// InvalidSelector = 32, /// - /// A session was not created by the driver + /// A new session could not be created. /// SessionNotCreated = 33, /// - /// The requested move was outside the active view port + /// The target for mouse interaction is not in the browser's viewport and cannot be brought into that viewport. /// MoveTargetOutOfBounds = 34, /// /// The XPath selector was invalid. /// + [Obsolete("This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30")] InvalidXPathSelector = 51, /// - /// An insecure SSl certificate was specified. + /// Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate. /// InsecureCertificate = 59, /// - /// The element was not interactable + /// A command could not be completed because the element is not pointer- or keyboard interactable. /// ElementNotInteractable = 60, /// - /// An invalid argument was passed to the command. + /// The arguments passed to a command are either invalid or malformed. /// InvalidArgument = 61, /// - /// No cookie was found matching the name requested. + /// No cookie matching the given path name was found amongst the associated cookies of session's current browsing context's active document. /// NoSuchCookie = 62, /// - /// The driver was unable to capture the screen. + /// A screen capture was made impossible. /// UnableToCaptureScreen = 63, /// - /// The click on the element was intercepted by a different element. + /// The Element Click command could not be completed because the element receiving the events is obscuring the element that was requested clicked. /// ElementClickIntercepted = 64, @@ -233,5 +256,15 @@ public enum WebDriverResult /// The referenced shadow root is no longer attached to the DOM. /// DetachedShadowRoot = 66, + + /// + /// The requested command matched a known URL but did not match any method for that URL. + /// + UnknownMethod = 67, + + /// + /// Indicates that a command that should have executed properly cannot be supported for some reason. + /// + UnsupportedOperation = 68, } } diff --git a/dotnet/src/webdriver/WebElement.cs b/dotnet/src/webdriver/WebElement.cs index b3e4356ca55b1..51cce73e1eb67 100644 --- a/dotnet/src/webdriver/WebElement.cs +++ b/dotnet/src/webdriver/WebElement.cs @@ -411,7 +411,6 @@ 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/AlertsTest.cs b/dotnet/test/common/AlertsTest.cs index 84a05f4a6a78c..8d093a783acf9 100644 --- a/dotnet/test/common/AlertsTest.cs +++ b/dotnet/test/common/AlertsTest.cs @@ -48,7 +48,7 @@ public void ShouldAllowUsersToAcceptAnAlertManually() alert.Accept(); // If we can perform any action, we're good to go - Assert.AreEqual("Testing Alerts", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Testing Alerts")); } [Test] @@ -81,7 +81,7 @@ public void ShouldAllowUsersToAcceptAnAlertWithNoTextManually() alert.Accept(); // If we can perform any action, we're good to go - Assert.AreEqual("Testing Alerts", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Testing Alerts")); } [Test] @@ -95,7 +95,7 @@ public void ShouldAllowUsersToDismissAnAlertManually() alert.Dismiss(); // If we can perform any action, we're good to go - Assert.AreEqual("Testing Alerts", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Testing Alerts")); } [Test] @@ -109,7 +109,7 @@ public void ShouldAllowAUserToAcceptAPrompt() alert.Accept(); // If we can perform any action, we're good to go - Assert.AreEqual("Testing Prompt", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Testing Prompt")); } [Test] @@ -123,7 +123,7 @@ public void ShouldAllowAUserToDismissAPrompt() alert.Dismiss(); // If we can perform any action, we're good to go - Assert.AreEqual("Testing Prompt", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Testing Prompt")); } [Test] @@ -138,7 +138,7 @@ public void ShouldAllowAUserToSetTheValueOfAPrompt() alert.Accept(); string result = driver.FindElement(By.Id("text")).Text; - Assert.AreEqual("cheese", result); + Assert.That(result, Is.EqualTo("cheese")); } [Test] @@ -173,7 +173,7 @@ public void ShouldAllowTheUserToGetTheTextOfAnAlert() string value = alert.Text; alert.Accept(); - Assert.AreEqual("cheese", value); + Assert.That(value, Is.EqualTo("cheese")); } [Test] @@ -187,7 +187,7 @@ public void ShouldAllowTheUserToGetTheTextOfAPrompt() string value = alert.Text; alert.Accept(); - Assert.AreEqual("Enter something", value); + Assert.That(value, Is.EqualTo("Enter something")); } [Test] @@ -222,7 +222,7 @@ public void ShouldAllowUsersToAcceptAnAlertInAFrame() alert.Accept(); // If we can perform any action, we're good to go - Assert.AreEqual("Testing Alerts", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Testing Alerts")); } [Test] @@ -244,7 +244,7 @@ public void ShouldAllowUsersToAcceptAnAlertInANestedFrame() alert.Accept(); // If we can perform any action, we're good to go - Assert.AreEqual("Testing Alerts", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Testing Alerts")); } [Test] @@ -298,7 +298,7 @@ public void PromptShouldUseDefaultValueIfNoKeysSent() IWebElement element = driver.FindElement(By.Id("text")); WaitFor(ElementTextToEqual(element, "This is a default value"), "Element text was not 'This is a default value'"); - Assert.AreEqual("This is a default value", element.Text); + Assert.That(element.Text, Is.EqualTo("This is a default value")); } [Test] @@ -311,7 +311,7 @@ public void PromptShouldHaveNullValueIfDismissed() alert.Dismiss(); IWebElement element = driver.FindElement(By.Id("text")); WaitFor(ElementTextToEqual(element, "null"), "Element text was not 'null'"); - Assert.AreEqual("null", element.Text); + Assert.That(element.Text, Is.EqualTo("null")); } [Test] @@ -349,10 +349,10 @@ function displayTwoPrompts() { IWebElement element1 = driver.FindElement(By.Id("text1")); WaitFor(ElementTextToEqual(element1, "brie"), "Element text was not 'brie'"); - Assert.AreEqual("brie", element1.Text); + Assert.That(element1.Text, Is.EqualTo("brie")); IWebElement element2 = driver.FindElement(By.Id("text2")); WaitFor(ElementTextToEqual(element2, "cheddar"), "Element text was not 'cheddar'"); - Assert.AreEqual("cheddar", element2.Text); + Assert.That(element2.Text, Is.EqualTo("cheddar")); } [Test] @@ -370,7 +370,7 @@ public void ShouldHandleAlertOnPageLoad() string value = alert.Text; alert.Accept(); - Assert.AreEqual("onload", value); + Assert.That(value, Is.EqualTo("onload")); IWebElement element = driver.FindElement(By.TagName("p")); WaitFor(ElementTextToEqual(element, "Page with onload event handler"), "Element text was not 'Page with onload event handler'"); } @@ -387,7 +387,7 @@ public void ShouldHandleAlertOnPageLoadUsingGet() string value = alert.Text; alert.Accept(); - Assert.AreEqual("onload", value); + Assert.That(value, Is.EqualTo("onload")); WaitFor(ElementTextToEqual(driver.FindElement(By.TagName("p")), "Page with onload event handler"), "Could not find element with text 'Page with onload event handler'"); } @@ -412,7 +412,7 @@ public void ShouldNotHandleAlertInAnotherWindow() driver.FindElement(By.Id("open-new-window")).Click(); List allWindows = new List(driver.WindowHandles); allWindows.Remove(mainWindow); - Assert.AreEqual(1, allWindows.Count); + Assert.That(allWindows, Has.One.Items); onloadWindow = allWindows[0]; Assert.That(() => @@ -472,8 +472,8 @@ public void ShouldHandleAlertOnFormSubmit() string text = alert.Text; alert.Accept(); - Assert.AreEqual("Tasty cheese", text); - Assert.AreEqual("Testing Alerts", driver.Title); + Assert.That(text, Is.EqualTo("Tasty cheese")); + Assert.That(driver.Title, Is.EqualTo("Testing Alerts")); } private IAlert AlertToBePresent() diff --git a/dotnet/test/common/BiDi/Browser/BrowserTest.cs b/dotnet/test/common/BiDi/Browser/BrowserTest.cs index ede287cefd953..096970d178543 100644 --- a/dotnet/test/common/BiDi/Browser/BrowserTest.cs +++ b/dotnet/test/common/BiDi/Browser/BrowserTest.cs @@ -41,7 +41,7 @@ public async Task CanGetUserContexts() var userContexts = await bidi.Browser.GetUserContextsAsync(); Assert.That(userContexts, Is.Not.Null); - Assert.That(userContexts.Count, Is.GreaterThanOrEqualTo(2)); + Assert.That(userContexts, Has.Count.GreaterThanOrEqualTo(2)); Assert.That(userContexts, Does.Contain(userContext1)); Assert.That(userContexts, Does.Contain(userContext2)); } diff --git a/dotnet/test/common/BiDi/BrowsingContext/BrowsingContextTest.cs b/dotnet/test/common/BiDi/BrowsingContext/BrowsingContextTest.cs index 45e67e37892fa..59f451fe421e4 100644 --- a/dotnet/test/common/BiDi/BrowsingContext/BrowsingContextTest.cs +++ b/dotnet/test/common/BiDi/BrowsingContext/BrowsingContextTest.cs @@ -289,8 +289,7 @@ public async Task CanCaptureScreenshotOfElement() var screenshot = await context.CaptureScreenshotAsync(new() { - // TODO: Seems Node implements ISharedReference - Clip = new ClipRectangle.Element(new Modules.Script.SharedReference(nodes[0].SharedId)) + Clip = new ClipRectangle.Element(nodes[0]) }); Assert.That(screenshot, Is.Not.Null); diff --git a/dotnet/test/common/BiDi/Network/NetworkEventsTest.cs b/dotnet/test/common/BiDi/Network/NetworkEventsTest.cs index 14baaf25d8f9a..74e736e70b0c4 100644 --- a/dotnet/test/common/BiDi/Network/NetworkEventsTest.cs +++ b/dotnet/test/common/BiDi/Network/NetworkEventsTest.cs @@ -99,7 +99,7 @@ public async Task CanListenToBeforeRequestSentEventWithCookie() var req = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5)); - Assert.That(req.Request.Cookies.Count, Is.EqualTo(1)); + Assert.That(req.Request.Cookies, Has.Count.EqualTo(1)); Assert.That(req.Request.Cookies[0].Name, Is.EqualTo("foo")); Assert.That((req.Request.Cookies[0].Value as BytesValue.String).Value, Is.EqualTo("bar")); } diff --git a/dotnet/test/common/BiDi/Script/ScriptCommandsTest.cs b/dotnet/test/common/BiDi/Script/ScriptCommandsTest.cs index da692fd898111..798ea1cbbf9f2 100644 --- a/dotnet/test/common/BiDi/Script/ScriptCommandsTest.cs +++ b/dotnet/test/common/BiDi/Script/ScriptCommandsTest.cs @@ -34,7 +34,7 @@ public async Task CanGetAllRealms() var realms = await bidi.Script.GetRealmsAsync(); Assert.That(realms, Is.Not.Null); - Assert.That(realms.Count, Is.EqualTo(2)); + Assert.That(realms, Has.Count.EqualTo(2)); Assert.That(realms[0], Is.AssignableFrom()); Assert.That(realms[0].Realm, Is.Not.Null); @@ -51,7 +51,7 @@ public async Task CanGetAllRealmsByType() var realms = await bidi.Script.GetRealmsAsync(new() { Type = RealmType.Window }); Assert.That(realms, Is.Not.Null); - Assert.That(realms.Count, Is.EqualTo(2)); + Assert.That(realms, Has.Count.EqualTo(2)); Assert.That(realms[0], Is.AssignableFrom()); Assert.That(realms[0].Realm, Is.Not.Null); diff --git a/dotnet/test/common/BiDi/Storage/StorageTest.cs b/dotnet/test/common/BiDi/Storage/StorageTest.cs index 19db76a0d4a7b..642f17756ef57 100644 --- a/dotnet/test/common/BiDi/Storage/StorageTest.cs +++ b/dotnet/test/common/BiDi/Storage/StorageTest.cs @@ -94,7 +94,7 @@ await context.Storage.SetCookieAsync(new("fish", "cod", UrlBuilder.HostName) var cookies = await context.Storage.GetCookiesAsync(); Assert.That(cookies, Is.Not.Null); - Assert.That(cookies.Count, Is.EqualTo(1)); + Assert.That(cookies, Has.Count.EqualTo(1)); var cookie = cookies[0]; @@ -119,7 +119,7 @@ public async Task CanGetAllCookies() var cookies = await bidi.Storage.GetCookiesAsync(); Assert.That(cookies, Is.Not.Null); - Assert.That(cookies.Count, Is.EqualTo(2)); + Assert.That(cookies, Has.Count.EqualTo(2)); Assert.That(cookies[0].Name, Is.EqualTo("key1")); Assert.That(cookies[1].Name, Is.EqualTo("key2")); } @@ -157,7 +157,7 @@ public async Task CanDeleteCookieWithName() var cookies = await bidi.Storage.GetCookiesAsync(); Assert.That(cookies, Is.Not.Null); - Assert.That(cookies.Count, Is.EqualTo(1)); + Assert.That(cookies, Has.Count.EqualTo(1)); Assert.That(cookies[0].Name, Is.EqualTo("key2")); } diff --git a/dotnet/test/common/ChildrenFindingTest.cs b/dotnet/test/common/ChildrenFindingTest.cs index 1bbe8ccfe1e6e..6588c7c88a43a 100644 --- a/dotnet/test/common/ChildrenFindingTest.cs +++ b/dotnet/test/common/ChildrenFindingTest.cs @@ -31,7 +31,7 @@ public void FindElementByXPath() driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("form2")); IWebElement child = element.FindElement(By.XPath("select")); - Assert.AreEqual("2", child.GetAttribute("id")); + Assert.That(child.GetAttribute("id"), Is.EqualTo("2")); } [Test] @@ -41,7 +41,7 @@ public void FindingElementsOnElementByXPathShouldFindTopLevelElements() IWebElement parent = driver.FindElement(By.Id("multiline")); ReadOnlyCollection allParaElements = driver.FindElements(By.XPath("//p")); ReadOnlyCollection children = parent.FindElements(By.XPath("//p")); - Assert.AreEqual(allParaElements.Count, children.Count); + Assert.That(children, Has.Exactly(allParaElements.Count).Items); } [Test] @@ -49,9 +49,10 @@ public void FindingDotSlashElementsOnElementByXPathShouldFindNotTopLevelElements { driver.Url = simpleTestPage; IWebElement parent = driver.FindElement(By.Id("multiline")); + ReadOnlyCollection children = parent.FindElements(By.XPath("./p")); - Assert.AreEqual(1, children.Count); - Assert.AreEqual("A div containing", children[0].Text); + Assert.That(children, Has.One.Items); + Assert.That(children[0].Text, Is.EqualTo("A div containing")); } [Test] @@ -59,7 +60,10 @@ public void FindElementByXPathWhenNoMatch() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("form2")); - Assert.That(() => element.FindElement(By.XPath("select/x")), Throws.InstanceOf()); + + Assert.That( + () => element.FindElement(By.XPath("select/x")), + Throws.InstanceOf()); } [Test] @@ -67,10 +71,11 @@ public void FindElementsByXPath() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("form2")); + ReadOnlyCollection children = element.FindElements(By.XPath("select/option")); - Assert.AreEqual(8, children.Count); - Assert.AreEqual("One", children[0].Text); - Assert.AreEqual("Two", children[1].Text); + Assert.That(children, Has.Exactly(8).Items); + Assert.That(children[0].Text, Is.EqualTo("One")); + Assert.That(children[1].Text, Is.EqualTo("Two")); } [Test] @@ -79,7 +84,7 @@ public void FindElementsByXPathWhenNoMatch() driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("form2")); ReadOnlyCollection children = element.FindElements(By.XPath("select/x")); - Assert.AreEqual(0, children.Count); + Assert.That(children, Is.Empty); } [Test] @@ -88,7 +93,7 @@ public void FindElementByName() driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("form2")); IWebElement child = element.FindElement(By.Name("selectomatic")); - Assert.AreEqual("2", child.GetAttribute("id")); + Assert.That(child.GetAttribute("id"), Is.EqualTo("2")); } [Test] @@ -96,8 +101,9 @@ public void FindElementsByName() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("form2")); + ReadOnlyCollection children = element.FindElements(By.Name("selectomatic")); - Assert.AreEqual(children.Count, 2); + Assert.That(children, Has.Exactly(2).Items); } [Test] @@ -105,8 +111,9 @@ public void FindElementById() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("form2")); + IWebElement child = element.FindElement(By.Id("2")); - Assert.AreEqual(child.GetAttribute("name"), "selectomatic"); + Assert.That(child.GetAttribute("name"), Is.EqualTo("selectomatic")); } @@ -115,8 +122,9 @@ public void FindElementByIdWhenMultipleMatchesExist() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Id("test_id_div")); + IWebElement child = element.FindElement(By.Id("test_id")); - Assert.AreEqual(child.Text, "inside"); + Assert.That(child.Text, Is.EqualTo("inside")); } [Test] @@ -124,8 +132,9 @@ public void FindElementByIdWhenIdContainsNonAlphanumericCharacters() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Id("test_special_chars")); + IWebElement childWithSpaces = element.FindElement(By.Id("white space")); - Assert.That(childWithSpaces.Text.Contains("space")); + Assert.That(childWithSpaces.Text, Does.Contain("space")); IWebElement childWithCssChars = element.FindElement(By.Id("css#.chars")); Assert.That(childWithCssChars.Text, Is.EqualTo("css escapes")); } @@ -135,7 +144,10 @@ public void FindElementByIdWhenNoMatchInContext() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Id("test_id_div")); - Assert.That(() => element.FindElement(By.Id("test_id_out")), Throws.InstanceOf()); + + Assert.That( + () => element.FindElement(By.Id("test_id_out")), + Throws.InstanceOf()); } [Test] @@ -144,7 +156,7 @@ public void FindElementsById() driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("form2")); ReadOnlyCollection children = element.FindElements(By.Id("2")); - Assert.AreEqual(children.Count, 2); + Assert.That(children, Has.Exactly(2).Items); } [Test] @@ -153,9 +165,9 @@ public void FindElementsByIdWithNonAlphanumericCharacters() driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Id("test_special_chars")); ReadOnlyCollection children = element.FindElements(By.Id("white space")); - Assert.That(children.Count, Is.EqualTo(1)); + Assert.That(children, Has.One.Items); ReadOnlyCollection children2 = element.FindElements(By.Id("css#.chars")); - Assert.That(children2.Count, Is.EqualTo(1)); + Assert.That(children2, Has.One.Items); } [Test] @@ -163,8 +175,9 @@ public void FindElementByLinkText() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("div1")); + IWebElement child = element.FindElement(By.LinkText("hello world")); - Assert.AreEqual(child.GetAttribute("name"), "link1"); + Assert.That(child.GetAttribute("name"), Is.EqualTo("link1")); } @@ -175,9 +188,9 @@ public void FindElementsByLinkText() IWebElement element = driver.FindElement(By.Name("div1")); ReadOnlyCollection elements = element.FindElements(By.LinkText("hello world")); - Assert.AreEqual(2, elements.Count); - Assert.AreEqual(elements[0].GetAttribute("name"), "link1"); - Assert.AreEqual(elements[1].GetAttribute("name"), "link2"); + Assert.That(elements, Has.Exactly(2).Items); + Assert.That(elements[0].GetAttribute("name"), Is.EqualTo("link1")); + Assert.That(elements[1].GetAttribute("name"), Is.EqualTo("link2")); } [Test] @@ -185,8 +198,9 @@ public void ShouldFindChildElementsById() { driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Id("test_id_div")); + IWebElement element = parent.FindElement(By.Id("test_id")); - Assert.AreEqual("inside", element.Text); + Assert.That(element.Text, Is.EqualTo("inside")); } [Test] @@ -195,8 +209,10 @@ public void ShouldNotReturnRootElementWhenFindingChildrenById() driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Id("test_id")); - Assert.AreEqual(0, parent.FindElements(By.Id("test_id")).Count); - Assert.That(() => parent.FindElement(By.Id("test_id")), Throws.InstanceOf()); + Assert.That(parent.FindElements(By.Id("test_id")), Is.Empty); + Assert.That( + () => parent.FindElement(By.Id("test_id")), + Throws.InstanceOf()); } [Test] @@ -207,7 +223,7 @@ public void ShouldFindChildElementsByClassName() IWebElement element = parent.FindElement(By.ClassName("one")); - Assert.AreEqual("Find me", element.Text); + Assert.That(element.Text, Is.EqualTo("Find me")); } [Test] @@ -218,7 +234,7 @@ public void ShouldFindChildrenByClassName() ReadOnlyCollection elements = parent.FindElements(By.ClassName("one")); - Assert.AreEqual(2, elements.Count); + Assert.That(elements, Has.Exactly(2).Items); } @@ -230,7 +246,7 @@ public void ShouldFindChildElementsByTagName() IWebElement element = parent.FindElement(By.TagName("a")); - Assert.AreEqual("link1", element.GetAttribute("name")); + Assert.That(element.GetAttribute("name"), Is.EqualTo("link1")); } @@ -242,7 +258,7 @@ public void ShouldFindChildrenByTagName() ReadOnlyCollection elements = parent.FindElements(By.TagName("a")); - Assert.AreEqual(2, elements.Count); + Assert.That(elements, Has.Exactly(2).Items); } [Test] @@ -253,7 +269,7 @@ public void ShouldBeAbleToFindAnElementByCssSelector() IWebElement element = parent.FindElement(By.CssSelector("*[name=\"selectomatic\"]")); - Assert.AreEqual("2", element.GetAttribute("id")); + Assert.That(element.GetAttribute("id"), Is.EqualTo("2")); } [Test] @@ -264,7 +280,7 @@ public void ShouldBeAbleToFindAnElementByCss3Selector() IWebElement element = parent.FindElement(By.CssSelector("*[name^=\"selecto\"]")); - Assert.AreEqual("2", element.GetAttribute("id")); + Assert.That(element.GetAttribute("id"), Is.EqualTo("2")); } [Test] @@ -275,7 +291,7 @@ public void ShouldBeAbleToFindElementsByCssSelector() ReadOnlyCollection elements = parent.FindElements(By.CssSelector("*[name=\"selectomatic\"]")); - Assert.AreEqual(2, elements.Count); + Assert.That(elements, Has.Exactly(2).Items); } [Test] @@ -284,8 +300,9 @@ public void ShouldBeAbleToFindChildrenOfANode() driver.Url = selectableItemsPage; ReadOnlyCollection elements = driver.FindElements(By.XPath("/html/head")); IWebElement head = elements[0]; + ReadOnlyCollection importedScripts = head.FindElements(By.TagName("script")); - Assert.That(importedScripts.Count, Is.EqualTo(3)); + Assert.That(importedScripts, Has.Exactly(3).Items); } [Test] @@ -293,9 +310,9 @@ public void ReturnAnEmptyListWhenThereAreNoChildrenOfANode() { driver.Url = xhtmlTestPage; IWebElement table = driver.FindElement(By.Id("table")); - ReadOnlyCollection rows = table.FindElements(By.TagName("tr")); - Assert.That(rows.Count, Is.EqualTo(0)); + ReadOnlyCollection rows = table.FindElements(By.TagName("tr")); + Assert.That(rows, Is.Empty); } [Test] @@ -311,7 +328,9 @@ public void ShouldNotFindElementOutSideTree() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.Name("login")); - Assert.That(() => element.FindElement(By.Name("x")), Throws.InstanceOf()); + Assert.That( + () => element.FindElement(By.Name("x")), + Throws.InstanceOf()); } [Test] @@ -320,8 +339,8 @@ public void FindingByTagNameShouldNotIncludeParentElementIfSameTagType() driver.Url = xhtmlTestPage; IWebElement parent = driver.FindElement(By.Id("my_span")); - Assert.AreEqual(2, parent.FindElements(By.TagName("div")).Count); - Assert.AreEqual(2, parent.FindElements(By.TagName("span")).Count); + Assert.That(parent.FindElements(By.TagName("div")), Has.Exactly(2).Items); + Assert.That(parent.FindElements(By.TagName("span")), Has.Exactly(2).Items); } [Test] @@ -331,7 +350,7 @@ public void FindingByCssShouldNotIncludeParentElementIfSameTagType() IWebElement parent = driver.FindElement(By.CssSelector("div#parent")); IWebElement child = parent.FindElement(By.CssSelector("div")); - Assert.AreEqual("child", child.GetAttribute("id")); + Assert.That(child.GetAttribute("id"), Is.EqualTo("child")); } [Test] @@ -342,7 +361,7 @@ public void FindMultipleElements() ReadOnlyCollection elements = elem.FindElements(By.PartialLinkText("link")); Assert.That(elements, Is.Not.Null); - Assert.AreEqual(6, elements.Count); + Assert.That(elements, Has.Exactly(6).Items); } [Test] @@ -353,7 +372,7 @@ public void LinkWithLeadingSpaces() IWebElement elem = driver.FindElement(By.Id("links")); IWebElement res = elem.FindElement(By.PartialLinkText("link with leading space")); - Assert.AreEqual("link with leading space", res.Text); + Assert.That(res.Text, Is.EqualTo("link with leading space")); } [Test] @@ -364,7 +383,7 @@ public void LinkWithTrailingSpace() IWebElement elem = driver.FindElement(By.Id("links")); IWebElement res = elem.FindElement(By.PartialLinkText("link with trailing space")); - Assert.AreEqual("link with trailing space", res.Text); + Assert.That(res.Text, Is.EqualTo("link with trailing space")); } [Test] @@ -374,7 +393,7 @@ public void ElementCanGetLinkByLinkTestIgnoringTrailingWhitespace() IWebElement elem = driver.FindElement(By.Id("links")); IWebElement link = elem.FindElement(By.LinkText("link with trailing space")); - Assert.AreEqual("linkWithTrailingSpace", link.GetAttribute("id")); + Assert.That(link.GetAttribute("id"), Is.EqualTo("linkWithTrailingSpace")); } } } diff --git a/dotnet/test/common/ClearTest.cs b/dotnet/test/common/ClearTest.cs index 9d31803834b63..d65a7f7e7a00a 100644 --- a/dotnet/test/common/ClearTest.cs +++ b/dotnet/test/common/ClearTest.cs @@ -31,7 +31,7 @@ public void WritableTextInputShouldClear() driver.Url = readOnlyPage; IWebElement element = driver.FindElement(By.Id("writableTextInput")); element.Clear(); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); } [Test] @@ -42,7 +42,9 @@ public void TextInputShouldNotClearWhenDisabled() driver.Url = readOnlyPage; IWebElement element = driver.FindElement(By.Id("textInputNotEnabled")); Assert.That(element.Enabled, Is.False); - Assert.That(() => element.Clear(), Throws.InstanceOf()); + Assert.That( + () => element.Clear(), + Throws.InstanceOf()); } [Test] @@ -50,7 +52,9 @@ public void TextInputShouldNotClearWhenReadOnly() { driver.Url = readOnlyPage; IWebElement element = driver.FindElement(By.Id("readOnlyTextInput")); - Assert.That(() => element.Clear(), Throws.InstanceOf()); + Assert.That( + () => element.Clear(), + Throws.InstanceOf()); } [Test] @@ -59,7 +63,7 @@ public void WritableTextAreaShouldClear() driver.Url = readOnlyPage; IWebElement element = driver.FindElement(By.Id("writableTextArea")); element.Clear(); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); } [Test] @@ -77,7 +81,9 @@ public void TextAreaShouldNotClearWhenReadOnly() { driver.Url = readOnlyPage; IWebElement element = driver.FindElement(By.Id("textAreaReadOnly")); - Assert.That(() => element.Clear(), Throws.InstanceOf()); + Assert.That( + () => element.Clear(), + Throws.InstanceOf()); } [Test] @@ -86,7 +92,8 @@ public void ContentEditableAreaShouldClear() driver.Url = readOnlyPage; IWebElement element = driver.FindElement(By.Id("content-editable")); element.Clear(); - Assert.AreEqual(string.Empty, element.Text); + + Assert.That(element.Text, Is.Empty); } [Test] @@ -195,9 +202,10 @@ private void ShouldBeAbleToClearInput(By locator, string oldValue, string cleare { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("inputs.html"); IWebElement element = driver.FindElement(locator); - Assert.AreEqual(oldValue, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(oldValue)); + element.Clear(); - Assert.AreEqual(clearedValue, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(clearedValue)); } } } diff --git a/dotnet/test/common/ClickScrollingTest.cs b/dotnet/test/common/ClickScrollingTest.cs index 92489f1c6d943..d5a73aed7c33c 100644 --- a/dotnet/test/common/ClickScrollingTest.cs +++ b/dotnet/test/common/ClickScrollingTest.cs @@ -44,7 +44,7 @@ public void ClickingOnAnchorScrollsPage() // Sometimes JS is returning a double object result = ((IJavaScriptExecutor)driver).ExecuteScript(scrollScript); - var yOffset = Convert.ChangeType(result, typeof(long)); + var yOffset = Convert.ToInt64(result); //Focusing on to click, but not actually following, //the link will scroll it in to view, which is a few pixels further than 0 @@ -69,7 +69,8 @@ public void ShouldBeAbleToClickOnAnElementHiddenByOverflow() IWebElement link = driver.FindElement(By.Id("line8")); // This used to throw a MoveTargetOutOfBoundsException - we don't expect it to link.Click(); - Assert.AreEqual("line8", driver.FindElement(By.Id("clicked")).Text); + + Assert.That(driver.FindElement(By.Id("clicked")).Text, Is.EqualTo("line8")); } [Test] @@ -109,7 +110,7 @@ public void ShouldNotScrollOverflowElementsWhichAreVisible() IWebElement item = list.FindElement(By.Id("desired")); item.Click(); long yOffset = (long)((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0].scrollTop;", list); - Assert.AreEqual(0, yOffset, "Should not have scrolled"); + Assert.That(yOffset, Is.Zero, "Should not have scrolled"); } @@ -122,7 +123,7 @@ public void ShouldNotScrollIfAlreadyScrolledAndElementIsInView() driver.FindElement(By.Id("button2")).Click(); double scrollTop = GetScrollTop(); driver.FindElement(By.Id("button1")).Click(); - Assert.AreEqual(scrollTop, GetScrollTop()); + Assert.That(GetScrollTop(), Is.EqualTo(scrollTop)); } [Test] @@ -139,7 +140,7 @@ public void ShouldScrollOverflowElementsIfClickPointIsOutOfViewButElementIsInVie { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("scroll5.html"); driver.FindElement(By.Id("inner")).Click(); - Assert.AreEqual("clicked", driver.FindElement(By.Id("clicked")).Text); + Assert.That(driver.FindElement(By.Id("clicked")).Text, Is.EqualTo("clicked")); } [Test] @@ -238,7 +239,7 @@ public void ShouldNotScrollWhenGettingElementSize() driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("scroll3.html"); double scrollTop = GetScrollTop(); Size ignoredSize = driver.FindElement(By.Id("button1")).Size; - Assert.AreEqual(scrollTop, GetScrollTop()); + Assert.That(GetScrollTop(), Is.EqualTo(scrollTop)); } [Test] @@ -266,7 +267,7 @@ public void ShouldBeAbleToClickInlineTextElementWithChildElementAfterScrolling() IWebElement label = driver.FindElement(By.Id("wrapper")); label.Click(); IWebElement checkbox = driver.FindElement(By.Id("check")); - Assert.IsFalse(checkbox.Selected, "Checkbox should not be selected after click"); + Assert.That(checkbox.Selected, Is.False, "Checkbox should not be selected after click"); } private double GetScrollTop() diff --git a/dotnet/test/common/ClickTest.cs b/dotnet/test/common/ClickTest.cs index 5a5f9cd06a4fa..20739bbe3d114 100644 --- a/dotnet/test/common/ClickTest.cs +++ b/dotnet/test/common/ClickTest.cs @@ -43,7 +43,7 @@ public void CanClickOnALinkAndFollowIt() { driver.FindElement(By.Id("normal")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -63,7 +63,7 @@ public void CanClickOnAnAnchorAndNotReloadThePage() bool samePage = (bool)((IJavaScriptExecutor)driver).ExecuteScript("return document.latch"); - Assert.AreEqual(true, samePage, "Latch was reset"); + Assert.That(samePage, Is.True, "Latch was reset"); } [Test] @@ -115,7 +115,7 @@ public void CanClickOnAnElementWithTopSetToANegativeNumber() driver.FindElement(By.Name("btn")).Click(); string log = driver.FindElement(By.Id("log")).Text; - Assert.AreEqual("click", log); + Assert.That(log, Is.EqualTo("click")); } [Test] @@ -136,7 +136,7 @@ public void ShouldSetRelatedTargetForMouseOver() } else { - Assert.AreEqual("parent matches? true", log); + Assert.That(log, Is.EqualTo("parent matches? true")); } } @@ -145,7 +145,7 @@ public void ShouldClickOnFirstBoundingClientRectWithNonZeroSize() { driver.FindElement(By.Id("twoClientRects")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -158,7 +158,7 @@ public void ShouldOnlyFollowHrefOnce() driver.FindElement(By.Id("new-window")).Click(); WaitFor(() => { return driver.WindowHandles.Count >= windowHandlesBefore + 1; }, "Window handles was not " + (windowHandlesBefore + 1).ToString()); - Assert.AreEqual(windowHandlesBefore + 1, driver.WindowHandles.Count); + Assert.That(driver.WindowHandles, Has.Exactly(windowHandlesBefore + 1).Items); } [Test] @@ -176,7 +176,7 @@ public void CanClickOnALinkWithEnclosedImage() { driver.FindElement(By.Id("link-with-enclosed-image")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -184,7 +184,7 @@ public void CanClickOnAnImageEnclosedInALink() { driver.FindElement(By.Id("link-with-enclosed-image")).FindElement(By.TagName("img")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -192,7 +192,7 @@ public void CanClickOnALinkThatContainsTextWrappedInASpan() { driver.FindElement(By.Id("link-with-enclosed-span")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -201,7 +201,7 @@ public void CanClickOnALinkThatContainsEmbeddedBlockElements() { driver.FindElement(By.Id("embeddedBlock")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -209,7 +209,7 @@ public void CanClickOnAnElementEnclosedInALink() { driver.FindElement(By.Id("link-with-enclosed-span")).FindElement(By.TagName("span")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -287,7 +287,7 @@ public void ShouldBeAbleToClickOnRightToLeftLanguageLink() element.Click(); WaitFor(() => driver.Title == "clicks", "Expected title to be 'clicks'"); - Assert.AreEqual("clicks", driver.Title); + Assert.That(driver.Title, Is.EqualTo("clicks")); } [Test] @@ -298,7 +298,7 @@ public void ShouldBeAbleToClickOnLinkInAbsolutelyPositionedFooter() driver.FindElement(By.Id("link")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -309,7 +309,7 @@ public void ShouldBeAbleToClickOnLinkInAbsolutelyPositionedFooterInQuirksMode() driver.FindElement(By.Id("link")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -321,7 +321,7 @@ public void ShouldBeAbleToClickOnLinksWithNoHrefAttribute() element.Click(); WaitFor(() => driver.Title == "Changed", "Expected title to be 'Changed'"); - Assert.AreEqual("Changed", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Changed")); } [Test] @@ -332,7 +332,7 @@ public void ShouldBeAbleToClickOnALinkThatWrapsToTheNextLine() driver.FindElement(By.Id("link")).Click(); WaitFor(() => driver.Title == "Submitted Successfully!", "Expected title to be 'Submitted Successfully!'"); - Assert.AreEqual("Submitted Successfully!", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Submitted Successfully!")); } [Test] @@ -343,7 +343,7 @@ public void ShouldBeAbleToClickOnASpanThatWrapsToTheNextLine() driver.FindElement(By.Id("span")).Click(); WaitFor(() => driver.Title == "Submitted Successfully!", "Expected title to be 'Submitted Successfully!'"); - Assert.AreEqual("Submitted Successfully!", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Submitted Successfully!")); } [Test] @@ -364,7 +364,7 @@ public void ShouldBeAbleToClickLinkContainingLineBreak() driver.Url = simpleTestPage; driver.FindElement(By.Id("multilinelink")).Click(); WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title was not 'We Arrive Here'"); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } } } diff --git a/dotnet/test/common/ContentEditableTest.cs b/dotnet/test/common/ContentEditableTest.cs index f927694ba078e..73f1e2c3cc20f 100644 --- a/dotnet/test/common/ContentEditableTest.cs +++ b/dotnet/test/common/ContentEditableTest.cs @@ -63,7 +63,7 @@ public void NonPrintableCharactersShouldWorkWithContentEditableOrDesignModeSet() element.SendKeys("Dishy" + Keys.Backspace + Keys.Left + Keys.Left); element.SendKeys(Keys.Left + Keys.Left + "F" + Keys.Delete + Keys.End + "ee!"); - Assert.AreEqual("Fishee!", element.Text); + Assert.That(element.Text, Is.EqualTo("Fishee!")); } [Test] @@ -137,7 +137,7 @@ public void AppendsTextToEndOfContentEditableWithMultipleTextNodes() IWebElement input = driver.FindElement(By.Id("editable")); input.SendKeys(", world!"); WaitFor(() => input.Text != "Why hello", "Text remained the original text"); - Assert.AreEqual("Why hello, world!", input.Text); + Assert.That(input.Text, Is.EqualTo("Why hello, world!")); } } } diff --git a/dotnet/test/common/CookieImplementationTest.cs b/dotnet/test/common/CookieImplementationTest.cs index 846d1a832bdeb..a329895d79b7d 100644 --- a/dotnet/test/common/CookieImplementationTest.cs +++ b/dotnet/test/common/CookieImplementationTest.cs @@ -54,7 +54,7 @@ public void ShouldGetCookieByName() ((IJavaScriptExecutor)driver).ExecuteScript("document.cookie = arguments[0] + '=set';", key); Cookie cookie = driver.Manage().Cookies.GetCookieNamed(key); - Assert.AreEqual("set", cookie.Value); + Assert.That(cookie.Value, Is.EqualTo("set")); } [Test] @@ -73,7 +73,7 @@ public void ShouldBeAbleToAddCookie() driver.Manage().Cookies.AddCookie(cookie); AssertCookieHasValue(key, value); - Assert.That(driver.Manage().Cookies.AllCookies.Contains(cookie), "Cookie was not added successfully"); + Assert.That(driver.Manage().Cookies.AllCookies, Does.Contain(cookie), "Cookie was not added successfully"); } [Test] @@ -101,7 +101,7 @@ public void GetAllCookies() driver.Url = simpleTestPage; cookies = driver.Manage().Cookies.AllCookies; - Assert.AreEqual(count + 2, cookies.Count); + Assert.That(cookies, Has.Count.EqualTo(count + 2)); Assert.That(cookies, Does.Contain(one)); Assert.That(cookies, Does.Contain(two)); @@ -389,7 +389,7 @@ public void ShouldWalkThePathToDeleteACookie() Assert.That(driver.Manage().Cookies.GetCookieNamed("rodent"), Is.Null); ReadOnlyCollection cookies = driver.Manage().Cookies.AllCookies; - Assert.That(cookies, Has.Count.EqualTo(2)); + Assert.That(cookies, Has.Exactly(2).Items); Assert.That(cookies, Does.Contain(cookie1)); Assert.That(cookies, Does.Contain(cookie3)); @@ -450,7 +450,7 @@ public void CookieEqualityAfterSetAndGet() Assert.That(retrievedCookie, Is.Not.Null); //Cookie.equals only compares name, domain and path - Assert.AreEqual(cookie1, retrievedCookie); + Assert.That(retrievedCookie, Is.EqualTo(cookie1)); } [Test] @@ -472,7 +472,7 @@ public void ShouldRetainCookieExpiry() Cookie retrieved = options.Cookies.GetCookieNamed("fish"); Assert.That(retrieved, Is.Not.Null); - Assert.AreEqual(addCookie.Expiry, retrieved.Expiry, "Cookies are not equal"); + Assert.That(retrieved.Expiry, Is.EqualTo(addCookie.Expiry), "Cookies are not equal"); } [Test] @@ -713,7 +713,7 @@ public void ShouldAddCookieToCurrentDomainAndPath() Cookie cookie = new Cookie("Homer", "Simpson", this.hostname, "/" + EnvironmentManager.Instance.UrlBuilder.Path, null); options.Cookies.AddCookie(cookie); ReadOnlyCollection cookies = options.Cookies.AllCookies; - Assert.That(cookies.Contains(cookie), "Valid cookie was not returned"); + Assert.That(cookies, Does.Contain(cookie), "Valid cookie was not returned"); } [Test] @@ -727,7 +727,10 @@ public void ShouldNotShowCookieAddedToDifferentDomain() driver.Url = macbethPage; IOptions options = driver.Manage(); Cookie cookie = new Cookie("Bart", "Simpson", EnvironmentManager.Instance.UrlBuilder.HostName + ".com", EnvironmentManager.Instance.UrlBuilder.Path, null); - Assert.That(() => options.Cookies.AddCookie(cookie), Throws.InstanceOf().Or.InstanceOf()); + Assert.That( + () => options.Cookies.AddCookie(cookie), + Throws.InstanceOf().Or.InstanceOf()); + ReadOnlyCollection cookies = options.Cookies.AllCookies; Assert.That(cookies, Does.Not.Contain(cookie), "Invalid cookie was returned"); } @@ -771,7 +774,9 @@ public void ShouldThrowExceptionWhenAddingCookieToCookieAverseDocument() IOptions options = driver.Manage(); Cookie cookie = new Cookie("question", "dunno"); - Assert.That(() => options.Cookies.AddCookie(cookie), Throws.InstanceOf().Or.InstanceOf()); + Assert.That( + () => options.Cookies.AddCookie(cookie), + Throws.InstanceOf().Or.InstanceOf()); } [Test] @@ -803,7 +808,7 @@ public void ShouldAddCookieToCurrentDomain() Cookie cookie = new Cookie("Marge", "Simpson", "/"); options.Cookies.AddCookie(cookie); ReadOnlyCollection cookies = options.Cookies.AllCookies; - Assert.That(cookies.Contains(cookie), "Valid cookie was not returned"); + Assert.That(cookies, Does.Contain(cookie), "Valid cookie was not returned"); } [Test] @@ -824,7 +829,7 @@ public void ShouldDeleteCookie() options.Cookies.DeleteCookie(cookieToDelete); ReadOnlyCollection cookies2 = options.Cookies.AllCookies; Assert.That(cookies2, Does.Not.Contain(cookieToDelete), "Cookie was not deleted successfully"); - Assert.That(cookies2.Contains(cookieToKeep), "Valid cookie was not returned"); + Assert.That(cookies2, Does.Contain(cookieToKeep), "Valid cookie was not returned"); } ////////////////////////////////////////////// @@ -924,21 +929,21 @@ private string GetDocumentCookieOrNull() private void AssertNoCookiesArePresent() { - Assert.That(driver.Manage().Cookies.AllCookies.Count, Is.EqualTo(0), "Cookies were not empty"); + Assert.That(driver.Manage().Cookies.AllCookies, Is.Empty, "Cookies were not empty"); string documentCookie = GetDocumentCookieOrNull(); if (documentCookie != null) { - Assert.AreEqual(string.Empty, documentCookie, "Cookies were not empty"); + Assert.That(documentCookie, Is.Empty, "Cookies were not empty"); } } private void AssertSomeCookiesArePresent() { - Assert.That(driver.Manage().Cookies.AllCookies.Count, Is.Not.EqualTo(0), "Cookies were empty"); + Assert.That(driver.Manage().Cookies.AllCookies, Is.Not.Empty, "Cookies were empty"); String documentCookie = GetDocumentCookieOrNull(); if (documentCookie != null) { - Assert.AreNotEqual(string.Empty, documentCookie, "Cookies were empty"); + Assert.That(documentCookie, Is.Not.Empty, "Cookies were empty"); } } @@ -964,7 +969,7 @@ private void AssertCookieIsPresentWithName(string key) private void AssertCookieHasValue(string key, string value) { - Assert.AreEqual(value, driver.Manage().Cookies.GetCookieNamed(key).Value, "Cookie had wrong value"); + Assert.That(driver.Manage().Cookies.GetCookieNamed(key).Value, Is.EqualTo(value), "Cookie had wrong value"); string documentCookie = GetDocumentCookieOrNull(); if (documentCookie != null) { diff --git a/dotnet/test/common/CorrectEventFiringTest.cs b/dotnet/test/common/CorrectEventFiringTest.cs index d30e205b485fd..6e1da8e0313bd 100644 --- a/dotnet/test/common/CorrectEventFiringTest.cs +++ b/dotnet/test/common/CorrectEventFiringTest.cs @@ -158,7 +158,7 @@ public void ShouldIssueMouseDownEvents() driver.FindElement(By.Id("mousedown")).Click(); String result = driver.FindElement(By.Id("result")).Text; - Assert.AreEqual(result, "mouse down"); + Assert.That(result, Is.EqualTo("mouse down")); } [Test] @@ -168,7 +168,7 @@ public void ShouldIssueClickEvents() driver.FindElement(By.Id("mouseclick")).Click(); String result = driver.FindElement(By.Id("result")).Text; - Assert.AreEqual("mouse click", result); + Assert.That(result, Is.EqualTo("mouse click")); } [Test] @@ -178,7 +178,7 @@ public void ShouldIssueMouseUpEvents() driver.FindElement(By.Id("mouseup")).Click(); String result = driver.FindElement(By.Id("result")).Text; - Assert.AreEqual(result, "mouse up"); + Assert.That(result, Is.EqualTo("mouse up")); } [Test] @@ -188,7 +188,7 @@ public void MouseEventsShouldBubbleUpToContainingElements() driver.FindElement(By.Id("child")).Click(); String result = driver.FindElement(By.Id("result")).Text; - Assert.AreEqual(result, "mouse down"); + Assert.That(result, Is.EqualTo("mouse down")); } [Test] @@ -205,9 +205,9 @@ public void ShouldEmitOnChangeEventsWhenSelectingElements() IWebElement bar = allOptions[1]; foo.Click(); - Assert.AreEqual(driver.FindElement(By.Id("result")).Text, initialTextValue); + Assert.That(driver.FindElement(By.Id("result")).Text, Is.EqualTo(initialTextValue)); bar.Click(); - Assert.AreEqual(driver.FindElement(By.Id("result")).Text, "bar"); + Assert.That(driver.FindElement(By.Id("result")).Text, Is.EqualTo("bar")); } [Test] @@ -221,9 +221,9 @@ public void ShouldEmitOnClickEventsWhenSelectingElements() IWebElement bar = allOptions[1]; foo.Click(); - Assert.AreEqual(driver.FindElement(By.Id("result")).Text, "foo"); + Assert.That(driver.FindElement(By.Id("result")).Text, Is.EqualTo("foo")); bar.Click(); - Assert.AreEqual(driver.FindElement(By.Id("result")).Text, "bar"); + Assert.That(driver.FindElement(By.Id("result")).Text, Is.EqualTo("bar")); } [Test] @@ -234,7 +234,7 @@ public void ShouldEmitOnChangeEventsWhenChangingTheStateOfACheckbox() IWebElement checkbox = driver.FindElement(By.Id("checkbox")); checkbox.Click(); - Assert.AreEqual(driver.FindElement(By.Id("result")).Text, "checkbox thing"); + Assert.That(driver.FindElement(By.Id("result")).Text, Is.EqualTo("checkbox thing")); } [Test] @@ -245,7 +245,7 @@ public void ShouldEmitClickEventWhenClickingOnATextInputElement() IWebElement clicker = driver.FindElement(By.Id("clickField")); clicker.Click(); - Assert.AreEqual(clicker.GetAttribute("value"), "Clicked"); + Assert.That(clicker.GetAttribute("value"), Is.EqualTo("Clicked")); } [Test] @@ -269,7 +269,7 @@ public void ClearingAnElementShouldCauseTheOnChangeHandlerToFire() element.Clear(); IWebElement result = driver.FindElement(By.Id("result")); - Assert.AreEqual("Cleared", result.Text.Trim()); + Assert.That(result.Text.Trim(), Is.EqualTo("Cleared")); } [Test] @@ -416,7 +416,7 @@ public void UploadingFileShouldFireOnChangeEvent() driver.Url = formsPage; IWebElement uploadElement = driver.FindElement(By.Id("upload")); IWebElement result = driver.FindElement(By.Id("fileResults")); - Assert.AreEqual(string.Empty, result.Text); + Assert.That(result.Text, Is.Empty); string filePath = System.IO.Path.Combine(EnvironmentManager.Instance.CurrentDirectory, "test.txt"); System.IO.FileInfo inputFile = new System.IO.FileInfo(filePath); @@ -429,7 +429,7 @@ public void UploadingFileShouldFireOnChangeEvent() driver.FindElement(By.Id("id-name1")).Click(); inputFile.Delete(); - Assert.AreEqual("changed", result.Text); + Assert.That(result.Text, Is.EqualTo("changed")); } [Test] @@ -445,8 +445,8 @@ public void ShouldReportTheXAndYCoordinatesWhenClicking() string clientY = driver.FindElement(By.Id("clientY")).Text; driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0); - Assert.AreNotEqual("0", clientX); - Assert.AreNotEqual("0", clientY); + Assert.That(clientX, Is.Not.EqualTo("0")); + Assert.That(clientY, Is.Not.EqualTo("0")); } [Test] @@ -487,7 +487,7 @@ public void ClickAnElementThatDisappear() driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_tests/disappearing_element.html"); driver.FindElement(By.Id("over")).Click(); - Assert.That(driver.FindElement(By.Id("log")).Text.StartsWith(expectedLogBuilder.ToString())); + Assert.That(driver.FindElement(By.Id("log")).Text, Does.StartWith(expectedLogBuilder.ToString())); } private void AssertEventNotFired(string eventName) diff --git a/dotnet/test/common/DevTools/DevToolsProfilerTest.cs b/dotnet/test/common/DevTools/DevToolsProfilerTest.cs index 985a336e2c94e..a663278e7bc69 100644 --- a/dotnet/test/common/DevTools/DevToolsProfilerTest.cs +++ b/dotnet/test/common/DevTools/DevToolsProfilerTest.cs @@ -131,12 +131,12 @@ private void ValidateProfile(CurrentCdpVersion.Profiler.Profile profiler) { Assert.That(profiler, Is.Not.Null); Assert.That(profiler.Nodes, Is.Not.Null); - Assert.That(profiler.StartTime, Is.Not.Null); - Assert.That(profiler.EndTime, Is.Not.Null); + Assert.That(profiler.StartTime, Is.Not.Zero); + Assert.That(profiler.EndTime, Is.Not.Zero); Assert.That(profiler.TimeDeltas, Is.Not.Null); foreach (var delta in profiler.TimeDeltas) { - Assert.That(delta, Is.Not.Null); + Assert.That(delta, Is.Not.Zero); } foreach (var node in profiler.Nodes) diff --git a/dotnet/test/common/DevTools/DevToolsTestFixture.cs b/dotnet/test/common/DevTools/DevToolsTestFixture.cs index 18bb78988557f..44f2317370420 100644 --- a/dotnet/test/common/DevTools/DevToolsTestFixture.cs +++ b/dotnet/test/common/DevTools/DevToolsTestFixture.cs @@ -39,7 +39,7 @@ public void Setup() devTools = driver as IDevTools; if (devTools == null) { - Assert.Ignore("{0} does not support Chrome DevTools Protocol", EnvironmentManager.Instance.Browser); + Assert.Ignore($"{EnvironmentManager.Instance.Browser} does not support Chrome DevTools Protocol"); return; } diff --git a/dotnet/test/common/DownloadsTest.cs b/dotnet/test/common/DownloadsTest.cs index b03d44d7d8f8d..0043316b2025f 100644 --- a/dotnet/test/common/DownloadsTest.cs +++ b/dotnet/test/common/DownloadsTest.cs @@ -76,7 +76,7 @@ public void CanDownloadFile() ((RemoteWebDriver)driver).DownloadFile(fileName, targetDirectory); string fileContent = File.ReadAllText(Path.Combine(targetDirectory, fileName)); - Assert.AreEqual("Hello, World!", fileContent.Trim()); + Assert.That(fileContent.Trim(), Is.EqualTo("Hello, World!")); Directory.Delete(targetDirectory, recursive: true); } @@ -90,7 +90,7 @@ public void CanDeleteFiles() ((RemoteWebDriver)driver).DeleteDownloadableFiles(); IReadOnlyList names = ((RemoteWebDriver)driver).GetDownloadableFiles(); - Assert.IsEmpty(names, "The names list should be empty."); + Assert.That(names, Is.Empty, "The names list should be empty."); } private void DownloadWithBrowser() diff --git a/dotnet/test/common/DriverElementFindingTest.cs b/dotnet/test/common/DriverElementFindingTest.cs index f491f4857335b..6c44b9a4602e9 100644 --- a/dotnet/test/common/DriverElementFindingTest.cs +++ b/dotnet/test/common/DriverElementFindingTest.cs @@ -93,7 +93,7 @@ public void ShouldFindElementsById() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.Id("test_id")); - Assert.That(elements.Count, Is.EqualTo(2)); + Assert.That(elements, Has.Count.EqualTo(2)); } [Test] @@ -101,7 +101,7 @@ public void ShouldFindElementsByLinkText() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.LinkText("hello world")); - Assert.That(elements.Count, Is.EqualTo(12)); + Assert.That(elements, Has.Count.EqualTo(12)); } [Test] @@ -109,7 +109,7 @@ public void ShouldFindElementsByName() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.Name("form1")); - Assert.That(elements.Count, Is.EqualTo(4)); + Assert.That(elements, Has.Count.EqualTo(4)); } [Test] @@ -117,7 +117,7 @@ public void ShouldFindElementsByXPath() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.XPath("//a")); - Assert.That(elements.Count, Is.EqualTo(12)); + Assert.That(elements, Has.Count.EqualTo(12)); } [Test] @@ -125,7 +125,7 @@ public void ShouldFindElementsByClassName() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.ClassName("one")); - Assert.That(elements.Count, Is.EqualTo(3)); + Assert.That(elements, Has.Count.EqualTo(3)); } [Test] @@ -133,7 +133,7 @@ public void ShouldFindElementsByPartialLinkText() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.PartialLinkText("world")); - Assert.That(elements.Count, Is.EqualTo(12)); + Assert.That(elements, Has.Count.EqualTo(12)); } [Test] @@ -141,7 +141,7 @@ public void ShouldFindElementsByTagName() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.TagName("a")); - Assert.That(elements.Count, Is.EqualTo(12)); + Assert.That(elements, Has.Count.EqualTo(12)); } #endregion } diff --git a/dotnet/test/common/ElementAttributeTest.cs b/dotnet/test/common/ElementAttributeTest.cs index 43a1be4a063a9..9eb59cfff2f5a 100644 --- a/dotnet/test/common/ElementAttributeTest.cs +++ b/dotnet/test/common/ElementAttributeTest.cs @@ -52,7 +52,7 @@ public void ShouldReturnAnAbsoluteUrlWhenGettingSrcAttributeOfAValidImgTag() driver.Url = simpleTestPage; IWebElement img = driver.FindElement(By.Id("validImgTag")); string attribute = img.GetAttribute("src"); - Assert.AreEqual(EnvironmentManager.Instance.UrlBuilder.WhereIs("icon.gif"), attribute); + Assert.That(attribute, Is.EqualTo(EnvironmentManager.Instance.UrlBuilder.WhereIs("icon.gif"))); } [Test] @@ -61,7 +61,7 @@ public void ShouldReturnAnAbsoluteUrlWhenGettingHrefAttributeOfAValidAnchorTag() driver.Url = simpleTestPage; IWebElement img = driver.FindElement(By.Id("validAnchorTag")); string attribute = img.GetAttribute("href"); - Assert.AreEqual(EnvironmentManager.Instance.UrlBuilder.WhereIs("icon.gif"), attribute); + Assert.That(attribute, Is.EqualTo(EnvironmentManager.Instance.UrlBuilder.WhereIs("icon.gif"))); } @@ -70,7 +70,7 @@ public void ShouldReturnEmptyAttributeValuesWhenPresentAndTheValueIsActuallyEmpt { driver.Url = simpleTestPage; IWebElement body = driver.FindElement(By.XPath("//body")); - Assert.AreEqual(string.Empty, body.GetAttribute("style")); + Assert.That(body.GetAttribute("style"), Is.Empty); } [Test] @@ -93,7 +93,7 @@ public void ShouldReturnTheValueOfTheIndexAttrbuteEvenIfItIsMissing() IWebElement multiSelect = driver.FindElement(By.Id("multi")); ReadOnlyCollection options = multiSelect.FindElements(By.TagName("option")); - Assert.AreEqual("1", options[1].GetAttribute("index")); + Assert.That(options[1].GetAttribute("index"), Is.EqualTo("1")); } @@ -133,7 +133,7 @@ public void ShouldThrowExceptionIfSendingKeysToElementDisabledUsingRandomDisable disabledTextElement1.SendKeys("foo"); }, Throws.TypeOf()); - Assert.AreEqual(string.Empty, disabledTextElement1.Text); + Assert.That(disabledTextElement1.Text, Is.Empty); IWebElement disabledTextElement2 = driver.FindElement(By.Id("disabledTextElement2")); @@ -141,7 +141,7 @@ public void ShouldThrowExceptionIfSendingKeysToElementDisabledUsingRandomDisable () => disabledTextElement2.SendKeys("bar"), Throws.TypeOf()); - Assert.AreEqual(string.Empty, disabledTextElement2.Text); + Assert.That(disabledTextElement2.Text, Is.Empty); } [Test] @@ -169,9 +169,9 @@ public void ShouldReturnTheValueOfCheckedForACheckboxOnlyIfItIsChecked() { driver.Url = formsPage; IWebElement checkbox = driver.FindElement(By.XPath("//input[@id='checky']")); - Assert.AreEqual(null, checkbox.GetAttribute("checked")); + Assert.That(checkbox.GetAttribute("checked"), Is.Null); checkbox.Click(); - Assert.AreEqual("true", checkbox.GetAttribute("checked")); + Assert.That(checkbox.GetAttribute("checked"), Is.EqualTo("true")); } [Test] @@ -182,14 +182,14 @@ public void ShouldOnlyReturnTheValueOfSelectedForRadioButtonsIfItIsSet() IWebElement initiallyNotSelected = driver.FindElement(By.Id("peas")); IWebElement initiallySelected = driver.FindElement(By.Id("cheese_and_peas")); - Assert.AreEqual(null, neverSelected.GetAttribute("selected"), "false"); - Assert.AreEqual(null, initiallyNotSelected.GetAttribute("selected"), "false"); - Assert.AreEqual("true", initiallySelected.GetAttribute("selected"), "true"); + Assert.That(neverSelected.GetAttribute("selected"), Is.Null, "false"); + Assert.That(initiallyNotSelected.GetAttribute("selected"), Is.Null, "false"); + Assert.That(initiallySelected.GetAttribute("selected"), Is.EqualTo("true"), "true"); initiallyNotSelected.Click(); - Assert.AreEqual(null, neverSelected.GetAttribute("selected")); - Assert.AreEqual("true", initiallyNotSelected.GetAttribute("selected")); - Assert.AreEqual(null, initiallySelected.GetAttribute("selected")); + Assert.That(neverSelected.GetAttribute("selected"), Is.Null); + Assert.That(initiallyNotSelected.GetAttribute("selected"), Is.EqualTo("true")); + Assert.That(initiallySelected.GetAttribute("selected"), Is.Null); } [Test] @@ -202,8 +202,8 @@ public void ShouldReturnTheValueOfSelectedForOptionsOnlyIfTheyAreSelected() IWebElement two = options[1]; Assert.That(one.Selected, Is.True); Assert.That(two.Selected, Is.False); - Assert.AreEqual("true", one.GetAttribute("selected")); - Assert.AreEqual(null, two.GetAttribute("selected")); + Assert.That(one.GetAttribute("selected"), Is.EqualTo("true")); + Assert.That(two.GetAttribute("selected"), Is.Null); } [Test] @@ -214,7 +214,7 @@ public void ShouldReturnValueOfClassAttributeOfAnElement() IWebElement heading = driver.FindElement(By.XPath("//h1")); String className = heading.GetAttribute("class"); - Assert.AreEqual("header", className); + Assert.That(className, Is.EqualTo("header")); } [Test] @@ -224,7 +224,7 @@ public void ShouldReturnTheContentsOfATextAreaAsItsValue() String value = driver.FindElement(By.Id("withText")).GetAttribute("value"); - Assert.AreEqual("Example text", value); + Assert.That(value, Is.EqualTo("Example text")); } [Test] @@ -260,7 +260,7 @@ public void ShouldReturnHiddenTextForTextContentAttribute() IWebElement element = driver.FindElement(By.Id("hiddenline")); string textContent = element.GetAttribute("textContent"); - Assert.AreEqual("A hidden line of text", textContent); + Assert.That(textContent, Is.EqualTo("A hidden line of text")); } [Test] @@ -268,7 +268,7 @@ public void ShouldGetNumericAtribute() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.Id("withText")); - Assert.AreEqual("5", element.GetAttribute("rows")); + Assert.That(element.GetAttribute("rows"), Is.EqualTo("5")); } [Test] @@ -288,11 +288,11 @@ public void ShouldCorrectlyReportValueOfColspan() IWebElement th1 = driver.FindElement(By.Id("th1")); IWebElement td2 = driver.FindElement(By.Id("td2")); - Assert.AreEqual("th1", th1.GetAttribute("id"), "th1 id"); - Assert.AreEqual("3", th1.GetAttribute("colspan"), "th1 colspan should be 3"); + Assert.That(th1.GetAttribute("id"), Is.EqualTo("th1"), "th1 id"); + Assert.That(th1.GetAttribute("colspan"), Is.EqualTo("3"), "th1 colspan should be 3"); - Assert.AreEqual("td2", td2.GetAttribute("id"), "td2 id"); - Assert.AreEqual("2", td2.GetAttribute("colspan"), "td2 colspan should be 2"); + Assert.That(td2.GetAttribute("id"), Is.EqualTo("td2"), "td2 id"); + Assert.That(td2.GetAttribute("colspan"), Is.EqualTo("2"), "td2 colspan should be 2"); } // This is a test-case re-creating issue 900. @@ -325,7 +325,7 @@ public void GetAttributeDoesNotReturnAnObjectForSvgProperties() driver.Url = svgPage; IWebElement svgElement = driver.FindElement(By.Id("rotate")); - Assert.AreEqual("rotate(30)", svgElement.GetAttribute("transform")); + Assert.That(svgElement.GetAttribute("transform"), Is.EqualTo("rotate(30)")); } [Test] @@ -333,9 +333,9 @@ public void CanRetrieveTheCurrentValueOfATextFormField_textInput() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.Id("working")); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); element.SendKeys("hello world"); - Assert.AreEqual("hello world", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("hello world")); } [Test] @@ -343,9 +343,9 @@ public void CanRetrieveTheCurrentValueOfATextFormField_emailInput() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.Id("email")); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); element.SendKeys("hello world"); - Assert.AreEqual("hello world", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("hello world")); } [Test] @@ -353,9 +353,9 @@ public void CanRetrieveTheCurrentValueOfATextFormField_textArea() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.Id("emptyTextArea")); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); element.SendKeys("hello world"); - Assert.AreEqual("hello world", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("hello world")); } [Test] @@ -373,15 +373,15 @@ public void ShouldReturnTrueForPresentBooleanAttributes() { driver.Url = booleanAttributes; IWebElement element1 = driver.FindElement(By.Id("emailRequired")); - Assert.AreEqual("true", element1.GetAttribute("required")); + Assert.That(element1.GetAttribute("required"), Is.EqualTo("true")); IWebElement element2 = driver.FindElement(By.Id("emptyTextAreaRequired")); - Assert.AreEqual("true", element2.GetAttribute("required")); + Assert.That(element2.GetAttribute("required"), Is.EqualTo("true")); IWebElement element3 = driver.FindElement(By.Id("inputRequired")); - Assert.AreEqual("true", element3.GetAttribute("required")); + Assert.That(element3.GetAttribute("required"), Is.EqualTo("true")); IWebElement element4 = driver.FindElement(By.Id("textAreaRequired")); - Assert.AreEqual("true", element4.GetAttribute("required")); + Assert.That(element4.GetAttribute("required"), Is.EqualTo("true")); IWebElement element5 = driver.FindElement(By.Id("unwrappable")); - Assert.AreEqual("true", element5.GetAttribute("nowrap")); + Assert.That(element5.GetAttribute("nowrap"), Is.EqualTo("true")); } [Test] @@ -389,7 +389,7 @@ public void MultipleAttributeShouldBeNullWhenNotSet() { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithoutMultiple")); - Assert.AreEqual(null, element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.Null); } [Test] @@ -397,7 +397,7 @@ public void MultipleAttributeShouldBeTrueWhenSet() { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithMultipleEqualsMultiple")); - Assert.AreEqual("true", element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.EqualTo("true")); } [Test] @@ -405,7 +405,7 @@ public void MultipleAttributeShouldBeTrueWhenSelectHasMultipleWithValueAsBlank() { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithEmptyStringMultiple")); - Assert.AreEqual("true", element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.EqualTo("true")); } [Test] @@ -413,7 +413,7 @@ public void MultipleAttributeShouldBeTrueWhenSelectHasMultipleWithoutAValue() { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithMultipleWithoutValue")); - Assert.AreEqual("true", element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.EqualTo("true")); } [Test] @@ -421,7 +421,7 @@ public void MultipleAttributeShouldBeTrueWhenSelectHasMultipleWithValueAsSomethi { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithRandomMultipleValue")); - Assert.AreEqual("true", element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.EqualTo("true")); } [Test] @@ -429,7 +429,7 @@ public void GetAttributeOfUserDefinedProperty() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("userDefinedProperty.html"); IWebElement element = driver.FindElement(By.Id("d")); - Assert.AreEqual("sampleValue", element.GetAttribute("dynamicProperty")); + Assert.That(element.GetAttribute("dynamicProperty"), Is.EqualTo("sampleValue")); } [Test] @@ -440,7 +440,7 @@ public void ShouldReturnValueOfClassAttributeOfAnElementAfterSwitchingIFrame() IWebElement wallace = driver.FindElement(By.XPath("//div[@id='wallace']")); String className = wallace.GetAttribute("class"); - Assert.AreEqual("gromit", className); + Assert.That(className, Is.EqualTo("gromit")); } } } diff --git a/dotnet/test/common/ElementElementFindingTest.cs b/dotnet/test/common/ElementElementFindingTest.cs index 67cf47bbe8f92..26d75b6279374 100644 --- a/dotnet/test/common/ElementElementFindingTest.cs +++ b/dotnet/test/common/ElementElementFindingTest.cs @@ -101,7 +101,7 @@ public void ShouldFindElementsById() driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Name("form2")); ReadOnlyCollection children = parent.FindElements(By.Id("2")); - Assert.That(children.Count, Is.EqualTo(2)); + Assert.That(children, Has.Count.EqualTo(2)); } [Test] @@ -110,7 +110,7 @@ public void ShouldFindElementsByLinkText() driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Name("div1")); ReadOnlyCollection children = parent.FindElements(By.PartialLinkText("hello world")); - Assert.That(children.Count, Is.EqualTo(2)); + Assert.That(children, Has.Count.EqualTo(2)); Assert.That(children[0].Text, Is.EqualTo("hello world")); Assert.That(children[1].Text, Is.EqualTo("hello world")); } @@ -121,7 +121,7 @@ public void ShouldFindElementsByName() driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Name("form2")); ReadOnlyCollection children = parent.FindElements(By.Name("selectomatic")); - Assert.That(children.Count, Is.EqualTo(2)); + Assert.That(children, Has.Count.EqualTo(2)); } [Test] @@ -130,7 +130,7 @@ public void ShouldFindElementsByXPath() driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Name("classes")); ReadOnlyCollection children = parent.FindElements(By.XPath("span")); - Assert.That(children.Count, Is.EqualTo(3)); + Assert.That(children, Has.Count.EqualTo(3)); Assert.That(children[0].Text, Is.EqualTo("Find me")); Assert.That(children[1].Text, Is.EqualTo("Also me")); Assert.That(children[2].Text, Is.EqualTo("But not me")); @@ -142,7 +142,7 @@ public void ShouldFindElementsByClassName() driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Name("classes")); ReadOnlyCollection children = parent.FindElements(By.ClassName("one")); - Assert.That(children.Count, Is.EqualTo(2)); + Assert.That(children, Has.Count.EqualTo(2)); Assert.That(children[0].Text, Is.EqualTo("Find me")); Assert.That(children[1].Text, Is.EqualTo("Also me")); } @@ -153,7 +153,7 @@ public void ShouldFindElementsByPartialLinkText() driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Name("div1")); ReadOnlyCollection children = parent.FindElements(By.PartialLinkText("hello ")); - Assert.That(children.Count, Is.EqualTo(2)); + Assert.That(children, Has.Count.EqualTo(2)); Assert.That(children[0].Text, Is.EqualTo("hello world")); Assert.That(children[1].Text, Is.EqualTo("hello world")); } @@ -164,7 +164,7 @@ public void ShouldFindElementsByTagName() driver.Url = nestedPage; IWebElement parent = driver.FindElement(By.Name("classes")); ReadOnlyCollection children = parent.FindElements(By.TagName("span")); - Assert.That(children.Count, Is.EqualTo(3)); + Assert.That(children, Has.Count.EqualTo(3)); Assert.That(children[0].Text, Is.EqualTo("Find me")); Assert.That(children[1].Text, Is.EqualTo("Also me")); Assert.That(children[2].Text, Is.EqualTo("But not me")); diff --git a/dotnet/test/common/ElementEqualityTest.cs b/dotnet/test/common/ElementEqualityTest.cs index b86111ae4414c..0ecf01983c9b8 100644 --- a/dotnet/test/common/ElementEqualityTest.cs +++ b/dotnet/test/common/ElementEqualityTest.cs @@ -34,7 +34,7 @@ public void SameElementLookedUpDifferentWaysShouldBeEqual() IWebElement body = driver.FindElement(By.TagName("body")); IWebElement xbody = driver.FindElement(By.XPath("//body")); - Assert.AreEqual(body, xbody); + Assert.That(xbody, Is.EqualTo(body)); } [Test] @@ -44,7 +44,7 @@ public void DifferentElementsShouldNotBeEqual() ReadOnlyCollection ps = driver.FindElements(By.TagName("p")); - Assert.AreNotEqual(ps[0], ps[1]); + Assert.That(ps[1], Is.Not.EqualTo(ps[0])); } [Test] @@ -54,7 +54,7 @@ public void SameElementLookedUpDifferentWaysUsingFindElementShouldHaveSameHashCo IWebElement body = driver.FindElement(By.TagName("body")); IWebElement xbody = driver.FindElement(By.XPath("//body")); - Assert.AreEqual(body.GetHashCode(), xbody.GetHashCode()); + Assert.That(xbody.GetHashCode(), Is.EqualTo(body.GetHashCode())); } public void SameElementLookedUpDifferentWaysUsingFindElementsShouldHaveSameHashCode() @@ -63,7 +63,7 @@ public void SameElementLookedUpDifferentWaysUsingFindElementsShouldHaveSameHashC ReadOnlyCollection body = driver.FindElements(By.TagName("body")); ReadOnlyCollection xbody = driver.FindElements(By.XPath("//body")); - Assert.AreEqual(body[0].GetHashCode(), xbody[0].GetHashCode()); + Assert.That(xbody[0].GetHashCode(), Is.EqualTo(body[0].GetHashCode())); } [Test] @@ -76,7 +76,7 @@ public void AnElementFoundInViaJsShouldHaveSameId() IWebElement element = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript("return document.getElementById('oneline');"); - Assert.AreEqual(first, element); + Assert.That(element, Is.EqualTo(first)); } } } diff --git a/dotnet/test/common/ElementFindingTest.cs b/dotnet/test/common/ElementFindingTest.cs index 313077382fc4f..f1375531be5f3 100644 --- a/dotnet/test/common/ElementFindingTest.cs +++ b/dotnet/test/common/ElementFindingTest.cs @@ -34,7 +34,7 @@ public void ShouldBeAbleToFindASingleElementById() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.Id("linkId")); - Assert.AreEqual("linkId", element.GetAttribute("id")); + Assert.That(element.GetAttribute("id"), Is.EqualTo("linkId")); } [Test] @@ -60,7 +60,7 @@ public void ShouldBeAbleToFindMultipleElementsById() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.Id("2")); - Assert.AreEqual(8, elements.Count); + Assert.That(elements, Has.Exactly(8).Items); } [Test] @@ -68,7 +68,7 @@ public void ShouldBeAbleToFindMultipleElementsByNumericId() { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.Id("2")); - Assert.That(elements.Count, Is.EqualTo(8)); + Assert.That(elements, Has.Exactly(8).Items); } [Test] @@ -76,9 +76,9 @@ public void ShouldBeAbleToFindMultipleElementsByIdWithNonAlphanumericCharacters( { driver.Url = nestedPage; ReadOnlyCollection elements = driver.FindElements(By.Id("white space")); - Assert.That(elements.Count, Is.EqualTo(2)); + Assert.That(elements, Has.Exactly(2).Items); ReadOnlyCollection elements2 = driver.FindElements(By.Id("css#.chars")); - Assert.That(elements2.Count, Is.EqualTo(2)); + Assert.That(elements2, Has.Exactly(2).Items); } // By.id negative @@ -95,7 +95,7 @@ public void ShouldNotBeAbleToLocateByIdMultipleElementsThatDoNotExist() { driver.Url = formsPage; ReadOnlyCollection elements = driver.FindElements(By.Id("nonExistentButton")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } [Test] @@ -110,7 +110,7 @@ public void FindingMultipleElementsByEmptyIdShouldReturnEmptyList() { driver.Url = formsPage; ReadOnlyCollection elements = driver.FindElements(By.Id("")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } [Test] @@ -125,7 +125,7 @@ public void FindingMultipleElementsByIdWithSpaceShouldReturnEmptyList() { driver.Url = formsPage; ReadOnlyCollection elements = driver.FindElements(By.Id("nonexistent button")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } // By.Name positive @@ -135,7 +135,7 @@ public void ShouldBeAbleToFindASingleElementByName() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.Name("checky")); - Assert.AreEqual("furrfu", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("furrfu")); } [Test] @@ -151,7 +151,7 @@ public void ShouldBeAbleToFindAnElementThatDoesNotSupportTheNameProperty() { driver.Url = nestedPage; IWebElement element = driver.FindElement(By.Name("div1")); - Assert.AreEqual("div1", element.GetAttribute("name")); + Assert.That(element.GetAttribute("name"), Is.EqualTo("div1")); } // By.Name negative @@ -168,7 +168,7 @@ public void ShouldNotBeAbleToLocateByNameMultipleElementsThatDoNotExist() { driver.Url = formsPage; ReadOnlyCollection elements = driver.FindElements(By.Name("nonExistentButton")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } [Test] @@ -183,7 +183,7 @@ public void FindingMultipleElementsByEmptyNameShouldReturnEmptyList() { driver.Url = formsPage; ReadOnlyCollection elements = driver.FindElements(By.Name("")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } [Test] @@ -198,7 +198,7 @@ public void FindingMultipleElementsByNameWithSpaceShouldReturnEmptyList() { driver.Url = formsPage; ReadOnlyCollection elements = driver.FindElements(By.Name("nonexistent button")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } // By.tagName positive @@ -208,7 +208,7 @@ public void ShouldBeAbleToFindASingleElementByTagName() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.TagName("input")); - Assert.AreEqual("input", element.TagName.ToLower()); + Assert.That(element.TagName.ToLower(), Is.EqualTo("input")); } [Test] @@ -233,7 +233,7 @@ public void ShouldNotBeAbleToLocateByTagNameMultipleElementsThatDoNotExist() { driver.Url = formsPage; ReadOnlyCollection elements = driver.FindElements(By.TagName("nonExistentButton")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } [Test] @@ -255,7 +255,7 @@ public void FindingMultipleElementsByTagNameWithSpaceShouldReturnEmptyList() { driver.Url = formsPage; ReadOnlyCollection elements = driver.FindElements(By.TagName("nonexistent button")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } // By.ClassName positive @@ -273,7 +273,7 @@ public void ShouldBeAbleToFindMultipleElementsByClassName() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.ClassName("nameC")); - Assert.That(elements.Count, Is.GreaterThan(1)); + Assert.That(elements, Has.Count.GreaterThan(1)); } [Test] @@ -281,7 +281,7 @@ public void ShouldFindElementByClassWhenItIsTheFirstNameAmongMany() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.ClassName("nameA")); - Assert.AreEqual("An H2 title", element.Text); + Assert.That(element.Text, Is.EqualTo("An H2 title")); } [Test] @@ -289,7 +289,7 @@ public void ShouldFindElementByClassWhenItIsTheLastNameAmongMany() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.ClassName("nameC")); - Assert.AreEqual("An H2 title", element.Text); + Assert.That(element.Text, Is.EqualTo("An H2 title")); } [Test] @@ -297,7 +297,7 @@ public void ShouldFindElementByClassWhenItIsInTheMiddleAmongMany() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.ClassName("nameBnoise")); - Assert.AreEqual("An H2 title", element.Text); + Assert.That(element.Text, Is.EqualTo("An H2 title")); } [Test] @@ -305,7 +305,7 @@ public void ShouldFindElementByClassWhenItsNameIsSurroundedByWhitespace() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.ClassName("spaceAround")); - Assert.AreEqual("Spaced out", element.Text); + Assert.That(element.Text, Is.EqualTo("Spaced out")); } [Test] @@ -313,8 +313,8 @@ public void ShouldFindElementsByClassWhenItsNameIsSurroundedByWhitespace() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.ClassName("spaceAround")); - Assert.AreEqual(1, elements.Count); - Assert.AreEqual("Spaced out", elements[0].Text); + Assert.That(elements, Has.Exactly(1).Items); + Assert.That(elements[0].Text, Is.EqualTo("Spaced out")); } // By.ClassName negative @@ -360,7 +360,7 @@ public void FindingASingleElementByAWeirdLookingClassName() driver.Url = xhtmlTestPage; String weird = "cls-!@#$%^&*"; IWebElement element = driver.FindElement(By.ClassName(weird)); - Assert.AreEqual(weird, element.GetAttribute("class")); + Assert.That(element.GetAttribute("class"), Is.EqualTo(weird)); } [Test] @@ -369,8 +369,8 @@ public void FindingMultipleElementsByAWeirdLookingClassName() driver.Url = xhtmlTestPage; String weird = "cls-!@#$%^&*"; ReadOnlyCollection elements = driver.FindElements(By.ClassName(weird)); - Assert.AreEqual(1, elements.Count); - Assert.AreEqual(weird, elements[0].GetAttribute("class")); + Assert.That(elements, Has.Count.EqualTo(1)); + Assert.That(elements[0].GetAttribute("class"), Is.EqualTo(weird)); } // By.XPath positive @@ -380,7 +380,7 @@ public void ShouldBeAbleToFindASingleElementByXPath() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.XPath("//h1")); - Assert.AreEqual("XHTML Might Be The Future", element.Text); + Assert.That(element.Text, Is.EqualTo("XHTML Might Be The Future")); } [Test] @@ -388,7 +388,7 @@ public void ShouldBeAbleToFindMultipleElementsByXPath() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.XPath("//div")); - Assert.AreEqual(13, elements.Count); + Assert.That(elements, Has.Count.EqualTo(13)); } [Test] @@ -396,10 +396,10 @@ public void ShouldBeAbleToFindManyElementsRepeatedlyByXPath() { driver.Url = xhtmlTestPage; String xpathString = "//node()[contains(@id,'id')]"; - Assert.AreEqual(3, driver.FindElements(By.XPath(xpathString)).Count); + Assert.That(driver.FindElements(By.XPath(xpathString)), Has.Exactly(3).Items); xpathString = "//node()[contains(@id,'nope')]"; - Assert.AreEqual(0, driver.FindElements(By.XPath(xpathString)).Count); + Assert.That(driver.FindElements(By.XPath(xpathString)), Is.Empty); } [Test] @@ -407,7 +407,7 @@ public void ShouldBeAbleToIdentifyElementsByClass() { driver.Url = xhtmlTestPage; IWebElement header = driver.FindElement(By.XPath("//h1[@class='header']")); - Assert.AreEqual("XHTML Might Be The Future", header.Text); + Assert.That(header.Text, Is.EqualTo("XHTML Might Be The Future")); } [Test] @@ -416,8 +416,8 @@ public void ShouldBeAbleToFindAnElementByXPathWithMultipleAttributes() driver.Url = formsPage; IWebElement element = driver.FindElement( By.XPath("//form[@name='optional']/input[@type='submit' and @value='Click!']")); - Assert.AreEqual("input", element.TagName.ToLower()); - Assert.AreEqual("Click!", element.GetAttribute("value")); + Assert.That(element.TagName.ToLower(), Is.EqualTo("input")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("Click!")); } [Test] @@ -425,7 +425,7 @@ public void FindingALinkByXpathShouldLocateAnElementWithTheGivenText() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.XPath("//a[text()='click me']")); - Assert.AreEqual("click me", element.Text); + Assert.That(element.Text, Is.EqualTo("click me")); } [Test] @@ -558,8 +558,8 @@ public void ShouldBeAbleToFindASingleElementByCssSelector() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.CssSelector("div.content")); - Assert.AreEqual("div", element.TagName.ToLower()); - Assert.AreEqual("content", element.GetAttribute("class")); + Assert.That(element.TagName.ToLower(), Is.EqualTo("div")); + Assert.That(element.GetAttribute("class"), Is.EqualTo("content")); } [Test] @@ -575,8 +575,8 @@ public void ShouldBeAbleToFindASingleElementByCompoundCssSelector() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.CssSelector("div.extraDiv, div.content")); - Assert.AreEqual("div", element.TagName.ToLower()); - Assert.AreEqual("content", element.GetAttribute("class")); + Assert.That(element.TagName.ToLower(), Is.EqualTo("div")); + Assert.That(element.GetAttribute("class"), Is.EqualTo("content")); } [Test] @@ -594,7 +594,7 @@ public void ShouldBeAbleToFindAnElementByBooleanAttributeUsingCssSelector() { driver.Url = (EnvironmentManager.Instance.UrlBuilder.WhereIs("locators_tests/boolean_attribute_selected.html")); IWebElement element = driver.FindElement(By.CssSelector("option[selected='selected']")); - Assert.AreEqual("two", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("two")); } [Test] @@ -602,7 +602,7 @@ public void ShouldBeAbleToFindAnElementByBooleanAttributeUsingShortCssSelector() { driver.Url = (EnvironmentManager.Instance.UrlBuilder.WhereIs("locators_tests/boolean_attribute_selected.html")); IWebElement element = driver.FindElement(By.CssSelector("option[selected]")); - Assert.AreEqual("two", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("two")); } [Test] @@ -610,7 +610,7 @@ public void ShouldBeAbleToFindAnElementByBooleanAttributeUsingShortCssSelectorOn { driver.Url = (EnvironmentManager.Instance.UrlBuilder.WhereIs("locators_tests/boolean_attribute_selected_html4.html")); IWebElement element = driver.FindElement(By.CssSelector("option[selected]")); - Assert.AreEqual("two", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("two")); } // By.CssSelector negative @@ -627,7 +627,7 @@ public void ShouldNotFindElementsByCssSelectorWhenThereIsNoSuchElement() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.CssSelector(".there-is-no-such-class")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } [Test] @@ -665,7 +665,7 @@ public void ShouldBeAbleToFindALinkByText() { driver.Url = xhtmlTestPage; IWebElement link = driver.FindElement(By.LinkText("click me")); - Assert.AreEqual("click me", link.Text); + Assert.That(link.Text, Is.EqualTo("click me")); } [Test] @@ -673,7 +673,7 @@ public void ShouldBeAbleToFindMultipleLinksByText() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.LinkText("click me")); - Assert.AreEqual(2, elements.Count, "Expected 2 links, got " + elements.Count); + Assert.That(elements, Has.Count.EqualTo(2), "Expected 2 links, got " + elements.Count); } [Test] @@ -681,7 +681,7 @@ public void ShouldFindElementByLinkTextContainingEqualsSign() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.LinkText("Link=equalssign")); - Assert.AreEqual("linkWithEqualsSign", element.GetAttribute("id")); + Assert.That(element.GetAttribute("id"), Is.EqualTo("linkWithEqualsSign")); } [Test] @@ -689,8 +689,8 @@ public void ShouldFindMultipleElementsByLinkTextContainingEqualsSign() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.LinkText("Link=equalssign")); - Assert.AreEqual(1, elements.Count); - Assert.AreEqual("linkWithEqualsSign", elements[0].GetAttribute("id")); + Assert.That(elements, Has.Count.EqualTo(1)); + Assert.That(elements[0].GetAttribute("id"), Is.EqualTo("linkWithEqualsSign")); } [Test] @@ -705,7 +705,7 @@ public void FindsByLinkTextOnXhtmlPage() driver.Url = (EnvironmentManager.Instance.UrlBuilder.WhereIs("actualXhtmlPage.xhtml")); string linkText = "Foo"; IWebElement element = driver.FindElement(By.LinkText(linkText)); - Assert.AreEqual(linkText, element.Text); + Assert.That(element.Text, Is.EqualTo(linkText)); } [Test] @@ -716,7 +716,7 @@ public void LinkWithFormattingTags() IWebElement elem = driver.FindElement(By.Id("links")); IWebElement res = elem.FindElement(By.PartialLinkText("link with formatting tags")); - Assert.AreEqual("link with formatting tags", res.Text); + Assert.That(res.Text, Is.EqualTo("link with formatting tags")); } [Test] @@ -724,8 +724,8 @@ public void DriverCanGetLinkByLinkTestIgnoringTrailingWhitespace() { driver.Url = simpleTestPage; IWebElement link = driver.FindElement(By.LinkText("link with trailing space")); - Assert.AreEqual("linkWithTrailingSpace", link.GetAttribute("id")); - Assert.AreEqual("link with trailing space", link.Text); + Assert.That(link.GetAttribute("id"), Is.EqualTo("linkWithTrailingSpace")); + Assert.That(link.Text, Is.EqualTo("link with trailing space")); } // By.linkText negative @@ -742,7 +742,7 @@ public void ShouldNotBeAbleToLocateByLinkTextMultipleElementsThatDoNotExist() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.LinkText("Not here either")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } // By.partialLinkText positive @@ -752,7 +752,7 @@ public void ShouldBeAbleToFindMultipleElementsByPartialLinkText() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.PartialLinkText("ick me")); - Assert.AreEqual(2, elements.Count); + Assert.That(elements, Has.Exactly(2).Items); } [Test] @@ -768,7 +768,7 @@ public void ShouldFindElementByPartialLinkTextContainingEqualsSign() { driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.PartialLinkText("Link=")); - Assert.AreEqual("linkWithEqualsSign", element.GetAttribute("id")); + Assert.That(element.GetAttribute("id"), Is.EqualTo("linkWithEqualsSign")); } [Test] @@ -776,8 +776,8 @@ public void ShouldFindMultipleElementsByPartialLinkTextContainingEqualsSign() { driver.Url = xhtmlTestPage; ReadOnlyCollection elements = driver.FindElements(By.PartialLinkText("Link=")); - Assert.AreEqual(1, elements.Count); - Assert.AreEqual("linkWithEqualsSign", elements[0].GetAttribute("id")); + Assert.That(elements, Has.Count.EqualTo(1)); + Assert.That(elements[0].GetAttribute("id"), Is.EqualTo("linkWithEqualsSign")); } // Misc tests @@ -788,7 +788,7 @@ public void DriverShouldBeAbleToFindElementsAfterLoadingMoreThanOnePageAtATime() driver.Url = formsPage; driver.Url = xhtmlTestPage; IWebElement link = driver.FindElement(By.LinkText("click me")); - Assert.AreEqual("click me", link.Text); + Assert.That(link.Text, Is.EqualTo("click me")); } // You don't want to ask why this is here @@ -798,16 +798,16 @@ public void WhenFindingByNameShouldNotReturnById() driver.Url = formsPage; IWebElement element = driver.FindElement(By.Name("id-name1")); - Assert.AreEqual("name", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("name")); element = driver.FindElement(By.Id("id-name1")); - Assert.AreEqual("id", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("id")); element = driver.FindElement(By.Name("id-name2")); - Assert.AreEqual("name", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("name")); element = driver.FindElement(By.Id("id-name2")); - Assert.AreEqual("id", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("id")); } [Test] @@ -815,7 +815,7 @@ public void ShouldBeAbleToFindAHiddenElementsByName() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.Name("hidden")); - Assert.AreEqual("hidden", element.GetAttribute("name")); + Assert.That(element.GetAttribute("name"), Is.EqualTo("hidden")); } [Test] @@ -851,10 +851,10 @@ public void AnElementFoundInADifferentFrameIsStale() public void ShouldReturnTitleOfPageIfSet() { driver.Url = xhtmlTestPage; - Assert.AreEqual(driver.Title, "XHTML Test Page"); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); driver.Url = simpleTestPage; - Assert.AreEqual(driver.Title, "Hello WebDriver"); + Assert.That(driver.Title, Is.EqualTo("Hello WebDriver")); } [Test] @@ -863,7 +863,7 @@ public void ShouldBeAbleToClickOnLinkIdentifiedByText() driver.Url = xhtmlTestPage; driver.FindElement(By.LinkText("click me")).Click(); WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -872,7 +872,7 @@ public void ShouldBeAbleToClickOnLinkIdentifiedById() driver.Url = xhtmlTestPage; driver.FindElement(By.Id("linkId")).Click(); WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -892,7 +892,7 @@ public void ShouldBeAbleToFindChildrenOfANode() ReadOnlyCollection elements = driver.FindElements(By.XPath("/html/head")); IWebElement head = elements[0]; ReadOnlyCollection importedScripts = head.FindElements(By.TagName("script")); - Assert.AreEqual(importedScripts.Count, 3); + Assert.That(importedScripts, Has.Exactly(3).Items); } [Test] @@ -902,7 +902,7 @@ public void ReturnAnEmptyListWhenThereAreNoChildrenOfANode() IWebElement table = driver.FindElement(By.Id("table")); ReadOnlyCollection rows = table.FindElements(By.TagName("tr")); - Assert.AreEqual(rows.Count, 0); + Assert.That(rows, Is.Empty); } [Test] @@ -912,7 +912,7 @@ public void ShouldFindElementsByName() IWebElement element = driver.FindElement(By.Name("checky")); - Assert.AreEqual(element.GetAttribute("value"), "furrfu"); + Assert.That(element.GetAttribute("value"), Is.EqualTo("furrfu")); } [Test] @@ -921,7 +921,7 @@ public void ShouldFindElementsByClassWhenItIsTheFirstNameAmongMany() driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.ClassName("nameA")); - Assert.AreEqual(element.Text, "An H2 title"); + Assert.That(element.Text, Is.EqualTo("An H2 title")); } [Test] @@ -930,7 +930,7 @@ public void ShouldFindElementsByClassWhenItIsTheLastNameAmongMany() driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.ClassName("nameC")); - Assert.AreEqual(element.Text, "An H2 title"); + Assert.That(element.Text, Is.EqualTo("An H2 title")); } [Test] @@ -939,7 +939,7 @@ public void ShouldFindElementsByClassWhenItIsInTheMiddleAmongMany() driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.ClassName("nameBnoise")); - Assert.AreEqual(element.Text, "An H2 title"); + Assert.That(element.Text, Is.EqualTo("An H2 title")); } [Test] @@ -976,7 +976,7 @@ public void ShouldBeAbleToClickOnLinksWithNoHrefAttribute() element.Click(); // if any exception is thrown, we won't get this far. Sanity check - Assert.AreEqual("Changed", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Changed")); } [Test] @@ -985,8 +985,8 @@ public void FindingByTagNameShouldNotIncludeParentElementIfSameTagType() driver.Url = xhtmlTestPage; IWebElement parent = driver.FindElement(By.Id("my_span")); - Assert.AreEqual(2, parent.FindElements(By.TagName("div")).Count); - Assert.AreEqual(2, parent.FindElements(By.TagName("span")).Count); + Assert.That(parent.FindElements(By.TagName("div")), Has.Count.EqualTo(2)); + Assert.That(parent.FindElements(By.TagName("span")), Has.Count.EqualTo(2)); } [Test] @@ -996,7 +996,7 @@ public void FindingByCssShouldNotIncludeParentElementIfSameTagType() IWebElement parent = driver.FindElement(By.CssSelector("div#parent")); IWebElement child = parent.FindElement(By.CssSelector("div")); - Assert.AreEqual("child", child.GetAttribute("id")); + Assert.That(child.GetAttribute("id"), Is.EqualTo("child")); } [Test] @@ -1005,8 +1005,8 @@ public void FindingByXPathShouldNotIncludeParentElementIfSameTagType() driver.Url = xhtmlTestPage; IWebElement parent = driver.FindElement(By.Id("my_span")); - Assert.AreEqual(2, parent.FindElements(By.TagName("div")).Count); - Assert.AreEqual(2, parent.FindElements(By.TagName("span")).Count); + Assert.That(parent.FindElements(By.TagName("div")), Has.Count.EqualTo(2)); + Assert.That(parent.FindElements(By.TagName("span")), Has.Count.EqualTo(2)); } [Test] @@ -1025,7 +1025,7 @@ public void ShouldFindElementByLinkTextContainingDoubleQuote() { driver.Url = simpleTestPage; IWebElement element = driver.FindElement(By.LinkText("link with \" (double quote)")); - Assert.AreEqual("quote", element.GetAttribute("id")); + Assert.That(element.GetAttribute("id"), Is.EqualTo("quote")); } [Test] @@ -1033,7 +1033,7 @@ public void ShouldFindElementByLinkTextContainingBackslash() { driver.Url = simpleTestPage; IWebElement element = driver.FindElement(By.LinkText("link with \\ (backslash)")); - Assert.AreEqual("backslash", element.GetAttribute("id")); + Assert.That(element.GetAttribute("id"), Is.EqualTo("backslash")); } } } diff --git a/dotnet/test/common/ElementPropertyTest.cs b/dotnet/test/common/ElementPropertyTest.cs index fd93089262c2a..2f3b98c80bfe1 100644 --- a/dotnet/test/common/ElementPropertyTest.cs +++ b/dotnet/test/common/ElementPropertyTest.cs @@ -40,9 +40,10 @@ public void CanRetrieveTheCurrentValueOfAProperty() { driver.Url = formsPage; IWebElement element = driver.FindElement(By.Id("working")); - Assert.AreEqual(string.Empty, element.GetDomProperty("value")); + + Assert.That(element.GetDomProperty("value"), Is.Empty); element.SendKeys("hello world"); - Assert.AreEqual("hello world", element.GetDomProperty("value")); + Assert.That(element.GetDomProperty("value"), Is.EqualTo("hello world")); } } } diff --git a/dotnet/test/common/ElementSelectingTest.cs b/dotnet/test/common/ElementSelectingTest.cs index 0fc8013784878..6d9bb1a7125ac 100644 --- a/dotnet/test/common/ElementSelectingTest.cs +++ b/dotnet/test/common/ElementSelectingTest.cs @@ -204,14 +204,14 @@ private static void AssertSelected(IWebElement element) private static void AssertSelected(IWebElement element, bool isSelected) { - Assert.AreEqual(isSelected, element.Selected, string.Format("Expected element {0} to be {1} but was {2}", Describe(element), SelectedToString(isSelected), SelectedToString(!isSelected))); + Assert.That(element.Selected, Is.EqualTo(isSelected), string.Format("Expected element {0} to be {1} but was {2}", Describe(element), SelectedToString(isSelected), SelectedToString(!isSelected))); } private static void AssertCannotSelect(IWebElement element) { bool previous = element.Selected; element.Click(); - Assert.AreEqual(previous, element.Selected); + Assert.That(element.Selected, Is.EqualTo(previous)); } private static void AssertCanSelect(IWebElement element) @@ -261,7 +261,7 @@ private static void AssertTogglingSwapsSelectedStateFrom(IWebElement element, bo { element.Click(); bool isNowSelected = element.Selected; - Assert.AreNotEqual(isNowSelected, originalState, string.Format("Expected element {0} to have been toggled to {1} but was {2}", Describe(element), SelectedToString(!originalState), SelectedToString(originalState))); + Assert.That(originalState, Is.Not.EqualTo(isNowSelected), string.Format("Expected element {0} to have been toggled to {1} but was {2}", Describe(element), SelectedToString(!originalState), SelectedToString(originalState))); AssertSelected(element, !originalState); } diff --git a/dotnet/test/common/ErrorsTest.cs b/dotnet/test/common/ErrorsTest.cs index f01894020c3f3..ad5ea3a120833 100644 --- a/dotnet/test/common/ErrorsTest.cs +++ b/dotnet/test/common/ErrorsTest.cs @@ -35,7 +35,7 @@ public void ShouldNotGenerateErrorsWhenOpeningANewPage() { driver.Url = errorsPage; object result = ((IJavaScriptExecutor)driver).ExecuteScript("return window.ERRORS.join('\\n');"); - Assert.AreEqual("", result, "Should have no errors"); + Assert.That(result, Is.Empty, "Should have no errors"); } } diff --git a/dotnet/test/common/ExecutingAsyncJavascriptTest.cs b/dotnet/test/common/ExecutingAsyncJavascriptTest.cs index 077bcd721c0fa..ef0711453b6dc 100644 --- a/dotnet/test/common/ExecutingAsyncJavascriptTest.cs +++ b/dotnet/test/common/ExecutingAsyncJavascriptTest.cs @@ -118,7 +118,7 @@ public void ShouldBeAbleToReturnArraysOfPrimitivesFromAsyncScripts() Assert.That(result, Is.Not.Null); Assert.That(result, Is.InstanceOf>()); ReadOnlyCollection resultList = result as ReadOnlyCollection; - Assert.That(resultList.Count, Is.EqualTo(5)); + Assert.That(resultList, Has.Count.EqualTo(5)); Assert.That(resultList[0], Is.Null); Assert.That((long)resultList[1], Is.EqualTo(123)); Assert.That(resultList[2].ToString(), Is.EqualTo("abc")); @@ -221,10 +221,12 @@ public void ShouldCatchErrorsWithMessageAndStacktraceWhenExecutingInitialScript( string js = "function functionB() { throw Error('errormessage'); };" + "function functionA() { functionB(); };" + "functionA();"; - Exception ex = Assert.Catch(() => executor.ExecuteAsyncScript(js)); - Assert.That(ex, Is.InstanceOf()); - Assert.That(ex.Message.Contains("errormessage")); - Assert.That(ex.StackTrace.Contains("functionB")); + + Assert.That( + () => executor.ExecuteAsyncScript(js), + Throws.InstanceOf() + .With.Message.Contains("errormessage") + .And.Property(nameof(WebDriverException.StackTrace)).Contains("functionB")); } [Test] @@ -236,21 +238,21 @@ public void ShouldBeAbleToExecuteAsynchronousScripts() IWebElement typer = driver.FindElement(By.Name("typer")); typer.SendKeys("bob"); - Assert.AreEqual("bob", typer.GetAttribute("value")); + Assert.That(typer.GetAttribute("value"), Is.EqualTo("bob")); driver.FindElement(By.Id("red")).Click(); driver.FindElement(By.Name("submit")).Click(); - Assert.AreEqual(1, GetNumberOfDivElements(), "There should only be 1 DIV at this point, which is used for the butter message"); + Assert.That(GetNumberOfDivElements(), Is.EqualTo(1), "There should only be 1 DIV at this point, which is used for the butter message"); driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromSeconds(10); string text = (string)executor.ExecuteAsyncScript( "var callback = arguments[arguments.length - 1];" + "window.registerListener(arguments[arguments.length - 1]);"); - Assert.AreEqual("bob", text); - Assert.AreEqual("", typer.GetAttribute("value")); + Assert.That(text, Is.EqualTo("bob")); + Assert.That(typer.GetAttribute("value"), Is.Empty); - Assert.AreEqual(2, GetNumberOfDivElements(), "There should be 1 DIV (for the butter message) + 1 DIV (for the new label)"); + Assert.That(GetNumberOfDivElements(), Is.EqualTo(2), "There should be 1 DIV (for the butter message) + 1 DIV (for the new label)"); } [Test] @@ -258,7 +260,7 @@ public void ShouldBeAbleToPassMultipleArgumentsToAsyncScripts() { driver.Url = ajaxyPage; long result = (long)executor.ExecuteAsyncScript("arguments[arguments.length - 1](arguments[0] + arguments[1]);", 1, 2); - Assert.AreEqual(3, result); + Assert.That(result, Is.EqualTo(3)); } [Test] @@ -290,7 +292,7 @@ public void ShouldBeAbleToMakeXMLHttpRequestsAndWaitForTheResponse() driver.Url = ajaxyPage; driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromSeconds(3); string response = (string)executor.ExecuteAsyncScript(script, sleepingPage + "?time=2"); - Assert.AreEqual("DoneSlept for 2s", response.Trim()); + Assert.That(response.Trim(), Is.EqualTo("DoneSlept for 2s")); } [Test] diff --git a/dotnet/test/common/ExecutingJavascriptTest.cs b/dotnet/test/common/ExecutingJavascriptTest.cs index 34a567a7a92c2..d5b239a9cf206 100644 --- a/dotnet/test/common/ExecutingJavascriptTest.cs +++ b/dotnet/test/common/ExecutingJavascriptTest.cs @@ -143,7 +143,7 @@ public void ShouldBeAbleToExecuteJavascriptAndReturnABasicObjectLiteral() expected.Add("abc", "123"); expected.Add("tired", false); - Assert.AreEqual(expected.Count, map.Count, "Expected:<" + expected.Count + ">, but was:<" + map.Count + ">"); + Assert.That(map, Has.Count.EqualTo(expected.Count), "Expected:<" + expected.Count + ">, but was:<" + map.Count + ">"); foreach (string expectedKey in expected.Keys) { Assert.That(map, Does.ContainKey(expectedKey)); @@ -200,8 +200,8 @@ public void ShouldBeAbleToExecuteSimpleJavascriptAndReturnAComplexObject() Assert.That(result, Is.InstanceOf>()); Dictionary map = (Dictionary)result; - Assert.AreEqual("http:", map["protocol"]); - Assert.AreEqual(javascriptPage, map["href"]); + Assert.That(map["protocol"], Is.EqualTo("http:")); + Assert.That(map["href"], Is.EqualTo(javascriptPage)); } [Test] @@ -256,10 +256,12 @@ public void ShouldThrowAnExceptionWithMessageAndStacktraceWhenTheJavascriptIsBad string js = "function functionB() { throw Error('errormessage'); };" + "function functionA() { functionB(); };" + "functionA();"; - Exception ex = Assert.Catch(() => ExecuteScript(js)); - Assert.That(ex, Is.InstanceOf()); - Assert.That(ex.Message.Contains("errormessage"), "Exception message does not contain 'errormessage'"); - Assert.That(ex.StackTrace.Contains("functionB"), "Exception message does not contain 'functionB'"); + + Assert.That( + () => ExecuteScript(js), + Throws.InstanceOf() + .With.Message.Contains("errormessage") + .And.Property(nameof(WebDriverException.StackTrace)).Contains("functionB")); } [Test] @@ -272,7 +274,7 @@ public void ShouldBeAbleToCallFunctionsDefinedOnThePage() ExecuteScript("displayMessage('I like cheese');"); string text = driver.FindElement(By.Id("result")).Text; - Assert.AreEqual("I like cheese", text.Trim()); + Assert.That(text.Trim(), Is.EqualTo("I like cheese")); } [Test] @@ -284,7 +286,7 @@ public void ShouldBeAbleToPassAStringAsAnArgument() driver.Url = javascriptPage; string text = (string)ExecuteScript("return arguments[0] == 'Hello!' ? 'Hello!' : 'Goodbye!';", "Hello!"); - Assert.AreEqual("Hello!", text); + Assert.That(text, Is.EqualTo("Hello!")); } [Test] @@ -317,19 +319,19 @@ public void ShouldBeAbleToPassANumberAsAnArgument() string function = string.Format(functionTemplate, 3); long result = (long)ExecuteScript(function, 3); - Assert.AreEqual(3, result); + Assert.That(result, Is.EqualTo(3)); function = string.Format(functionTemplate, -3); result = (long)ExecuteScript(function, -3); - Assert.AreEqual(-3, result); + Assert.That(result, Is.EqualTo(-3)); function = string.Format(functionTemplate, 2147483647); result = (long)ExecuteScript(function, 2147483647); - Assert.AreEqual(2147483647, result); + Assert.That(result, Is.EqualTo(2147483647)); function = string.Format(functionTemplate, -2147483647); result = (long)ExecuteScript(function, -2147483647); - Assert.AreEqual(-2147483647, result); + Assert.That(result, Is.EqualTo(-2147483647)); } [Test] @@ -343,7 +345,7 @@ public void ShouldBeAbleToPassAWebElementAsArgument() IWebElement button = driver.FindElement(By.Id("plainButton")); string value = (string)ExecuteScript("arguments[0]['flibble'] = arguments[0].getAttribute('id'); return arguments[0]['flibble'];", button); - Assert.AreEqual("plainButton", value); + Assert.That(value, Is.EqualTo("plainButton")); } [Test] @@ -357,7 +359,7 @@ public void PassingArrayAsOnlyArgumentShouldFlattenArray() driver.Url = javascriptPage; object[] array = new object[] { "zero", 1, true, 3.14159 }; long length = (long)ExecuteScript("return arguments[0].length", array); - Assert.AreEqual(array.Length, length); + Assert.That(length, Is.EqualTo(array.Length)); } [Test] @@ -371,7 +373,7 @@ public void ShouldBeAbleToPassAnArrayAsAdditionalArgument() driver.Url = javascriptPage; object[] array = new object[] { "zero", 1, true, 3.14159, false }; long length = (long)ExecuteScript("return arguments[1].length", "string", array); - Assert.AreEqual(array.Length, length); + Assert.That(length, Is.EqualTo(array.Length)); } [Test] @@ -388,7 +390,7 @@ public void ShouldBeAbleToPassACollectionAsArgument() collection.Add("Brie"); collection.Add(7); long length = (long)ExecuteScript("return arguments[0].length", collection); - Assert.AreEqual(collection.Count, length); + Assert.That(length, Is.EqualTo(collection.Count)); } [Test] @@ -415,7 +417,7 @@ public void ShouldBeAbleToPassInMoreThanOneArgument() driver.Url = javascriptPage; string result = (string)ExecuteScript("return arguments[0] + arguments[1];", "one", "two"); - Assert.AreEqual("onetwo", result); + Assert.That(result, Is.EqualTo("onetwo")); } [Test] @@ -426,7 +428,7 @@ public void ShouldBeAbleToGrabTheBodyOfFrameOnceSwitchedTo() driver.SwitchTo().Frame("editFrame"); IWebElement body = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript("return document.body"); - Assert.AreEqual("", body.Text); + Assert.That(body.Text, Is.Empty); } // This is a duplicate test of ShouldBeAbleToExecuteScriptAndReturnElementsList. @@ -449,13 +451,13 @@ public void JavascriptStringHandlingShouldWorkAsExpected() driver.Url = javascriptPage; string value = (string)ExecuteScript("return '';"); - Assert.AreEqual("", value); + Assert.That(value, Is.Empty); value = (string)ExecuteScript("return undefined;"); Assert.That(value, Is.Null); value = (string)ExecuteScript("return ' '"); - Assert.AreEqual(" ", value); + Assert.That(value, Is.EqualTo(" ")); } [Test] @@ -467,7 +469,7 @@ public void ShouldBeAbleToExecuteABigChunkOfJavascriptCode() if (fileList.Length > 0) { string jquery = System.IO.File.ReadAllText(fileList[0]); - Assert.That(jquery.Length, Is.GreaterThan(50000)); + Assert.That(jquery, Has.Length.GreaterThan(50000)); ExecuteScript(jquery, null); } } @@ -508,7 +510,7 @@ public void ShouldBeAbleToExecuteScriptAndReturnElementsList() ReadOnlyCollection resultsList = (ReadOnlyCollection)resultObject; - Assert.That(resultsList.Count, Is.GreaterThan(0)); + Assert.That(resultsList, Is.Not.Empty); } [Test] @@ -520,7 +522,7 @@ public void ShouldBeAbleToCreateAPersistentValue() ExecuteScript("document.alerts.push('hello world');"); string text = (string)ExecuteScript("return document.alerts.shift()"); - Assert.AreEqual("hello world", text); + Assert.That(text, Is.EqualTo("hello world")); } [Test] @@ -533,7 +535,7 @@ public void ShouldBeAbleToHandleAnArrayOfElementsAsAnObjectArray() string name = (string)((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0][0].tagName", args); - Assert.AreEqual("form", name.ToLower()); + Assert.That(name, Is.EqualTo("form").IgnoreCase); } [Test] @@ -548,7 +550,7 @@ public void ShouldBeAbleToPassADictionaryAsAParameter() object res = ((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0]['foo'][1]", args); - Assert.AreEqual(2, (long)res); + Assert.That((long)res, Is.EqualTo(2)); } [Test] @@ -713,7 +715,7 @@ public void ShouldBeAbleToPassMoreThanOneStringAsArguments() driver.Url = javascriptPage; string text = (string)ExecuteScript("return arguments[0] + arguments[1] + arguments[2] + arguments[3];", "Hello,", " ", "world", "!"); - Assert.AreEqual("Hello, world!", text); + Assert.That(text, Is.EqualTo("Hello, world!")); } [Test] @@ -728,16 +730,16 @@ public void ShouldBeAbleToPassMoreThanOneBooleanAsArguments() driver.Url = javascriptPage; string text = (string)ExecuteScript(function, true, true); - Assert.AreEqual("TrueTrue", text); + Assert.That(text, Is.EqualTo("TrueTrue")); text = (string)ExecuteScript(function, false, true); - Assert.AreEqual("FalseTrue", text); + Assert.That(text, Is.EqualTo("FalseTrue")); text = (string)ExecuteScript(function, true, false); - Assert.AreEqual("TrueFalse", text); + Assert.That(text, Is.EqualTo("TrueFalse")); text = (string)ExecuteScript(function, false, false); - Assert.AreEqual("FalseFalse", text); + Assert.That(text, Is.EqualTo("FalseFalse")); } [Test] @@ -751,16 +753,16 @@ public void ShouldBeAbleToPassMoreThanOneNumberAsArguments() driver.Url = javascriptPage; long result = (long)ExecuteScript(function, 30, 12); - Assert.AreEqual(42, result); + Assert.That(result, Is.EqualTo(42)); result = (long)ExecuteScript(function, -30, -12); - Assert.AreEqual(-42, result); + Assert.That(result, Is.EqualTo(-42)); result = (long)ExecuteScript(function, 2147483646, 1); - Assert.AreEqual(2147483647, result); + Assert.That(result, Is.EqualTo(2147483647)); result = (long)ExecuteScript(function, -2147483646, -1); - Assert.AreEqual(-2147483647, result); + Assert.That(result, Is.EqualTo(-2147483647)); } @@ -775,22 +777,22 @@ public void ShouldBeAbleToPassADoubleAsAnArgument() driver.Url = javascriptPage; double result = (double)ExecuteScript(function, (double)4.2); - Assert.AreEqual(4.2, result); + Assert.That(result, Is.EqualTo(4.2)); result = (double)ExecuteScript(function, (double)-4.2); - Assert.AreEqual(-4.2, result); + Assert.That(result, Is.EqualTo(-4.2)); result = (double)ExecuteScript(function, (float)4.2); - Assert.AreEqual(4.2, result); + Assert.That(result, Is.EqualTo(4.2)); result = (double)ExecuteScript(function, (float)-4.2); - Assert.AreEqual(-4.2, result); + Assert.That(result, Is.EqualTo(-4.2)); result = (long)ExecuteScript(function, (double)4.0); - Assert.AreEqual(4, result); + Assert.That(result, Is.EqualTo(4)); result = (long)ExecuteScript(function, (double)-4.0); - Assert.AreEqual(-4, result); + Assert.That(result, Is.EqualTo(-4)); } [Test] @@ -804,16 +806,16 @@ public void ShouldBeAbleToPassMoreThanOneDoubleAsArguments() driver.Url = javascriptPage; double result = (double)ExecuteScript(function, 30.1, 12.1); - Assert.AreEqual(42.2, result); + Assert.That(result, Is.EqualTo(42.2)); result = (double)ExecuteScript(function, -30.1, -12.1); - Assert.AreEqual(-42.2, result); + Assert.That(result, Is.EqualTo(-42.2)); result = (double)ExecuteScript(function, 2147483646.1, 1.0); - Assert.AreEqual(2147483647.1, result); + Assert.That(result, Is.EqualTo(2147483647.1)); result = (double)ExecuteScript(function, -2147483646.1, -1.0); - Assert.AreEqual(-2147483647.1, result); + Assert.That(result, Is.EqualTo(-2147483647.1)); } @@ -828,7 +830,7 @@ public void ShouldBeAbleToPassMoreThanOneWebElementAsArguments() IWebElement dynamo = driver.FindElement(By.Id("dynamo")); string value = (string)ExecuteScript("arguments[0]['flibble'] = arguments[0].getAttribute('id'); return arguments[0]['flibble'] + arguments[1].innerHTML;", button, dynamo); - Assert.AreEqual("plainButtonWhat's for dinner?", value); + Assert.That(value, Is.EqualTo("plainButtonWhat's for dinner?")); } [Test] @@ -847,7 +849,7 @@ public void ShouldBeAbleToPassInMixedArguments() "Hello, World!", true); - Assert.AreEqual("What's for dinner?424.2Hello, World!true", result); + Assert.That(result, Is.EqualTo("What's for dinner?424.2Hello, World!true")); } @@ -864,7 +866,7 @@ public void ShouldBeAbleToPassInAndRetrieveDates() ExecuteScript(function, "2014-05-20T20:00:00+08:00"); IWebElement element = driver.FindElement(By.Id("result")); string text = element.Text; - Assert.AreEqual("2014-05-20T20:00:00+08:00", text); + Assert.That(text, Is.EqualTo("2014-05-20T20:00:00+08:00")); } private object ExecuteScript(String script, params Object[] args) diff --git a/dotnet/test/common/FormHandlingTests.cs b/dotnet/test/common/FormHandlingTests.cs index 736b77a610f25..47382b7ebf8e1 100644 --- a/dotnet/test/common/FormHandlingTests.cs +++ b/dotnet/test/common/FormHandlingTests.cs @@ -32,7 +32,7 @@ public void ShouldClickOnSubmitInputElements() driver.Url = formsPage; driver.FindElement(By.Id("submitButton")).Click(); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -48,7 +48,7 @@ public void ShouldBeAbleToClickImageButtons() driver.Url = formsPage; driver.FindElement(By.Id("imageButton")).Click(); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -57,7 +57,7 @@ public void ShouldBeAbleToSubmitForms() driver.Url = formsPage; driver.FindElement(By.Name("login")).Submit(); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -66,7 +66,7 @@ public void ShouldSubmitAFormWhenAnyInputElementWithinThatFormIsSubmitted() driver.Url = formsPage; driver.FindElement(By.Id("checky")).Submit(); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -75,7 +75,7 @@ public void ShouldSubmitAFormWhenAnyElementWithinThatFormIsSubmitted() driver.Url = formsPage; driver.FindElement(By.XPath("//form/p")).Submit(); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -84,7 +84,7 @@ public void ShouldSubmitAFormWithIdSubmit() driver.Url = formsPage; driver.FindElement(By.Id("submit")).Submit(); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -94,7 +94,7 @@ public void ShouldSubmitAFormWithNameSubmit() driver.Url = formsPage; driver.FindElement(By.Name("submit")).Submit(); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -111,7 +111,7 @@ public void ShouldBeAbleToEnterTextIntoATextAreaBySettingItsValue() IWebElement textarea = driver.FindElement(By.Id("keyUpArea")); string cheesey = "Brie and cheddar"; textarea.SendKeys(cheesey); - Assert.AreEqual(textarea.GetAttribute("value"), cheesey); + Assert.That(textarea.GetAttribute("value"), Is.EqualTo(cheesey)); } [Test] @@ -121,7 +121,7 @@ public void SendKeysKeepsCapitalization() IWebElement textarea = driver.FindElement(By.Id("keyUpArea")); string cheesey = "BrIe And CheDdar"; textarea.SendKeys(cheesey); - Assert.AreEqual(textarea.GetAttribute("value"), cheesey); + Assert.That(textarea.GetAttribute("value"), Is.EqualTo(cheesey)); } [Test] @@ -134,7 +134,7 @@ public void ShouldSubmitAFormUsingTheNewlineLiteral() input.SendKeys("\n"); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); Assert.That(driver.Url, Does.EndWith("?x=name")); } @@ -147,7 +147,7 @@ public void ShouldSubmitAFormUsingTheEnterKey() input.SendKeys(Keys.Enter); WaitFor(TitleToBe("We Arrive Here"), "Browser title is not 'We Arrive Here'"); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); Assert.That(driver.Url, Does.EndWith("?x=name")); } @@ -157,14 +157,14 @@ public void ShouldEnterDataIntoFormFields() driver.Url = xhtmlTestPage; IWebElement element = driver.FindElement(By.XPath("//form[@name='someForm']/input[@id='username']")); String originalValue = element.GetAttribute("value"); - Assert.AreEqual(originalValue, "change"); + Assert.That(originalValue, Is.EqualTo("change")); element.Clear(); element.SendKeys("some text"); element = driver.FindElement(By.XPath("//form[@name='someForm']/input[@id='username']")); String newFormValue = element.GetAttribute("value"); - Assert.AreEqual(newFormValue, "some text"); + Assert.That(newFormValue, Is.EqualTo("some text")); } [Test] @@ -173,7 +173,7 @@ public void ShouldBeAbleToAlterTheContentsOfAFileUploadInputElement() string testFileName = string.Format("test-{0}.txt", Guid.NewGuid().ToString("D")); driver.Url = formsPage; IWebElement uploadElement = driver.FindElement(By.Id("upload")); - Assert.That(uploadElement.GetAttribute("value"), Is.Null.Or.EqualTo(string.Empty)); + Assert.That(uploadElement.GetAttribute("value"), Is.Null.Or.Empty); string filePath = System.IO.Path.Combine(EnvironmentManager.Instance.CurrentDirectory, testFileName); System.IO.FileInfo inputFile = new System.IO.FileInfo(filePath); @@ -201,7 +201,7 @@ public void ShouldBeAbleToSendKeysToAFileUploadInputElementInAnXhtmlDocument() driver.Url = xhtmlFormPage; IWebElement uploadElement = driver.FindElement(By.Id("file")); - Assert.AreEqual(string.Empty, uploadElement.GetAttribute("value")); + Assert.That(uploadElement.GetAttribute("value"), Is.Empty); string testFileName = string.Format("test-{0}.txt", Guid.NewGuid().ToString("D")); string filePath = System.IO.Path.Combine(EnvironmentManager.Instance.CurrentDirectory, testFileName); @@ -214,7 +214,7 @@ public void ShouldBeAbleToSendKeysToAFileUploadInputElementInAnXhtmlDocument() string uploadElementValue = uploadElement.GetAttribute("value"); System.IO.FileInfo outputFile = new System.IO.FileInfo(uploadElementValue.Replace('\\', System.IO.Path.DirectorySeparatorChar)); - Assert.AreEqual(inputFile.Name, outputFile.Name); + Assert.That(outputFile.Name, Is.EqualTo(inputFile.Name)); inputFile.Delete(); } @@ -253,11 +253,11 @@ public void SendingKeyboardEventsShouldAppendTextInInputs() IWebElement element = driver.FindElement(By.Id("working")); element.SendKeys("Some"); String value = element.GetAttribute("value"); - Assert.AreEqual(value, "Some"); + Assert.That(value, Is.EqualTo("Some")); element.SendKeys(" text"); value = element.GetAttribute("value"); - Assert.AreEqual(value, "Some text"); + Assert.That(value, Is.EqualTo("Some text")); } [Test] @@ -268,7 +268,7 @@ public void SendingKeyboardEventsShouldAppendTextInInputsWithExistingValue() element.SendKeys(". Some text"); string value = element.GetAttribute("value"); - Assert.AreEqual("Example text. Some text", value); + Assert.That(value, Is.EqualTo("Example text. Some text")); } [Test] @@ -280,7 +280,7 @@ public void SendingKeyboardEventsShouldAppendTextInTextAreas() element.SendKeys(". Some text"); String value = element.GetAttribute("value"); - Assert.AreEqual(value, "Example text. Some text"); + Assert.That(value, Is.EqualTo("Example text. Some text")); } [Test] @@ -288,10 +288,10 @@ public void EmptyTextBoxesShouldReturnAnEmptyStringNotNull() { driver.Url = formsPage; IWebElement emptyTextBox = driver.FindElement(By.Id("working")); - Assert.AreEqual(emptyTextBox.GetAttribute("value"), ""); + Assert.That(emptyTextBox.GetAttribute("value"), Is.Empty); IWebElement emptyTextArea = driver.FindElement(By.Id("emptyTextArea")); - Assert.AreEqual(emptyTextBox.GetAttribute("value"), ""); + Assert.That(emptyTextBox.GetAttribute("value"), Is.Empty); } [Test] @@ -316,7 +316,7 @@ public void HandleFormWithJavascriptAction() string text = alert.Text; alert.Dismiss(); - Assert.AreEqual("Tasty cheese", text); + Assert.That(text, Is.EqualTo("Tasty cheese")); } [Test] @@ -391,12 +391,12 @@ public void ShouldBeAbleToClearTextFromInputElements() IWebElement element = driver.FindElement(By.Id("working")); element.SendKeys("Some text"); String value = element.GetAttribute("value"); - Assert.That(value.Length, Is.GreaterThan(0)); + Assert.That(value, Is.Not.Empty); element.Clear(); value = element.GetAttribute("value"); - Assert.That(value.Length, Is.EqualTo(0)); + Assert.That(value, Is.Empty); } [Test] @@ -406,12 +406,12 @@ public void ShouldBeAbleToClearTextFromTextAreas() IWebElement element = driver.FindElement(By.Id("withText")); element.SendKeys("Some text"); String value = element.GetAttribute("value"); - Assert.That(value.Length, Is.GreaterThan(0)); + Assert.That(value, Is.Not.Empty); element.Clear(); value = element.GetAttribute("value"); - Assert.That(value.Length, Is.EqualTo(0)); + Assert.That(value, Is.Empty); } private void CheckSubmitButton(string buttonId) @@ -424,7 +424,7 @@ private void CheckSubmitButton(string buttonId) WaitFor(TitleToBe("Submitted Successfully!"), "Browser title is not 'Submitted Successfully!'"); - Assert.That(driver.Url.Contains("name=" + name), "URL does not contain 'name=" + name + "'. Actual URL:" + driver.Url); + Assert.That(driver.Url, Does.Contain("name=" + name), "URL does not contain 'name=" + name + "'. Actual URL:" + driver.Url); } private Func TitleToBe(string desiredTitle) diff --git a/dotnet/test/common/FrameSwitchingTest.cs b/dotnet/test/common/FrameSwitchingTest.cs index a5e9777e2f48a..cd23b0c0bbbed 100644 --- a/dotnet/test/common/FrameSwitchingTest.cs +++ b/dotnet/test/common/FrameSwitchingTest.cs @@ -84,7 +84,7 @@ public void ShouldBeAbleToSwitchToAFrameByItsIndex() driver.Url = framesetPage; driver.SwitchTo().Frame(1); - Assert.AreEqual("2", driver.FindElement(By.Id("pageNumber")).Text); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("2")); } [Test] @@ -93,7 +93,7 @@ public void ShouldBeAbleToSwitchToAnIframeByItsIndex() driver.Url = iframePage; driver.SwitchTo().Frame(0); - Assert.AreEqual("name", driver.FindElement(By.Name("id-name1")).GetAttribute("value")); + Assert.That(driver.FindElement(By.Name("id-name1")).GetAttribute("value"), Is.EqualTo("name")); } [Test] @@ -101,7 +101,7 @@ public void ShouldBeAbleToSwitchToAFrameByItsName() { driver.Url = framesetPage; driver.SwitchTo().Frame("fourth"); - Assert.AreEqual("child1", driver.FindElement(By.TagName("frame")).GetAttribute("name")); + Assert.That(driver.FindElement(By.TagName("frame")).GetAttribute("name"), Is.EqualTo("child1")); } @@ -110,7 +110,7 @@ public void ShouldBeAbleToSwitchToAnIframeByItsName() { driver.Url = iframePage; driver.SwitchTo().Frame("iframe1-name"); - Assert.AreEqual("name", driver.FindElement(By.Name("id-name1")).GetAttribute("value")); + Assert.That(driver.FindElement(By.Name("id-name1")).GetAttribute("value"), Is.EqualTo("name")); } @@ -119,7 +119,7 @@ public void ShouldBeAbleToSwitchToAFrameByItsID() { driver.Url = framesetPage; driver.SwitchTo().Frame("fifth"); - Assert.AreEqual("Open new window", driver.FindElement(By.Name("windowOne")).Text); + Assert.That(driver.FindElement(By.Name("windowOne")).Text, Is.EqualTo("Open new window")); } @@ -128,7 +128,7 @@ public void ShouldBeAbleToSwitchToAnIframeByItsID() { driver.Url = iframePage; driver.SwitchTo().Frame("iframe1"); - Assert.AreEqual("name", driver.FindElement(By.Name("id-name1")).GetAttribute("value")); + Assert.That(driver.FindElement(By.Name("id-name1")).GetAttribute("value"), Is.EqualTo("name")); } [Test] @@ -145,7 +145,7 @@ public void ShouldBeAbleToSwitchToAFrameUsingAPreviouslyLocatedWebElement() driver.Url = framesetPage; IWebElement frame = driver.FindElement(By.TagName("frame")); driver.SwitchTo().Frame(frame); - Assert.AreEqual("1", driver.FindElement(By.Id("pageNumber")).Text); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("1")); } [Test] @@ -154,7 +154,7 @@ public void ShouldBeAbleToSwitchToAnIFrameUsingAPreviouslyLocatedWebElement() driver.Url = iframePage; IWebElement frame = driver.FindElement(By.TagName("iframe")); driver.SwitchTo().Frame(frame); - Assert.AreEqual("name", driver.FindElement(By.Name("id-name1")).GetAttribute("value")); + Assert.That(driver.FindElement(By.Name("id-name1")).GetAttribute("value"), Is.EqualTo("name")); } @@ -173,7 +173,7 @@ public void FrameSearchesShouldBeRelativeToTheCurrentlySelectedFrame() IWebElement frameElement = WaitFor(() => driver.FindElement(By.Name("second")), "did not find frame"); driver.SwitchTo().Frame(frameElement); - Assert.AreEqual("2", driver.FindElement(By.Id("pageNumber")).Text); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("2")); Assert.That( () => driver.SwitchTo().Frame("third"), @@ -188,7 +188,7 @@ public void FrameSearchesShouldBeRelativeToTheCurrentlySelectedFrame() driver.SwitchTo().DefaultContent(); driver.SwitchTo().Frame("second"); - Assert.AreEqual("2", driver.FindElement(By.Id("pageNumber")).Text); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("2")); } [Test] @@ -196,7 +196,7 @@ public void ShouldSelectChildFramesByChainedCalls() { driver.Url = framesetPage; driver.SwitchTo().Frame("fourth").SwitchTo().Frame("child2"); - Assert.AreEqual("11", driver.FindElement(By.Id("pageNumber")).Text); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("11")); } [Test] @@ -235,7 +235,7 @@ public void ShouldBeAbleToSwitchToParentFrame() { driver.Url = framesetPage; driver.SwitchTo().Frame("fourth").SwitchTo().ParentFrame().SwitchTo().Frame("first"); - Assert.AreEqual("1", driver.FindElement(By.Id("pageNumber")).Text); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("1")); } [Test] @@ -244,7 +244,7 @@ public void ShouldBeAbleToSwitchToParentFrameFromASecondLevelFrame() driver.Url = framesetPage; driver.SwitchTo().Frame("fourth").SwitchTo().Frame("child1").SwitchTo().ParentFrame().SwitchTo().Frame("child2"); - Assert.AreEqual("11", driver.FindElement(By.Id("pageNumber")).Text); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("11")); } [Test] @@ -252,7 +252,7 @@ public void SwitchingToParentFrameFromDefaultContextIsNoOp() { driver.Url = xhtmlTestPage; driver.SwitchTo().ParentFrame(); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -291,7 +291,7 @@ public void ShouldFocusOnTheReplacementWhenAFrameFollowsALinkToA_TopTargettedPag driver.FindElement(By.LinkText("top")).Click(); WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -314,7 +314,7 @@ public void ShouldAllowTheUserToSwitchToAnIFrameAndRemainFocusedOnIt() driver.FindElement(By.Id("submitButton")).Click(); string hello = GetTextOfGreetingElement(); - Assert.AreEqual(hello, "Success!"); + Assert.That(hello, Is.EqualTo("Success!")); } [Test] @@ -327,11 +327,11 @@ public void ShouldBeAbleToClickInAFrame() driver.FindElement(By.Id("submitButton")).Click(); // driver should still be focused on frame "third" ... - Assert.AreEqual("Success!", GetTextOfGreetingElement()); + Assert.That(GetTextOfGreetingElement(), Is.EqualTo("Success!")); // Make sure it was really frame "third" which was replaced ... driver.SwitchTo().DefaultContent().SwitchTo().Frame("third"); - Assert.AreEqual("Success!", GetTextOfGreetingElement()); + Assert.That(GetTextOfGreetingElement(), Is.EqualTo("Success!")); } [Test] @@ -354,11 +354,11 @@ public void ShouldBeAbleToClickInASubFrame() driver.FindElement(By.Id("submitButton")).Click(); // driver should still be focused on frame "iframe1" inside frame "sixth" ... - Assert.AreEqual("Success!", GetTextOfGreetingElement()); + Assert.That(GetTextOfGreetingElement(), Is.EqualTo("Success!")); // Make sure it was really frame "iframe1" inside frame "sixth" which was replaced ... driver.SwitchTo().DefaultContent().SwitchTo().Frame("sixth").SwitchTo().Frame("iframe1"); - Assert.AreEqual("Success!", driver.FindElement(By.Id("greeting")).Text); + Assert.That(driver.FindElement(By.Id("greeting")).Text, Is.EqualTo("Success!")); } [Test] @@ -377,21 +377,21 @@ public void ShouldBeAbleToFindElementsInIframesByXPath() public void GetCurrentUrlShouldReturnTopLevelBrowsingContextUrl() { driver.Url = framesetPage; - Assert.AreEqual(framesetPage, driver.Url); + Assert.That(driver.Url, Is.EqualTo(framesetPage)); driver.SwitchTo().Frame("second"); - Assert.AreEqual(framesetPage, driver.Url); + Assert.That(driver.Url, Is.EqualTo(framesetPage)); } [Test] public void GetCurrentUrlShouldReturnTopLevelBrowsingContextUrlForIframes() { driver.Url = iframePage; - Assert.AreEqual(iframePage, driver.Url); + Assert.That(driver.Url, Is.EqualTo(iframePage)); driver.SwitchTo().Frame("iframe1"); - Assert.AreEqual(iframePage, driver.Url); + Assert.That(driver.Url, Is.EqualTo(iframePage)); } [Test] @@ -476,7 +476,7 @@ public void ShouldReturnWindowTitleInAFrameset() { driver.Url = framesetPage; driver.SwitchTo().Frame("third"); - Assert.AreEqual("Unique title", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Unique title")); } [Test] @@ -518,7 +518,7 @@ public void ShouldNotSwitchMagicallyToTheTopWindow() { url = url.Substring(0, url.Length - 1); } - Assert.AreEqual(baseUrl + "bug4876_iframe.html", url); + Assert.That(url, Is.EqualTo(baseUrl + "bug4876_iframe.html")); } } } @@ -557,13 +557,13 @@ public void ShouldBeAbleToSelectAFrameByName() driver.Url = framesetPage; driver.SwitchTo().Frame("second"); - Assert.AreEqual(driver.FindElement(By.Id("pageNumber")).Text, "2"); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("2")); driver.SwitchTo().DefaultContent().SwitchTo().Frame("third"); driver.FindElement(By.Id("changeme")).Click(); driver.SwitchTo().DefaultContent().SwitchTo().Frame("second"); - Assert.AreEqual(driver.FindElement(By.Id("pageNumber")).Text, "2"); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("2")); } [Test] diff --git a/dotnet/test/common/GetLogsTest.cs b/dotnet/test/common/GetLogsTest.cs index 59e28ba091aa3..79524819f2e7e 100644 --- a/dotnet/test/common/GetLogsTest.cs +++ b/dotnet/test/common/GetLogsTest.cs @@ -89,7 +89,7 @@ public void TurningOffLogShouldMeanNoLogMessages() { CreateWebDriverWithLogging(logType, LogLevel.Off); ReadOnlyCollection entries = localDriver.Manage().Logs.GetLog(logType); - Assert.AreEqual(0, entries.Count, string.Format("There should be no log entries for log type {0} when logging is turned off.", logType)); + Assert.That(entries, Is.Empty, string.Format("There should be no log entries for log type {0} when logging is turned off.", logType)); QuitDriver(); } } diff --git a/dotnet/test/common/GetMultipleAttributeTest.cs b/dotnet/test/common/GetMultipleAttributeTest.cs index 48e441b50d4e5..26cf57d4813c1 100644 --- a/dotnet/test/common/GetMultipleAttributeTest.cs +++ b/dotnet/test/common/GetMultipleAttributeTest.cs @@ -37,7 +37,7 @@ public void MultipleAttributeShouldBeTrueWhenSet() { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithMultipleEqualsMultiple")); - Assert.AreEqual("true", element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.EqualTo("true")); } [Test] @@ -45,7 +45,7 @@ public void MultipleAttributeShouldBeTrueWhenSelectHasMutilpeWithValueAsBlank() { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithEmptyStringMultiple")); - Assert.AreEqual("true", element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.EqualTo("true")); } [Test] @@ -53,7 +53,7 @@ public void MultipleAttributeShouldBeTrueWhenSelectHasMutilpeWithoutAValue() { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithMultipleWithoutValue")); - Assert.AreEqual("true", element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.EqualTo("true")); } [Test] @@ -61,7 +61,7 @@ public void MultipleAttributeShouldBeTrueWhenSelectHasMutilpeWithValueAsSomethin { driver.Url = selectPage; IWebElement element = driver.FindElement(By.Id("selectWithRandomMultipleValue")); - Assert.AreEqual("true", element.GetAttribute("multiple")); + Assert.That(element.GetAttribute("multiple"), Is.EqualTo("true")); } } } diff --git a/dotnet/test/common/I18Test.cs b/dotnet/test/common/I18Test.cs index 9c115b89b6dd9..eeed6e357e5c8 100644 --- a/dotnet/test/common/I18Test.cs +++ b/dotnet/test/common/I18Test.cs @@ -49,7 +49,7 @@ public void ShouldBeAbleToEnterHebrewTextFromLeftToRight() input.SendKeys(shalom); - Assert.AreEqual(shalom, input.GetAttribute("value")); + Assert.That(input.GetAttribute("value"), Is.EqualTo(shalom)); } [Test] @@ -60,7 +60,7 @@ public void ShouldBeAbleToEnterHebrewTextFromRightToLeft() input.SendKeys(tmunot); - Assert.AreEqual(tmunot, input.GetAttribute("value")); + Assert.That(input.GetAttribute("value"), Is.EqualTo(tmunot)); } [Test] @@ -86,7 +86,7 @@ public void ShouldBeAbleToEnterSupplementaryCharacters() IWebElement el = driver.FindElement(By.Name("i18n")); el.SendKeys(input); - Assert.AreEqual(input, el.GetAttribute("value")); + Assert.That(el.GetAttribute("value"), Is.EqualTo(input)); } [Test] @@ -98,7 +98,7 @@ public void ShouldBeAbleToReturnTheTextInAPage() string text = driver.FindElement(By.TagName("body")).Text; - Assert.AreEqual(shalom, text); + Assert.That(text, Is.EqualTo(shalom)); } } } diff --git a/dotnet/test/common/ImplicitWaitTest.cs b/dotnet/test/common/ImplicitWaitTest.cs index fc55cb7fbd153..4c6f6592abd54 100644 --- a/dotnet/test/common/ImplicitWaitTest.cs +++ b/dotnet/test/common/ImplicitWaitTest.cs @@ -86,7 +86,7 @@ public void ShouldStillFailToFindElementsWhenImplicitWaitsAreEnabled() driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(500); ReadOnlyCollection elements = driver.FindElements(By.ClassName("redbox")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } [Test] @@ -99,7 +99,7 @@ public void ShouldReturnAfterFirstAttemptToFindManyAfterDisablingImplicitWaits() driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(0); add.Click(); ReadOnlyCollection elements = driver.FindElements(By.ClassName("redbox")); - Assert.AreEqual(0, elements.Count); + Assert.That(elements, Is.Empty); } [Test] diff --git a/dotnet/test/common/Interactions/ActionBuilderTest.cs b/dotnet/test/common/Interactions/ActionBuilderTest.cs index a762bc92639d2..d7acb6a95888f 100644 --- a/dotnet/test/common/Interactions/ActionBuilderTest.cs +++ b/dotnet/test/common/Interactions/ActionBuilderTest.cs @@ -19,7 +19,6 @@ using NUnit.Framework; using System; -using System.Collections; using System.Collections.Generic; namespace OpenQA.Selenium.Interactions @@ -52,11 +51,12 @@ public void OutputsPointerEventsToDictionary() var dictionary = sequence[0].ToDictionary(); Console.WriteLine(dictionary); - Assert.AreEqual("pointer", dictionary["type"]); - Assert.NotNull(dictionary["id"]); - Assert.NotNull(dictionary["parameters"]); + Assert.That(dictionary, Does.ContainKey("type").WithValue("pointer")); + Assert.That(dictionary["id"], Is.Not.Null); + Assert.That(dictionary["parameters"], Is.Not.Null); + var parameters = new Dictionary { { "pointerType", "pen" } }; - CollectionAssert.AreEquivalent(parameters, (IEnumerable)dictionary["parameters"]); + Assert.That(dictionary["parameters"], Is.EquivalentTo(parameters)); var events = new Dictionary { @@ -72,8 +72,8 @@ public void OutputsPointerEventsToDictionary() {"type", "pointerDown"}, {"button", 0} }; - var actions = (IList)dictionary["actions"]; - CollectionAssert.AreEquivalent(events, (IEnumerable)actions[0]); + var actions = (IList)dictionary["actions"]; + Assert.That(actions[0], Is.EquivalentTo(events)); } } } diff --git a/dotnet/test/common/Interactions/BasicKeyboardInterfaceTest.cs b/dotnet/test/common/Interactions/BasicKeyboardInterfaceTest.cs index 88f148ca1cf3d..88c235a5a19b8 100644 --- a/dotnet/test/common/Interactions/BasicKeyboardInterfaceTest.cs +++ b/dotnet/test/common/Interactions/BasicKeyboardInterfaceTest.cs @@ -58,7 +58,7 @@ public void ShouldSetActiveKeyboard() KeyInputDevice device = actionProvider.GetActiveKeyboard(); - Assert.AreEqual("test keyboard", device.DeviceName); + Assert.That(device.DeviceName, Is.EqualTo("test keyboard")); } [Test] @@ -77,7 +77,7 @@ public void ShouldAllowBasicKeyboardInput() sendLowercase.Perform(); - Assert.AreEqual("abc def", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("abc def")); } @@ -154,7 +154,7 @@ public void ShouldAllowSendingKeysWithShiftPressed() AssertThatFormEventsFiredAreExactly("focus keydown keydown keypress keyup keydown keypress keyup keyup"); - Assert.AreEqual("AB", keysEventInput.GetAttribute("value")); + Assert.That(keysEventInput.GetAttribute("value"), Is.EqualTo("AB")); } [Test] @@ -333,12 +333,12 @@ public void ShouldAllowSendingKeysWithLeftShiftPressed() AssertThatFormEventsFiredAreExactly("focus keydown keydown keypress keyup keydown keypress keyup keyup"); - Assert.AreEqual("AB", keysEventInput.GetAttribute("value")); + Assert.That(keysEventInput.GetAttribute("value"), Is.EqualTo("AB")); } private void AssertThatFormEventsFiredAreExactly(string message, string expected) { - Assert.AreEqual(expected, driver.FindElement(By.Id("result")).Text.Trim(), message); + Assert.That(driver.FindElement(By.Id("result")).Text.Trim(), Is.EqualTo(expected), message); } private void AssertThatFormEventsFiredAreExactly(string expected) @@ -348,7 +348,7 @@ private void AssertThatFormEventsFiredAreExactly(string expected) private void AssertThatBodyEventsFiredAreExactly(string expected) { - Assert.AreEqual(expected, driver.FindElement(By.Id("body_result")).Text.Trim()); + Assert.That(driver.FindElement(By.Id("body_result")).Text.Trim(), Is.EqualTo(expected)); } private Func BackgroundColorToChangeFrom(IWebElement element, Color currentColor) diff --git a/dotnet/test/common/Interactions/BasicMouseInterfaceTest.cs b/dotnet/test/common/Interactions/BasicMouseInterfaceTest.cs index f88252cc4d1a9..41ffa4812164f 100644 --- a/dotnet/test/common/Interactions/BasicMouseInterfaceTest.cs +++ b/dotnet/test/common/Interactions/BasicMouseInterfaceTest.cs @@ -45,7 +45,7 @@ public void ShouldSetActivePointer() PointerInputDevice device = actionProvider.GetActivePointer(); - Assert.AreEqual("test mouse", device.DeviceName); + Assert.That(device.DeviceName, Is.EqualTo("test mouse")); } [Test] @@ -53,7 +53,7 @@ public void ShouldAllowDraggingElementWithMouseMovesItToAnotherList() { PerformDragAndDropWithMouse(); IWebElement dragInto = driver.FindElement(By.Id("sortable1")); - Assert.AreEqual(6, dragInto.FindElements(By.TagName("li")).Count); + Assert.That(dragInto.FindElements(By.TagName("li")), Has.Exactly(6).Items); } // This test is very similar to DraggingElementWithMouse. The only @@ -116,7 +116,7 @@ public void ShouldAllowDragAndDrop() dropInto = driver.FindElement(By.Id("droppable")); string text = dropInto.FindElement(By.TagName("p")).Text; - Assert.AreEqual("Dropped!", text); + Assert.That(text, Is.EqualTo("Dropped!")); } [Test] @@ -130,7 +130,7 @@ public void ShouldAllowDoubleClick() IAction dblClick = actionProvider.DoubleClick(toDoubleClick).Build(); dblClick.Perform(); - Assert.AreEqual("DoubleClicked", toDoubleClick.GetAttribute("value")); + Assert.That(toDoubleClick.GetAttribute("value"), Is.EqualTo("DoubleClicked")); } [Test] @@ -144,7 +144,7 @@ public void ShouldAllowContextClick() IAction contextClick = actionProvider.ContextClick(toContextClick).Build(); contextClick.Perform(); - Assert.AreEqual("ContextClicked", toContextClick.GetAttribute("value")); + Assert.That(toContextClick.GetAttribute("value"), Is.EqualTo("ContextClicked")); } [Test] @@ -159,7 +159,7 @@ public void ShouldAllowMoveAndClick() IAction contextClick = actionProvider.MoveToElement(toClick).Click().Build(); contextClick.Perform(); - Assert.AreEqual("Clicked", toClick.GetAttribute("value"), "Value should change to Clicked."); + Assert.That(toClick.GetAttribute("value"), Is.EqualTo("Clicked"), "Value should change to Clicked."); } [Test] @@ -175,8 +175,8 @@ public void ShouldMoveToLocation() IWebElement location = driver.FindElement(By.Id("absolute-location")); var coordinates = location.Text.Split(','); - Assert.AreEqual("100", coordinates[0].Trim()); - Assert.AreEqual("200", coordinates[1].Trim()); + Assert.That(coordinates[0].Trim(), Is.EqualTo("100")); + Assert.That(coordinates[1].Trim(), Is.EqualTo("200")); } [Test] @@ -286,14 +286,14 @@ public void ShouldAllowUsersToHoverOverElements() } IWebElement item = driver.FindElement(By.Id("item1")); - Assert.AreEqual("", item.Text); + Assert.That(item.Text, Is.EqualTo("")); ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].style.background = 'green'", element); Actions actionBuilder = new Actions(driver); actionBuilder.MoveToElement(element).Perform(); item = driver.FindElement(By.Id("item1")); - Assert.AreEqual("Item 1", item.Text); + Assert.That(item.Text, Is.EqualTo("Item 1")); } [Test] @@ -307,7 +307,7 @@ public void HoverPersists() IWebElement element = driver.FindElement(By.Id("menu1")); IWebElement item = driver.FindElement(By.Id("item1")); - Assert.AreEqual(string.Empty, item.Text); + Assert.That(item.Text, Is.Empty); ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].style.background = 'green'", element); new Actions(driver).MoveToElement(element).Perform(); @@ -317,7 +317,7 @@ public void HoverPersists() WaitFor(ElementTextToNotEqual(item, ""), "Element text was empty after timeout"); - Assert.AreEqual("Item 1", item.Text); + Assert.That(item.Text, Is.EqualTo("Item 1")); } [Test] @@ -462,7 +462,7 @@ private void PerformDragAndDropWithMouse() IAction drop = new Actions(driver).Release(dragInto).Build(); - Assert.AreEqual("Nothing happened.", dragReporter.Text); + Assert.That(dragReporter.Text, Is.EqualTo("Nothing happened.")); holdItem.Perform(); moveToSpecificItem.Perform(); diff --git a/dotnet/test/common/Interactions/BasicWheelInterfaceTest.cs b/dotnet/test/common/Interactions/BasicWheelInterfaceTest.cs index f46cb647dc510..38ef28a7a8fcd 100644 --- a/dotnet/test/common/Interactions/BasicWheelInterfaceTest.cs +++ b/dotnet/test/common/Interactions/BasicWheelInterfaceTest.cs @@ -46,7 +46,7 @@ public void ShouldSetActiveWheel() WheelInputDevice device = actionProvider.GetActiveWheel(); - Assert.AreEqual("test wheel", device.DeviceName); + Assert.That(device.DeviceName, Is.EqualTo("test wheel")); } [Test] @@ -56,11 +56,11 @@ public void ShouldAllowScrollingToAnElement() driver.Url = scrollFrameOutOfViewport; IWebElement iframe = driver.FindElement(By.TagName("iframe")); - Assert.IsFalse(IsInViewport(iframe)); + Assert.That(IsInViewport(iframe), Is.False); new Actions(driver).ScrollToElement(iframe).Build().Perform(); - Assert.IsTrue(IsInViewport(iframe)); + Assert.That(IsInViewport(iframe), Is.True); } [Test] @@ -78,7 +78,7 @@ public void ShouldScrollFromElementByGivenAmount() driver.SwitchTo().Frame(iframe); IWebElement checkbox = driver.FindElement(By.Name("scroll_checkbox")); - Assert.IsTrue(IsInViewport(checkbox)); + Assert.That(IsInViewport(checkbox), Is.True); } [Test] @@ -99,7 +99,7 @@ public void ShouldAllowScrollingFromElementByGivenAmountWithOffset() IWebElement iframe = driver.FindElement(By.TagName("iframe")); driver.SwitchTo().Frame(iframe); IWebElement checkbox = driver.FindElement(By.Name("scroll_checkbox")); - Assert.IsTrue(IsInViewport(checkbox)); + Assert.That(IsInViewport(checkbox), Is.True); } [Test] @@ -128,7 +128,7 @@ public void ShouldAllowScrollingFromViewportByGivenAmount() new Actions(driver).ScrollByAmount(0, deltaY).Build().Perform(); - Assert.IsTrue(IsInViewport(footer)); + Assert.That(IsInViewport(footer), Is.True); } [Test] @@ -147,7 +147,7 @@ public void ShouldAllowScrollingFromViewportByGivenAmountFromOrigin() IWebElement iframe = driver.FindElement(By.TagName("iframe")); driver.SwitchTo().Frame(iframe); IWebElement checkbox = driver.FindElement(By.Name("scroll_checkbox")); - Assert.IsTrue(IsInViewport(checkbox)); + Assert.That(IsInViewport(checkbox), Is.True); } [Test] diff --git a/dotnet/test/common/Interactions/CombinedInputActionsTest.cs b/dotnet/test/common/Interactions/CombinedInputActionsTest.cs index 9133254c209c5..9fcb0d42422c7 100644 --- a/dotnet/test/common/Interactions/CombinedInputActionsTest.cs +++ b/dotnet/test/common/Interactions/CombinedInputActionsTest.cs @@ -70,7 +70,7 @@ public void PlainClickingOnMultiSelectionList() showButton.Click(); IWebElement resultElement = driver.FindElement(By.Id("result")); - Assert.AreEqual("cheddar", resultElement.Text, "Should have picked the third option only."); + Assert.That(resultElement.Text, Is.EqualTo("cheddar"), "Should have picked the third option only."); } [Test] @@ -94,7 +94,7 @@ public void ShouldAllowSettingActivePointerWithKeyBoardActions() loginAction.Perform(); IAlert alert = driver.SwitchTo().Alert(); - Assert.AreEqual("You have successfully logged in.", alert.Text); + Assert.That(alert.Text, Is.EqualTo("You have successfully logged in.")); alert.Accept(); } @@ -120,7 +120,7 @@ public void ShiftClickingOnMultiSelectionList() showButton.Click(); IWebElement resultElement = driver.FindElement(By.Id("result")); - Assert.AreEqual("roquefort parmigiano cheddar", resultElement.Text, "Should have picked the last three options."); + Assert.That(resultElement.Text, Is.EqualTo("roquefort parmigiano cheddar"), "Should have picked the last three options."); } [Test] @@ -149,7 +149,7 @@ public void ControlClickingOnMultiSelectionList() showButton.Click(); IWebElement resultElement = driver.FindElement(By.Id("result")); - Assert.AreEqual("roquefort cheddar", resultElement.Text, "Should have picked the first and third options."); + Assert.That(resultElement.Text, Is.EqualTo("roquefort cheddar"), "Should have picked the first and third options."); } [Test] @@ -165,7 +165,7 @@ public void ControlClickingOnCustomMultiSelectionList() IWebElement reportingElement = driver.FindElement(By.Id("infodiv")); - Assert.AreEqual("no info", reportingElement.Text); + Assert.That(reportingElement.Text, Is.EqualTo("no info")); ReadOnlyCollection listItems = driver.FindElements(By.TagName("li")); @@ -177,11 +177,11 @@ public void ControlClickingOnCustomMultiSelectionList() selectThreeItems.Perform(); - Assert.AreEqual("#item2 #item4 #item6", reportingElement.Text); + Assert.That(reportingElement.Text, Is.EqualTo("#item2 #item4 #item6")); // Now click on another element, make sure that's the only one selected. new Actions(driver).Click(listItems[6]).Build().Perform(); - Assert.AreEqual("#item7", reportingElement.Text); + Assert.That(reportingElement.Text, Is.EqualTo("#item7")); } [Test] @@ -292,7 +292,7 @@ public void ChordControlCutAndPaste() .SendKeys(element, "abc def") .Perform(); - Assert.AreEqual("abc def", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abc def")); //TODO: Figure out why calling sendKey(Key.CONTROL + "a") and then //sendKeys("x") does not work on Linux. @@ -303,7 +303,7 @@ public void ChordControlCutAndPaste() // Release keys before next step. new Actions(driver).SendKeys(Keys.Null).Perform(); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); new Actions(driver).KeyDown(controlModifier) .SendKeys("v") @@ -312,7 +312,7 @@ public void ChordControlCutAndPaste() new Actions(driver).SendKeys(Keys.Null).Perform(); - Assert.AreEqual("abc defabc def", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abc defabc def")); } [Test] @@ -331,8 +331,8 @@ public void CombiningShiftAndClickResultsInANewWindow() .KeyUp(Keys.Shift) .Perform(); WaitFor(() => { return driver.WindowHandles.Count > 1; }, "Did not receive new window"); - Assert.AreEqual(2, driver.WindowHandles.Count, "Should have opened a new window."); - Assert.AreEqual(originalTitle, driver.Title, "Should not have navigated away."); + Assert.That(driver.WindowHandles, Has.Exactly(2).Items, "Should have opened a new window."); + Assert.That(driver.Title, Is.EqualTo(originalTitle), "Should not have navigated away."); string originalHandle = driver.CurrentWindowHandle; foreach (string newHandle in driver.WindowHandles) @@ -358,7 +358,7 @@ public void HoldingDownShiftKeyWhileClicking() new Actions(driver).MoveToElement(toClick).KeyDown(Keys.Shift).Click().KeyUp(Keys.Shift).Perform(); IWebElement shiftInfo = WaitFor(() => { return driver.FindElement(By.Id("shiftKey")); }, "Could not find element with id 'shiftKey'"); - Assert.AreEqual("true", shiftInfo.Text); + Assert.That(shiftInfo.Text, Is.EqualTo("true")); } [Test] @@ -373,7 +373,7 @@ public void CanClickOnSuckerFishStyleMenu() IWebElement element = driver.FindElement(By.Id("menu1")); IWebElement target = driver.FindElement(By.Id("item1")); - Assert.AreEqual(string.Empty, target.Text); + Assert.That(target.Text, Is.Empty); ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].style.background = 'green'", element); new Actions(driver).MoveToElement(element).Build().Perform(); @@ -413,7 +413,7 @@ public void PerformsPause() { DateTime start = DateTime.Now; new Actions(driver).Pause(TimeSpan.FromMilliseconds(1200)).Build().Perform(); - Assert.IsTrue(DateTime.Now - start > TimeSpan.FromMilliseconds(1200)); + Assert.That(DateTime.Now - start > TimeSpan.FromMilliseconds(1200), Is.True); } [Test] diff --git a/dotnet/test/common/Interactions/DragAndDropTest.cs b/dotnet/test/common/Interactions/DragAndDropTest.cs index 87a900aefa86b..0eb0f98c03d5d 100644 --- a/dotnet/test/common/Interactions/DragAndDropTest.cs +++ b/dotnet/test/common/Interactions/DragAndDropTest.cs @@ -44,13 +44,13 @@ public void DragAndDropRelative() driver.Url = dragAndDropPage; IWebElement img = driver.FindElement(By.Id("test1")); Point expectedLocation = Drag(img, img.Location, 150, 200); - Assert.AreEqual(expectedLocation, img.Location); + Assert.That(img.Location, Is.EqualTo(expectedLocation)); expectedLocation = Drag(img, img.Location, -50, -25); - Assert.AreEqual(expectedLocation, img.Location); + Assert.That(img.Location, Is.EqualTo(expectedLocation)); expectedLocation = Drag(img, img.Location, 0, 0); - Assert.AreEqual(expectedLocation, img.Location); + Assert.That(img.Location, Is.EqualTo(expectedLocation)); expectedLocation = Drag(img, img.Location, 1, -1); - Assert.AreEqual(expectedLocation, img.Location); + Assert.That(img.Location, Is.EqualTo(expectedLocation)); } [Test] @@ -61,7 +61,7 @@ public void DragAndDropToElement() IWebElement img2 = driver.FindElement(By.Id("test2")); Actions actionProvider = new Actions(driver); actionProvider.DragAndDrop(img2, img1).Perform(); - Assert.AreEqual(img1.Location, img2.Location); + Assert.That(img2.Location, Is.EqualTo(img1.Location)); } [Test] @@ -87,7 +87,7 @@ public void DragAndDropToElementInIframe() IWebElement img2 = driver.FindElement(By.Id("test2")); new Actions(driver).DragAndDrop(img2, img1).Perform(); - Assert.AreEqual(img1.Location, img2.Location); + Assert.That(img2.Location, Is.EqualTo(img1.Location)); } [Test] @@ -103,7 +103,7 @@ public void DragAndDropElementWithOffsetInIframeAtBottom() new Actions(driver).DragAndDropToOffset(img1, 20, 20).Perform(); initial.Offset(20, 20); - Assert.AreEqual(initial, img1.Location); + Assert.That(img1.Location, Is.EqualTo(initial)); } [Test] @@ -126,7 +126,7 @@ public void DragAndDropElementWithOffsetInScrolledDiv() new Actions(driver).DragAndDropToOffset(el, 3700, 3700).Perform(); initial.Offset(3700, 3700); - Assert.AreEqual(initial, el.Location); + Assert.That(el.Location, Is.EqualTo(initial)); } [Test] @@ -137,7 +137,7 @@ public void ElementInDiv() Point startLocation = img.Location; Point expectedLocation = Drag(img, startLocation, 100, 100); Point endLocation = img.Location; - Assert.AreEqual(expectedLocation, endLocation); + Assert.That(endLocation, Is.EqualTo(expectedLocation)); } [Test] @@ -172,7 +172,7 @@ public void ShouldAllowUsersToDragAndDropToElementsOffTheCurrentViewPort() driver.Url = dragAndDropPage; IWebElement img = driver.FindElement(By.Id("test3")); Point expectedLocation = Drag(img, img.Location, 100, 100); - Assert.AreEqual(expectedLocation, img.Location); + Assert.That(img.Location, Is.EqualTo(expectedLocation)); } finally { @@ -204,15 +204,15 @@ public void DragAndDropOnJQueryItems() text = dropInto.FindElement(By.TagName("p")).Text; } - Assert.AreEqual("Dropped!", text); + Assert.That(text, Is.EqualTo("Dropped!")); IWebElement reporter = driver.FindElement(By.Id("drop_reports")); // Assert that only one mouse click took place and the mouse was moved // during it. string reporterText = reporter.Text; Assert.That(reporterText, Does.Match("start( move)* down( move)+ up")); - Assert.AreEqual(1, Regex.Matches(reporterText, "down").Count, "Reporter text:" + reporterText); - Assert.AreEqual(1, Regex.Matches(reporterText, "up").Count, "Reporter text:" + reporterText); + Assert.That(Regex.Matches(reporterText, "down"), Has.Count.EqualTo(1), "Reporter text:" + reporterText); + Assert.That(Regex.Matches(reporterText, "up"), Has.Count.EqualTo(1), "Reporter text:" + reporterText); Assert.That(reporterText, Does.Contain("move")); } @@ -230,11 +230,11 @@ public void CanDragAnElementNotVisibleInTheCurrentViewportDueToAParentOverflow() Point targetLocation = dragTo.Location; int yOffset = targetLocation.Y - srcLocation.Y; - Assert.AreNotEqual(0, yOffset); + Assert.That(yOffset, Is.Not.Zero); new Actions(driver).DragAndDropToOffset(toDrag, 0, yOffset).Perform(); - Assert.AreEqual(dragTo.Location, toDrag.Location); + Assert.That(toDrag.Location, Is.EqualTo(dragTo.Location)); } //------------------------------------------------------------------ @@ -250,7 +250,7 @@ public void DragAndDropRelativeAndToElement() actionProvider.DragAndDropToOffset(img1, 100, 100).Perform(); actionProvider.Reset(); actionProvider.DragAndDrop(img2, img1).Perform(); - Assert.AreEqual(img1.Location, img2.Location); + Assert.That(img2.Location, Is.EqualTo(img1.Location)); } private Point Drag(IWebElement elem, Point initialLocation, int moveRightBy, int moveDownBy) diff --git a/dotnet/test/common/Internal/Logging/FileLogHandlerTest.cs b/dotnet/test/common/Internal/Logging/FileLogHandlerTest.cs index 63deb2bece47b..5c3e3150061dd 100644 --- a/dotnet/test/common/Internal/Logging/FileLogHandlerTest.cs +++ b/dotnet/test/common/Internal/Logging/FileLogHandlerTest.cs @@ -72,7 +72,7 @@ public void ShouldCreateFileIfDoesNotExist() fileLogHandler2.Handle(new LogEvent(typeof(FileLogHandlerTest), DateTimeOffset.Now, LogEventLevel.Info, "test message")); } - Assert.That(Regex.Matches(File.ReadAllText(tempFile), "test message").Count, Is.EqualTo(1)); + Assert.That(Regex.Matches(File.ReadAllText(tempFile), "test message"), Has.Count.EqualTo(1)); } finally { @@ -97,7 +97,7 @@ public void ShouldAppendFileIfExists() fileLogHandler2.Handle(new LogEvent(typeof(FileLogHandlerTest), DateTimeOffset.Now, LogEventLevel.Info, "test message")); } - Assert.That(Regex.Matches(File.ReadAllText(tempFilePath), "test message").Count, Is.EqualTo(2)); + Assert.That(Regex.Matches(File.ReadAllText(tempFilePath), "test message"), Has.Count.EqualTo(2)); } finally { @@ -117,7 +117,7 @@ public void ShouldOverwriteFileIfExists() fileLogHandler.Handle(new LogEvent(typeof(FileLogHandlerTest), DateTimeOffset.Now, LogEventLevel.Info, "test message")); } - Assert.That(Regex.Matches(File.ReadAllText(tempFile), "test message").Count, Is.EqualTo(1)); + Assert.That(Regex.Matches(File.ReadAllText(tempFile), "test message"), Has.Count.EqualTo(1)); } finally { @@ -137,7 +137,7 @@ public void ShouldAppendFileIfDoesNotExist() fileLogHandler.Handle(new LogEvent(typeof(FileLogHandlerTest), DateTimeOffset.Now, LogEventLevel.Info, "test message")); } - Assert.That(Regex.Matches(File.ReadAllText(tempFilePath), "test message").Count, Is.EqualTo(1)); + Assert.That(Regex.Matches(File.ReadAllText(tempFilePath), "test message"), Has.Count.EqualTo(1)); } finally { diff --git a/dotnet/test/common/JavascriptEnabledBrowserTest.cs b/dotnet/test/common/JavascriptEnabledBrowserTest.cs index 2c87086c89703..ea9d267db29d8 100644 --- a/dotnet/test/common/JavascriptEnabledBrowserTest.cs +++ b/dotnet/test/common/JavascriptEnabledBrowserTest.cs @@ -32,9 +32,9 @@ public void DocumentShouldReflectLatestTitle() { driver.Url = javascriptPage; - Assert.AreEqual("Testing Javascript", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Testing Javascript")); driver.FindElement(By.LinkText("Change the page title!")).Click(); - Assert.AreEqual("Changed", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Changed")); } [Test] @@ -42,13 +42,13 @@ public void DocumentShouldReflectLatestDom() { driver.Url = javascriptPage; String currentText = driver.FindElement(By.XPath("//div[@id='dynamo']")).Text; - Assert.AreEqual("What's for dinner?", currentText); + Assert.That(currentText, Is.EqualTo("What's for dinner?")); IWebElement element = driver.FindElement(By.LinkText("Update a div")); element.Click(); String newText = driver.FindElement(By.XPath("//div[@id='dynamo']")).Text; - Assert.AreEqual("Fish and chips!", newText); + Assert.That(newText, Is.EqualTo("Fish and chips!")); } [Test] @@ -60,7 +60,7 @@ public void ShouldWaitForLoadsToCompleteAfterJavascriptCausesANewPageToLoad() driver.FindElement(By.Id("changeme")).Click(); WaitFor(() => { return driver.Title == "Page3"; }, "Browser title was not 'Page3'"); - Assert.AreEqual("Page3", driver.Title); + Assert.That(driver.Title, Is.EqualTo("Page3")); } [Test] @@ -73,7 +73,7 @@ public void ShouldBeAbleToFindElementAfterJavascriptCausesANewPageToLoad() driver.FindElement(By.Id("changeme")).Click(); WaitFor(() => { return driver.Title == "Page3"; }, "Browser title was not 'Page3'"); - Assert.AreEqual("3", driver.FindElement(By.Id("pageNumber")).Text); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("3")); } [Test] @@ -83,7 +83,7 @@ public void ShouldFireOnChangeEventWhenSettingAnElementsValue() driver.FindElement(By.Id("change")).SendKeys("foo"); String result = driver.FindElement(By.Id("result")).Text; - Assert.AreEqual("change", result); + Assert.That(result, Is.EqualTo("change")); } [Test] @@ -94,7 +94,7 @@ public void ShouldBeAbleToSubmitFormsByCausingTheOnClickEventToFire() element.Click(); WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title was not 'We Arrive Here'"); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -105,7 +105,7 @@ public void ShouldBeAbleToClickOnSubmitButtons() element.Click(); WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title was not 'We Arrive Here'"); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -113,11 +113,11 @@ public void Issue80ClickShouldGenerateClickEvent() { driver.Url = javascriptPage; IWebElement element = driver.FindElement(By.Id("clickField")); - Assert.AreEqual("Hello", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("Hello")); element.Click(); - Assert.AreEqual("Clicked", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("Clicked")); } [Test] @@ -128,7 +128,7 @@ public void ShouldBeAbleToSwitchToFocusedElement() driver.FindElement(By.Id("switchFocus")).Click(); IWebElement element = driver.SwitchTo().ActiveElement(); - Assert.AreEqual("theworks", element.GetAttribute("id")); + Assert.That(element.GetAttribute("id"), Is.EqualTo("theworks")); } [Test] @@ -138,7 +138,7 @@ public void IfNoElementHasFocusTheActiveElementIsTheBody() IWebElement element = driver.SwitchTo().ActiveElement(); - Assert.AreEqual("body", element.GetAttribute("name")); + Assert.That(element.GetAttribute("name"), Is.EqualTo("body")); } [Test] diff --git a/dotnet/test/common/MiscTest.cs b/dotnet/test/common/MiscTest.cs index a979bd1071d60..dbccd948ed371 100644 --- a/dotnet/test/common/MiscTest.cs +++ b/dotnet/test/common/MiscTest.cs @@ -40,13 +40,13 @@ public void ShouldReturnTitleOfPageIfSet() public void ShouldReportTheCurrentUrlCorrectly() { driver.Url = macbethPage; - Assert.AreEqual(macbethPage, driver.Url); + Assert.That(driver.Url, Is.EqualTo(macbethPage)); driver.Url = simpleTestPage; - Assert.AreEqual(simpleTestPage, driver.Url); + Assert.That(driver.Url, Is.EqualTo(simpleTestPage)); driver.Url = javascriptPage; - Assert.AreEqual(javascriptPage, driver.Url); + Assert.That(driver.Url, Is.EqualTo(javascriptPage)); } [Test] @@ -82,7 +82,7 @@ public void ShouldBeAbleToGetTheSourceOfAnXmlDocument() driver.Url = simpleXmlDocument; string source = driver.PageSource.ToLower(); source = System.Text.RegularExpressions.Regex.Replace(source, "\\s", string.Empty); - Assert.AreEqual("baz", source); + Assert.That(source, Is.EqualTo("baz")); } // Test is ignored for all browsers, but is kept here in the source code for @@ -108,14 +108,14 @@ public void ClickingShouldNotTrampleWOrHInGlobalScope() foreach (string val in values) { - Assert.AreEqual(val, GetGlobalVar(driver, val)); + Assert.That(GetGlobalVar(driver, val), Is.EqualTo(val)); } driver.FindElement(By.Id("toclick")).Click(); foreach (string val in values) { - Assert.AreEqual(val, GetGlobalVar(driver, val)); + Assert.That(GetGlobalVar(driver, val), Is.EqualTo(val)); } } diff --git a/dotnet/test/common/NavigationTest.cs b/dotnet/test/common/NavigationTest.cs index 32a660f7cd57f..6dce194d446d4 100644 --- a/dotnet/test/common/NavigationTest.cs +++ b/dotnet/test/common/NavigationTest.cs @@ -48,10 +48,10 @@ public void ShouldGoBackAndForward() driver.Url = simpleTestPage; navigation.Back(); - Assert.AreEqual(macbethTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(macbethTitle)); navigation.Forward(); - Assert.AreEqual(simpleTestTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(simpleTestTitle)); } [Test] @@ -71,12 +71,12 @@ public void ShouldGoToUrlUsingString() navigation = driver.Navigate(); navigation.GoToUrl(macbethPage); - Assert.AreEqual(macbethTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(macbethTitle)); // We go to two pages to ensure that the browser wasn't // already at the desired page through a previous test. navigation.GoToUrl(simpleTestPage); - Assert.AreEqual(simpleTestTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(simpleTestTitle)); } [Test] @@ -88,12 +88,12 @@ public void ShouldGoToUrlUsingUri() navigation = driver.Navigate(); navigation.GoToUrl(macBeth); - Assert.AreEqual(driver.Title, macbethTitle); + Assert.That(macbethTitle, Is.EqualTo(driver.Title)); // We go to two pages to ensure that the browser wasn't // already at the desired page through a previous test. navigation.GoToUrl(simpleTest); - Assert.AreEqual(simpleTestTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(simpleTestTitle)); } [Test] @@ -103,21 +103,20 @@ public void ShouldRefreshPage() IWebElement changedDiv = driver.FindElement(By.Id("dynamo")); driver.FindElement(By.Id("updatediv")).Click(); - Assert.AreEqual("Fish and chips!", changedDiv.Text); + Assert.That(changedDiv.Text, Is.EqualTo("Fish and chips!")); driver.Navigate().Refresh(); changedDiv = driver.FindElement(By.Id("dynamo")); - Assert.AreEqual("What's for dinner?", changedDiv.Text); + Assert.That(changedDiv.Text, Is.EqualTo("What's for dinner?")); } [Test] [NeedsFreshDriver(IsCreatedBeforeTest = true)] - public Task ShouldNotHaveProblemNavigatingWithNoPagesBrowsedAsync() + public void ShouldNotHaveProblemNavigatingWithNoPagesBrowsedAsync() { var navigation = driver.Navigate(); - Assert.DoesNotThrowAsync(async () => await navigation.BackAsync()); - Assert.DoesNotThrowAsync(async () => await navigation.ForwardAsync()); - return Task.CompletedTask; + Assert.That(async () => await navigation.BackAsync(), Throws.Nothing); + Assert.That(async () => await navigation.ForwardAsync(), Throws.Nothing); } [Test] @@ -129,10 +128,10 @@ public async Task ShouldGoBackAndForwardAsync() await navigation.GoToUrlAsync(simpleTestPage); await navigation.BackAsync(); - Assert.AreEqual(macbethTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(macbethTitle)); await navigation.ForwardAsync(); - Assert.AreEqual(simpleTestTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(simpleTestTitle)); } [Test] @@ -148,10 +147,10 @@ public async Task ShouldGoToUrlUsingStringAsync() var navigation = driver.Navigate(); await navigation.GoToUrlAsync(macbethPage); - Assert.AreEqual(macbethTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(macbethTitle)); await navigation.GoToUrlAsync(simpleTestPage); - Assert.AreEqual(simpleTestTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(simpleTestTitle)); } [Test] @@ -160,9 +159,9 @@ public void ShouldGoToUrlUsingUriAsync() var navigation = driver.Navigate(); navigation.GoToUrlAsync(new Uri(macbethPage)); - Assert.AreEqual(driver.Title, macbethTitle); + Assert.That(macbethTitle, Is.EqualTo(driver.Title)); navigation.GoToUrl(new Uri(simpleTestPage)); - Assert.AreEqual(simpleTestTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(simpleTestTitle)); } [Test] @@ -172,11 +171,11 @@ public async Task ShouldRefreshPageAsync() IWebElement changedDiv = driver.FindElement(By.Id("dynamo")); driver.FindElement(By.Id("updatediv")).Click(); - Assert.AreEqual("Fish and chips!", changedDiv.Text); + Assert.That(changedDiv.Text, Is.EqualTo("Fish and chips!")); await driver.Navigate().RefreshAsync(); changedDiv = driver.FindElement(By.Id("dynamo")); - Assert.AreEqual("What's for dinner?", changedDiv.Text); + Assert.That(changedDiv.Text, Is.EqualTo("What's for dinner?")); } } } diff --git a/dotnet/test/common/NetworkInterceptionTests.cs b/dotnet/test/common/NetworkInterceptionTests.cs index 10234945895d0..59434fb563e86 100644 --- a/dotnet/test/common/NetworkInterceptionTests.cs +++ b/dotnet/test/common/NetworkInterceptionTests.cs @@ -57,7 +57,7 @@ public async Task TestCanInterceptNetworkCalls() driver.Url = simpleTestPage; string text = driver.FindElement(By.CssSelector("p")).Text; await network.StopMonitoring(); - Assert.AreEqual("I intercepted you", text); + Assert.That(text, Is.EqualTo("I intercepted you")); } } @@ -78,7 +78,7 @@ public async Task TestCanUseAuthorizationHandler() driver.Url = authenticationPage; string text = driver.FindElement(By.CssSelector("h1")).Text; await network.StopMonitoring(); - Assert.AreEqual("authorized", text); + Assert.That(text, Is.EqualTo("authorized")); } } } diff --git a/dotnet/test/common/PageLoadingTest.cs b/dotnet/test/common/PageLoadingTest.cs index 9cbb86c06bcb4..0b231c94746e1 100644 --- a/dotnet/test/common/PageLoadingTest.cs +++ b/dotnet/test/common/PageLoadingTest.cs @@ -145,7 +145,7 @@ public void NormalStrategyShouldWaitForDocumentToBeLoaded() { driver.Url = simpleTestPage; - Assert.AreEqual(driver.Title, "Hello WebDriver"); + Assert.That(driver.Title, Is.EqualTo("Hello WebDriver")); } [Test] @@ -153,7 +153,7 @@ public void NormalStrategyShouldWaitForDocumentToBeLoaded() public void ShouldFollowRedirectsSentInTheHttpResponseHeaders() { driver.Url = redirectPage; - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -161,7 +161,7 @@ public void ShouldFollowMetaRedirects() { driver.Url = metaRedirectPage; WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title was not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -192,7 +192,7 @@ public void ShouldReturnUrlOnNotExistedPage() { string url = EnvironmentManager.Instance.UrlBuilder.WhereIs("not_existed_page.html"); driver.Url = url; - Assert.AreEqual(url, driver.Url); + Assert.That(driver.Url, Is.EqualTo(url)); } [Test] @@ -202,11 +202,11 @@ public void ShouldBeAbleToLoadAPageWithFramesetsAndWaitUntilAllFramesAreLoaded() driver.SwitchTo().Frame(0); IWebElement pageNumber = driver.FindElement(By.XPath("//span[@id='pageNumber']")); - Assert.AreEqual(pageNumber.Text.Trim(), "1"); + Assert.That(pageNumber.Text.Trim(), Is.EqualTo("1")); driver.SwitchTo().DefaultContent().SwitchTo().Frame(1); pageNumber = driver.FindElement(By.XPath("//span[@id='pageNumber']")); - Assert.AreEqual(pageNumber.Text.Trim(), "2"); + Assert.That(pageNumber.Text.Trim(), Is.EqualTo("2")); } [Test] @@ -223,7 +223,7 @@ public void ShouldDoNothingIfThereIsNothingToGoBackTo() if (driver.Title == originalTitle) { driver.Navigate().Back(); - Assert.AreEqual(originalTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(originalTitle)); } } @@ -234,11 +234,11 @@ public void ShouldBeAbleToNavigateBackInTheBrowserHistory() driver.FindElement(By.Id("imageButton")).Submit(); WaitFor(TitleToBeEqualTo("We Arrive Here"), "Browser title was not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); driver.Navigate().Back(); WaitFor(TitleToBeEqualTo("We Leave From Here"), "Browser title was not 'We Leave From Here'"); - Assert.AreEqual(driver.Title, "We Leave From Here"); + Assert.That(driver.Title, Is.EqualTo("We Leave From Here")); } [Test] @@ -248,11 +248,11 @@ public void ShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes() driver.FindElement(By.Name("sameWindow")).Click(); WaitFor(TitleToBeEqualTo("This page has iframes"), "Browser title was not 'This page has iframes'"); - Assert.AreEqual(driver.Title, "This page has iframes"); + Assert.That(driver.Title, Is.EqualTo("This page has iframes")); driver.Navigate().Back(); WaitFor(TitleToBeEqualTo("XHTML Test Page"), "Browser title was not 'XHTML Test Page'"); - Assert.AreEqual(driver.Title, "XHTML Test Page"); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] @@ -262,15 +262,15 @@ public void ShouldBeAbleToNavigateForwardsInTheBrowserHistory() driver.FindElement(By.Id("imageButton")).Submit(); WaitFor(TitleToBeEqualTo("We Arrive Here"), "Browser title was not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); driver.Navigate().Back(); WaitFor(TitleToBeEqualTo("We Leave From Here"), "Browser title was not 'We Leave From Here'"); - Assert.AreEqual(driver.Title, "We Leave From Here"); + Assert.That(driver.Title, Is.EqualTo("We Leave From Here")); driver.Navigate().Forward(); WaitFor(TitleToBeEqualTo("We Arrive Here"), "Browser title was not 'We Arrive Here'"); - Assert.AreEqual(driver.Title, "We Arrive Here"); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] @@ -283,7 +283,7 @@ public void ShouldBeAbleToAccessPagesWithAnInsecureSslCertificate() driver.Url = url; // This should work - Assert.AreEqual(driver.Title, "Hello WebDriver"); + Assert.That(driver.Title, Is.EqualTo("Hello WebDriver")); } [Test] @@ -293,7 +293,7 @@ public void ShouldBeAbleToRefreshAPage() driver.Navigate().Refresh(); - Assert.AreEqual(driver.Title, "XHTML Test Page"); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } /// diff --git a/dotnet/test/common/PartialLinkTextMatchTest.cs b/dotnet/test/common/PartialLinkTextMatchTest.cs index 111c7e301702a..1d69fe0b7aea7 100644 --- a/dotnet/test/common/PartialLinkTextMatchTest.cs +++ b/dotnet/test/common/PartialLinkTextMatchTest.cs @@ -33,7 +33,7 @@ public void LinkWithFormattingTags() IWebElement res = elem.FindElement(By.PartialLinkText("link with formatting tags")); Assert.That(res, Is.Not.Null); - Assert.AreEqual("link with formatting tags", res.Text); + Assert.That(res.Text, Is.EqualTo("link with formatting tags")); } [Test] @@ -44,7 +44,7 @@ public void LinkWithLeadingSpaces() IWebElement res = elem.FindElement(By.PartialLinkText("link with leading space")); Assert.That(res, Is.Not.Null); - Assert.AreEqual("link with leading space", res.Text); + Assert.That(res.Text, Is.EqualTo("link with leading space")); } [Test] @@ -56,7 +56,7 @@ public void LinkWithTrailingSpace() IWebElement res = elem.FindElement(By.PartialLinkText("link with trailing space")); Assert.That(res, Is.Not.Null); - Assert.AreEqual("link with trailing space", res.Text); + Assert.That(res.Text, Is.EqualTo("link with trailing space")); } [Test] @@ -67,7 +67,7 @@ public void FindMultipleElements() ReadOnlyCollection elements = elem.FindElements(By.PartialLinkText("link")); Assert.That(elements, Is.Not.Null); - Assert.AreEqual(6, elements.Count); + Assert.That(elements, Has.Count.EqualTo(6)); } [Test] @@ -76,7 +76,7 @@ public void DriverCanGetLinkByLinkTestIgnoringTrailingWhitespace() driver.Url = simpleTestPage; IWebElement link = null; link = driver.FindElement(By.LinkText("link with trailing space")); - Assert.AreEqual("linkWithTrailingSpace", link.GetAttribute("id")); + Assert.That(link.GetAttribute("id"), Is.EqualTo("linkWithTrailingSpace")); } [Test] @@ -87,7 +87,7 @@ public void ElementCanGetLinkByLinkTestIgnoringTrailingWhitespace() IWebElement link = null; link = elem.FindElement(By.LinkText("link with trailing space")); - Assert.AreEqual("linkWithTrailingSpace", link.GetAttribute("id")); + Assert.That(link.GetAttribute("id"), Is.EqualTo("linkWithTrailingSpace")); } } } diff --git a/dotnet/test/common/PositionAndSizeTest.cs b/dotnet/test/common/PositionAndSizeTest.cs index 8b8f225148ec7..5d5cab17a89e5 100644 --- a/dotnet/test/common/PositionAndSizeTest.cs +++ b/dotnet/test/common/PositionAndSizeTest.cs @@ -43,40 +43,40 @@ public void ShouldBeAbleToDetermineTheLocationOfAnElement() public void ShouldGetCoordinatesOfAnElement() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("coordinates_tests/simple_page.html"); - Assert.AreEqual(new Point(10, 10), GetLocationInViewPort(By.Id("box"))); - Assert.AreEqual(new Point(10, 10), GetLocationOnPage(By.Id("box"))); + Assert.That(GetLocationInViewPort(By.Id("box")), Is.EqualTo(new Point(10, 10))); + Assert.That(GetLocationOnPage(By.Id("box")), Is.EqualTo(new Point(10, 10))); } [Test] public void ShouldGetCoordinatesOfAnEmptyElement() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("coordinates_tests/page_with_empty_element.html"); - Assert.AreEqual(new Point(10, 10), GetLocationInViewPort(By.Id("box"))); - Assert.AreEqual(new Point(10, 10), GetLocationOnPage(By.Id("box"))); + Assert.That(GetLocationInViewPort(By.Id("box")), Is.EqualTo(new Point(10, 10))); + Assert.That(GetLocationOnPage(By.Id("box")), Is.EqualTo(new Point(10, 10))); } [Test] public void ShouldGetCoordinatesOfATransparentElement() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("coordinates_tests/page_with_transparent_element.html"); - Assert.AreEqual(new Point(10, 10), GetLocationInViewPort(By.Id("box"))); - Assert.AreEqual(new Point(10, 10), GetLocationOnPage(By.Id("box"))); + Assert.That(GetLocationInViewPort(By.Id("box")), Is.EqualTo(new Point(10, 10))); + Assert.That(GetLocationOnPage(By.Id("box")), Is.EqualTo(new Point(10, 10))); } [Test] public void ShouldGetCoordinatesOfAHiddenElement() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("coordinates_tests/page_with_hidden_element.html"); - Assert.AreEqual(new Point(10, 10), GetLocationInViewPort(By.Id("box"))); - Assert.AreEqual(new Point(10, 10), GetLocationOnPage(By.Id("box"))); + Assert.That(GetLocationInViewPort(By.Id("box")), Is.EqualTo(new Point(10, 10))); + Assert.That(GetLocationOnPage(By.Id("box")), Is.EqualTo(new Point(10, 10))); } [Test] public void ShouldGetCoordinatesOfAnInvisibleElement() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("coordinates_tests/page_with_invisible_element.html"); - Assert.AreEqual(new Point(0, 0), GetLocationInViewPort(By.Id("box"))); - Assert.AreEqual(new Point(0, 0), GetLocationOnPage(By.Id("box"))); + Assert.That(GetLocationInViewPort(By.Id("box")), Is.EqualTo(new Point(0, 0))); + Assert.That(GetLocationOnPage(By.Id("box")), Is.EqualTo(new Point(0, 0))); } [Test] @@ -99,8 +99,8 @@ public void ShouldGetCoordinatesOfAnElementInAFrame() driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("coordinates_tests/element_in_frame.html"); driver.SwitchTo().Frame("ifr"); IWebElement box = driver.FindElement(By.Id("box")); - Assert.AreEqual(new Point(10, 10), box.Location); - Assert.AreEqual(new Point(10, 10), GetLocationOnPage(By.Id("box"))); + Assert.That(box.Location, Is.EqualTo(new Point(10, 10))); + Assert.That(GetLocationOnPage(By.Id("box")), Is.EqualTo(new Point(10, 10))); } [Test] @@ -108,10 +108,10 @@ public void ShouldGetCoordinatesInViewPortOfAnElementInAFrame() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("coordinates_tests/element_in_frame.html"); driver.SwitchTo().Frame("ifr"); - Assert.AreEqual(new Point(10, 10), GetLocationOnPage(By.Id("box"))); + Assert.That(GetLocationOnPage(By.Id("box")), Is.EqualTo(new Point(10, 10))); // GetLocationInViewPort only works within the context of a single frame // for W3C-spec compliant remote ends. - // Assert.AreEqual(new Point(25, 25), GetLocationInViewPort(By.Id("box"))); + // Assert.That(GetLocationInViewPort(By.Id("box")), Is.EqualTo(new Point(25, 25))); } [Test] @@ -120,10 +120,10 @@ public void ShouldGetCoordinatesInViewPortOfAnElementInANestedFrame() driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("coordinates_tests/element_in_nested_frame.html"); driver.SwitchTo().Frame("ifr"); driver.SwitchTo().Frame("ifr"); - Assert.AreEqual(new Point(10, 10), GetLocationOnPage(By.Id("box"))); + Assert.That(GetLocationOnPage(By.Id("box")), Is.EqualTo(new Point(10, 10))); // GetLocationInViewPort only works within the context of a single frame // for W3C-spec compliant remote ends. - // Assert.AreEqual(new Point(40, 40), GetLocationInViewPort(By.Id("box"))); + // Assert.That(GetLocationInViewPort(By.Id("box")), Is.EqualTo(new Point(40, 40))); } [Test] @@ -156,15 +156,15 @@ public void ShouldHandleNonIntegerPositionAndSize() IWebElement r2 = driver.FindElement(By.Id("r2")); string left = r2.GetCssValue("left"); - Assert.AreEqual(10.9, Math.Round(Convert.ToDecimal(left.Replace("px", "")), 1)); + Assert.That(Math.Round(Convert.ToDecimal(left.Replace("px", "")), 1), Is.EqualTo(10.9)); string top = r2.GetCssValue("top"); - Assert.AreEqual(10.1, Math.Round(Convert.ToDecimal(top.Replace("px", "")), 1)); - Assert.AreEqual(new Point(11, 10), r2.Location); + Assert.That(Math.Round(Convert.ToDecimal(top.Replace("px", "")), 1), Is.EqualTo(10.1)); + Assert.That(r2.Location, Is.EqualTo(new Point(11, 10))); string width = r2.GetCssValue("width"); - Assert.AreEqual(48.7, Math.Round(Convert.ToDecimal(width.Replace("px", "")), 1)); + Assert.That(Math.Round(Convert.ToDecimal(width.Replace("px", "")), 1), Is.EqualTo(48.7)); string height = r2.GetCssValue("height"); - Assert.AreEqual(49.3, Math.Round(Convert.ToDecimal(height.Replace("px", "")), 1)); - Assert.AreEqual(new Size(49, 49), r2.Size); + Assert.That(Math.Round(Convert.ToDecimal(height.Replace("px", "")), 1), Is.EqualTo(49.3)); + Assert.That(r2.Size, Is.EqualTo(new Size(49, 49))); } //------------------------------------------------------------------ diff --git a/dotnet/test/common/SessionHandlingTest.cs b/dotnet/test/common/SessionHandlingTest.cs index f0c50c329a691..8b9c1db2f5504 100644 --- a/dotnet/test/common/SessionHandlingTest.cs +++ b/dotnet/test/common/SessionHandlingTest.cs @@ -49,7 +49,7 @@ public void CallingQuitAfterClosingTheLastWindowIsANoOp() testDriver.Quit(); testDriver = EnvironmentManager.Instance.CreateDriverInstance(); testDriver.Url = xhtmlTestPage; - Assert.AreEqual("XHTML Test Page", testDriver.Title); + Assert.That(testDriver.Title, Is.EqualTo("XHTML Test Page")); testDriver.Quit(); } @@ -106,7 +106,7 @@ public void ShouldBeAbleToStartNewDriverAfterCallingCloseOnOnlyOpenWindow() testDriver.Dispose(); testDriver = EnvironmentManager.Instance.CreateDriverInstance(); testDriver.Url = xhtmlTestPage; - Assert.AreEqual("XHTML Test Page", testDriver.Title); + Assert.That(testDriver.Title, Is.EqualTo("XHTML Test Page")); testDriver.Close(); testDriver.Dispose(); } @@ -143,7 +143,7 @@ public void ShouldBeAbleToCallDisposeAfterQuit() testDriver.Dispose(); testDriver = EnvironmentManager.Instance.CreateDriverInstance(); testDriver.Url = xhtmlTestPage; - Assert.AreEqual("XHTML Test Page", testDriver.Title); + Assert.That(testDriver.Title, Is.EqualTo("XHTML Test Page")); testDriver.Quit(); } @@ -155,7 +155,7 @@ public void ShouldOpenAndCloseBrowserRepeatedly() EnvironmentManager.Instance.CloseCurrentDriver(); CreateFreshDriver(); driver.Url = simpleTestPage; - Assert.AreEqual(simpleTestTitle, driver.Title); + Assert.That(driver.Title, Is.EqualTo(simpleTestTitle)); } } } diff --git a/dotnet/test/common/SvgDocumentTest.cs b/dotnet/test/common/SvgDocumentTest.cs index 5eb5483667c79..5a777d920492a 100644 --- a/dotnet/test/common/SvgDocumentTest.cs +++ b/dotnet/test/common/SvgDocumentTest.cs @@ -38,9 +38,9 @@ public void ClickOnSvgElement() driver.Url = svgTestPage; IWebElement rect = driver.FindElement(By.Id("rect")); - Assert.AreEqual("blue", rect.GetAttribute("fill")); + Assert.That(rect.GetAttribute("fill"), Is.EqualTo("blue")); rect.Click(); - Assert.AreEqual("green", rect.GetAttribute("fill")); + Assert.That(rect.GetAttribute("fill"), Is.EqualTo("green")); } [Test] @@ -54,9 +54,9 @@ public void ExecuteScriptInSvgDocument() driver.Url = svgTestPage; IWebElement rect = driver.FindElement(By.Id("rect")); - Assert.AreEqual("blue", rect.GetAttribute("fill")); + Assert.That(rect.GetAttribute("fill"), Is.EqualTo("blue")); ((IJavaScriptExecutor)driver).ExecuteScript("document.getElementById('rect').setAttribute('fill', 'yellow');"); - Assert.AreEqual("yellow", rect.GetAttribute("fill")); + Assert.That(rect.GetAttribute("fill"), Is.EqualTo("yellow")); } } } diff --git a/dotnet/test/common/SvgElementTest.cs b/dotnet/test/common/SvgElementTest.cs index fbefdea76a6ea..554b860edbc18 100644 --- a/dotnet/test/common/SvgElementTest.cs +++ b/dotnet/test/common/SvgElementTest.cs @@ -39,17 +39,17 @@ public void ShouldClickOnGraphVisualElements() IWebElement svg = driver.FindElement(By.CssSelector("svg")); ReadOnlyCollection groupElements = svg.FindElements(By.CssSelector("g")); - Assert.AreEqual(5, groupElements.Count); + Assert.That(groupElements, Has.Count.EqualTo(5)); groupElements[1].Click(); IWebElement resultElement = driver.FindElement(By.Id("result")); WaitFor(() => { return resultElement.Text == "slice_red"; }, "Element text was not 'slice_red'"); - Assert.AreEqual("slice_red", resultElement.Text); + Assert.That(resultElement.Text, Is.EqualTo("slice_red")); groupElements[2].Click(); resultElement = driver.FindElement(By.Id("result")); WaitFor(() => { return resultElement.Text == "slice_green"; }, "Element text was not 'slice_green'"); - Assert.AreEqual("slice_green", resultElement.Text); + Assert.That(resultElement.Text, Is.EqualTo("slice_green")); } [Test] @@ -70,7 +70,7 @@ public void ShouldClickOnGraphTextElements() appleElement.Click(); IWebElement resultElement = driver.FindElement(By.Id("result")); WaitFor(() => { return resultElement.Text == "text_apple"; }, "Element text was not 'text_apple'"); - Assert.AreEqual("text_apple", resultElement.Text); + Assert.That(resultElement.Text, Is.EqualTo("text_apple")); } private IWebElement FindAppleElement(IEnumerable textElements) diff --git a/dotnet/test/common/TagNameTest.cs b/dotnet/test/common/TagNameTest.cs index fec7d75d2cc0d..77b64af111de8 100644 --- a/dotnet/test/common/TagNameTest.cs +++ b/dotnet/test/common/TagNameTest.cs @@ -29,7 +29,7 @@ public void ShouldReturnInput() { driver.Url = formsPage; IWebElement selectBox = driver.FindElement(By.Id("cheese")); - Assert.AreEqual(selectBox.TagName.ToLower(), "input"); + Assert.That(selectBox.TagName, Is.EqualTo("input").IgnoreCase); } } } diff --git a/dotnet/test/common/TakesScreenshotTest.cs b/dotnet/test/common/TakesScreenshotTest.cs index 6c09b0acfde93..74fcad3463f42 100644 --- a/dotnet/test/common/TakesScreenshotTest.cs +++ b/dotnet/test/common/TakesScreenshotTest.cs @@ -141,7 +141,7 @@ public void ShouldTakeScreenshotsOfAnElement() Color pixelColor = GetPixelColor(screenImage, 1, 1); string pixelColorString = FormatColorToHex(pixelColor.ToArgb()); - Assert.AreEqual("#0f12f7", pixelColorString); + Assert.That(pixelColorString, Is.EqualTo("#0f12f7")); } [Test] diff --git a/dotnet/test/common/TargetLocatorTest.cs b/dotnet/test/common/TargetLocatorTest.cs index 19a23cb1dd086..de1cd4a70816a 100644 --- a/dotnet/test/common/TargetLocatorTest.cs +++ b/dotnet/test/common/TargetLocatorTest.cs @@ -89,7 +89,7 @@ public void ShouldSwitchToFrameByNameAndBackToDefaultContent() driver.Url = framesPage; driver.SwitchTo().Frame("first"); - Assert.AreEqual(driver.FindElement(By.Id("pageNumber")).Text, "1"); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("1")); driver.SwitchTo().DefaultContent(); @@ -99,7 +99,7 @@ public void ShouldSwitchToFrameByNameAndBackToDefaultContent() Throws.TypeOf()); driver.SwitchTo().Frame("second"); - Assert.AreEqual(driver.FindElement(By.Id("pageNumber")).Text, "2"); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("2")); driver.SwitchTo().DefaultContent(); @@ -115,7 +115,7 @@ public void ShouldSwitchToFrameByIndexAndBackToDefaultContent() driver.Url = framesPage; driver.SwitchTo().Frame(0); - Assert.AreEqual(driver.FindElement(By.Id("pageNumber")).Text, "1"); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("1")); driver.SwitchTo().DefaultContent(); @@ -126,7 +126,7 @@ public void ShouldSwitchToFrameByIndexAndBackToDefaultContent() driver.SwitchTo().Frame(1); - Assert.AreEqual(driver.FindElement(By.Id("pageNumber")).Text, "2"); + Assert.That(driver.FindElement(By.Id("pageNumber")).Text, Is.EqualTo("2")); driver.SwitchTo().DefaultContent(); diff --git a/dotnet/test/common/TextHandlingTest.cs b/dotnet/test/common/TextHandlingTest.cs index f087f1fbd2346..3b66fe86dd2c4 100644 --- a/dotnet/test/common/TextHandlingTest.cs +++ b/dotnet/test/common/TextHandlingTest.cs @@ -34,10 +34,10 @@ public void ShouldReturnTheTextContentOfASingleElementWithNoChildren() { driver.Url = simpleTestPage; string selectText = driver.FindElement(By.Id("oneline")).Text; - Assert.AreEqual(selectText, "A single line of text"); + Assert.That(selectText, Is.EqualTo("A single line of text")); string getText = driver.FindElement(By.Id("oneline")).Text; - Assert.AreEqual(getText, "A single line of text"); + Assert.That(getText, Is.EqualTo("A single line of text")); } [Test] @@ -58,9 +58,9 @@ public void ShouldIgnoreScriptElements() IWebElement labelForUsername = driver.FindElement(By.Id("labelforusername")); string text = labelForUsername.Text; - Assert.AreEqual(labelForUsername.FindElements(By.TagName("script")).Count, 1); + Assert.That(labelForUsername.FindElements(By.TagName("script")).Count, Is.EqualTo(1)); Assert.That(text, Does.Not.Contain("document.getElementById")); - Assert.AreEqual(text, "Username:"); + Assert.That(text, Is.EqualTo("Username:")); } [Test] @@ -80,7 +80,7 @@ public void ShouldCollapseMultipleWhitespaceCharactersIntoASingleSpace() driver.Url = (simpleTestPage); string text = driver.FindElement(By.Id("lotsofspaces")).Text; - Assert.AreEqual(text, "This line has lots of spaces."); + Assert.That(text, Is.EqualTo("This line has lots of spaces.")); } [Test] @@ -99,7 +99,7 @@ public void ShouldConvertANonBreakingSpaceIntoANormalSpaceCharacter() driver.Url = (simpleTestPage); string text = driver.FindElement(By.Id("nbsp")).Text; - Assert.AreEqual(text, "This line has a non-breaking space"); + Assert.That(text, Is.EqualTo("This line has a non-breaking space")); } [Test] @@ -109,7 +109,7 @@ public void ShouldNotCollapseANonBreakingSpaces() IWebElement element = driver.FindElement(By.Id("nbspandspaces")); string text = element.Text; - Assert.AreEqual(text, "This line has a non-breaking space and spaces"); + Assert.That(text, Is.EqualTo("This line has a non-breaking space and spaces")); } [Test] @@ -147,7 +147,7 @@ public void HavingInlineElementsShouldNotAffectHowTextIsReturned() { driver.Url = (simpleTestPage); string text = driver.FindElement(By.Id("inline")).Text; - Assert.AreEqual(text, "This line has text within elements that are meant to be displayed inline"); + Assert.That(text, Is.EqualTo("This line has text within elements that are meant to be displayed inline")); } [Test] @@ -156,7 +156,7 @@ public void ShouldReturnTheEntireTextOfInlineElements() driver.Url = (simpleTestPage); string text = driver.FindElement(By.Id("span")).Text; - Assert.AreEqual(text, "An inline element"); + Assert.That(text, Is.EqualTo("An inline element")); } [Test] @@ -195,7 +195,7 @@ public void ShouldBeAbleToSetMoreThanOneLineOfTextInATextArea() textarea.SendKeys(expectedText); string seenText = textarea.GetAttribute("value"); - Assert.AreEqual(expectedText, seenText); + Assert.That(seenText, Is.EqualTo(expectedText)); } [Test] @@ -207,7 +207,7 @@ public void ShouldBeAbleToEnterDatesAfterFillingInOtherValuesFirst() input.SendKeys(expectedValue); string seenValue = input.GetAttribute("value"); - Assert.AreEqual(seenValue, expectedValue); + Assert.That(expectedValue, Is.EqualTo(seenValue)); } [Test] @@ -216,7 +216,7 @@ public void ShouldReturnEmptyStringWhenTextIsOnlySpaces() driver.Url = (xhtmlTestPage); string text = driver.FindElement(By.Id("spaces")).Text; - Assert.AreEqual(text, string.Empty); + Assert.That(text, Is.Empty); } [Test] @@ -225,7 +225,7 @@ public void ShouldReturnEmptyStringWhenTextIsEmpty() driver.Url = (xhtmlTestPage); string text = driver.FindElement(By.Id("empty")).Text; - Assert.AreEqual(text, string.Empty); + Assert.That(text, Is.Empty); } [Test] @@ -234,7 +234,7 @@ public void ShouldReturnEmptyStringWhenTagIsSelfClosing() driver.Url = (xhtmlFormPage); string text = driver.FindElement(By.Id("self-closed")).Text; - Assert.AreEqual(text, string.Empty); + Assert.That(text, Is.Empty); } [Test] @@ -243,7 +243,7 @@ public void ShouldNotTrimSpacesWhenLineWraps() driver.Url = simpleTestPage; string text = driver.FindElement(By.XPath("//table/tbody/tr[1]/td[1]")).Text; - Assert.AreEqual("beforeSpace afterSpace", text); + Assert.That(text, Is.EqualTo("beforeSpace afterSpace")); } [Test] @@ -253,7 +253,7 @@ public void ShouldHandleSiblingBlockLevelElements() string text = driver.FindElement(By.Id("twoblocks")).Text; - Assert.AreEqual("Some text" + NewLine + "Some more text", text); + Assert.That(text, Is.EqualTo("Some text" + NewLine + "Some more text")); } [Test] @@ -263,8 +263,8 @@ public void ShouldHandleNestedBlockLevelElements() string text = driver.FindElement(By.Id("nestedblocks")).Text; - Assert.AreEqual("Cheese" + NewLine + "Some text" + NewLine + "Some more text" + NewLine - + "and also" + NewLine + "Brie", text); + Assert.That(text, Is.EqualTo("Cheese" + NewLine + "Some text" + NewLine + "Some more text" + NewLine + + "and also" + NewLine + "Brie")); } [Test] @@ -274,7 +274,7 @@ public void ShouldHandleWhitespaceInInlineElements() string text = driver.FindElement(By.Id("inlinespan")).Text; - Assert.AreEqual(text, "line has text"); + Assert.That(text, Is.EqualTo("line has text")); } [Test] @@ -305,8 +305,8 @@ public void ShouldOnlyIncludeVisibleText() string empty = driver.FindElement(By.Id("suppressedParagraph")).Text; string explicitText = driver.FindElement(By.Id("outer")).Text; - Assert.AreEqual(string.Empty, empty); - Assert.AreEqual("sub-element that is explicitly visible", explicitText); + Assert.That(empty, Is.Empty); + Assert.That(explicitText, Is.EqualTo("sub-element that is explicitly visible")); } [Test] @@ -326,7 +326,7 @@ public void TextOfAnInputFieldShouldBeEmpty() { driver.Url = formsPage; IWebElement input = driver.FindElement(By.Id("inputWithText")); - Assert.AreEqual(string.Empty, input.Text); + Assert.That(input.Text, Is.Empty); } [Test] @@ -334,7 +334,7 @@ public void TextOfATextAreaShouldBeEqualToItsDefaultText() { driver.Url = formsPage; IWebElement area = driver.FindElement(By.Id("withText")); - Assert.AreEqual("Example text", area.Text); + Assert.That(area.Text, Is.EqualTo("Example text")); } [Test] @@ -345,7 +345,7 @@ public void TextOfATextAreaShouldBeEqualToItsDefaultTextEvenAfterTyping() IWebElement area = driver.FindElement(By.Id("withText")); string oldText = area.Text; area.SendKeys("New Text"); - Assert.AreEqual(oldText, area.Text); + Assert.That(area.Text, Is.EqualTo(oldText)); } [Test] @@ -356,7 +356,7 @@ public void TextOfATextAreaShouldBeEqualToItsDefaultTextEvenAfterChangingTheValu IWebElement area = driver.FindElement(By.Id("withText")); string oldText = area.GetAttribute("value"); ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].value = arguments[1]", area, "New Text"); - Assert.AreEqual(oldText, area.Text); + Assert.That(area.Text, Is.EqualTo(oldText)); } [Test] @@ -364,7 +364,7 @@ public void ShouldGetTextWhichIsAValidJSONObject() { driver.Url = simpleTestPage; IWebElement element = driver.FindElement(By.Id("simpleJsonText")); - Assert.AreEqual("{a=\"b\", c=1, d=true}", element.Text); + Assert.That(element.Text, Is.EqualTo("{a=\"b\", c=1, d=true}")); //assertEquals("{a=\"b\", \"c\"=d, e=true, f=\\123\\\\g\\\\\"\"\"\\\'}", element.getText()); } @@ -373,7 +373,7 @@ public void ShouldGetTextWhichIsAValidComplexJSONObject() { driver.Url = simpleTestPage; IWebElement element = driver.FindElement(By.Id("complexJsonText")); - Assert.AreEqual("{a=\"\\\\b\\\\\\\"\'\\\'\"}", element.Text); + Assert.That(element.Text, Is.EqualTo("{a=\"\\\\b\\\\\\\"\'\\\'\"}")); } [Test] @@ -384,11 +384,11 @@ public void ShouldNotReturnLtrMarks() IWebElement element = driver.FindElement(By.Id("EH")).FindElement(By.TagName("nobr")); string text = element.Text; String expected = "Some notes"; - Assert.AreNotSame(8206, (int)text[0], "RTL mark should not be present"); + Assert.That((int)text[0], Is.Not.EqualTo(8206), "RTL mark should not be present"); // Note: If this assertion fails but the content of the strings *looks* the same // it may be because of hidden unicode LTR character being included in the string. // That's the reason for the previous assert. - Assert.Equals(expected, element.Text); + Assert.That(element.Text, Is.EqualTo(expected)); } [Test] @@ -398,7 +398,7 @@ public void ShouldTrimTextWithMultiByteWhitespaces() driver.Url = simpleTestPage; String text = driver.FindElement(By.Id("trimmedSpace")).Text; - Assert.AreEqual("test", text); + Assert.That(text, Is.EqualTo("test")); } [Test] diff --git a/dotnet/test/common/TypingTest.cs b/dotnet/test/common/TypingTest.cs index d2290a210fdc7..55caf6f76cfe0 100644 --- a/dotnet/test/common/TypingTest.cs +++ b/dotnet/test/common/TypingTest.cs @@ -74,7 +74,7 @@ public void ShouldTypeLowerCaseLetters() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("abc def"); - Assert.AreEqual("abc def", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("abc def")); } [Test] @@ -85,7 +85,7 @@ public void ShouldBeAbleToTypeCapitalLetters() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("ABC DEF"); - Assert.AreEqual("ABC DEF", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("ABC DEF")); } [Test] @@ -96,7 +96,7 @@ public void ShouldBeAbleToTypeQuoteMarks() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("\""); - Assert.AreEqual("\"", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("\"")); } [Test] @@ -113,7 +113,7 @@ public void ShouldBeAbleToTypeTheAtCharacter() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("@"); - Assert.AreEqual("@", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("@")); } [Test] @@ -124,7 +124,7 @@ public void ShouldBeAbleToMixUpperAndLowerCaseLetters() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("me@eXample.com"); - Assert.AreEqual("me@eXample.com", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("me@eXample.com")); } [Test] @@ -135,7 +135,7 @@ public void ArrowKeysShouldNotBePrintable() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys(Keys.ArrowLeft); - Assert.AreEqual(string.Empty, keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.Empty); } [Test] @@ -146,7 +146,7 @@ public void ShouldBeAbleToUseArrowKeys() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("Tet" + Keys.ArrowLeft + "s"); - Assert.AreEqual("Test", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("Test")); } [Test] @@ -158,7 +158,7 @@ public void WillSimulateAKeyUpWhenEnteringTextIntoInputElements() element.SendKeys("I like cheese"); IWebElement result = driver.FindElement(By.Id("result")); - Assert.AreEqual("I like cheese", result.Text); + Assert.That(result.Text, Is.EqualTo("I like cheese")); } [Test] @@ -172,7 +172,7 @@ public void WillSimulateAKeyDownWhenEnteringTextIntoInputElements() IWebElement result = driver.FindElement(By.Id("result")); // Because the key down gets the result before the input element is // filled, we're a letter short here - Assert.AreEqual("I like chees", result.Text); + Assert.That(result.Text, Is.EqualTo("I like chees")); } [Test] @@ -186,7 +186,7 @@ public void WillSimulateAKeyPressWhenEnteringTextIntoInputElements() IWebElement result = driver.FindElement(By.Id("result")); // Because the key down gets the result before the input element is // filled, we're a letter short here - Assert.AreEqual("I like chees", result.Text); + Assert.That(result.Text, Is.EqualTo("I like chees")); } [Test] @@ -198,7 +198,7 @@ public void WillSimulateAKeyUpWhenEnteringTextIntoTextAreas() element.SendKeys("I like cheese"); IWebElement result = driver.FindElement(By.Id("result")); - Assert.AreEqual("I like cheese", result.Text); + Assert.That(result.Text, Is.EqualTo("I like cheese")); } [Test] @@ -212,7 +212,7 @@ public void WillSimulateAKeyDownWhenEnteringTextIntoTextAreas() IWebElement result = driver.FindElement(By.Id("result")); // Because the key down gets the result before the input element is // filled, we're a letter short here - Assert.AreEqual("I like chees", result.Text); + Assert.That(result.Text, Is.EqualTo("I like chees")); } [Test] @@ -226,7 +226,7 @@ public void WillSimulateAKeyPressWhenEnteringTextIntoTextAreas() IWebElement result = driver.FindElement(By.Id("result")); // Because the key down gets the result before the input element is // filled, we're a letter short here - Assert.AreEqual("I like chees", result.Text); + Assert.That(result.Text, Is.EqualTo("I like chees")); } [Test] @@ -238,7 +238,7 @@ public void ShouldFireFocusKeyEventsInTheRightOrder() IWebElement element = driver.FindElement(By.Id("theworks")); element.SendKeys("a"); - Assert.AreEqual("focus keydown keypress keyup", result.Text.Trim()); + Assert.That(result.Text.Trim(), Is.EqualTo("focus keydown keypress keyup")); } [Test] @@ -262,7 +262,7 @@ public void ShouldReportKeyCodeOfArrowKeys() CheckRecordedKeySequence(result, 39); // And leave no rubbish/printable keys in the "keyReporter" - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); } [Test] @@ -294,7 +294,7 @@ public void ShouldReportKeyCodeOfArrowKeysUpDownEvents() Assert.That(text, Does.Contain("up: 39")); // And leave no rubbish/printable keys in the "keyReporter" - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); } [Test] @@ -307,7 +307,7 @@ public void NumericNonShiftKeys() string numericLineCharsNonShifted = "`1234567890-=[]\\;,.'/42"; element.SendKeys(numericLineCharsNonShifted); - Assert.AreEqual(numericLineCharsNonShifted, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(numericLineCharsNonShifted)); } [Test] @@ -322,7 +322,7 @@ public void NumericShiftKeys() string numericShiftsEtc = "~!@#$%^&*()_+{}:\"<>?|END~"; element.SendKeys(numericShiftsEtc); - Assert.AreEqual(numericShiftsEtc, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(numericShiftsEtc)); string text = result.Text.Trim(); Assert.That(text, Does.Contain(" up: 16")); } @@ -337,7 +337,7 @@ public void LowerCaseAlphaKeys() String lowerAlphas = "abcdefghijklmnopqrstuvwxyz"; element.SendKeys(lowerAlphas); - Assert.AreEqual(lowerAlphas, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(lowerAlphas)); } [Test] @@ -352,7 +352,7 @@ public void UppercaseAlphaKeys() String upperAlphas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; element.SendKeys(upperAlphas); - Assert.AreEqual(upperAlphas, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(upperAlphas)); string text = result.Text.Trim(); Assert.That(text, Does.Contain(" up: 16")); } @@ -371,7 +371,7 @@ public void AllPrintableKeys() "PQRSTUVWXYZ [\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; element.SendKeys(allPrintable); - Assert.AreEqual(allPrintable, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(allPrintable)); string text = result.Text.Trim(); Assert.That(text, Does.Contain(" up: 16")); } @@ -385,7 +385,7 @@ public void ArrowKeysAndPageUpAndDown() element.SendKeys("a" + Keys.Left + "b" + Keys.Right + Keys.Up + Keys.Down + Keys.PageUp + Keys.PageDown + "1"); - Assert.AreEqual("ba1", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("ba1")); } [Test] @@ -399,7 +399,7 @@ public void HomeAndEndAndPageUpAndPageDownKeys() element.SendKeys("abc" + HomeKey() + "0" + Keys.Left + Keys.Right + Keys.PageUp + Keys.PageDown + EndKey() + "1" + HomeKey() + "0" + Keys.PageUp + EndKey() + "111" + HomeKey() + "00"); - Assert.AreEqual("0000abc1111", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("0000abc1111")); } [Test] @@ -410,13 +410,13 @@ public void DeleteAndBackspaceKeys() IWebElement element = driver.FindElement(By.Id("keyReporter")); element.SendKeys("abcdefghi"); - Assert.AreEqual("abcdefghi", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abcdefghi")); element.SendKeys(Keys.Left + Keys.Left + Keys.Delete); - Assert.AreEqual("abcdefgi", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abcdefgi")); element.SendKeys(Keys.Left + Keys.Left + Keys.Backspace); - Assert.AreEqual("abcdfgi", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abcdfgi")); } [Test] @@ -427,7 +427,7 @@ public void SpecialSpaceKeys() IWebElement element = driver.FindElement(By.Id("keyReporter")); element.SendKeys("abcd" + Keys.Space + "fgh" + Keys.Space + "ij"); - Assert.AreEqual("abcd fgh ij", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abcd fgh ij")); } [Test] @@ -441,7 +441,7 @@ public void NumberpadKeys() Keys.Decimal + Keys.Separator + Keys.NumberPad0 + Keys.NumberPad9 + Keys.Add + Keys.Semicolon + Keys.Equal + Keys.Divide + Keys.NumberPad3 + "abcd"); - Assert.AreEqual("abcd*-+.,09+;=/3abcd", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abcd*-+.,09+;=/3abcd")); } [Test] @@ -453,7 +453,7 @@ public void FunctionKeys() element.SendKeys("FUNCTION" + Keys.F8 + "-KEYS" + Keys.F8); element.SendKeys("" + Keys.F8 + "-TOO" + Keys.F8); - Assert.AreEqual("FUNCTION-KEYS-TOO", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("FUNCTION-KEYS-TOO")); } [Test] @@ -464,12 +464,12 @@ public void ShiftSelectionDeletes() IWebElement element = driver.FindElement(By.Id("keyReporter")); element.SendKeys("abcd efgh"); - Assert.AreEqual(element.GetAttribute("value"), "abcd efgh"); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abcd efgh")); //Could be chord problem element.SendKeys(Keys.Shift + Keys.Left + Keys.Left + Keys.Left); element.SendKeys(Keys.Delete); - Assert.AreEqual("abcd e", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("abcd e")); } [Test] @@ -486,7 +486,7 @@ public void ChordControlHomeShiftEndDelete() element.SendKeys(HomeKey()); element.SendKeys("" + Keys.Shift + EndKey() + Keys.Delete); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); string text = result.Text.Trim(); Assert.That(text, Does.Contain(" up: 16")); } @@ -501,22 +501,22 @@ public void ChordReverseShiftHomeSelectionDeletes() IWebElement element = driver.FindElement(By.Id("keyReporter")); element.SendKeys("done" + HomeKey()); - Assert.AreEqual("done", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("done")); //Sending chords element.SendKeys("" + Keys.Shift + "ALL " + HomeKey()); - Assert.AreEqual("ALL done", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("ALL done")); element.SendKeys(Keys.Delete); - Assert.AreEqual("done", element.GetAttribute("value"), "done"); + Assert.That(element.GetAttribute("value"), Is.EqualTo("done"), "done"); element.SendKeys("" + EndKey() + Keys.Shift + HomeKey()); - Assert.AreEqual("done", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("done")); // Note: trailing SHIFT up here string text = result.Text.Trim(); element.SendKeys("" + Keys.Delete); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); } [Test] @@ -529,31 +529,31 @@ public void ChordControlCutAndPaste() String paste = "!\"#$%&'()*+,-./0123456789:;<=>?@ ABCDEFG"; element.SendKeys(paste); - Assert.AreEqual(paste, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(paste)); //Chords element.SendKeys("" + HomeKey() + Keys.Shift + EndKey()); element.SendKeys(PrimaryModifier() + "x"); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); element.SendKeys(PrimaryModifier() + "v"); - Assert.AreEqual(paste, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(paste)); element.SendKeys("" + Keys.Left + Keys.Left + Keys.Left + Keys.Shift + EndKey()); element.SendKeys(PrimaryModifier() + "x" + "v"); - Assert.AreEqual(paste, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo(paste)); element.SendKeys(HomeKey()); element.SendKeys(PrimaryModifier() + "v"); element.SendKeys(PrimaryModifier() + "v" + "v"); element.SendKeys(PrimaryModifier() + "v" + "v" + "v"); - Assert.AreEqual("EFGEFGEFGEFGEFGEFG" + paste, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("EFGEFGEFGEFGEFGEFG" + paste)); element.SendKeys("" + EndKey() + Keys.Shift + HomeKey() + Keys.Null + Keys.Delete); - Assert.AreEqual(element.GetAttribute("value"), string.Empty); + Assert.That(element.GetAttribute("value"), Is.Empty); } [Test] @@ -564,7 +564,7 @@ public void ShouldTypeIntoInputElementsThatHaveNoTypeAttribute() IWebElement element = driver.FindElement(By.Id("no-type")); element.SendKeys("Should Say Cheese"); - Assert.AreEqual("Should Say Cheese", element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.EqualTo("Should Say Cheese")); } [Test] @@ -575,7 +575,7 @@ public void ShouldNotTypeIntoElementsThatPreventKeyDownEvents() IWebElement silent = driver.FindElement(By.Name("suppress")); silent.SendKeys("s"); - Assert.AreEqual(string.Empty, silent.GetAttribute("value")); + Assert.That(silent.GetAttribute("value"), Is.Empty); } [Test] @@ -596,7 +596,7 @@ public void ShouldBeAbleToTypeOnAnEmailInputField() driver.Url = formsPage; IWebElement email = driver.FindElement(By.Id("email")); email.SendKeys("foobar"); - Assert.AreEqual("foobar", email.GetAttribute("value")); + Assert.That(email.GetAttribute("value"), Is.EqualTo("foobar")); } [Test] @@ -605,7 +605,7 @@ public void ShouldBeAbleToTypeOnANumberInputField() driver.Url = formsPage; IWebElement numberElement = driver.FindElement(By.Id("age")); numberElement.SendKeys("33"); - Assert.AreEqual("33", numberElement.GetAttribute("value")); + Assert.That(numberElement.GetAttribute("value"), Is.EqualTo("33")); } [Test] @@ -624,11 +624,11 @@ public void CanSafelyTypeOnElementThatIsRemovedFromTheDomOnKeyPress() IWebElement input = driver.FindElement(By.Id("target")); IWebElement log = driver.FindElement(By.Id("log")); - Assert.AreEqual("", log.GetAttribute("value")); + Assert.That(log.GetAttribute("value"), Is.EqualTo("")); input.SendKeys("b"); string expected = "keydown (target)\nkeyup (target)\nkeyup (body)"; - Assert.AreEqual(expected, GetValueText(log)); + Assert.That(GetValueText(log), Is.EqualTo(expected)); input.SendKeys("a"); @@ -647,7 +647,7 @@ public void CanClearNumberInputAfterTypingInvalidInput() input.SendKeys("e"); input.Clear(); input.SendKeys("3"); - Assert.AreEqual("3", input.GetAttribute("value")); + Assert.That(input.GetAttribute("value"), Is.EqualTo("3")); } //------------------------------------------------------------------ @@ -684,7 +684,7 @@ public void NonPrintableCharactersShouldWorkWithContentEditableOrDesignModeSet() element.SendKeys("Dishy" + Keys.Backspace + Keys.Left + Keys.Left); element.SendKeys(Keys.Left + Keys.Left + "F" + Keys.Delete + EndKey() + "ee!"); - Assert.AreEqual(element.Text, "Fishee!"); + Assert.That(element.Text, Is.EqualTo("Fishee!")); } [Test] @@ -696,7 +696,7 @@ public void ShouldBeAbleToTypeIntoEmptyContentEditableElement() editable.Clear(); editable.SendKeys("cheese"); // requires focus on OS X - Assert.AreEqual("cheese", editable.Text); + Assert.That(editable.Text, Is.EqualTo("cheese")); } [Test] @@ -711,7 +711,7 @@ public void ShouldBeAbleToTypeIntoContentEditableElementWithExistingValue() string initialText = editable.Text; editable.SendKeys(", edited"); - Assert.AreEqual(initialText + ", edited", editable.Text); + Assert.That(editable.Text, Is.EqualTo(initialText + ", edited")); } [Test] @@ -726,7 +726,7 @@ public void ShouldBeAbleToTypeIntoTinyMCE() editable.Clear(); editable.SendKeys("cheese"); // requires focus on OS X - Assert.AreEqual("cheese", editable.Text); + Assert.That(editable.Text, Is.EqualTo("cheese")); } private string GetValueText(IWebElement el) diff --git a/dotnet/test/common/UploadTest.cs b/dotnet/test/common/UploadTest.cs index c83363c2a7b98..5608e1e5d2747 100644 --- a/dotnet/test/common/UploadTest.cs +++ b/dotnet/test/common/UploadTest.cs @@ -69,7 +69,7 @@ public void CleanFileInput() IWebElement element = driver.FindElement(By.Id("upload")); element.SendKeys(testFile.FullName); element.Clear(); - Assert.AreEqual(string.Empty, element.GetAttribute("value")); + Assert.That(element.GetAttribute("value"), Is.Empty); } [Test] diff --git a/dotnet/test/common/VirtualAuthn/VirtualAuthenticatorTest.cs b/dotnet/test/common/VirtualAuthn/VirtualAuthenticatorTest.cs index e6c16e11b673a..fdfa743d4a51f 100644 --- a/dotnet/test/common/VirtualAuthn/VirtualAuthenticatorTest.cs +++ b/dotnet/test/common/VirtualAuthn/VirtualAuthenticatorTest.cs @@ -170,12 +170,12 @@ public void ShouldCreateAuthenticator() object response = jsDriver.ExecuteAsyncScript( "registerCredential().then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response)["status"]); + Assert.That((Dictionary)response, Does.ContainKey("status").WithValue("OK")); object assertionResponse = GetAssertionFor(ExtractRawIdFrom(response)); // Attempt to use the credential to get an assertion. - Assert.AreEqual("OK", ((Dictionary)assertionResponse)["status"]); + Assert.That((Dictionary)assertionResponse, Does.ContainKey("status").WithValue("OK")); } [Test] @@ -191,7 +191,27 @@ public void ShouldRemoveAuthenticator() webDriver.RemoveVirtualAuthenticator(authenticatorId); - Assert.IsNull(webDriver.AuthenticatorId); + Assert.That(webDriver.AuthenticatorId, Is.Null); + } + + [Test] + [NeedsFreshDriver(IsCreatedAfterTest = true)] + [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Virtual Authenticator")] + [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Virtual Authenticator")] + [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Virtual Authenticator")] + public void ShouldSupportMultipleVirtualAuthenticatorsAtOnce() + { + VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions(); + + string authenticatorId1 = webDriver.AddVirtualAuthenticator(options); + Assert.That(webDriver.AuthenticatorId, Is.EqualTo(authenticatorId1)); + + string authenticatorId2 = webDriver.AddVirtualAuthenticator(options); + + webDriver.RemoveVirtualAuthenticator(authenticatorId1); + webDriver.RemoveVirtualAuthenticator(authenticatorId2); + + Assert.That(webDriver.AuthenticatorId, Is.Null); } [Test] @@ -216,7 +236,7 @@ public void ShouldAddNonResidentCredential() // Attempt to use the credential to generate an assertion. object response = GetAssertionFor(id); - Assert.AreEqual("OK", ((Dictionary)response)["status"]); + Assert.That((Dictionary)response, Does.ContainKey("status").WithValue("OK")); } [Test] @@ -248,7 +268,7 @@ public void ShouldAddNonResidentCredentialWhenAuthenticatorUsesU2FProtocol() // Attempt to use the credential to generate an assertion. object response = GetAssertionFor(id); - Assert.AreEqual("OK", ((Dictionary)response)["status"]); + Assert.That((Dictionary)response, Does.ContainKey("status").WithValue("OK")); } [Test] @@ -272,14 +292,14 @@ public void ShouldAddResidentCredential() // empty allowCredentials array. object response = jsDriver.ExecuteAsyncScript( "getCredential([]).then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response)["status"]); + Assert.That(((Dictionary)response)["status"], Is.EqualTo("OK")); Dictionary attestation = (Dictionary)((Dictionary)response)["attestation"]; ReadOnlyCollection returnedUserHandle = (ReadOnlyCollection)attestation["userHandle"]; - Assert.AreEqual(1, returnedUserHandle.Count); - Assert.AreEqual(0, returnedUserHandle.IndexOf(1L)); + Assert.That(returnedUserHandle, Has.One.Items); + Assert.That(returnedUserHandle.IndexOf(1L), Is.Zero); } [Test] @@ -302,7 +322,9 @@ public void AddResidentCredentialNotSupportedWhenAuthenticatorUsesU2FProtocol() byte[] userHandle = { 1 }; Credential credential = Credential.CreateResidentCredential( credentialId, "localhost", base64EncodedEC256PK, userHandle, /*signCount=*/0); - Assert.Throws(() => webDriver.AddCredential(credential)); + Assert.That( + () => webDriver.AddCredential(credential), + Throws.TypeOf().With.Message.Contains("The Authenticator does not support Resident Credentials.")); } [Test] @@ -319,21 +341,21 @@ public void ShouldGetCredential() object response1 = jsDriver.ExecuteAsyncScript( "registerCredential({authenticatorSelection: {requireResidentKey: true}})" + " .then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response1)["status"]); + Assert.That((Dictionary)response1, Does.ContainKey("status").WithValue("OK")); // Register a non resident credential. object response2 = jsDriver.ExecuteAsyncScript( "registerCredential().then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response2)["status"]); + Assert.That((Dictionary)response2, Does.ContainKey("status").WithValue("OK")); byte[] credential1Id = ConvertListIntoArrayOfBytes(ExtractRawIdFrom(response1)); byte[] credential2Id = ConvertListIntoArrayOfBytes(ExtractRawIdFrom(response2)); - Assert.AreNotEqual(credential1Id, credential2Id); + Assert.That(credential2Id, Is.Not.EqualTo(credential1Id)); // Retrieve the two credentials. List credentials = webDriver.GetCredentials(); - Assert.AreEqual(2, credentials.Count); + Assert.That(credentials, Has.Exactly(2).Items); Credential credential1 = null; Credential credential2 = null; @@ -353,11 +375,11 @@ public void ShouldGetCredential() } } - Assert.True(credential1.IsResidentCredential); - Assert.NotNull(credential1.PrivateKey); + Assert.That(credential1.IsResidentCredential, Is.True); + Assert.That(credential1.PrivateKey, Is.Not.Null); - Assert.False(credential2.IsResidentCredential); - Assert.NotNull(credential2.PrivateKey); + Assert.That(credential2.IsResidentCredential, Is.False); + Assert.That(credential2.PrivateKey, Is.Not.Null); } [Test] @@ -373,7 +395,7 @@ public void ShouldRemoveCredentialByRawId() object response = jsDriver.ExecuteAsyncScript( "registerCredential().then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response)["status"]); + Assert.That((Dictionary)response, Does.ContainKey("status").WithValue("OK")); // Remove a credential by its ID as an array of bytes. List rawId = ExtractRawIdFrom(response); @@ -384,7 +406,7 @@ public void ShouldRemoveCredentialByRawId() object assertionResponse = GetAssertionFor(rawId); string error = (string)((Dictionary)assertionResponse)["status"]; - Assert.True(error.StartsWith("NotAllowedError")); + Assert.That(error, Does.StartWith("NotAllowedError")); } [Test] @@ -400,7 +422,7 @@ public void ShouldRemoveCredentialByBase64UrlId() object response = jsDriver.ExecuteAsyncScript( "registerCredential().then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response)["status"]); + Assert.That((Dictionary)response, Does.ContainKey("status").WithValue("OK")); // Remove a credential by its base64url ID. String credentialId = ExtractIdFrom(response); @@ -410,7 +432,7 @@ public void ShouldRemoveCredentialByBase64UrlId() object assertionResponse = GetAssertionFor(credentialId); string error = (string)((Dictionary)assertionResponse)["status"]; - Assert.True(error.StartsWith("NotAllowedError")); + Assert.That(error, Does.StartWith("NotAllowedError")); } [Test] @@ -425,12 +447,12 @@ public void ShouldRemoveAllCredentials() // Register two credentials. object response1 = jsDriver.ExecuteAsyncScript( "registerCredential().then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response1)["status"]); + Assert.That((Dictionary)response1, Does.ContainKey("status").WithValue("OK")); List rawId1 = ExtractRawIdFrom(response1); object response2 = jsDriver.ExecuteAsyncScript( "registerCredential().then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response2)["status"]); + Assert.That((Dictionary)response2, Does.ContainKey("status").WithValue("OK")); List rawId2 = ExtractRawIdFrom(response1); // Remove all credentials. @@ -449,7 +471,7 @@ public void ShouldRemoveAllCredentials() string error = (string)((Dictionary)response)["status"]; - Assert.True(error.StartsWith("NotAllowedError")); + Assert.That(error, Does.StartWith("NotAllowedError")); } [Test] @@ -465,7 +487,7 @@ public void testSetUserVerified() Object response = jsDriver.ExecuteAsyncScript( "registerCredential({authenticatorSelection: {userVerification: 'required'}})" + " .then(arguments[arguments.length - 1]);"); - Assert.AreEqual("OK", ((Dictionary)response)["status"]); + Assert.That((Dictionary)response, Does.ContainKey("status").WithValue("OK")); List rawId = ExtractRawIdFrom(response); // Getting an assertion requiring user verification should succeed. @@ -475,7 +497,7 @@ public void testSetUserVerified() + " \"id\": Int8Array.from(arguments[0])," + "}], {userVerification: 'required'}).then(arguments[arguments.length - 1]);", rawId); - Assert.AreEqual("OK", ((Dictionary)response)["status"]); + Assert.That((Dictionary)response, Does.ContainKey("status").WithValue("OK")); // Disable user verification. webDriver.SetUserVerified(false); @@ -490,7 +512,39 @@ public void testSetUserVerified() string error = (string)((Dictionary)response)["status"]; - Assert.True(error.StartsWith("NotAllowedError")); + Assert.That(error, Does.StartWith("NotAllowedError")); + } + + [Test] + [NeedsFreshDriver(IsCreatedAfterTest = true)] + [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Virtual Authenticator")] + [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Virtual Authenticator")] + [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Virtual Authenticator")] + public void ShouldThrowOnInvalidArguments() + { + Assert.That( + () => webDriver.AddVirtualAuthenticator(null), + Throws.ArgumentNullException); + + Assert.That( + () => webDriver.RemoveVirtualAuthenticator(null), + Throws.ArgumentNullException); + + Assert.That( + () => webDriver.AddCredential(null), + Throws.ArgumentNullException); + + Assert.That( + () => webDriver.RemoveCredential((byte[])null), + Throws.ArgumentNullException); + + Assert.That( + () => webDriver.RemoveCredential((string)null), + Throws.ArgumentNullException); + + Assert.That( + () => webDriver.RemoveVirtualAuthenticator("non-existant"), + Throws.TypeOf()); } } } diff --git a/dotnet/test/common/VisibilityTest.cs b/dotnet/test/common/VisibilityTest.cs index a48e785e95f8b..527699e6d8f88 100644 --- a/dotnet/test/common/VisibilityTest.cs +++ b/dotnet/test/common/VisibilityTest.cs @@ -111,8 +111,8 @@ public void ZeroSizedDivIsShownIfDescendantHasSize() IWebElement element = driver.FindElement(By.Id("zero")); Size size = element.Size; - Assert.AreEqual(0, size.Width, "Should have 0 width"); - Assert.AreEqual(0, size.Height, "Should have 0 height"); + Assert.That(size.Width, Is.Zero, "Should have 0 width"); + Assert.That(size.Height, Is.Zero, "Should have 0 height"); Assert.That(element.Displayed, Is.True); } @@ -268,9 +268,9 @@ public void ShouldBeAbleToClickOnElementsWithOpacityZero() driver.Url = clickJackerPage; IWebElement element = driver.FindElement(By.Id("clickJacker")); - Assert.AreEqual("0", element.GetCssValue("opacity"), "Precondition failed: clickJacker should be transparent"); + Assert.That(element.GetCssValue("opacity"), Is.EqualTo("0"), "Precondition failed: clickJacker should be transparent"); element.Click(); - Assert.AreEqual("1", element.GetCssValue("opacity")); + Assert.That(element.GetCssValue("opacity"), Is.EqualTo("1")); } [Test] diff --git a/dotnet/test/common/WebElementTest.cs b/dotnet/test/common/WebElementTest.cs index 5da1ec406f1be..9fcf68ee1b0f4 100644 --- a/dotnet/test/common/WebElementTest.cs +++ b/dotnet/test/common/WebElementTest.cs @@ -68,7 +68,7 @@ public void ShouldGetElementName() driver.Url = simpleTestPage; IWebElement oneliner = driver.FindElement(By.Id("oneline")); - Assert.AreEqual("p", oneliner.TagName.ToLower()); + Assert.That(oneliner.TagName, Is.EqualTo("p").IgnoreCase); } @@ -78,12 +78,12 @@ public void ShouldGetElementText() driver.Url = simpleTestPage; IWebElement oneliner = driver.FindElement(By.Id("oneline")); - Assert.AreEqual("A single line of text", oneliner.Text); + Assert.That(oneliner.Text, Is.EqualTo("A single line of text")); IWebElement twoblocks = driver.FindElement(By.Id("twoblocks")); - Assert.AreEqual("Some text" + + Assert.That(twoblocks.Text, Is.EqualTo("Some text" + System.Environment.NewLine + - "Some more text", twoblocks.Text); + "Some more text")); } @@ -110,7 +110,7 @@ public void ShouldClearElement() IWebElement textbox = driver.FindElement(By.Id("keyUp")); textbox.SendKeys("a@#$ç.ó"); textbox.Clear(); - Assert.AreEqual("", textbox.GetAttribute("value")); + Assert.That(textbox.GetAttribute("value"), Is.Empty); } [Test] @@ -121,7 +121,7 @@ public void ShouldClearRenderedElement() IWebElement textbox = driver.FindElement(By.Id("keyUp")); textbox.SendKeys("a@#$ç.ó"); textbox.Clear(); - Assert.AreEqual("", textbox.GetAttribute("value")); + Assert.That(textbox.GetAttribute("value"), Is.Empty); } [Test] @@ -131,7 +131,7 @@ public void ShouldSendKeysToElement() IWebElement textbox = driver.FindElement(By.Id("keyUp")); textbox.SendKeys("a@#$ç.ó"); - Assert.AreEqual("a@#$ç.ó", textbox.GetAttribute("value")); + Assert.That(textbox.GetAttribute("value"), Is.EqualTo("a@#$ç.ó")); } [Test] @@ -152,7 +152,7 @@ public void ShouldClickLinkElement() IWebElement changedDiv = driver.FindElement(By.Id("dynamo")); IWebElement link = driver.FindElement(By.LinkText("Update a div")); link.Click(); - Assert.AreEqual("Fish and chips!", changedDiv.Text); + Assert.That(changedDiv.Text, Is.EqualTo("Fish and chips!")); } [Test] @@ -162,8 +162,8 @@ public void ShouldGetAttributesFromElement() IWebElement dynamo = driver.FindElement(By.Id("dynamo")); IWebElement mousedown = driver.FindElement(By.Id("mousedown")); - Assert.AreEqual("mousedown", mousedown.GetAttribute("id")); - Assert.AreEqual("dynamo", dynamo.GetAttribute("id")); + Assert.That(mousedown.GetAttribute("id"), Is.EqualTo("mousedown")); + Assert.That(dynamo.GetAttribute("id"), Is.EqualTo("dynamo")); } } diff --git a/dotnet/test/common/WindowSwitchingTest.cs b/dotnet/test/common/WindowSwitchingTest.cs index ab153b8377a50..9128351111f67 100644 --- a/dotnet/test/common/WindowSwitchingTest.cs +++ b/dotnet/test/common/WindowSwitchingTest.cs @@ -36,23 +36,23 @@ public void ShouldSwitchFocusToANewWindowWhenItIsOpenedAndNotStopFutureOperation String current = driver.CurrentWindowHandle; driver.FindElement(By.LinkText("Open new window")).Click(); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); WaitFor(WindowCountToBe(2), "Window count was not 2"); WaitFor(WindowWithName("result"), "Could not find window with name 'result'"); WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title was not 'We Arrive Here'"); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); driver.Url = iframesPage; string handle = driver.CurrentWindowHandle; driver.FindElement(By.Id("iframe_page_heading")); driver.SwitchTo().Frame("iframe1"); - Assert.AreEqual(driver.CurrentWindowHandle, handle); + Assert.That(handle, Is.EqualTo(driver.CurrentWindowHandle)); driver.SwitchTo().DefaultContent(); driver.Close(); driver.SwitchTo().Window(current); - //Assert.AreEqual("XHTML Test Page", driver.Title); + //Assert.That(driver.Title, Is.EqualTo("TML Test Page")); } [Test] @@ -79,7 +79,7 @@ public void ShouldThrowNoSuchWindowExceptionOnAnAttemptToGetItsHandle() driver.FindElement(By.LinkText("Open new window")).Click(); WaitFor(WindowCountToBe(2), "Window count was not 2"); - Assert.AreEqual(2, driver.WindowHandles.Count); + Assert.That(driver.WindowHandles, Has.Exactly(2).Items); WaitFor(WindowWithName("result"), "Could not find window with name 'result'"); driver.SwitchTo().Window("result"); @@ -108,7 +108,7 @@ public void ShouldThrowNoSuchWindowExceptionOnAnyOperationIfAWindowIsClosed() driver.FindElement(By.LinkText("Open new window")).Click(); WaitFor(WindowCountToBe(2), "Window count was not 2"); - Assert.AreEqual(2, driver.WindowHandles.Count); + Assert.That(driver.WindowHandles, Has.Exactly(2).Items); WaitFor(WindowWithName("result"), "Could not find window with name 'result'"); driver.SwitchTo().Window("result"); @@ -141,7 +141,7 @@ public void ShouldThrowNoSuchWindowExceptionOnAnyElementOperationIfAWindowIsClos driver.FindElement(By.LinkText("Open new window")).Click(); WaitFor(WindowCountToBe(2), "Window count was not 2"); - Assert.AreEqual(2, driver.WindowHandles.Count); + Assert.That(driver.WindowHandles, Has.Exactly(2).Items); WaitFor(WindowWithName("result"), "Could not find window with name 'result'"); driver.SwitchTo().Window("result"); @@ -182,7 +182,7 @@ public void ShouldBeAbleToIterateOverAllOpenWindows() seenHandles.Add(handle); } - Assert.AreEqual(3, allWindowHandles.Count); + Assert.That(allWindowHandles, Has.Exactly(3).Items); } [Test] @@ -265,7 +265,7 @@ public void FailingToSwitchToAWindowLeavesTheCurrentWindowAsIs() String newHandle = driver.CurrentWindowHandle; - Assert.AreEqual(current, newHandle); + Assert.That(newHandle, Is.EqualTo(current)); } [Test] @@ -281,7 +281,7 @@ public void CanCloseWindowWhenMultipleWindowsAreOpen() ReadOnlyCollection allWindowHandles = driver.WindowHandles; // There should be two windows. We should also see each of the window titles at least once. - Assert.AreEqual(2, allWindowHandles.Count); + Assert.That(allWindowHandles, Has.Exactly(2).Items); string handle1 = allWindowHandles[1]; driver.SwitchTo().Window(handle1); driver.Close(); @@ -289,7 +289,7 @@ public void CanCloseWindowWhenMultipleWindowsAreOpen() WaitFor(WindowCountToBe(1), "Window count was not 1"); allWindowHandles = driver.WindowHandles; - Assert.AreEqual(1, allWindowHandles.Count); + Assert.That(allWindowHandles, Has.One.Items); } [Test] @@ -309,7 +309,7 @@ public void CanCloseWindowAndSwitchBackToMainWindow() ReadOnlyCollection allWindowHandles = driver.WindowHandles; // There should be two windows. We should also see each of the window titles at least once. - Assert.AreEqual(2, allWindowHandles.Count); + Assert.That(allWindowHandles, Has.Exactly(2).Items); foreach (string handle in allWindowHandles) { @@ -323,9 +323,9 @@ public void CanCloseWindowAndSwitchBackToMainWindow() driver.SwitchTo().Window(mainHandle); string newHandle = driver.CurrentWindowHandle; - Assert.AreEqual(mainHandle, newHandle); + Assert.That(newHandle, Is.EqualTo(mainHandle)); - Assert.AreEqual(1, driver.WindowHandles.Count); + Assert.That(driver.WindowHandles, Has.One.Items); } [Test] @@ -381,8 +381,8 @@ public void ShouldGetBrowserHandles() ReadOnlyCollection handles = driver.WindowHandles; // At least the two handles we want should be there. - Assert.Contains(handle1, handles, "Should have contained current handle"); - Assert.Contains(handle2, handles, "Should have contained result handle"); + Assert.That(handles, Does.Contain(handle1), "Should have contained current handle"); + Assert.That(handles, Does.Contain(handle2), "Should have contained result handle"); // Some (semi-)clean up.. driver.SwitchTo().Window(handle2); diff --git a/dotnet/test/common/WindowTest.cs b/dotnet/test/common/WindowTest.cs index ac8fd10128444..29110bc0439d7 100644 --- a/dotnet/test/common/WindowTest.cs +++ b/dotnet/test/common/WindowTest.cs @@ -60,8 +60,8 @@ public void ShouldBeAbleToSetTheSizeOfTheCurrentWindow() ChangeSizeBy(-20, -20); Size newSize = window.Size; - Assert.AreEqual(targetSize.Width, newSize.Width); - Assert.AreEqual(targetSize.Height, newSize.Height); + Assert.That(newSize.Width, Is.EqualTo(targetSize.Width)); + Assert.That(newSize.Height, Is.EqualTo(targetSize.Height)); } [Test] @@ -80,8 +80,8 @@ public void ShouldBeAbleToSetTheSizeOfTheCurrentWindowFromFrame() Size newSize = window.Size; - Assert.AreEqual(targetSize.Width, newSize.Width); - Assert.AreEqual(targetSize.Height, newSize.Height); + Assert.That(newSize.Width, Is.EqualTo(targetSize.Width)); + Assert.That(newSize.Height, Is.EqualTo(targetSize.Height)); } finally { @@ -105,8 +105,8 @@ public void ShouldBeAbleToSetTheSizeOfTheCurrentWindowFromIFrame() Size newSize = window.Size; - Assert.AreEqual(targetSize.Width, newSize.Width); - Assert.AreEqual(targetSize.Height, newSize.Height); + Assert.That(newSize.Width, Is.EqualTo(targetSize.Width)); + Assert.That(newSize.Height, Is.EqualTo(targetSize.Height)); } finally { @@ -134,8 +134,8 @@ public void ShouldBeAbleToSetThePositionOfTheCurrentWindow() Point newLocation = window.Position; - Assert.AreEqual(targetPosition.X, newLocation.X); - Assert.AreEqual(targetPosition.Y, newLocation.Y); + Assert.That(newLocation.X, Is.EqualTo(targetPosition.X)); + Assert.That(newLocation.Y, Is.EqualTo(targetPosition.Y)); } [Test] diff --git a/dotnet/test/firefox/FirefoxDriverTest.cs b/dotnet/test/firefox/FirefoxDriverTest.cs index 0ea48610a235a..0de306815de96 100644 --- a/dotnet/test/firefox/FirefoxDriverTest.cs +++ b/dotnet/test/firefox/FirefoxDriverTest.cs @@ -34,15 +34,9 @@ public void ShouldContinueToWorkIfUnableToFindElementById() { driver.Url = formsPage; - try - { - driver.FindElement(By.Id("notThere")); - Assert.Fail("Should not be able to select element by id here"); - } - catch (NoSuchElementException) - { - // This is expected - } + Assert.That( + () => driver.FindElement(By.Id("notThere")), + Throws.InstanceOf()); // Is this works, then we're golden driver.Url = xhtmlTestPage; @@ -64,7 +58,7 @@ public void ShouldWaitUntilBrowserHasClosedProperly() textarea.SendKeys(expectedText); string seenText = textarea.GetAttribute("value"); - Assert.AreEqual(expectedText, seenText); + Assert.That(seenText, Is.EqualTo(expectedText)); } //[Test] @@ -75,8 +69,8 @@ public void ShouldBeAbleToStartMoreThanOneInstanceOfTheFirefoxDriverSimultaneous driver.Url = xhtmlTestPage; secondDriver.Url = formsPage; - Assert.AreEqual("XHTML Test Page", driver.Title); - Assert.AreEqual("We Leave From Here", secondDriver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); + Assert.That(secondDriver.Title, Is.EqualTo("We Leave From Here")); // We only need to quit the second driver if the test passes secondDriver.Quit(); @@ -109,7 +103,7 @@ public void ShouldRemoveProfileAfterExit() string profileLocation = profile.ProfileDirectory; firefox.Quit(); - Assert.IsFalse(Directory.Exists(profileLocation)); + Assert.That(profileLocation, Does.Not.Exist); } //[Test] @@ -133,7 +127,7 @@ public void FocusRemainsInOriginalWindowWhenOpeningNewWindow() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("ABC DEF"); - Assert.AreEqual("ABC DEF", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("ABC DEF")); } //[Test] @@ -157,7 +151,7 @@ public void SwitchingWindowShouldSwitchFocus() List allWindowHandles = new List(driver.WindowHandles); // There should be two windows. We should also see each of the window titles at least once. - Assert.AreEqual(2, allWindowHandles.Count); + Assert.That(allWindowHandles, Has.Exactly(2).Items); allWindowHandles.Remove(originalWinHandle); string newWinHandle = (string)allWindowHandles[0]; @@ -169,7 +163,7 @@ public void SwitchingWindowShouldSwitchFocus() IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("ABC DEF"); - Assert.AreEqual("ABC DEF", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("ABC DEF")); // Key events in original window. driver.SwitchTo().Window(originalWinHandle); @@ -178,7 +172,7 @@ public void SwitchingWindowShouldSwitchFocus() IWebElement keyReporter2 = driver.FindElement(By.Id("keyReporter")); keyReporter2.SendKeys("QWERTY"); - Assert.AreEqual("QWERTY", keyReporter2.GetAttribute("value")); + Assert.That(keyReporter2.GetAttribute("value"), Is.EqualTo("QWERTY")); } //[Test] @@ -199,7 +193,7 @@ public void ClosingWindowAndSwitchingToOriginalSwitchesFocus() SleepBecauseWindowsTakeTimeToOpen(); List allWindowHandles = new List(driver.WindowHandles); // There should be two windows. We should also see each of the window titles at least once. - Assert.AreEqual(2, allWindowHandles.Count); + Assert.That(allWindowHandles, Has.Exactly(2).Items); allWindowHandles.Remove(originalWinHandle); string newWinHandle = (string)allWindowHandles[0]; @@ -217,7 +211,7 @@ public void ClosingWindowAndSwitchingToOriginalSwitchesFocus() driver.Url = javascriptPage; IWebElement keyReporter = driver.FindElement(By.Id("keyReporter")); keyReporter.SendKeys("ABC DEF"); - Assert.AreEqual("ABC DEF", keyReporter.GetAttribute("value")); + Assert.That(keyReporter.GetAttribute("value"), Is.EqualTo("ABC DEF")); } //[Test] @@ -234,7 +228,7 @@ public void CanBlockInvalidSslCertificates() secondDriver = new FirefoxDriver(options); secondDriver.Url = url; string gotTitle = secondDriver.Title; - Assert.AreNotEqual("Hello IWebDriver", gotTitle); + Assert.That(gotTitle, Is.EqualTo("Hello IWebDriver")); } catch (Exception) { @@ -263,7 +257,7 @@ public void ShouldAllowUserToSuccessfullyOverrideTheHomePage() try { - Assert.AreEqual(javascriptPage, driver2.Url); + Assert.That(driver2.Url, Is.EqualTo(javascriptPage)); } finally { diff --git a/dotnet/test/firefox/FirefoxProfileManagerTest.cs b/dotnet/test/firefox/FirefoxProfileManagerTest.cs index 82833b3e7c035..649241074440f 100644 --- a/dotnet/test/firefox/FirefoxProfileManagerTest.cs +++ b/dotnet/test/firefox/FirefoxProfileManagerTest.cs @@ -36,28 +36,28 @@ public void SetUp() public void ShouldGetNamedProfile() { FirefoxProfile profile = manager.GetProfile("default"); - Assert.IsNotNull(profile); + Assert.That(profile, Is.Not.Null); } //[Test] public void ShouldReturnNullForInvalidProfileName() { FirefoxProfile profile = manager.GetProfile("ThisIsMyBogusProfileName"); - Assert.IsNull(profile); + Assert.That(profile, Is.Null); } //[Test] public void ShouldReturnNullForNullProfileName() { FirefoxProfile profile = manager.GetProfile(null); - Assert.IsNull(profile); + Assert.That(profile, Is.Null); } //[Test] public void ShouldReturnNullForEmptyProfileName() { FirefoxProfile profile = manager.GetProfile(string.Empty); - Assert.IsNull(profile); + Assert.That(profile, Is.Null); } } } diff --git a/dotnet/test/firefox/FirefoxProfileTests.cs b/dotnet/test/firefox/FirefoxProfileTests.cs index 3cc64fd2220fc..3b1b89cdbd5b8 100644 --- a/dotnet/test/firefox/FirefoxProfileTests.cs +++ b/dotnet/test/firefox/FirefoxProfileTests.cs @@ -54,7 +54,7 @@ public void ShouldQuoteStringsWhenSettingStringProperties() break; } } - Assert.IsTrue(seenCheese); + Assert.That(seenCheese, Is.True); } //[Test] @@ -72,7 +72,7 @@ public void ShouldSetIntegerPreferences() break; } } - Assert.IsTrue(seenCheese, "Did not see integer value being set correctly"); + Assert.That(seenCheese, Is.True, "Did not see integer value being set correctly"); } //[Test] @@ -90,7 +90,7 @@ public void testShouldSetBooleanPreferences() } } - Assert.IsTrue(seenCheese, "Did not see boolean value being set correctly"); + Assert.That(seenCheese, Is.True, "Did not see boolean value being set correctly"); } private List ReadGeneratedProperties() diff --git a/dotnet/test/ie/IeSpecificTests.cs b/dotnet/test/ie/IeSpecificTests.cs index 444bf96096765..0158c19158f98 100644 --- a/dotnet/test/ie/IeSpecificTests.cs +++ b/dotnet/test/ie/IeSpecificTests.cs @@ -118,7 +118,7 @@ public void KeysTest() } } - Assert.IsTrue(passed, errors); + Assert.That(passed, errors); } //[Test] @@ -140,7 +140,7 @@ public void ScrollingFrameTest() WaitFor(FrameToExistAndBeSwitchedTo("scrolling_frame"), "No frame with name or id 'scrolling_frame' found"); IWebElement element = driver.FindElement(By.Name("scroll_checkbox")); element.Click(); - Assert.IsTrue(element.Selected); + Assert.That(element.Selected); driver.SwitchTo().DefaultContent(); @@ -148,7 +148,7 @@ public void ScrollingFrameTest() WaitFor(FrameToExistAndBeSwitchedTo("scrolling_frame"), "No frame with name or id 'scrolling_frame' found"); element = driver.FindElement(By.Name("scroll_checkbox")); element.Click(); - Assert.IsTrue(element.Selected); + Assert.That(element.Selected); } finally { @@ -176,11 +176,11 @@ public void ShouldBeAbleToBrowseTransformedXml() driver.FindElement(By.Id("x")).Click(); // Sleep is required; driver may not be fast enough after this Click(). System.Threading.Thread.Sleep(2000); - Assert.AreEqual("XHTML Test Page", driver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); // Act on the result page to make sure the window handling is still valid. driver.FindElement(By.Id("linkId")).Click(); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } //[Test] @@ -191,8 +191,8 @@ public void ShouldBeAbleToStartMoreThanOneInstanceOfTheIEDriverSimultaneously() driver.Url = xhtmlTestPage; secondDriver.Url = formsPage; - Assert.AreEqual("XHTML Test Page", driver.Title); - Assert.AreEqual("We Leave From Here", secondDriver.Title); + Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); + Assert.That(secondDriver.Title, Is.EqualTo("We Arrive Here")); // We only need to quit the second driver if the test passes secondDriver.Quit(); @@ -212,7 +212,7 @@ public void ShouldPropagateSessionCookies() string bodyStyle = driver.FindElement(By.TagName("body")).GetAttribute("style"); driver.Close(); driver.SwitchTo().Window(startWindow); - Assert.IsTrue(bodyStyle.Contains("BACKGROUND-COLOR: #80ffff") || bodyStyle.Contains("background-color: rgb(128, 255, 255)")); + Assert.That(bodyStyle, Does.Contain("BACKGROUND-COLOR: #80ffff").Or.Contain("background-color: rgb(128, 255, 255)")); } //[Test] @@ -226,7 +226,7 @@ public void ShouldHandleShowModalDialogWindows() WaitFor(() => { return driver.WindowHandles.Count > 1; }, "Window count was not greater than 1"); ReadOnlyCollection windowHandles = driver.WindowHandles; - Assert.AreEqual(2, windowHandles.Count); + Assert.That(windowHandles, Has.Exactly(2).Items); string dialogHandle = string.Empty; foreach (string handle in windowHandles) @@ -238,7 +238,7 @@ public void ShouldHandleShowModalDialogWindows() } } - Assert.AreNotEqual(string.Empty, dialogHandle); + Assert.That(dialogHandle, Is.Not.Empty); driver.SwitchTo().Window(dialogHandle); IWebElement closeElement = driver.FindElement(By.Id("close")); @@ -247,7 +247,7 @@ public void ShouldHandleShowModalDialogWindows() WaitFor(() => { return driver.WindowHandles.Count == 1; }, "Window count was not 1"); windowHandles = driver.WindowHandles; - Assert.AreEqual(1, windowHandles.Count); + Assert.That(windowHandles, Has.One.Items); driver.SwitchTo().Window(originalWindowHandle); } @@ -256,9 +256,9 @@ public void ScrollTest() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("scroll.html"); driver.FindElement(By.Id("line8")).Click(); - Assert.AreEqual("line8", driver.FindElement(By.Id("clicked")).Text); + Assert.That(driver.FindElement(By.Id("clicked")).Text, Is.EqualTo("line8")); driver.FindElement(By.Id("line1")).Click(); - Assert.AreEqual("line1", driver.FindElement(By.Id("clicked")).Text); + Assert.That(driver.FindElement(By.Id("clicked")).Text, Is.EqualTo("line1")); } //[Test] @@ -268,7 +268,7 @@ public void ShouldNotScrollOverflowElementsWhichAreVisible() var list = driver.FindElement(By.TagName("ul")); var item = list.FindElement(By.Id("desired")); item.Click(); - Assert.AreEqual(0, ((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0].scrollTop;", list), "Should not have scrolled"); + Assert.That(((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0].scrollTop;", list), Is.Zero, "Should not have scrolled"); } //[Test] @@ -278,7 +278,7 @@ public void ShouldNotScrollIfAlreadyScrolledAndElementIsInView() driver.FindElement(By.Id("button1")).Click(); var scrollTop = GetScrollTop(); driver.FindElement(By.Id("button2")).Click(); - Assert.AreEqual(scrollTop, GetScrollTop()); + Assert.That(GetScrollTop(), Is.EqualTo(scrollTop)); } //[Test] @@ -293,7 +293,7 @@ public void ShouldBeAbleToHandleCascadingModalDialogs() ReadOnlyCollection windows = driver.WindowHandles; string firstWindowHandle = windows.Except(new List() { parentHandle }).First(); driver.SwitchTo().Window(firstWindowHandle); - Assert.AreEqual(2, windows.Count); + Assert.That(windows, Has.Exactly(2).Items); // Launch second modal driver.FindElement(By.CssSelector("input[type='button'][value='btn2']")).Click(); @@ -301,14 +301,14 @@ public void ShouldBeAbleToHandleCascadingModalDialogs() ReadOnlyCollection windows_1 = driver.WindowHandles; string secondWindowHandle = windows_1.Except(windows).First(); driver.SwitchTo().Window(secondWindowHandle); - Assert.AreEqual(3, windows_1.Count); + Assert.That(windows_1, Has.Exactly(3).Items); // Launch third modal driver.FindElement(By.CssSelector("input[type='button'][value='btn3']")).Click(); WaitFor(() => { return driver.WindowHandles.Count > 3; }, "Window count was not greater than 3"); ReadOnlyCollection windows_2 = driver.WindowHandles; string finalWindowHandle = windows_2.Except(windows_1).First(); - Assert.AreEqual(4, windows_2.Count); + Assert.That(windows_2, Has.Exactly(4).Items); driver.SwitchTo().Window(finalWindowHandle).Close(); driver.SwitchTo().Window(secondWindowHandle).Close(); @@ -328,7 +328,7 @@ public void ShouldBeAbleToHandleCascadingModalDialogsLaunchedWithJavaScriptLinks ReadOnlyCollection windows = driver.WindowHandles; string firstWindowHandle = windows.Except(new List() { parentHandle }).First(); driver.SwitchTo().Window(firstWindowHandle); - Assert.AreEqual(2, windows.Count); + Assert.That(windows, Has.Exactly(2).Items); // Launch second modal driver.FindElement(By.CssSelector("a[id='lnk2']")).Click(); @@ -337,14 +337,14 @@ public void ShouldBeAbleToHandleCascadingModalDialogsLaunchedWithJavaScriptLinks ReadOnlyCollection windows_1 = driver.WindowHandles; string secondWindowHandle = windows_1.Except(windows).First(); driver.SwitchTo().Window(secondWindowHandle); - Assert.AreEqual(3, windows_1.Count); + Assert.That(windows_1, Has.Exactly(3).Items); // Launch third modal driver.FindElement(By.CssSelector("a[id='lnk3']")).Click(); WaitFor(() => { return driver.WindowHandles.Count > 3; }, "Window count was not greater than 3"); ReadOnlyCollection windows_2 = driver.WindowHandles; string finalWindowHandle = windows_2.Except(windows_1).First(); - Assert.AreEqual(4, windows_2.Count); + Assert.That(windows_2, Has.Exactly(4).Items); driver.SwitchTo().Window(finalWindowHandle).Close(); driver.SwitchTo().Window(secondWindowHandle).Close(); diff --git a/dotnet/test/remote/RemoteSessionCreationTests.cs b/dotnet/test/remote/RemoteSessionCreationTests.cs index 685b234cd1b57..a194c3e96d5ad 100644 --- a/dotnet/test/remote/RemoteSessionCreationTests.cs +++ b/dotnet/test/remote/RemoteSessionCreationTests.cs @@ -34,7 +34,7 @@ public void CreateChromeRemoteSession() chrome.Url = xhtmlTestPage; try { - Assert.AreEqual("XHTML Test Page", chrome.Title); + Assert.That(chrome.Title, Is.EqualTo("XHTML Test Page")); } finally { @@ -49,7 +49,7 @@ public void CreateFirefoxRemoteSession() firefox.Url = xhtmlTestPage; try { - Assert.AreEqual("XHTML Test Page", firefox.Title); + Assert.That(firefox.Title, Is.EqualTo("XHTML Test Page")); } finally { @@ -64,7 +64,7 @@ public void CreateEdgeRemoteSession() edge.Url = xhtmlTestPage; try { - Assert.AreEqual("XHTML Test Page", edge.Title); + Assert.That(edge.Title, Is.EqualTo("XHTML Test Page")); } finally { diff --git a/dotnet/test/remote/RemoteWebDriverSpecificTests.cs b/dotnet/test/remote/RemoteWebDriverSpecificTests.cs index 1462f4cbc8a9e..391309436ff6c 100644 --- a/dotnet/test/remote/RemoteWebDriverSpecificTests.cs +++ b/dotnet/test/remote/RemoteWebDriverSpecificTests.cs @@ -62,7 +62,7 @@ public void ShouldBeAbleToSendFileToRemoteServer() IAllowsFileDetection fileDetectionDriver = driver as IAllowsFileDetection; if (fileDetectionDriver == null) { - Assert.Fail("driver does not support file detection. This should not be"); + Assert.That(driver, Is.InstanceOf(), "driver does not support file detection. This should not be"); } fileDetectionDriver.FileDetector = new LocalFileDetector(); @@ -75,7 +75,7 @@ public void ShouldBeAbleToSendFileToRemoteServer() driver.SwitchTo().Frame("upload_target"); IWebElement body = driver.FindElement(By.XPath("//body")); - Assert.IsTrue(LoremIpsumText == body.Text, "Page source is: " + driver.PageSource); + Assert.That(body.Text, Is.EqualTo(LoremIpsumText), "Page source is: " + driver.PageSource); driver.SwitchTo().DefaultContent(); uploadElement = driver.FindElement(By.Id("upload")); Console.WriteLine(uploadElement.Text); diff --git a/dotnet/test/support/Events/EventFiringWebDriverElementTest.cs b/dotnet/test/support/Events/EventFiringWebDriverElementTest.cs index fd668df43d92b..5ed36b705700c 100644 --- a/dotnet/test/support/Events/EventFiringWebDriverElementTest.cs +++ b/dotnet/test/support/Events/EventFiringWebDriverElementTest.cs @@ -37,7 +37,7 @@ public void CanTakeEventFiringWebElementScreenshot() IWebElement element = firingDriver.FindElement(By.Name("checky")); Screenshot screenshot = ((ITakesScreenshot)element).GetScreenshot(); - Assert.IsNotNull(screenshot); + Assert.That(screenshot, Is.Not.Null); } } } diff --git a/dotnet/test/support/Events/EventFiringWebDriverTest.cs b/dotnet/test/support/Events/EventFiringWebDriverTest.cs index 8623c02b5f07a..bf2d95aec33f3 100644 --- a/dotnet/test/support/Events/EventFiringWebDriverTest.cs +++ b/dotnet/test/support/Events/EventFiringWebDriverTest.cs @@ -85,7 +85,7 @@ Navigated forward mockNavigation.Verify(x => x.ForwardAsync(), Times.Once); string normalizedActualLog = log.ToString().Replace("\r\n", "\n").Replace("\r", "\n"); - Assert.AreEqual(normalizedExpectedLog, normalizedActualLog); + Assert.That(normalizedActualLog, Is.EqualTo(normalizedExpectedLog)); } [Test] @@ -103,7 +103,7 @@ public void ShouldFireClickEvent() string expectedLog = @"Clicking Clicked "; - Assert.AreEqual(expectedLog, log.ToString()); + Assert.That(log.ToString(), Is.EqualTo(expectedLog)); } [Test] @@ -126,7 +126,7 @@ public void ShouldFireValueChangedEvent() ValueChanging 'Dummy Text' ValueChanged 'Dummy Text' "; - Assert.AreEqual(expectedLog, log.ToString()); + Assert.That(log.ToString(), Is.EqualTo(expectedLog)); } [Test] @@ -138,7 +138,7 @@ public void ElementsCanEqual() var element1 = firingDriver.FindElement(By.Id("foo")); var element2 = firingDriver.FindElement(By.Id("foo")); - Assert.AreEqual(element1, element2); + Assert.That(element2, Is.EqualTo(element1)); } [Test] @@ -172,7 +172,7 @@ public void ShouldFireFindByEvent() FindElementCompleted from IWebDriver By.XPath: //link[@type = 'text/css'] "; - Assert.AreEqual(expectedLog, log.ToString()); + Assert.That(log.ToString(), Is.EqualTo(expectedLog)); } [Test] @@ -184,17 +184,11 @@ public void ShouldCallListenerOnException() EventFiringWebDriver firingDriver = new EventFiringWebDriver(mockDriver.Object); firingDriver.ExceptionThrown += new EventHandler(firingDriver_ExceptionThrown); - try - { - firingDriver.FindElement(By.Id("foo")); - Assert.Fail("Expected exception to be propogated"); - } - catch (NoSuchElementException) - { - // Fine - } + Assert.That( + () => firingDriver.FindElement(By.Id("foo")), + Throws.InstanceOf()); - Assert.IsTrue(log.ToString().Contains(exception.Message)); + Assert.That(log.ToString(), Does.Contain(exception.Message)); } [Test] @@ -231,7 +225,7 @@ public void ShouldBeAbleToAccessWrappedInstanceFromEventCalls() stubDriver = new StubDriver(); EventFiringWebDriver testDriver = new EventFiringWebDriver(stubDriver); StubDriver wrapped = ((IWrapsDriver)testDriver).WrappedDriver as StubDriver; - Assert.AreEqual(stubDriver, wrapped); + Assert.That(wrapped, Is.EqualTo(stubDriver)); testDriver.Navigating += new EventHandler(testDriver_Navigating); testDriver.Url = "http://example.org"; @@ -253,13 +247,13 @@ public void ShouldFireGetShadowRootEvents() // act abcElement.GetShadowRoot(); - Assert.IsNotNull(gettingShadowRootArgs); - Assert.AreEqual(mockDriver.Object, gettingShadowRootArgs.Driver); - Assert.AreEqual(mockElement.Object, gettingShadowRootArgs.SearchContext); + Assert.That(gettingShadowRootArgs, Is.Not.Null); + Assert.That(gettingShadowRootArgs.Driver, Is.EqualTo(mockDriver.Object)); + Assert.That(gettingShadowRootArgs.SearchContext, Is.EqualTo(mockElement.Object)); - Assert.IsNotNull(getShadowRootCompletedArgs); - Assert.AreEqual(mockDriver.Object, getShadowRootCompletedArgs.Driver); - Assert.AreEqual(mockElement.Object, getShadowRootCompletedArgs.SearchContext); + Assert.That(getShadowRootCompletedArgs, Is.Not.Null); + Assert.That(getShadowRootCompletedArgs.Driver, Is.EqualTo(mockDriver.Object)); + Assert.That(getShadowRootCompletedArgs.SearchContext, Is.EqualTo(mockElement.Object)); } [Test] @@ -281,18 +275,18 @@ public void ShouldFireFindEventsInShadowRoot() // act var element = shadowRoot.FindElement(By.CssSelector(".abc")); - Assert.IsNotNull(findingElementArgs); - Assert.AreEqual(mockDriver.Object, findingElementArgs.Driver); - Assert.AreEqual(null, findingElementArgs.Element); + Assert.That(findingElementArgs, Is.Not.Null); + Assert.That(findingElementArgs.Driver, Is.EqualTo(mockDriver.Object)); + Assert.That(findingElementArgs.Element, Is.Null); - Assert.IsNotNull(findElementCompletedArgs); - Assert.AreEqual(mockDriver.Object, findElementCompletedArgs.Driver); - Assert.AreEqual(null, findElementCompletedArgs.Element); + Assert.That(findElementCompletedArgs, Is.Not.Null); + Assert.That(findElementCompletedArgs.Driver, Is.EqualTo(mockDriver.Object)); + Assert.That(findElementCompletedArgs.Element, Is.Null); } void testDriver_Navigating(object sender, WebDriverNavigationEventArgs e) { - Assert.AreEqual(e.Driver, stubDriver); + Assert.That(stubDriver, Is.EqualTo(e.Driver)); } void firingDriver_ExceptionThrown(object sender, WebDriverExceptionEventArgs e) diff --git a/dotnet/test/support/UI/DefaultWaitTest.cs b/dotnet/test/support/UI/DefaultWaitTest.cs index 311123a2032eb..6da08aa208ce9 100644 --- a/dotnet/test/support/UI/DefaultWaitTest.cs +++ b/dotnet/test/support/UI/DefaultWaitTest.cs @@ -55,7 +55,7 @@ public void ShouldWaitUntilReturnValueOfConditionIsNotNull() wait.PollingInterval = TimeSpan.FromSeconds(2); wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(NoSuchFrameException)); - Assert.AreEqual(defaultReturnValue, wait.Until(condition)); + Assert.That(wait.Until(condition), Is.EqualTo(defaultReturnValue)); } [Test] @@ -71,7 +71,7 @@ public void ShouldWaitUntilABooleanResultIsTrue() wait.PollingInterval = TimeSpan.FromSeconds(2); wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(NoSuchFrameException)); - Assert.IsTrue(wait.Until(condition)); + Assert.That(wait.Until(condition), Is.True); } [Test] @@ -102,7 +102,7 @@ public void CanIgnoreMultipleExceptions() wait.PollingInterval = TimeSpan.FromSeconds(2); wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(NoSuchFrameException)); - Assert.AreEqual(defaultReturnValue, wait.Until(condition)); + Assert.That(wait.Until(condition), Is.EqualTo(defaultReturnValue)); } [Test] @@ -119,10 +119,10 @@ public void PropagatesUnIgnoredExceptions() wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(NoSuchFrameException)); var caughtException = Assert.Throws(() => wait.Until(condition)); - Assert.AreSame(ex, caughtException); + Assert.That(caughtException, Is.SameAs(ex)); // Regression test for issue #6343 - StringAssert.Contains("NonInlineableThrow", caughtException.StackTrace, "the stack trace must include the call to NonInlineableThrow()"); + Assert.That(caughtException.StackTrace, Does.Contain("NonInlineableThrow"), "the stack trace must include the call to NonInlineableThrow()"); } [Test] @@ -139,7 +139,7 @@ public void TimeoutMessageIncludesLastIgnoredException() wait.IgnoreExceptionTypes(typeof(NoSuchWindowException)); var caughtException = Assert.Throws(() => wait.Until(condition)); - Assert.AreSame(ex, caughtException.InnerException); + Assert.That(caughtException.InnerException, Is.SameAs(ex)); } [Test] diff --git a/dotnet/test/support/UI/LoadableComponentTests.cs b/dotnet/test/support/UI/LoadableComponentTests.cs index cd86498113cbd..0d99c2c8161f1 100644 --- a/dotnet/test/support/UI/LoadableComponentTests.cs +++ b/dotnet/test/support/UI/LoadableComponentTests.cs @@ -45,7 +45,7 @@ public void ShouldCauseTheLoadMethodToBeCalledIfTheComponentIsNotAlreadyLoaded() ok.Load(); - Assert.True(ok.WasLoadCalled()); + Assert.That(ok.WasLoadCalled(), Is.True); } [Test] @@ -53,31 +53,21 @@ public void ShouldThrowAnErrorIfCallingLoadDoesNotCauseTheComponentToLoad() { LoadsOk ok = new LoadsOk(false); - try - { - ok.Load(); - Assert.Fail(); - } - catch (LoadableComponentException e) - { - Assert.AreEqual("Expected failure", e.Message); - } + Assert.That( + () => ok.Load(), + Throws.InstanceOf().With.Message.EqualTo("Expected failure")); } [Test] public void ShouldCallHandleLoadErrorWhenWebDriverExceptionOccursDuringExecuteLoad() { ExecuteLoadThrows loadThrows = new ExecuteLoadThrows(); - try - { - loadThrows.Load(); - Assert.Fail(); - } - catch (Exception e) - { - Assert.AreEqual("HandleLoadError called", e.Message); - Assert.AreEqual("Excpected failure in ExecuteLoad", e.InnerException.Message); - } + + Assert.That( + () => loadThrows.Load(), + Throws.Exception + .With.Message.EqualTo("HandleLoadError called") + .And.InnerException.Message.EqualTo("Excpected failure in ExecuteLoad")); } diff --git a/dotnet/test/support/UI/PopupWindowFinderTest.cs b/dotnet/test/support/UI/PopupWindowFinderTest.cs index 692fa8d19e1bb..ac9f805083fd0 100644 --- a/dotnet/test/support/UI/PopupWindowFinderTest.cs +++ b/dotnet/test/support/UI/PopupWindowFinderTest.cs @@ -49,11 +49,11 @@ public void ShouldFindPopupWindowUsingAction() PopupWindowFinder finder = new PopupWindowFinder(driver); string newHandle = finder.Invoke(() => { driver.FindElement(By.LinkText("Open new window")).Click(); }); - Assert.That(newHandle, Is.Not.Null.Or.Empty); - Assert.AreNotEqual(current, newHandle); + Assert.That(newHandle, Is.Not.Null.And.Not.Empty); + Assert.That(newHandle, Is.Not.EqualTo(current)); driver.SwitchTo().Window(newHandle); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); driver.Close(); driver.SwitchTo().Window(current); @@ -68,11 +68,11 @@ public void ShouldFindPopupWindowUsingElementClick() PopupWindowFinder finder = new PopupWindowFinder(driver); string newHandle = finder.Click(driver.FindElement(By.LinkText("Open new window"))); - Assert.That(newHandle, Is.Not.Null.Or.Empty); - Assert.AreNotEqual(current, newHandle); + Assert.That(newHandle, Is.Not.Null.And.Not.Empty); + Assert.That(newHandle, Is.Not.EqualTo(current)); driver.SwitchTo().Window(newHandle); - Assert.AreEqual("We Arrive Here", driver.Title); + Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); driver.Close(); driver.SwitchTo().Window(current); @@ -86,14 +86,14 @@ public void ShouldFindMultiplePopupWindowsInSuccession() PopupWindowFinder finder = new PopupWindowFinder(driver); string second = finder.Click(driver.FindElement(By.Name("windowOne"))); - Assert.That(second, Is.Not.Null.Or.Empty); - Assert.AreNotEqual(first, second); + Assert.That(second, Is.Not.Null.And.Not.Empty); + Assert.That(second, Is.Not.EqualTo(first)); finder = new PopupWindowFinder(driver); string third = finder.Click(driver.FindElement(By.Name("windowTwo"))); - Assert.That(third, Is.Not.Null.Or.Empty); - Assert.AreNotEqual(first, third); - Assert.AreNotEqual(second, third); + Assert.That(third, Is.Not.Null.And.Not.Empty); + Assert.That(third, Is.Not.EqualTo(first)); + Assert.That(third, Is.Not.EqualTo(second)); driver.SwitchTo().Window(second); driver.Close(); @@ -109,7 +109,9 @@ public void ShouldNotFindPopupWindowWhenNoneExists() { driver.Url = xhtmlTestPage; PopupWindowFinder finder = new PopupWindowFinder(driver); - Assert.Throws(() => { string handle = finder.Click(driver.FindElement(By.Id("linkId"))); }); + Assert.That( + () => finder.Click(driver.FindElement(By.Id("linkId"))), + Throws.TypeOf()); } } } diff --git a/dotnet/test/support/UI/SelectBrowserTests.cs b/dotnet/test/support/UI/SelectBrowserTests.cs index fc835d96a4596..3978627f37073 100644 --- a/dotnet/test/support/UI/SelectBrowserTests.cs +++ b/dotnet/test/support/UI/SelectBrowserTests.cs @@ -51,7 +51,9 @@ public void Setup() public void ShouldThrowAnExceptionIfTheElementIsNotASelectElement() { IWebElement element = driver.FindElement(By.Name("checky")); - Assert.Throws(() => { SelectElement elementWrapper = new SelectElement(element); }); + Assert.That( + () => new SelectElement(element), + Throws.TypeOf()); } [Test] @@ -59,7 +61,7 @@ public void ShouldIndicateThatASelectCanSupportMultipleOptions() { IWebElement element = driver.FindElement(By.Name("multi")); SelectElement elementWrapper = new SelectElement(element); - Assert.IsTrue(elementWrapper.IsMultiple); + Assert.That(elementWrapper.IsMultiple, Is.True); } [Test] @@ -67,7 +69,7 @@ public void ShouldIndicateThatASelectCanSupportMultipleOptionsWithEmptyMultipleA { IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.IsTrue(elementWrapper.IsMultiple); + Assert.That(elementWrapper.IsMultiple, Is.True); } [Test] @@ -75,7 +77,7 @@ public void ShouldIndicateThatASelectCanSupportMultipleOptionsWithTrueMultipleAt { IWebElement element = driver.FindElement(By.Name("multi_true")); SelectElement elementWrapper = new SelectElement(element); - Assert.IsTrue(elementWrapper.IsMultiple); + Assert.That(elementWrapper.IsMultiple, Is.True); } [Test] @@ -83,7 +85,7 @@ public void ShouldNotIndicateThatANormalSelectSupportsMulitpleOptions() { IWebElement element = driver.FindElement(By.Name("selectomatic")); SelectElement elementWrapper = new SelectElement(element); - Assert.IsFalse(elementWrapper.IsMultiple); + Assert.That(elementWrapper.IsMultiple, Is.False); } [Test] @@ -91,7 +93,7 @@ public void ShouldIndicateThatASelectCanSupportMultipleOptionsWithFalseMultipleA { IWebElement element = driver.FindElement(By.Name("multi_false")); SelectElement elementWrapper = new SelectElement(element); - Assert.IsTrue(elementWrapper.IsMultiple); + Assert.That(elementWrapper.IsMultiple, Is.True); } [Test] @@ -101,19 +103,19 @@ public void ShouldReturnAllOptionsWhenAsked() SelectElement elementWrapper = new SelectElement(element); IList returnedOptions = elementWrapper.Options; - Assert.AreEqual(4, returnedOptions.Count); + Assert.That(returnedOptions, Has.Exactly(4).Items); string one = returnedOptions[0].Text; - Assert.AreEqual("One", one); + Assert.That(one, Is.EqualTo("One")); string two = returnedOptions[1].Text; - Assert.AreEqual("Two", two); + Assert.That(two, Is.EqualTo("Two")); string three = returnedOptions[2].Text; - Assert.AreEqual("Four", three); + Assert.That(three, Is.EqualTo("Four")); string four = returnedOptions[3].Text; - Assert.AreEqual("Still learning how to count, apparently", four); + Assert.That(four, Is.EqualTo("Still learning how to count, apparently")); } @@ -125,10 +127,10 @@ public void ShouldReturnOptionWhichIsSelected() IList returnedOptions = elementWrapper.AllSelectedOptions; - Assert.AreEqual(1, returnedOptions.Count); + Assert.That(returnedOptions, Has.One.Items); string one = returnedOptions[0].Text; - Assert.AreEqual("One", one); + Assert.That(one, Is.EqualTo("One")); } [Test] @@ -139,13 +141,13 @@ public void ShouldReturnOptionsWhichAreSelected() IList returnedOptions = elementWrapper.AllSelectedOptions; - Assert.AreEqual(2, returnedOptions.Count); + Assert.That(returnedOptions, Has.Exactly(2).Items); string one = returnedOptions[0].Text; - Assert.AreEqual("Eggs", one); + Assert.That(one, Is.EqualTo("Eggs")); string two = returnedOptions[1].Text; - Assert.AreEqual("Sausages", two); + Assert.That(two, Is.EqualTo("Sausages")); } [Test] @@ -156,7 +158,7 @@ public void ShouldReturnFirstSelectedOption() IWebElement firstSelected = elementWrapper.AllSelectedOptions[0]; - Assert.AreEqual("Eggs", firstSelected.Text); + Assert.That(firstSelected.Text, Is.EqualTo("Eggs")); } // [Test] @@ -169,7 +171,7 @@ public void ShouldThrowANoSuchElementExceptionIfNothingIsSelected() IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.AreEqual(0, elementWrapper.AllSelectedOptions.Count); + Assert.That(elementWrapper.AllSelectedOptions.Count, Is.Zero); } [Test] @@ -179,7 +181,7 @@ public void ShouldAllowOptionsToBeSelectedByVisibleText() SelectElement elementWrapper = new SelectElement(element); elementWrapper.SelectByText("select_2"); IWebElement firstSelected = elementWrapper.AllSelectedOptions[0]; - Assert.AreEqual("select_2", firstSelected.Text); + Assert.That(firstSelected.Text, Is.EqualTo("select_2")); } [Test] @@ -189,7 +191,7 @@ public void ShouldAllowOptionsToBeSelectedByPartialText() SelectElement elementWrapper = new SelectElement(element); elementWrapper.SelectByText("4", true); IWebElement firstSelected = elementWrapper.AllSelectedOptions[0]; - Assert.AreEqual("select_4", firstSelected.Text); + Assert.That(firstSelected.Text, Is.EqualTo("select_4")); } [Test] @@ -197,7 +199,9 @@ public void ShouldThrowExceptionOnSelectByTextExactMatchIfOptionDoesNotExist() { IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.SelectByText("4")); + Assert.That( + () => elementWrapper.SelectByText("4"), + Throws.TypeOf()); } [Test] @@ -206,7 +210,9 @@ public void ShouldNotAllowInvisibleOptionsToBeSelectedByVisibleText() { IWebElement element = driver.FindElement(By.Name("invisi_select")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.SelectByText("Apples")); + Assert.That( + () => elementWrapper.SelectByText("Apples"), + Throws.TypeOf()); } [Test] @@ -214,7 +220,9 @@ public void ShouldThrowExceptionOnSelectByVisibleTextIfOptionDoesNotExist() { IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.SelectByText("not there")); + Assert.That( + () => elementWrapper.SelectByText("not there"), + Throws.TypeOf()); } [Test] @@ -222,7 +230,9 @@ public void ShouldThrowExceptionOnSelectByVisibleTextIfOptionDisabled() { IWebElement element = driver.FindElement(By.Name("single_disabled")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.SelectByText("Disabled")); + Assert.That( + () => elementWrapper.SelectByText("Disabled"), + Throws.TypeOf()); } [Test] @@ -232,7 +242,7 @@ public void ShouldAllowOptionsToBeSelectedByIndex() SelectElement elementWrapper = new SelectElement(element); elementWrapper.SelectByIndex(1); IWebElement firstSelected = elementWrapper.AllSelectedOptions[0]; - Assert.AreEqual("select_2", firstSelected.Text); + Assert.That(firstSelected.Text, Is.EqualTo("select_2")); } [Test] @@ -240,7 +250,9 @@ public void ShouldThrowExceptionOnSelectByIndexIfOptionDoesNotExist() { IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.SelectByIndex(10)); + Assert.That( + () => elementWrapper.SelectByIndex(10), + Throws.TypeOf()); } [Test] @@ -248,7 +260,9 @@ public void ShouldThrowExceptionOnSelectByIndexIfOptionDisabled() { IWebElement element = driver.FindElement(By.Name("single_disabled")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.SelectByIndex(1)); + Assert.That( + () => elementWrapper.SelectByIndex(1), + Throws.InvalidOperationException); } [Test] @@ -258,7 +272,7 @@ public void ShouldAllowOptionsToBeSelectedByReturnedValue() SelectElement elementWrapper = new SelectElement(element); elementWrapper.SelectByValue("select_2"); IWebElement firstSelected = elementWrapper.AllSelectedOptions[0]; - Assert.AreEqual("select_2", firstSelected.Text); + Assert.That(firstSelected.Text, Is.EqualTo("select_2")); } [Test] @@ -266,7 +280,9 @@ public void ShouldThrowExceptionOnSelectByReturnedValueIfOptionDoesNotExist() { IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.SelectByValue("not there")); + Assert.That( + () => elementWrapper.SelectByValue("not there"), + Throws.TypeOf()); } [Test] @@ -274,7 +290,9 @@ public void ShouldThrowExceptionOnSelectByReturnedValueIfOptionDisabled() { IWebElement element = driver.FindElement(By.Name("single_disabled")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.SelectByValue("disabled")); + Assert.That( + () => elementWrapper.SelectByValue("disabled"), + Throws.InvalidOperationException); } [Test] @@ -285,7 +303,7 @@ public void ShouldAllowUserToDeselectAllWhenSelectSupportsMultipleSelections() elementWrapper.DeselectAll(); IList returnedOptions = elementWrapper.AllSelectedOptions; - Assert.AreEqual(0, returnedOptions.Count); + Assert.That(returnedOptions, Is.Empty); } [Test] @@ -293,7 +311,9 @@ public void ShouldNotAllowUserToDeselectAllWhenSelectDoesNotSupportMultipleSelec { IWebElement element = driver.FindElement(By.Name("selectomatic")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.DeselectAll()); + Assert.That( + () => elementWrapper.DeselectAll(), + Throws.InvalidOperationException); } [Test] @@ -304,7 +324,7 @@ public void ShouldAllowUserToDeselectOptionsByVisibleText() elementWrapper.DeselectByText("Eggs"); IList returnedOptions = elementWrapper.AllSelectedOptions; - Assert.AreEqual(1, returnedOptions.Count); + Assert.That(returnedOptions.Count, Is.EqualTo(1)); } [Test] @@ -313,7 +333,9 @@ public void ShouldNotAllowUserToDeselectOptionsByInvisibleText() { IWebElement element = driver.FindElement(By.Name("invisi_select")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.DeselectByText("Apples")); + Assert.That( + () => elementWrapper.DeselectByText("Apples"), + Throws.TypeOf()); } [Test] @@ -324,7 +346,7 @@ public void ShouldAllowOptionsToBeDeselectedByIndex() elementWrapper.DeselectByIndex(0); IList returnedOptions = elementWrapper.AllSelectedOptions; - Assert.AreEqual(1, returnedOptions.Count); + Assert.That(returnedOptions.Count, Is.EqualTo(1)); } [Test] @@ -335,7 +357,7 @@ public void ShouldAllowOptionsToBeDeselectedByReturnedValue() elementWrapper.DeselectByValue("eggs"); IList returnedOptions = elementWrapper.AllSelectedOptions; - Assert.AreEqual(1, returnedOptions.Count); + Assert.That(returnedOptions.Count, Is.EqualTo(1)); } [Test] @@ -343,7 +365,9 @@ public void ShouldThrowExceptionOnDeselectByReturnedValueIfOptionDoesNotExist() { IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.DeselectByValue("not there")); + Assert.That( + () => elementWrapper.DeselectByValue("not there"), + Throws.TypeOf()); } [Test] @@ -351,7 +375,9 @@ public void ShouldThrowExceptionOnDeselectByTextIfOptionDoesNotExist() { IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.DeselectByText("not there")); + Assert.That( + () => elementWrapper.DeselectByText("not there"), + Throws.TypeOf()); } [Test] @@ -359,7 +385,9 @@ public void ShouldThrowExceptionOnDeselectByIndexIfOptionDoesNotExist() { IWebElement element = driver.FindElement(By.Name("select_empty_multiple")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.DeselectByIndex(10)); + Assert.That( + () => elementWrapper.DeselectByIndex(10), + Throws.TypeOf()); } [Test] @@ -367,7 +395,9 @@ public void ShouldNotAllowUserToDeselectByTextWhenSelectDoesNotSupportMultipleSe { IWebElement element = driver.FindElement(By.Name("selectomatic")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.DeselectByText("Four")); + Assert.That( + () => elementWrapper.DeselectByText("Four"), + Throws.InvalidOperationException); } [Test] @@ -375,7 +405,9 @@ public void ShouldNotAllowUserToDeselectByValueWhenSelectDoesNotSupportMultipleS { IWebElement element = driver.FindElement(By.Name("selectomatic")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.DeselectByValue("two")); + Assert.That( + () => elementWrapper.DeselectByValue("two"), + Throws.InvalidOperationException); } [Test] @@ -383,7 +415,9 @@ public void ShouldNotAllowUserToDeselectByIndexWhenSelectDoesNotSupportMultipleS { IWebElement element = driver.FindElement(By.Name("selectomatic")); SelectElement elementWrapper = new SelectElement(element); - Assert.Throws(() => elementWrapper.DeselectByIndex(0)); + Assert.That( + () => elementWrapper.DeselectByIndex(0), + Throws.InvalidOperationException); } } } diff --git a/dotnet/test/support/UI/SelectTests.cs b/dotnet/test/support/UI/SelectTests.cs index a6ccaf476b491..d4966e29aea6c 100644 --- a/dotnet/test/support/UI/SelectTests.cs +++ b/dotnet/test/support/UI/SelectTests.cs @@ -41,7 +41,9 @@ public void SetUp() public void ThrowUnexpectedTagNameExceptionWhenNotSelectTag() { webElement.SetupGet(_ => _.TagName).Returns("form"); - Assert.Throws(() => new SelectElement(webElement.Object)); + Assert.That( + () => new SelectElement(webElement.Object), + Throws.TypeOf()); } [Test] @@ -50,7 +52,7 @@ public void CanCreateNewInstanceOfSelectWithNormalSelectElement() webElement.SetupGet(_ => _.TagName).Returns("select"); webElement.Setup(_ => _.GetAttribute(It.Is(x => x == "multiple"))).Returns((string)null); - Assert.IsFalse(new SelectElement(webElement.Object).IsMultiple); + Assert.That(new SelectElement(webElement.Object).IsMultiple, Is.False); } [Test] @@ -59,7 +61,7 @@ public void CanCreateNewInstanceOfSelectWithMultipleSelectElement() webElement.SetupGet(_ => _.TagName).Returns("select"); webElement.Setup(_ => _.GetAttribute(It.Is(x => x == "multiple"))).Returns("true"); - Assert.IsTrue(new SelectElement(webElement.Object).IsMultiple); + Assert.That(new SelectElement(webElement.Object).IsMultiple, Is.True); } [Test] @@ -70,7 +72,7 @@ public void CanGetListOfOptions() webElement.Setup(_ => _.GetAttribute(It.Is(x => x == "multiple"))).Returns("true"); webElement.Setup(_ => _.FindElements(It.IsAny())).Returns(new ReadOnlyCollection(options)); - Assert.AreEqual(options, new SelectElement(webElement.Object).Options); + Assert.That(new SelectElement(webElement.Object).Options, Is.EqualTo(options)); } [Test] @@ -89,7 +91,7 @@ public void CanGetSingleSelectedOption() webElement.Setup(_ => _.FindElements(It.IsAny())).Returns(new ReadOnlyCollection(options)).Verifiable(); IWebElement option = new SelectElement(webElement.Object).SelectedOption; - Assert.AreEqual(selected.Object, option); + Assert.That(option, Is.EqualTo(selected.Object)); notSelected.Verify(_ => _.Selected, Times.Once); selected.Verify(_ => _.Selected, Times.Once); webElement.Verify(); @@ -111,8 +113,8 @@ public void CanGetAllSelectedOptions() webElement.Setup(_ => _.FindElements(It.IsAny())).Returns(new ReadOnlyCollection(options)).Verifiable(); IList returnedOption = new SelectElement(webElement.Object).AllSelectedOptions; - Assert.That(returnedOption.Count == 1); - Assert.AreEqual(selected.Object, returnedOption[0]); + Assert.That(returnedOption, Has.Count.EqualTo(1)); + Assert.That(returnedOption[0], Is.EqualTo(selected.Object)); notSelected.Verify(_ => _.Selected, Times.Once); selected.Verify(_ => _.Selected, Times.Once); webElement.Verify(); @@ -412,7 +414,10 @@ public void SelectedOptionPropertyShouldThrowExceptionWhenNoOptionSelected() webElement.Setup(_ => _.FindElements(It.IsAny())).Returns(new ReadOnlyCollection(options)).Verifiable(); SelectElement element = new SelectElement(webElement.Object); - Assert.Throws(() => { IWebElement selectedOption = element.SelectedOption; }); + Assert.That( + () => element.SelectedOption, + Throws.TypeOf()); + notSelected.Verify(_ => _.Selected, Times.Once); webElement.Verify(_ => _.FindElements(It.IsAny()), Times.Once); } @@ -422,7 +427,7 @@ public void ShouldConvertAnUnquotedStringIntoOneWithQuotes() { string result = EscapeQuotes("foo"); - Assert.AreEqual("\"foo\"", result); + Assert.That(result, Is.EqualTo("\"foo\"")); } [Test] @@ -430,7 +435,7 @@ public void ShouldConvertAStringWithATickIntoOneWithQuotes() { string result = EscapeQuotes("f'oo"); - Assert.AreEqual("\"f'oo\"", result); + Assert.That(result, Is.EqualTo("\"f'oo\"")); } [Test] @@ -438,7 +443,7 @@ public void ShouldConvertAStringWithAQuotIntoOneWithTicks() { string result = EscapeQuotes("f\"oo"); - Assert.AreEqual("'f\"oo'", result); + Assert.That(result, Is.EqualTo("'f\"oo'")); } [Test] @@ -446,7 +451,7 @@ public void ShouldProvideConcatenatedStringsWhenStringToEscapeContainsTicksAndQu { string result = EscapeQuotes("f\"o'o"); - Assert.AreEqual("concat(\"f\", '\"', \"o'o\")", result); + Assert.That(result, Is.EqualTo("concat(\"f\", '\"', \"o'o\")")); } /** @@ -458,7 +463,7 @@ public void ShouldProvideConcatenatedStringsWhenStringEndsWithQuote() { string result = EscapeQuotes("Bar \"Rock'n'Roll\""); - Assert.AreEqual("concat(\"Bar \", '\"', \"Rock'n'Roll\", '\"')", result); + Assert.That(result, Is.EqualTo("concat(\"Bar \", '\"', \"Rock'n'Roll\", '\"')")); } private string EscapeQuotes(string toEscape) diff --git a/dotnet/test/support/UI/SlowLoadableComponentTest.cs b/dotnet/test/support/UI/SlowLoadableComponentTest.cs index 61543e8dd1c43..bc198f7e8cccb 100644 --- a/dotnet/test/support/UI/SlowLoadableComponentTest.cs +++ b/dotnet/test/support/UI/SlowLoadableComponentTest.cs @@ -45,7 +45,7 @@ public void TestShouldCauseTheLoadMethodToBeCalledIfTheComponentIsNotAlreadyLoad int numberOfTimesThroughLoop = 1; SlowLoading slowLoading = new SlowLoading(TimeSpan.FromSeconds(1), new SystemClock(), numberOfTimesThroughLoop).Load(); - Assert.AreEqual(numberOfTimesThroughLoop, slowLoading.GetLoopCount()); + Assert.That(slowLoading.GetLoopCount(), Is.EqualTo(numberOfTimesThroughLoop)); } [Test] @@ -65,15 +65,10 @@ public void TestTheLoadMethodShouldOnlyBeCalledOnceIfTheComponentTakesALongTimeT public void TestShouldThrowAnErrorIfCallingLoadDoesNotCauseTheComponentToLoadBeforeTimeout() { FakeClock clock = new FakeClock(); - try - { - new BasicSlowLoader(TimeSpan.FromSeconds(2), clock).Load(); - Assert.Fail(); - } - catch (WebDriverTimeoutException) - { - // We expect to time out - } + + Assert.That( + () => new BasicSlowLoader(TimeSpan.FromSeconds(2), clock).Load(), + Throws.InstanceOf()); } [Test] @@ -81,15 +76,9 @@ public void TestShouldCancelLoadingIfAnErrorIsDetected() { HasError error = new HasError(); - try - { - error.Load(); - Assert.Fail(); - } - catch (CustomException) - { - // This is expected - } + Assert.That( + () => error.Load(), + Throws.InstanceOf()); } diff --git a/dotnet/test/support/UI/WebDriverWaitTest.cs b/dotnet/test/support/UI/WebDriverWaitTest.cs index cd6995b48130c..acacbbfd2ebd2 100644 --- a/dotnet/test/support/UI/WebDriverWaitTest.cs +++ b/dotnet/test/support/UI/WebDriverWaitTest.cs @@ -47,7 +47,7 @@ public void CanGetListOfOptions() var condition = GetCondition(() => null, () => SOME_STRING); var wait = new WebDriverWait(new TickingClock(), mockDriver.Object, FIVE_SECONDS, ZERO_SECONDS); - Assert.AreEqual(SOME_STRING, wait.Until(condition)); + Assert.That(wait.Until(condition), Is.EqualTo(SOME_STRING)); } [Test] @@ -57,7 +57,7 @@ public void WaitsForBaseObjectType() var condition = GetCondition(() => null, () => new object()); var wait = new WebDriverWait(new TickingClock(), mockDriver.Object, FIVE_SECONDS, ZERO_SECONDS); - Assert.IsNotNull(wait.Until(condition)); + Assert.That(wait.Until(condition), Is.Not.Null); } [Test] @@ -67,7 +67,7 @@ public void WaitsUntilABooleanResultIsTrue() var condition = GetCondition(() => false, () => true); var wait = new WebDriverWait(new TickingClock(), mockDriver.Object, FIVE_SECONDS, ZERO_SECONDS); - Assert.True(wait.Until(condition)); + Assert.That(wait.Until(condition), Is.True); } [Test] @@ -79,8 +79,8 @@ public void ThrowsForInvalidTypes() var wait = new WebDriverWait(new TickingClock(), mockDriver.Object, FIVE_SECONDS, ZERO_SECONDS); - Assert.Throws(typeof(ArgumentException), () => wait.Until(nullableBooleanCondition)); - Assert.Throws(typeof(ArgumentException), () => wait.Until(intCondition)); + Assert.That(() => wait.Until(nullableBooleanCondition), Throws.ArgumentException); + Assert.That(() => wait.Until(intCondition), Throws.ArgumentException); } [Test] @@ -89,7 +89,9 @@ public void ThrowsAnExceptionIfTheTimerRunsOut() var mockDriver = new Mock(); var wait = new WebDriverWait(GetClock(), mockDriver.Object, ONE_SECONDS, ZERO_SECONDS); - Assert.Throws(typeof(WebDriverTimeoutException), () => wait.Until(driver => false)); + Assert.That( + () => wait.Until(driver => false), + Throws.TypeOf()); } [Test] @@ -101,7 +103,7 @@ public void SilentlyCapturesNoSuchElementExceptions() var wait = new WebDriverWait(new TickingClock(), mockDriver.Object, FIVE_SECONDS, ZERO_SECONDS); - Assert.AreEqual(element.Object, wait.Until(condition)); + Assert.That(wait.Until(condition), Is.EqualTo(element.Object)); } [Test] @@ -114,7 +116,7 @@ public void PassesWebDriverFromConstructorToExpectation() var wait = new WebDriverWait(new TickingClock(), mockDriver.Object, FIVE_SECONDS, ZERO_SECONDS); - Assert.AreEqual(SOME_STRING, wait.Until(condition)); + Assert.That(wait.Until(condition), Is.EqualTo(SOME_STRING)); mockDriver.Verify(_ => _.CurrentWindowHandle, Times.Once); } @@ -127,15 +129,9 @@ public void ChainsNoSuchElementExceptionWhenTimingOut() var wait = new WebDriverWait(GetClock(), mockDriver.Object, ONE_SECONDS, ZERO_SECONDS); - try - { - wait.Until(condition); - Assert.Fail("Expected WebDriverTimeoutException to be thrown"); - } - catch (WebDriverTimeoutException e) - { - Assert.IsInstanceOf(typeof(NoSuchElementException), e.InnerException); - } + Assert.That( + () => wait.Until(condition), + Throws.InstanceOf().With.InnerException.InstanceOf()); } private Func GetCondition(Func first, Func second) diff --git a/java/maven_install.json b/java/maven_install.json index 89ea3131ad63b..25b1acef66bdc 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": 329453186, - "__RESOLVED_ARTIFACTS_HASH": -9148858, - "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": 818842380, + "__RESOLVED_ARTIFACTS_HASH": 1188602649, "artifacts": { "com.beust:jcommander": { "shasums": { @@ -68,10 +61,10 @@ }, "com.github.javaparser:javaparser-core": { "shasums": { - "jar": "3e3e0c65d57d12797dbead3df1ebb28e7583737d0cd1f2a898dba6febd50ab88", - "sources": "e450a5f8c86af0b0a5db5096ffbd1a794a86ff2e6a8a55266e28b3ad4df70c40" + "jar": "a24c4fa7799ffe0c7a9af11d4eecd757098ed4498f86067bf28b46b2bfea1833", + "sources": "892e0fd9e6dd0a8672b09e9a6bb151958e378a35d0d052ae6067d9e70f00899a" }, - "version": "3.26.2" + "version": "3.26.3" }, "com.github.spotbugs:spotbugs": { "shasums": { @@ -108,13 +101,6 @@ }, "version": "1.1.1" }, - "com.google.auto.value:auto-value-annotations": { - "shasums": { - "jar": "fedd59b0b4986c342f6ab2d182f2a4ee9fceb2c7e2d5bdc4dc764c92394a23d3", - "sources": "41dbbed2cc92e72fe61e622f715735b05db45dcc49a1276619781b6e19e7a91f" - }, - "version": "1.7.4" - }, "com.google.auto:auto-common": { "shasums": { "jar": "f50b1ce8a41fad31a8a819c052f8ffa362ea0a3dbe9ef8f7c7dc9a36d4738a59", @@ -164,17 +150,9 @@ }, "version": "33.3.1-jre" }, - "com.google.guava:guava-testlib": { - "shasums": { - "jar": "aadc71b10d5c3ac474dd16be84cfb18d257e584d1e0a59f8cab64ef4376226ce", - "sources": "7149659f8966197dcd91a42183349f862d3973f8e65efe6d03e678464fa13bfd" - }, - "version": "31.1-jre" - }, "com.google.guava:listenablefuture": { "shasums": { - "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", - "sources": null + "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99" }, "version": "9999.0-empty-to-avoid-conflict-with-guava" }, @@ -185,13 +163,6 @@ }, "version": "3.0.0" }, - "com.google.truth:truth": { - "shasums": { - "jar": "a85e03b8b6ae8780f060cfded9500a3d1b5f52808f99a2ea6da9c683313c7518", - "sources": "a98b2f82af388484dfe1b2b859c3c05a28fcae000fc532ef0155e1814fa3af05" - }, - "version": "1.1.2" - }, "com.graphql-java:graphql-java": { "shasums": { "jar": "8828fef5d8133d3d5ad23cee262a9b3ab4ce95aedf5e3332bb577a9aa7c627e0", @@ -257,10 +228,10 @@ }, "io.lettuce:lettuce-core": { "shasums": { - "jar": "bcadafb28f41343d39bf90820b8349e3462e43d7e5c0edc3f9886aa661972015", - "sources": "67d988cdd8d2e62a8c9c3c86ea812bf0020e59090ebd3469bfc0cca554d8d631" + "jar": "ff26c28351becdaf6d5abe25d97ea799a986b1746bfe5f70659d1e53745b6f1a", + "sources": "383337d6e56a97563c31f2d06838c85f8295662a5f7f72408bef5d59329cf98a" }, - "version": "6.5.0.RELEASE" + "version": "6.5.1.RELEASE" }, "io.netty:netty-buffer": { "shasums": { @@ -355,10 +326,10 @@ }, "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": { @@ -446,10 +417,10 @@ }, "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": { @@ -479,19 +450,12 @@ }, "version": "2.0.0" }, - "junit:junit": { - "shasums": { - "jar": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3", - "sources": "34181df6482d40ea4c046b063cb53c7ffae94bdf1b1d62695bdf3adf9dea7e3a" - }, - "version": "4.13.2" - }, "net.bytebuddy:byte-buddy": { "shasums": { - "jar": "d8390d20685a41a2bdca640f958942cd91bcbf21c42470494bdf5752d9a07b14", - "sources": "254ea80bf6f932e785b6f7dcdf3666b6fad4ceea36ef187c064a5346c650cb2c" + "jar": "fa08998aae1e7bdae83bde0712c50e8444d71c0e0c196bb2247ade8d4ad0eb90", + "sources": "f215e745c8c7e62cd02ade3b3a9deec4a98c85a3786e3b8854efa6e83b6da4c3" }, - "version": "1.15.10" + "version": "1.15.11" }, "net.bytebuddy:byte-buddy-agent": { "shasums": { @@ -530,10 +494,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": { @@ -565,17 +529,17 @@ }, "org.apache.logging.log4j:log4j-api": { "shasums": { - "jar": "6e77bb229fc8dcaf09038beeb5e9030b22e9e01b51b458b0183ce669ebcc92ef", - "sources": "e01afccb47c9340abba621f1cd93e05a092525614071a446c3958f2cd9f48bf6" + "jar": "5b4a0a0cd0e751ded431c162442bdbdd53328d1f8bb2bae5fc1bbeee0f66d80f", + "sources": "a7e2290fd22242d85d8423efb8eff5fd7e14f80fed94bc959415d61cb8aa0d11" }, - "version": "2.24.1" + "version": "2.24.3" }, "org.apache.logging.log4j:log4j-core": { "shasums": { - "jar": "00bcf388472ca80a687014181763b66d777177f22cbbf179fd60e1b1ac9bc9b0", - "sources": "b5b4eafe913e457160a3c19773c7f59e132a62b1c74ab9fa744ebc6f9ba9bc9a" + "jar": "7eb4084596ae25bd3c61698e48e8d0ab65a9260758884ed5cbb9c6e55c44a56a", + "sources": "909158f99135ee7d3cb583e00eac314a22d873aca87440a2a0f20c7e3dc85440" }, - "version": "2.24.1" + "version": "2.24.3" }, "org.apiguardian:apiguardian-api": { "shasums": { @@ -614,10 +578,10 @@ }, "org.checkerframework:checker-qual": { "shasums": { - "jar": "3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6", - "sources": "d6bdee58964cd05aabfca4e44947d3cbdada6bf617ed618b62b3b0d5a21de339" + "jar": "7e8554c902b9b839e61396cfe3a64c84ecabfb8eb652c410bfd8e4f5c1a8ece8", + "sources": "4f85e422b5da3c73990e894f1ed4cac45358f34fb4b979687848301584eccb57" }, - "version": "3.43.0" + "version": "3.21.2" }, "org.dom4j:dom4j": { "shasums": { @@ -889,22 +853,6 @@ "com.google.j2objc:j2objc-annotations", "org.checkerframework:checker-qual" ], - "com.google.guava:guava-testlib": [ - "com.google.code.findbugs:jsr305", - "com.google.errorprone:error_prone_annotations", - "com.google.guava:guava", - "com.google.j2objc:j2objc-annotations", - "junit:junit", - "org.checkerframework:checker-qual" - ], - "com.google.truth:truth": [ - "com.google.auto.value:auto-value-annotations", - "com.google.errorprone:error_prone_annotations", - "com.google.guava:guava", - "junit:junit", - "org.checkerframework:checker-qual", - "org.ow2.asm:asm" - ], "com.graphql-java:graphql-java": [ "com.graphql-java:java-dataloader", "org.reactivestreams:reactive-streams" @@ -1042,9 +990,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 +1127,6 @@ "eu.neilalexander:jnacl" ] }, - "skipped": [ - "com.google.guava:listenablefuture:jar:sources" - ], "packages": { "com.beust:jcommander": [ "com.beust.ah", @@ -1359,11 +1301,6 @@ "com.google.auto.service:auto-service-annotations": [ "com.google.auto.service" ], - "com.google.auto.value:auto-value-annotations": [ - "com.google.auto.value", - "com.google.auto.value.extension.memoized", - "com.google.auto.value.extension.serializable" - ], "com.google.auto:auto-common": [ "com.google.auto.common" ], @@ -1417,21 +1354,9 @@ "com.google.common.xml", "com.google.thirdparty.publicsuffix" ], - "com.google.guava:guava-testlib": [ - "com.google.common.collect.testing", - "com.google.common.collect.testing.features", - "com.google.common.collect.testing.google", - "com.google.common.collect.testing.testers", - "com.google.common.escape.testing", - "com.google.common.testing", - "com.google.common.util.concurrent.testing" - ], "com.google.j2objc:j2objc-annotations": [ "com.google.j2objc.annotations" ], - "com.google.truth:truth": [ - "com.google.common.truth" - ], "com.graphql-java:graphql-java": [ "graphql", "graphql.agent.result", @@ -1879,40 +1804,6 @@ "org.jaxen.util", "org.jaxen.xom" ], - "junit:junit": [ - "junit.extensions", - "junit.framework", - "junit.runner", - "junit.textui", - "org.junit", - "org.junit.experimental", - "org.junit.experimental.categories", - "org.junit.experimental.max", - "org.junit.experimental.results", - "org.junit.experimental.runners", - "org.junit.experimental.theories", - "org.junit.experimental.theories.internal", - "org.junit.experimental.theories.suppliers", - "org.junit.function", - "org.junit.internal", - "org.junit.internal.builders", - "org.junit.internal.management", - "org.junit.internal.matchers", - "org.junit.internal.requests", - "org.junit.internal.runners", - "org.junit.internal.runners.model", - "org.junit.internal.runners.rules", - "org.junit.internal.runners.statements", - "org.junit.matchers", - "org.junit.rules", - "org.junit.runner", - "org.junit.runner.manipulation", - "org.junit.runner.notification", - "org.junit.runners", - "org.junit.runners.model", - "org.junit.runners.parameterized", - "org.junit.validator" - ], "net.bytebuddy:byte-buddy": [ "net.bytebuddy", "net.bytebuddy.agent.builder", @@ -1957,9 +1848,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 +1951,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", @@ -2573,7 +2460,7 @@ "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" @@ -3025,8 +2912,6 @@ "com.google.auto.service:auto-service-annotations", "com.google.auto.service:auto-service-annotations:jar:sources", "com.google.auto.service:auto-service:jar:sources", - "com.google.auto.value:auto-value-annotations", - "com.google.auto.value:auto-value-annotations:jar:sources", "com.google.auto:auto-common", "com.google.auto:auto-common:jar:sources", "com.google.code.findbugs:jsr305", @@ -3040,14 +2925,10 @@ "com.google.guava:failureaccess", "com.google.guava:failureaccess:jar:sources", "com.google.guava:guava", - "com.google.guava:guava-testlib", - "com.google.guava:guava-testlib:jar:sources", "com.google.guava:guava:jar:sources", "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", "com.google.j2objc:j2objc-annotations:jar:sources", - "com.google.truth:truth", - "com.google.truth:truth:jar:sources", "com.graphql-java:graphql-java", "com.graphql-java:graphql-java:jar:sources", "com.graphql-java:java-dataloader", @@ -3130,8 +3011,6 @@ "javax.cache:cache-api:jar:sources", "jaxen:jaxen", "jaxen:jaxen:jar:sources", - "junit:junit", - "junit:junit:jar:sources", "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", "net.bytebuddy:byte-buddy-agent:jar:sources", diff --git a/java/private/export.bzl b/java/private/export.bzl index 1d3e9b0498b46..41a41801a7385 100644 --- a/java/private/export.bzl +++ b/java/private/export.bzl @@ -1,3 +1,4 @@ +load("@contrib_rules_jvm//java:defs.bzl", "java_library") load( "@rules_jvm_external//:defs.bzl", "javadoc", @@ -24,7 +25,7 @@ def java_export( lib_name = "%s-lib" % name # Construct the java_library we'll export from here. - native.java_library( + java_library( name = lib_name, tags = tags, exports = exports, diff --git a/java/spotbugs-excludes.xml b/java/spotbugs-excludes.xml index 2ae98dc7e6050..a1104b7f597b6 100644 --- a/java/spotbugs-excludes.xml +++ b/java/spotbugs-excludes.xml @@ -160,6 +160,11 @@ + + + + + @@ -237,7 +242,7 @@ - + diff --git a/java/src/org/openqa/selenium/Architecture.java b/java/src/org/openqa/selenium/Architecture.java index a4cfdb7087bee..35798b5ed9475 100644 --- a/java/src/org/openqa/selenium/Architecture.java +++ b/java/src/org/openqa/selenium/Architecture.java @@ -17,6 +17,8 @@ package org.openqa.selenium; +import java.util.Locale; + /** * Represents the known architectures used in WebDriver. It attempts to smooth over some of Java's * rough edges when dealing with microprocessor architectures by, for instance, allowing you to @@ -98,7 +100,7 @@ public int getDataModel() { @Override public String toString() { - return name().toLowerCase(); + return name().toLowerCase(Locale.ENGLISH); } /** @@ -121,7 +123,7 @@ public static Architecture getCurrent() { */ public static Architecture extractFromSysProperty(String arch) { if (arch != null) { - arch = arch.toLowerCase(); + arch = arch.toLowerCase(Locale.ENGLISH); } // Some architectures are basically the same even though they have different names. ia32, x86, diff --git a/java/src/org/openqa/selenium/Platform.java b/java/src/org/openqa/selenium/Platform.java index 577aaef2881cc..66f7927eaeb9b 100644 --- a/java/src/org/openqa/selenium/Platform.java +++ b/java/src/org/openqa/selenium/Platform.java @@ -18,6 +18,7 @@ package org.openqa.selenium; import java.util.Arrays; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -414,7 +415,7 @@ public static Platform extractFromSysProperty(String osName) { * @return the most likely platform based on given operating system name and version */ public static Platform extractFromSysProperty(String osName, String osVersion) { - osName = osName.toLowerCase(); + osName = osName.toLowerCase(Locale.ENGLISH); // os.name for android is linux if ("dalvik".equalsIgnoreCase(System.getProperty("java.vm.name"))) { return Platform.ANDROID; @@ -434,7 +435,7 @@ public static Platform extractFromSysProperty(String osName, String osVersion) { if ("".equals(matcher)) { continue; } - matcher = matcher.toLowerCase(); + matcher = matcher.toLowerCase(Locale.ENGLISH); if (os.isExactMatch(osName, matcher)) { return os; } diff --git a/java/src/org/openqa/selenium/Proxy.java b/java/src/org/openqa/selenium/Proxy.java index ca264597802ae..345256444c4a0 100644 --- a/java/src/org/openqa/selenium/Proxy.java +++ b/java/src/org/openqa/selenium/Proxy.java @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -93,7 +94,8 @@ public Proxy() { public Proxy(Map raw) { Map> setters = new HashMap<>(); setters.put( - PROXY_TYPE, value -> setProxyType(ProxyType.valueOf(((String) value).toUpperCase()))); + PROXY_TYPE, + value -> setProxyType(ProxyType.valueOf(((String) value).toUpperCase(Locale.ENGLISH)))); setters.put(FTP_PROXY, value -> setFtpProxy((String) value)); setters.put(HTTP_PROXY, value -> setHttpProxy((String) value)); setters.put( @@ -448,7 +450,7 @@ public String toString() { case DIRECT: case MANUAL: case SYSTEM: - builder.append(getProxyType().toString().toLowerCase()); + builder.append(getProxyType().toString().toLowerCase(Locale.ENGLISH)); break; case PAC: diff --git a/java/src/org/openqa/selenium/chrome/ChromeDriverService.java b/java/src/org/openqa/selenium/chrome/ChromeDriverService.java index 566ceb7717d16..d6beaa0b69489 100644 --- a/java/src/org/openqa/selenium/chrome/ChromeDriverService.java +++ b/java/src/org/openqa/selenium/chrome/ChromeDriverService.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebDriverException; @@ -300,7 +301,7 @@ protected List createArgs() { } if (logLevel != null) { - args.add(String.format("--log-level=%s", logLevel.toString().toUpperCase())); + args.add(String.format("--log-level=%s", logLevel.toString().toUpperCase(Locale.ENGLISH))); } if (allowedListIps != null) { args.add(String.format("--allowed-ips=%s", allowedListIps)); diff --git a/java/src/org/openqa/selenium/chromium/ChromiumDriver.java b/java/src/org/openqa/selenium/chromium/ChromiumDriver.java index f5518714d436f..b5f6dacb3a7bb 100644 --- a/java/src/org/openqa/selenium/chromium/ChromiumDriver.java +++ b/java/src/org/openqa/selenium/chromium/ChromiumDriver.java @@ -147,7 +147,7 @@ protected ChromiumDriver( try { try { - cdpUri = client.flatMap(httpClient -> CdpEndpointFinder.getCdpEndPoint(httpClient)); + cdpUri = client.flatMap(CdpEndpointFinder::getCdpEndPoint); } catch (Exception e) { try { client.ifPresent(HttpClient::close); diff --git a/java/src/org/openqa/selenium/chromium/ChromiumDriverLogLevel.java b/java/src/org/openqa/selenium/chromium/ChromiumDriverLogLevel.java index 830d4ad01a211..de57b8e917c5c 100644 --- a/java/src/org/openqa/selenium/chromium/ChromiumDriverLogLevel.java +++ b/java/src/org/openqa/selenium/chromium/ChromiumDriverLogLevel.java @@ -17,6 +17,7 @@ package org.openqa.selenium.chromium; +import java.util.Locale; import java.util.Map; import java.util.logging.Level; @@ -46,7 +47,7 @@ public enum ChromiumDriverLogLevel { @Override public String toString() { - return super.toString().toLowerCase(); + return super.toString().toLowerCase(Locale.ENGLISH); } public static ChromiumDriverLogLevel fromString(String text) { diff --git a/java/src/org/openqa/selenium/devtools/NetworkInterceptor.java b/java/src/org/openqa/selenium/devtools/NetworkInterceptor.java index d3777136b3780..427e225ac339b 100644 --- a/java/src/org/openqa/selenium/devtools/NetworkInterceptor.java +++ b/java/src/org/openqa/selenium/devtools/NetworkInterceptor.java @@ -19,6 +19,7 @@ import static org.openqa.selenium.remote.http.Contents.utf8String; +import java.util.Locale; import java.util.Map; import java.util.Optional; import org.openqa.selenium.WebDriver; @@ -105,7 +106,7 @@ public void close() { protected HttpMethod convertFromCdpHttpMethod(String method) { Require.nonNull("HTTP Method", method); try { - return HttpMethod.valueOf(method.toUpperCase()); + return HttpMethod.valueOf(method.toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException e) { // Spam in a reasonable value return HttpMethod.GET; diff --git a/java/src/org/openqa/selenium/devtools/SeleniumCdpConnection.java b/java/src/org/openqa/selenium/devtools/SeleniumCdpConnection.java index 33a8245ab14dc..12e26cdce1061 100644 --- a/java/src/org/openqa/selenium/devtools/SeleniumCdpConnection.java +++ b/java/src/org/openqa/selenium/devtools/SeleniumCdpConnection.java @@ -77,7 +77,7 @@ public static Optional create( client = reportedUri.map(uri -> CdpEndpointFinder.getHttpClient(clientFactory, uri)); try { - cdpUri = client.flatMap(httpClient -> CdpEndpointFinder.getCdpEndPoint(httpClient)); + cdpUri = client.flatMap(CdpEndpointFinder::getCdpEndPoint); } catch (Exception e) { try { client.ifPresent(HttpClient::close); @@ -87,7 +87,7 @@ public static Optional create( throw e; } - if (!cdpUri.isPresent()) { + if (cdpUri.isEmpty()) { try { client.ifPresent(HttpClient::close); } catch (Exception e) { diff --git a/java/src/org/openqa/selenium/devtools/idealized/Network.java b/java/src/org/openqa/selenium/devtools/idealized/Network.java index ec36b5d40d5d0..949811311a6be 100644 --- a/java/src/org/openqa/selenium/devtools/idealized/Network.java +++ b/java/src/org/openqa/selenium/devtools/idealized/Network.java @@ -26,6 +26,7 @@ import java.util.Base64; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.concurrent.CancellationException; @@ -300,7 +301,7 @@ protected Optional getAuthCredentials(URI uri) { protected HttpMethod convertFromCdpHttpMethod(String method) { Require.nonNull("HTTP Method", method); try { - return HttpMethod.valueOf(method.toUpperCase()); + return HttpMethod.valueOf(method.toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException e) { // Spam in a reasonable value return HttpMethod.GET; diff --git a/java/src/org/openqa/selenium/edge/EdgeDriverService.java b/java/src/org/openqa/selenium/edge/EdgeDriverService.java index a089f93055519..0e3c252087882 100644 --- a/java/src/org/openqa/selenium/edge/EdgeDriverService.java +++ b/java/src/org/openqa/selenium/edge/EdgeDriverService.java @@ -27,6 +27,7 @@ import java.time.Duration; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Map; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebDriverException; @@ -294,7 +295,7 @@ protected List createArgs() { } if (logLevel != null) { - args.add(String.format("--log-level=%s", logLevel.toString().toUpperCase())); + args.add(String.format("--log-level=%s", logLevel.toString().toUpperCase(Locale.ENGLISH))); } if (Boolean.TRUE.equals(silent)) { args.add("--silent"); diff --git a/java/src/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementDialog.java b/java/src/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementDialog.java index e3568900abe98..45478d1f618f3 100644 --- a/java/src/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementDialog.java +++ b/java/src/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementDialog.java @@ -52,6 +52,8 @@ public interface FederatedCredentialManagementDialog { /** Returns the subtitle of the dialog or null if none. */ String getSubtitle(); + void clickDialog(); + /** * Returns the accounts shown in the account chooser. * diff --git a/java/src/org/openqa/selenium/firefox/FirefoxBinary.java b/java/src/org/openqa/selenium/firefox/FirefoxBinary.java index 436ebefd0a7b6..8c902c1490b65 100644 --- a/java/src/org/openqa/selenium/firefox/FirefoxBinary.java +++ b/java/src/org/openqa/selenium/firefox/FirefoxBinary.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -72,7 +73,7 @@ public String toString() { * @return the Channel enum value matching the parameter */ public static Channel fromString(String name) { - final String lcName = name.toLowerCase(); + final String lcName = name.toLowerCase(Locale.ENGLISH); return stream(Channel.values()) .filter(ch -> ch.name.equals(lcName)) .findFirst() diff --git a/java/src/org/openqa/selenium/firefox/FirefoxDriver.java b/java/src/org/openqa/selenium/firefox/FirefoxDriver.java index a6beac5461e85..01ec605d2fa08 100644 --- a/java/src/org/openqa/selenium/firefox/FirefoxDriver.java +++ b/java/src/org/openqa/selenium/firefox/FirefoxDriver.java @@ -176,7 +176,7 @@ private FirefoxDriver( Optional cdpUri; try { - cdpUri = client.flatMap(httpClient -> CdpEndpointFinder.getCdpEndPoint(httpClient)); + cdpUri = client.flatMap(CdpEndpointFinder::getCdpEndPoint); } catch (Exception e) { try { client.ifPresent(HttpClient::close); diff --git a/java/src/org/openqa/selenium/firefox/FirefoxDriverLogLevel.java b/java/src/org/openqa/selenium/firefox/FirefoxDriverLogLevel.java index b3500dc1909c5..b46e762214b84 100644 --- a/java/src/org/openqa/selenium/firefox/FirefoxDriverLogLevel.java +++ b/java/src/org/openqa/selenium/firefox/FirefoxDriverLogLevel.java @@ -18,6 +18,7 @@ package org.openqa.selenium.firefox; import java.util.Collections; +import java.util.Locale; import java.util.Map; import java.util.logging.Level; @@ -47,7 +48,7 @@ public enum FirefoxDriverLogLevel { @Override public String toString() { - return super.toString().toLowerCase(); + return super.toString().toLowerCase(Locale.ENGLISH); } public static FirefoxDriverLogLevel fromString(String text) { diff --git a/java/src/org/openqa/selenium/grid/commands/Hub.java b/java/src/org/openqa/selenium/grid/commands/Hub.java index fd1807e8333ea..22cf38460bd5e 100644 --- a/java/src/org/openqa/selenium/grid/commands/Hub.java +++ b/java/src/org/openqa/selenium/grid/commands/Hub.java @@ -144,6 +144,7 @@ protected Handlers createHandlers(Config config) { distributorOptions.getSlotMatcher(), newSessionRequestOptions.getSessionRequestTimeoutPeriod(), newSessionRequestOptions.getSessionRequestTimeout(), + newSessionRequestOptions.getMaximumResponseDelay(), secret, newSessionRequestOptions.getBatchSize()); handler.addHandler(queue); diff --git a/java/src/org/openqa/selenium/grid/commands/Standalone.java b/java/src/org/openqa/selenium/grid/commands/Standalone.java index c12ec74ccf3ed..20fa9660784aa 100644 --- a/java/src/org/openqa/selenium/grid/commands/Standalone.java +++ b/java/src/org/openqa/selenium/grid/commands/Standalone.java @@ -150,6 +150,7 @@ protected Handlers createHandlers(Config config) { distributorOptions.getSlotMatcher(), newSessionRequestOptions.getSessionRequestTimeoutPeriod(), newSessionRequestOptions.getSessionRequestTimeout(), + newSessionRequestOptions.getMaximumResponseDelay(), registrationSecret, newSessionRequestOptions.getBatchSize()); combinedHandler.addHandler(queue); diff --git a/java/src/org/openqa/selenium/grid/config/DescribedOption.java b/java/src/org/openqa/selenium/grid/config/DescribedOption.java index d11a9e71eb677..3e5aa4e25b133 100644 --- a/java/src/org/openqa/selenium/grid/config/DescribedOption.java +++ b/java/src/org/openqa/selenium/grid/config/DescribedOption.java @@ -32,6 +32,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Optional; import java.util.ServiceLoader; @@ -194,7 +195,7 @@ public int hashCode() { } public String getType(Type type) { - String className = deriveClass(type).getSimpleName().toLowerCase(); + String className = deriveClass(type).getSimpleName().toLowerCase(Locale.ENGLISH); return isCollection(type) ? "list of " + className + "s" : className; } diff --git a/java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java b/java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java index 594f1061dd6c6..3db617bbd5335 100644 --- a/java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java +++ b/java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java @@ -82,7 +82,8 @@ public boolean matches(Capabilities stereotype, Capabilities capabilities) { (capabilities.getBrowserVersion() == null || capabilities.getBrowserVersion().isEmpty() || Objects.equals(capabilities.getBrowserVersion(), "stable")) - || Objects.equals(stereotype.getBrowserVersion(), capabilities.getBrowserVersion()); + || browserVersionMatch( + stereotype.getBrowserVersion(), capabilities.getBrowserVersion()); boolean platformNameMatch = capabilities.getPlatformName() == null || Objects.equals(stereotype.getPlatformName(), capabilities.getPlatformName()) @@ -91,6 +92,10 @@ public boolean matches(Capabilities stereotype, Capabilities capabilities) { return browserNameMatch && browserVersionMatch && platformNameMatch; } + private boolean browserVersionMatch(String stereotype, String capabilities) { + return new SemanticVersionComparator().compare(stereotype, capabilities) == 0; + } + private Boolean initialMatch(Capabilities stereotype, Capabilities capabilities) { return stereotype.getCapabilityNames().stream() // Matching of extension capabilities is implementation independent. Skip them diff --git a/java/src/org/openqa/selenium/grid/data/NodeStatus.java b/java/src/org/openqa/selenium/grid/data/NodeStatus.java index c9ce38614fcea..ec969ef4163e4 100644 --- a/java/src/org/openqa/selenium/grid/data/NodeStatus.java +++ b/java/src/org/openqa/selenium/grid/data/NodeStatus.java @@ -204,6 +204,14 @@ public long getLastSessionCreated() { .orElse(0); } + public String getBrowserVersion() { + return slots.stream() + .map(slot -> slot.getStereotype().getBrowserVersion()) + .filter(Objects::nonNull) + .max(new SemanticVersionComparator()) + .orElse(""); + } + @Override public boolean equals(Object o) { if (!(o instanceof NodeStatus)) { diff --git a/java/src/org/openqa/selenium/grid/data/SemanticVersionComparator.java b/java/src/org/openqa/selenium/grid/data/SemanticVersionComparator.java new file mode 100644 index 0000000000000..794e356896753 --- /dev/null +++ b/java/src/org/openqa/selenium/grid/data/SemanticVersionComparator.java @@ -0,0 +1,75 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.grid.data; + +import java.io.Serializable; +import java.util.Comparator; + +public class SemanticVersionComparator implements Comparator, Serializable { + + @Override + public int compare(String v1, String v2) { + // Custom semver comparator with empty strings last + if (v1.isEmpty() && v2.isEmpty()) return 0; + if (v1.isEmpty()) return 1; // Empty string comes last + if (v2.isEmpty()) return -1; + + String[] parts1 = v1.split("\\."); + String[] parts2 = v2.split("\\."); + + int maxLength = Math.max(parts1.length, parts2.length); + for (int i = 0; i < maxLength; i++) { + String part1 = i < parts1.length ? parts1[i] : "0"; + String part2 = i < parts2.length ? parts2[i] : part1; + + boolean isPart1Numeric = isNumber(part1); + boolean isPart2Numeric = isNumber(part2); + + if (isPart1Numeric && isPart2Numeric) { + // Compare numerically + int num1 = Integer.parseInt(part1); + int num2 = Integer.parseInt(part2); + if (num1 != num2) { + return Integer.compare(num1, num2); // Ascending order + } + } else if (!isPart1Numeric && !isPart2Numeric) { + // Compare lexicographically, case-insensitive + int result = part1.compareToIgnoreCase(part2); // Ascending order + if (result != 0) { + return result; + } + } else { + // Numbers take precedence over strings + return isPart1Numeric ? 1 : -1; + } + } + return 0; // Versions are equal + } + + private boolean isNumber(String str) { + if (str == null || str.isEmpty()) { + return false; + } + for (char c : str.toCharArray()) { + if (c < '\u0030' || c > '\u0039') { + return false; + } + } + return true; + } +} diff --git a/java/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java b/java/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java index fafa4d806bae7..926dceb864c03 100644 --- a/java/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java +++ b/java/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java @@ -77,6 +77,7 @@ import org.openqa.selenium.grid.data.NodeHeartBeatEvent; import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.NodeRemovedEvent; +import org.openqa.selenium.grid.data.NodeRestartedEvent; import org.openqa.selenium.grid.data.NodeStatus; import org.openqa.selenium.grid.data.NodeStatusEvent; import org.openqa.selenium.grid.data.RequestId; @@ -205,6 +206,7 @@ public LocalDistributor( bus.addListener(NodeStatusEvent.listener(this::register)); bus.addListener(NodeStatusEvent.listener(model::refresh)); + bus.addListener(NodeRestartedEvent.listener(this::handleNodeRestarted)); bus.addListener(NodeRemovedEvent.listener(nodeStatus -> remove(nodeStatus.getNodeId()))); bus.addListener( NodeHeartBeatEvent.listener( @@ -327,6 +329,25 @@ private void register(NodeStatus status) { } } + private void handleNodeRestarted(NodeStatus status) { + Require.nonNull("Node", status); + Lock writeLock = lock.writeLock(); + writeLock.lock(); + try { + if (!nodes.containsKey(status.getNodeId())) { + return; + } + if (!getNodeFromURI(status.getExternalUri()).isDraining()) { + LOG.info( + String.format( + "Node %s has restarted. Setting availability to DOWN.", status.getNodeId())); + model.setAvailability(status.getNodeId(), DOWN); + } + } finally { + writeLock.unlock(); + } + } + @Override public LocalDistributor add(Node node) { Require.nonNull("Node", node); diff --git a/java/src/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelector.java b/java/src/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelector.java index d10767e4b6c35..9622b1d6af710 100644 --- a/java/src/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelector.java +++ b/java/src/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelector.java @@ -21,10 +21,12 @@ import com.google.common.annotations.VisibleForTesting; import java.util.Comparator; +import java.util.Locale; import java.util.Set; import org.openqa.selenium.Capabilities; import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.data.NodeStatus; +import org.openqa.selenium.grid.data.SemanticVersionComparator; import org.openqa.selenium.grid.data.Slot; import org.openqa.selenium.grid.data.SlotId; import org.openqa.selenium.grid.data.SlotMatcher; @@ -53,6 +55,11 @@ public Set selectSlot( .thenComparingDouble(NodeStatus::getLoad) // Then last session created (oldest first), so natural ordering again .thenComparingLong(NodeStatus::getLastSessionCreated) + // Then sort by stereotype browserVersion (descending order). SemVer comparison with + // considering empty value at first. + .thenComparing( + Comparator.comparing( + NodeStatus::getBrowserVersion, new SemanticVersionComparator().reversed())) // And use the node id as a tie-breaker. .thenComparing(NodeStatus::getNodeId)) .flatMap( @@ -67,7 +74,7 @@ public Set selectSlot( @VisibleForTesting long getNumberOfSupportedBrowsers(NodeStatus nodeStatus) { return nodeStatus.getSlots().stream() - .map(slot -> slot.getStereotype().getBrowserName().toLowerCase()) + .map(slot -> slot.getStereotype().getBrowserName().toLowerCase(Locale.ENGLISH)) .distinct() .count(); } diff --git a/java/src/org/openqa/selenium/grid/jmx/MBean.java b/java/src/org/openqa/selenium/grid/jmx/MBean.java index 3bdd3111dc21f..501cd254d27d5 100644 --- a/java/src/org/openqa/selenium/grid/jmx/MBean.java +++ b/java/src/org/openqa/selenium/grid/jmx/MBean.java @@ -248,9 +248,9 @@ public AttributeList getAttributes(String[] attributes) { // if attributeNames is empty, return an empty result list if (attributes == null || attributes.length == 0) return resultList; - for (int i = 0; i < attributes.length; i++) { - Object value = getAttribute(attributes[i]); - resultList.add(new Attribute(attributes[i], value)); + for (String attribute : attributes) { + Object value = getAttribute(attribute); + resultList.add(new Attribute(attribute, value)); } return resultList; diff --git a/java/src/org/openqa/selenium/grid/node/Node.java b/java/src/org/openqa/selenium/grid/node/Node.java index 68767fa0a26b9..98322648d201a 100644 --- a/java/src/org/openqa/selenium/grid/node/Node.java +++ b/java/src/org/openqa/selenium/grid/node/Node.java @@ -101,6 +101,12 @@ * by {@code sessionId}. This returns a boolean. * * + * DELETE + * /se/grid/node/connection/{sessionId} + * Notifies the node about closure of a websocket connection for the {@link Session} + * identified by {@code sessionId}. + * + * * POST * /se/grid/node/connection/{sessionId} * Allows the node to be ask about whether or not new websocket connections are allowed for the {@link Session} @@ -173,6 +179,9 @@ protected Node( get("/se/grid/node/owner/{sessionId}") .to(params -> new IsSessionOwner(this, sessionIdFrom(params))) .with(spanDecorator("node.is_session_owner").andThen(requiresSecret)), + delete("/se/grid/node/connection/{sessionId}") + .to(params -> new ReleaseConnection(this, sessionIdFrom(params))) + .with(spanDecorator("node.is_session_owner").andThen(requiresSecret)), post("/se/grid/node/connection/{sessionId}") .to(params -> new TryAcquireConnection(this, sessionIdFrom(params))) .with(spanDecorator("node.is_session_owner").andThen(requiresSecret)), @@ -250,6 +259,8 @@ public TemporaryFilesystem getDownloadsFilesystem(UUID uuid) throws IOException public abstract boolean tryAcquireConnection(SessionId id); + public abstract void releaseConnection(SessionId id); + public abstract boolean isSupporting(Capabilities capabilities); public abstract NodeStatus getStatus(); diff --git a/java/src/org/openqa/selenium/grid/node/ProxyNodeWebsockets.java b/java/src/org/openqa/selenium/grid/node/ProxyNodeWebsockets.java index eff13dc5a40f5..e9583ca8fa0e8 100644 --- a/java/src/org/openqa/selenium/grid/node/ProxyNodeWebsockets.java +++ b/java/src/org/openqa/selenium/grid/node/ProxyNodeWebsockets.java @@ -237,7 +237,7 @@ private Consumer createWsEndPoint( WebSocket upstream = client.openSocket( new HttpRequest(GET, uri.toString()), - new ForwardingListener(downstream, sessionConsumer, sessionId)); + new ForwardingListener(node, downstream, sessionConsumer, sessionId)); return (msg) -> { try { @@ -260,12 +260,17 @@ private Consumer createWsEndPoint( } private static class ForwardingListener implements WebSocket.Listener { + private final Node node; private final Consumer downstream; private final Consumer sessionConsumer; private final SessionId sessionId; public ForwardingListener( - Consumer downstream, Consumer sessionConsumer, SessionId sessionId) { + Node node, + Consumer downstream, + Consumer sessionConsumer, + SessionId sessionId) { + this.node = node; this.downstream = Objects.requireNonNull(downstream); this.sessionConsumer = Objects.requireNonNull(sessionConsumer); this.sessionId = Objects.requireNonNull(sessionId); @@ -280,7 +285,7 @@ public void onBinary(byte[] data) { @Override public void onClose(int code, String reason) { downstream.accept(new CloseMessage(code, reason)); - sessionConsumer.accept(sessionId); + node.releaseConnection(sessionId); } @Override diff --git a/java/src/org/openqa/selenium/grid/node/ReleaseConnection.java b/java/src/org/openqa/selenium/grid/node/ReleaseConnection.java new file mode 100644 index 0000000000000..a9a7e85b0f7aa --- /dev/null +++ b/java/src/org/openqa/selenium/grid/node/ReleaseConnection.java @@ -0,0 +1,43 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.grid.node; + +import java.io.UncheckedIOException; +import org.openqa.selenium.internal.Require; +import org.openqa.selenium.remote.SessionId; +import org.openqa.selenium.remote.http.HttpHandler; +import org.openqa.selenium.remote.http.HttpRequest; +import org.openqa.selenium.remote.http.HttpResponse; + +class ReleaseConnection implements HttpHandler { + + private final Node node; + private final SessionId id; + + ReleaseConnection(Node node, SessionId id) { + this.node = Require.nonNull("Node", node); + this.id = Require.nonNull("Session id", id); + } + + @Override + public HttpResponse execute(HttpRequest req) throws UncheckedIOException { + node.releaseConnection(id); + + return new HttpResponse().setStatus(200); + } +} diff --git a/java/src/org/openqa/selenium/grid/node/TryAcquireConnection.java b/java/src/org/openqa/selenium/grid/node/TryAcquireConnection.java index 6c8822bea84cd..076e5f7d32037 100644 --- a/java/src/org/openqa/selenium/grid/node/TryAcquireConnection.java +++ b/java/src/org/openqa/selenium/grid/node/TryAcquireConnection.java @@ -19,8 +19,8 @@ import static org.openqa.selenium.remote.http.Contents.asJson; -import com.google.common.collect.ImmutableMap; import java.io.UncheckedIOException; +import java.util.Map; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.SessionId; import org.openqa.selenium.remote.http.HttpHandler; @@ -39,7 +39,6 @@ class TryAcquireConnection implements HttpHandler { @Override public HttpResponse execute(HttpRequest req) throws UncheckedIOException { - return new HttpResponse() - .setContent(asJson(ImmutableMap.of("value", node.tryAcquireConnection(id)))); + return new HttpResponse().setContent(asJson(Map.of("value", node.tryAcquireConnection(id)))); } } diff --git a/java/src/org/openqa/selenium/grid/node/config/NodeFlags.java b/java/src/org/openqa/selenium/grid/node/config/NodeFlags.java index b56e57b3dcb97..e090fcd928b7a 100644 --- a/java/src/org/openqa/selenium/grid/node/config/NodeFlags.java +++ b/java/src/org/openqa/selenium/grid/node/config/NodeFlags.java @@ -81,8 +81,8 @@ public class NodeFlags implements HasRoles { @Parameter( names = {"--connection-limit-per-session"}, description = - "Let X be the maximum number of websocket connections per session.This will ensure one" - + " session is not able to exhaust the connection limit of the host") + "Let X be the maximum number of concurrent websocket connections per session. This will" + + " ensure one session is not able to exhaust the connection limit of the host") @ConfigValue(section = NODE_SECTION, name = "connection-limit-per-session", example = "8") public int connectionLimitPerSession = DEFAULT_CONNECTION_LIMIT; diff --git a/java/src/org/openqa/selenium/grid/node/config/NodeOptions.java b/java/src/org/openqa/selenium/grid/node/config/NodeOptions.java index ff8fc6d76667a..0a3fd5d82d0ae 100644 --- a/java/src/org/openqa/selenium/grid/node/config/NodeOptions.java +++ b/java/src/org/openqa/selenium/grid/node/config/NodeOptions.java @@ -36,6 +36,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.ServiceLoader; @@ -582,7 +583,9 @@ private void addSpecificDrivers( Optional>> first = allDrivers.entrySet().stream() - .filter(entry -> drivers.contains(entry.getKey().getDisplayName().toLowerCase())) + .filter( + entry -> + drivers.contains(entry.getKey().getDisplayName().toLowerCase(Locale.ENGLISH))) .findFirst(); if (first.isEmpty()) { @@ -590,8 +593,11 @@ private void addSpecificDrivers( } allDrivers.entrySet().stream() - .filter(entry -> drivers.contains(entry.getKey().getDisplayName().toLowerCase())) - .sorted(Comparator.comparing(entry -> entry.getKey().getDisplayName().toLowerCase())) + .filter( + entry -> drivers.contains(entry.getKey().getDisplayName().toLowerCase(Locale.ENGLISH))) + .sorted( + Comparator.comparing( + entry -> entry.getKey().getDisplayName().toLowerCase(Locale.ENGLISH))) .peek(this::report) .forEach( entry -> { @@ -614,7 +620,8 @@ private Map> discoverDrivers( List driversSM = StreamSupport.stream(ServiceLoader.load(WebDriverInfo.class).spliterator(), false) .filter(WebDriverInfo::isAvailable) - .sorted(Comparator.comparing(info -> info.getDisplayName().toLowerCase())) + .sorted( + Comparator.comparing(info -> info.getDisplayName().toLowerCase(Locale.ENGLISH))) .collect(Collectors.toList()); infos.addAll(driversSM); } else { @@ -625,7 +632,8 @@ private Map> discoverDrivers( List localDrivers = StreamSupport.stream(ServiceLoader.load(WebDriverInfo.class).spliterator(), false) .filter(WebDriverInfo::isPresent) - .sorted(Comparator.comparing(info -> info.getDisplayName().toLowerCase())) + .sorted( + Comparator.comparing(info -> info.getDisplayName().toLowerCase(Locale.ENGLISH))) .collect(Collectors.toList()); infos.addAll(localDrivers); } @@ -708,7 +716,7 @@ public Optional createDriver(Capabilities capabilities) private int getDriverMaxSessions(WebDriverInfo info, int desiredMaxSessions) { // Safari and Safari Technology Preview if (info.getMaximumSimultaneousSessions() == 1 - && SINGLE_SESSION_DRIVERS.contains(info.getDisplayName().toLowerCase())) { + && SINGLE_SESSION_DRIVERS.contains(info.getDisplayName().toLowerCase(Locale.ENGLISH))) { return info.getMaximumSimultaneousSessions(); } boolean overrideMaxSessions = diff --git a/java/src/org/openqa/selenium/grid/node/config/SessionCapabilitiesMutator.java b/java/src/org/openqa/selenium/grid/node/config/SessionCapabilitiesMutator.java index fca93f5035882..79a03e7bcee25 100644 --- a/java/src/org/openqa/selenium/grid/node/config/SessionCapabilitiesMutator.java +++ b/java/src/org/openqa/selenium/grid/node/config/SessionCapabilitiesMutator.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.function.Function; @@ -56,7 +57,7 @@ public Capabilities apply(Capabilities capabilities) { .setCapability(SE_NO_VNC_PORT, slotStereotype.getCapability(SE_NO_VNC_PORT)); } - String browserName = capabilities.getBrowserName().toLowerCase(); + String browserName = capabilities.getBrowserName().toLowerCase(Locale.ENGLISH); if ("internet explorer".equalsIgnoreCase(browserName)) { return new ImmutableCapabilities(removeUnknownExtensionsForIE(capabilities)); @@ -83,7 +84,7 @@ public Capabilities apply(Capabilities capabilities) { Map toReturn = new HashMap<>(slotStereotype.merge(capabilities).asMap()); // Merge browser specific stereotype and capabilities options - switch (browserName.toLowerCase()) { + switch (browserName.toLowerCase(Locale.ENGLISH)) { case "chrome": case "microsoftedge": case "msedge": diff --git a/java/src/org/openqa/selenium/grid/node/docker/DockerSessionFactory.java b/java/src/org/openqa/selenium/grid/node/docker/DockerSessionFactory.java index 48f567f576268..3cc1d4ab68911 100644 --- a/java/src/org/openqa/selenium/grid/node/docker/DockerSessionFactory.java +++ b/java/src/org/openqa/selenium/grid/node/docker/DockerSessionFactory.java @@ -454,9 +454,8 @@ private void saveSessionCapabilities(Capabilities sessionRequestCapabilities, St String capsToJson = new Json().toJson(sessionRequestCapabilities); try { Files.createDirectories(Paths.get(path)); - Files.write( - Paths.get(path, "sessionCapabilities.json"), - capsToJson.getBytes(Charset.defaultCharset())); + Files.writeString( + Paths.get(path, "sessionCapabilities.json"), capsToJson, Charset.defaultCharset()); } catch (IOException e) { LOG.log(Level.WARNING, "Failed to save session capabilities", e); } diff --git a/java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java b/java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java index af8c05cf7a7c1..77cfbb488e1c5 100644 --- a/java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java +++ b/java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java @@ -30,6 +30,7 @@ import java.net.URISyntaxException; import java.time.Duration; import java.time.Instant; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.ServiceLoader; @@ -157,7 +158,7 @@ public static Node create(Config config) { .filter( info -> driverName - .map(name -> name.equals(info.getDisplayName().toLowerCase())) + .map(name -> name.equals(info.getDisplayName().toLowerCase(Locale.ENGLISH))) .orElse(true)) .findFirst() .orElseThrow( @@ -365,7 +366,24 @@ public boolean isSessionOwner(SessionId id) { @Override public boolean tryAcquireConnection(SessionId id) { - return sessionId.equals(id) && connectionLimitPerSession > connectionCounter.getAndIncrement(); + if (!sessionId.equals(id)) { + return false; + } + + if (connectionLimitPerSession > connectionCounter.getAndIncrement()) { + return true; + } + + // ensure a rejected connection will not be counted + connectionCounter.getAndDecrement(); + return false; + } + + @Override + public void releaseConnection(SessionId id) { + if (sessionId.equals(id)) { + connectionCounter.getAndDecrement(); + } } @Override diff --git a/java/src/org/openqa/selenium/grid/node/local/LocalNode.java b/java/src/org/openqa/selenium/grid/node/local/LocalNode.java index bb45cd00579dc..49d5af6dfa184 100644 --- a/java/src/org/openqa/selenium/grid/node/local/LocalNode.java +++ b/java/src/org/openqa/selenium/grid/node/local/LocalNode.java @@ -623,7 +623,31 @@ public boolean tryAcquireConnection(SessionId id) throws NoSuchSessionException AtomicLong counter = slot.getConnectionCounter(); - return connectionLimitPerSession > counter.getAndIncrement(); + if (connectionLimitPerSession > counter.getAndIncrement()) { + return true; + } + + // ensure a rejected connection will not be counted + counter.getAndDecrement(); + return false; + } + + @Override + public void releaseConnection(SessionId id) { + SessionSlot slot = currentSessions.getIfPresent(id); + + if (slot == null) { + return; + } + + if (connectionLimitPerSession == -1) { + // no limit + return; + } + + AtomicLong counter = slot.getConnectionCounter(); + + counter.decrementAndGet(); } @Override @@ -875,11 +899,11 @@ private Session createExternalSession( boolean bidiSupported = isSupportingBiDi && (webSocketUrl instanceof String); if (bidiSupported && bidiEnabled) { String biDiUrl = (String) other.getCapabilities().getCapability("webSocketUrl"); - URI uri = null; + URI uri; try { uri = new URI(biDiUrl); } catch (URISyntaxException e) { - throw new IllegalArgumentException("Unable to create URI from " + uri); + throw new IllegalArgumentException("Unable to create URI from " + biDiUrl); } String bidiPath = String.format("/session/%s/se/bidi", other.getId()); toUse = diff --git a/java/src/org/openqa/selenium/grid/node/relay/RelayOptions.java b/java/src/org/openqa/selenium/grid/node/relay/RelayOptions.java index 34d827ce3f2e0..cc98f23489fea 100644 --- a/java/src/org/openqa/selenium/grid/node/relay/RelayOptions.java +++ b/java/src/org/openqa/selenium/grid/node/relay/RelayOptions.java @@ -29,6 +29,7 @@ import java.time.Duration; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.logging.Logger; @@ -122,7 +123,7 @@ public String getServiceProtocolVersion() { private String normalizeProtocolVersion(String protocolVersion) { // Support input in the form of "http/1.1" or "HTTP/1.1" - return protocolVersion.toUpperCase().replaceAll("/", "_").replaceAll("\\.", "_"); + return protocolVersion.toUpperCase(Locale.ENGLISH).replaceAll("/", "_").replaceAll("\\.", "_"); } // Method being used in SessionSlot diff --git a/java/src/org/openqa/selenium/grid/node/remote/RemoteNode.java b/java/src/org/openqa/selenium/grid/node/remote/RemoteNode.java index d83d7bbbdd9ca..a40edb20afde3 100644 --- a/java/src/org/openqa/selenium/grid/node/remote/RemoteNode.java +++ b/java/src/org/openqa/selenium/grid/node/remote/RemoteNode.java @@ -196,6 +196,18 @@ public boolean tryAcquireConnection(SessionId id) { return Boolean.TRUE.equals(Values.get(res, Boolean.class)); } + @Override + public void releaseConnection(SessionId id) { + Require.nonNull("Session ID", id); + + HttpRequest req = new HttpRequest(DELETE, "/se/grid/node/connection/" + id); + HttpTracing.inject(tracer, tracer.getCurrentContext(), req); + + HttpResponse res = client.with(addSecret).execute(req); + + Values.get(res, Void.class); + } + @Override public Session getSession(SessionId id) throws NoSuchSessionException { Require.nonNull("Session ID", id); diff --git a/java/src/org/openqa/selenium/grid/sessionqueue/config/NewSessionQueueOptions.java b/java/src/org/openqa/selenium/grid/sessionqueue/config/NewSessionQueueOptions.java index bc9b213a35b68..ef6e74e2736c5 100644 --- a/java/src/org/openqa/selenium/grid/sessionqueue/config/NewSessionQueueOptions.java +++ b/java/src/org/openqa/selenium/grid/sessionqueue/config/NewSessionQueueOptions.java @@ -35,6 +35,7 @@ public class NewSessionQueueOptions { static final String SESSION_QUEUE_SECTION = "sessionqueue"; + static final int DEFAULT_MAXIMUM_RESPONSE_DELAY = 8; static final int DEFAULT_REQUEST_TIMEOUT = 300; static final int DEFAULT_REQUEST_TIMEOUT_PERIOD = 10; static final int DEFAULT_RETRY_INTERVAL = 15; @@ -89,6 +90,15 @@ public URI getSessionQueueUri() { } } + public Duration getMaximumResponseDelay() { + int timeout = + config + .getInt(SESSION_QUEUE_SECTION, "maximum-response-delay") + .orElse(DEFAULT_MAXIMUM_RESPONSE_DELAY); + + return Duration.ofSeconds(timeout); + } + public Duration getSessionRequestTimeout() { // If the user sets 0 or less, we default to 1s. int timeout = diff --git a/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java b/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java index 5dc3a4e947da7..2b88bdce35c30 100644 --- a/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java +++ b/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java @@ -96,6 +96,7 @@ public class LocalNewSessionQueue extends NewSessionQueue implements Closeable { private static final String NAME = "Local New Session Queue"; private final SlotMatcher slotMatcher; private final Duration requestTimeout; + private final Duration maximumResponseDelay; private final int batchSize; private final Map requests; private final Map contexts; @@ -115,6 +116,7 @@ public LocalNewSessionQueue( SlotMatcher slotMatcher, Duration requestTimeoutCheck, Duration requestTimeout, + Duration maximumResponseDelay, Secret registrationSecret, int batchSize) { super(tracer, registrationSecret); @@ -123,6 +125,7 @@ public LocalNewSessionQueue( Require.nonNegative("Retry period", requestTimeoutCheck); this.requestTimeout = Require.positive("Request timeout", requestTimeout); + this.maximumResponseDelay = Require.positive("Maximum response delay", maximumResponseDelay); this.requests = new ConcurrentHashMap<>(); this.queue = new ConcurrentLinkedDeque<>(); @@ -152,6 +155,7 @@ public static NewSessionQueue create(Config config) { slotMatcher, newSessionQueueOptions.getSessionRequestTimeoutPeriod(), newSessionQueueOptions.getSessionRequestTimeout(), + newSessionQueueOptions.getMaximumResponseDelay(), secretOptions.getRegistrationSecret(), newSessionQueueOptions.getBatchSize()); } @@ -234,7 +238,9 @@ public HttpResponse addToQueue(SessionRequest request) { } Lock writeLock = this.lock.writeLock(); - writeLock.lock(); + if (!writeLock.tryLock()) { + writeLock.lock(); + } try { requests.remove(request.getRequestId()); queue.remove(request); @@ -268,7 +274,9 @@ Data injectIntoQueue(SessionRequest request) { Data data = new Data(request.getEnqueued()); Lock writeLock = lock.writeLock(); - writeLock.lock(); + if (!writeLock.tryLock()) { + writeLock.lock(); + } try { requests.put(request.getRequestId(), data); queue.addLast(request); @@ -288,7 +296,9 @@ public boolean retryAddToQueue(SessionRequest request) { contexts.getOrDefault(request.getRequestId(), tracer.getCurrentContext()); try (Span ignored = context.createSpan("sessionqueue.retry")) { Lock writeLock = lock.writeLock(); - writeLock.lock(); + if (!writeLock.tryLock()) { + writeLock.lock(); + } try { if (!requests.containsKey(request.getRequestId())) { return false; @@ -324,7 +334,9 @@ public Optional remove(RequestId reqId) { Require.nonNull("Request ID", reqId); Lock writeLock = lock.writeLock(); - writeLock.lock(); + if (!writeLock.tryLock()) { + writeLock.lock(); + } try { Iterator iterator = queue.iterator(); while (iterator.hasNext()) { @@ -345,6 +357,29 @@ public Optional remove(RequestId reqId) { public List getNextAvailable(Map stereotypes) { Require.nonNull("Stereotypes", stereotypes); + // use nano time to avoid issues with a jumping clock e.g. on WSL2 or due to time-sync + long started = System.nanoTime(); + // delay the response to avoid heavy polling via http + while (maximumResponseDelay.toNanos() > System.nanoTime() - started) { + Lock readLock = lock.readLock(); + readLock.lock(); + + try { + if (!queue.isEmpty()) { + break; + } + } finally { + readLock.unlock(); + } + + try { + Thread.sleep(10); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + break; + } + } + Predicate matchesStereotype = caps -> stereotypes.entrySet().stream() @@ -360,7 +395,9 @@ public List getNextAvailable(Map stereotypes }); Lock writeLock = lock.writeLock(); - writeLock.lock(); + if (!writeLock.tryLock()) { + writeLock.lock(); + } try { List availableRequests = queue.stream() @@ -397,7 +434,9 @@ public boolean complete( try (Span ignored = context.createSpan("sessionqueue.completed")) { Data data; Lock writeLock = lock.writeLock(); - writeLock.lock(); + if (!writeLock.tryLock()) { + writeLock.lock(); + } try { data = requests.remove(reqId); queue.removeIf(req -> reqId.equals(req.getRequestId())); @@ -417,7 +456,9 @@ public boolean complete( @Override public int clearQueue() { Lock writeLock = lock.writeLock(); - writeLock.lock(); + if (!writeLock.tryLock()) { + writeLock.lock(); + } try { int size = queue.size(); diff --git a/java/src/org/openqa/selenium/grid/web/ResourceHandler.java b/java/src/org/openqa/selenium/grid/web/ResourceHandler.java index b51f54ce3635b..99474bc78140f 100644 --- a/java/src/org/openqa/selenium/grid/web/ResourceHandler.java +++ b/java/src/org/openqa/selenium/grid/web/ResourceHandler.java @@ -42,6 +42,7 @@ import java.io.UncheckedIOException; import java.net.MalformedURLException; import java.net.URL; +import java.util.Locale; import java.util.Optional; import java.util.stream.Collectors; import org.openqa.selenium.internal.Require; @@ -134,7 +135,7 @@ private String mediaType(String uri) { String extension = (index == -1 || uri.length() == index) ? "" : uri.substring(index + 1); MediaType type; - switch (extension.toLowerCase()) { + switch (extension.toLowerCase(Locale.ENGLISH)) { case "appcache": type = CACHE_MANIFEST_UTF_8; break; diff --git a/java/src/org/openqa/selenium/grid/web/ReverseProxyHandler.java b/java/src/org/openqa/selenium/grid/web/ReverseProxyHandler.java index 7373e1095c2eb..b6a98bb323992 100644 --- a/java/src/org/openqa/selenium/grid/web/ReverseProxyHandler.java +++ b/java/src/org/openqa/selenium/grid/web/ReverseProxyHandler.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet; import java.io.UncheckedIOException; +import java.util.Locale; import java.util.logging.Logger; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.http.HttpClient; @@ -78,7 +79,7 @@ public HttpResponse execute(HttpRequest req) throws UncheckedIOException { req.forEachHeader( (name, value) -> { - if (IGNORED_REQ_HEADERS.contains(name.toLowerCase())) { + if (IGNORED_REQ_HEADERS.contains(name.toLowerCase(Locale.ENGLISH))) { return; } toUpstream.addHeader(name, value); diff --git a/java/src/org/openqa/selenium/internal/Require.java b/java/src/org/openqa/selenium/internal/Require.java index 476966a597bb4..4ec171e5a305e 100644 --- a/java/src/org/openqa/selenium/internal/Require.java +++ b/java/src/org/openqa/selenium/internal/Require.java @@ -129,11 +129,8 @@ public static int positive(String argName, Integer number, String message) { throw new IllegalArgumentException(String.format(MUST_BE_SET, argName)); } if (number <= 0) { - if (message == null) { - throw new IllegalArgumentException(String.format(MUST_BE_POSITIVE, argName)); - } else { - throw new IllegalArgumentException(message); - } + throw new IllegalArgumentException( + Objects.requireNonNullElseGet(message, () -> String.format(MUST_BE_POSITIVE, argName))); } return number; } @@ -143,11 +140,8 @@ public static double positive(String argName, Double number, String message) { throw new IllegalArgumentException(String.format(MUST_BE_SET, argName)); } if (number <= 0) { - if (message == null) { - throw new IllegalArgumentException(String.format(MUST_BE_POSITIVE, argName)); - } else { - throw new IllegalArgumentException(message); - } + throw new IllegalArgumentException( + Objects.requireNonNullElseGet(message, () -> String.format(MUST_BE_POSITIVE, argName))); } return number; } diff --git a/java/src/org/openqa/selenium/io/FileHandler.java b/java/src/org/openqa/selenium/io/FileHandler.java index b332d8ff78649..8d171649e15e6 100644 --- a/java/src/org/openqa/selenium/io/FileHandler.java +++ b/java/src/org/openqa/selenium/io/FileHandler.java @@ -25,6 +25,7 @@ import java.nio.file.Files; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Objects; /** Utility methods for common filesystem activities */ @@ -41,9 +42,10 @@ public static void copyResource(File outputDir, Class forClassLoader, String. private static InputStream locateResource(Class forClassLoader, String name) throws IOException { - String arch = Objects.requireNonNull(System.getProperty("os.arch")).toLowerCase() + "/"; + String arch = + Objects.requireNonNull(System.getProperty("os.arch")).toLowerCase(Locale.ENGLISH) + "/"; List alternatives = Arrays.asList(name, "/" + name, arch + name, "/" + arch + name); - if (System.getProperty("os.name").toLowerCase().contains("mac")) { + if (System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("mac")) { alternatives.add("mac/" + name); alternatives.add("/mac/" + name); } diff --git a/java/src/org/openqa/selenium/json/JsonInput.java b/java/src/org/openqa/selenium/json/JsonInput.java index 5c8842851a3e0..c116a24b3d9c6 100644 --- a/java/src/org/openqa/selenium/json/JsonInput.java +++ b/java/src/org/openqa/selenium/json/JsonInput.java @@ -39,8 +39,7 @@ public class JsonInput implements Closeable { private final Reader source; - // FIXME: This flag is never set - private final boolean readPerformed = false; + private boolean readPerformed = false; private JsonTypeCoercer coercer; private PropertySetting setter; private final Input input; @@ -49,6 +48,7 @@ public class JsonInput implements Closeable { private final Deque stack = new ArrayDeque<>(); JsonInput(Reader source, JsonTypeCoercer coercer, PropertySetting setter) { + this.source = Require.nonNull("Source", source); this.coercer = Require.nonNull("Coercer", coercer); this.input = new Input(source); @@ -402,6 +402,10 @@ public void skipValue() { } } + private void markReadPerformed() { + readPerformed = true; + } + /** * Read the next element from the JSON input stream as the specified type. * @@ -413,6 +417,7 @@ public void skipValue() { * @throws UncheckedIOException if an I/O exception is encountered */ public T read(Type type) { + markReadPerformed(); skipWhitespace(input); // Guard against reading an empty stream diff --git a/java/src/org/openqa/selenium/json/SimplePropertyDescriptor.java b/java/src/org/openqa/selenium/json/SimplePropertyDescriptor.java index c993a4b73ca98..71247234fbbf8 100644 --- a/java/src/org/openqa/selenium/json/SimplePropertyDescriptor.java +++ b/java/src/org/openqa/selenium/json/SimplePropertyDescriptor.java @@ -19,6 +19,7 @@ import java.lang.reflect.Method; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.function.Function; @@ -127,7 +128,7 @@ public static SimplePropertyDescriptor[] getPropertyDescriptors(Class clazz) } private static String uncapitalize(String s) { - return s.substring(0, 1).toLowerCase() + s.substring(1); + return s.substring(0, 1).toLowerCase(Locale.ENGLISH) + s.substring(1); } private static boolean hasPrefix(String prefix, String methodName) { diff --git a/java/src/org/openqa/selenium/manager/SeleniumManagerOutput.java b/java/src/org/openqa/selenium/manager/SeleniumManagerOutput.java index 1faee3a809729..3c408679819ba 100644 --- a/java/src/org/openqa/selenium/manager/SeleniumManagerOutput.java +++ b/java/src/org/openqa/selenium/manager/SeleniumManagerOutput.java @@ -17,6 +17,7 @@ package org.openqa.selenium.manager; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.logging.Level; import org.openqa.selenium.internal.Require; @@ -75,7 +76,7 @@ private static Log fromJson(JsonInput input) { while (input.hasNext()) { switch (input.nextName()) { case "level": - switch (input.nextString().toLowerCase()) { + switch (input.nextString().toLowerCase(Locale.ENGLISH)) { case "error": case "warn": level = Level.WARNING; diff --git a/java/src/org/openqa/selenium/remote/FedCmDialogImpl.java b/java/src/org/openqa/selenium/remote/FedCmDialogImpl.java index d61b1a1acccbb..59e832f84e367 100644 --- a/java/src/org/openqa/selenium/remote/FedCmDialogImpl.java +++ b/java/src/org/openqa/selenium/remote/FedCmDialogImpl.java @@ -45,6 +45,12 @@ public String getDialogType() { return (String) executeMethod.execute(DriverCommand.GET_FEDCM_DIALOG_TYPE, null); } + @Override + public void clickDialog() { + executeMethod.execute( + DriverCommand.CLICK_DIALOG, Map.of("dialogButton", "ConfirmIdpLoginContinue")); + } + @Override public String getTitle() { Map result = diff --git a/java/src/org/openqa/selenium/remote/RemoteWebDriver.java b/java/src/org/openqa/selenium/remote/RemoteWebDriver.java index 737be829226d7..e0443aea24d89 100644 --- a/java/src/org/openqa/selenium/remote/RemoteWebDriver.java +++ b/java/src/org/openqa/selenium/remote/RemoteWebDriver.java @@ -1247,7 +1247,7 @@ public void addCredential(Credential credential) { Stream.concat( credential.toMap().entrySet().stream(), Stream.of(Map.entry("authenticatorId", id))) - .collect(Collectors.toUnmodifiableMap((e) -> e.getKey(), (e) -> e.getValue()))); + .collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, Map.Entry::getValue))); } @Override diff --git a/java/src/org/openqa/selenium/remote/TracedCommandExecutor.java b/java/src/org/openqa/selenium/remote/TracedCommandExecutor.java index a8d0b220ea678..a33d52d79e758 100644 --- a/java/src/org/openqa/selenium/remote/TracedCommandExecutor.java +++ b/java/src/org/openqa/selenium/remote/TracedCommandExecutor.java @@ -37,7 +37,7 @@ public TracedCommandExecutor(CommandExecutor delegate, Tracer tracer) { @Override public Response execute(Command command) throws IOException { - try (Span commandSpan = tracer.getCurrentContext().createSpan("command")) { + try (Span commandSpan = tracer.getCurrentContext().createSpan(command.getName())) { SessionId sessionId = command.getSessionId(); if (sessionId != null) { commandSpan.setAttribute("sessionId", sessionId.toString()); diff --git a/java/src/org/openqa/selenium/remote/codec/AbstractHttpCommandCodec.java b/java/src/org/openqa/selenium/remote/codec/AbstractHttpCommandCodec.java index 77987b49d7020..1f73cbca58b46 100644 --- a/java/src/org/openqa/selenium/remote/codec/AbstractHttpCommandCodec.java +++ b/java/src/org/openqa/selenium/remote/codec/AbstractHttpCommandCodec.java @@ -197,14 +197,15 @@ public AbstractHttpCommandCodec() { defineCommand(SET_USER_VERIFIED, post(webauthnId + "/uv")); // Federated Credential Management API - defineCommand(CANCEL_DIALOG, post("/fedcm/canceldialog")); - defineCommand(SELECT_ACCOUNT, post("/fedcm/selectaccount")); - defineCommand(CLICK_DIALOG, post("/fedcm/clickdialogbutton")); - defineCommand(GET_ACCOUNTS, get("/fedcm/accountlist")); - defineCommand(GET_FEDCM_TITLE, get("/fedcm/gettitle")); - defineCommand(GET_FEDCM_DIALOG_TYPE, get("/fedcm/getdialogtype")); - defineCommand(SET_DELAY_ENABLED, post("/fedcm/setdelayenabled")); - defineCommand(RESET_COOLDOWN, post("/fedcm/resetcooldown")); + String fedcm = sessionId + "/fedcm"; + defineCommand(CANCEL_DIALOG, post(fedcm + "/canceldialog")); + defineCommand(SELECT_ACCOUNT, post(fedcm + "/selectaccount")); + defineCommand(CLICK_DIALOG, post(fedcm + "/clickdialogbutton")); + defineCommand(GET_ACCOUNTS, get(fedcm + "/accountlist")); + defineCommand(GET_FEDCM_TITLE, get(fedcm + "/gettitle")); + defineCommand(GET_FEDCM_DIALOG_TYPE, get(fedcm + "/getdialogtype")); + defineCommand(SET_DELAY_ENABLED, post(fedcm + "/setdelayenabled")); + defineCommand(RESET_COOLDOWN, post(fedcm + "/resetcooldown")); defineCommand(GET_DOWNLOADABLE_FILES, get(sessionId + "/se/files")); defineCommand(DOWNLOAD_FILE, post(sessionId + "/se/files")); diff --git a/java/src/org/openqa/selenium/remote/http/HttpMessage.java b/java/src/org/openqa/selenium/remote/http/HttpMessage.java index 909d7ecf7bd97..13d7de07205df 100644 --- a/java/src/org/openqa/selenium/remote/http/HttpMessage.java +++ b/java/src/org/openqa/selenium/remote/http/HttpMessage.java @@ -28,6 +28,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; @@ -91,7 +92,7 @@ public Iterable getHeaderNames() { */ public Iterable getHeaders(String name) { return Collections.unmodifiableCollection( - headers.getOrDefault(name.toLowerCase(), Collections.emptyList())); + headers.getOrDefault(name.toLowerCase(Locale.ENGLISH), Collections.emptyList())); } /** @@ -101,7 +102,8 @@ public Iterable getHeaders(String name) { * @return the value */ public String getHeader(String name) { - List values = headers.getOrDefault(name.toLowerCase(), Collections.emptyList()); + String lcName = name.toLowerCase(Locale.ENGLISH); + List values = headers.getOrDefault(lcName, Collections.emptyList()); return !values.isEmpty() ? values.get(0) : null; } @@ -114,7 +116,8 @@ public String getHeader(String name) { * @return self */ public M setHeader(String name, String value) { - return removeHeader(name.toLowerCase()).addHeader(name.toLowerCase(), value); + String lcName = name.toLowerCase(Locale.ENGLISH); + return removeHeader(lcName).addHeader(lcName, value); } /** @@ -126,7 +129,9 @@ public M setHeader(String name, String value) { * @return self */ public M addHeader(String name, String value) { - headers.computeIfAbsent(name.toLowerCase(), (n) -> new ArrayList<>()).add(value); + String lcName = name.toLowerCase(Locale.ENGLISH); + List values = headers.computeIfAbsent(lcName, (n) -> new ArrayList<>()); + values.add(value); return self(); } @@ -137,17 +142,17 @@ public M addHeader(String name, String value) { * @return self */ public M removeHeader(String name) { - headers.remove(name.toLowerCase()); + String lcName = name.toLowerCase(Locale.ENGLISH); + headers.remove(lcName); return self(); } public Charset getContentEncoding() { - Charset charset = UTF_8; try { String contentType = getHeader(HttpHeader.ContentType.getName()); if (contentType != null) { return Arrays.stream(contentType.split(";")) - .map((e) -> e.trim().toLowerCase()) + .map((e) -> e.trim().toLowerCase(Locale.ENGLISH)) .filter((e) -> e.startsWith("charset=")) .map((e) -> e.substring(e.indexOf('=') + 1)) .map(Charset::forName) @@ -157,7 +162,7 @@ public Charset getContentEncoding() { } catch (IllegalArgumentException ignored) { // Do nothing. } - return charset; + return UTF_8; } @Deprecated diff --git a/java/src/org/openqa/selenium/remote/http/HttpMethod.java b/java/src/org/openqa/selenium/remote/http/HttpMethod.java index 73ed0f52aa4b8..fc6622ea40d7f 100644 --- a/java/src/org/openqa/selenium/remote/http/HttpMethod.java +++ b/java/src/org/openqa/selenium/remote/http/HttpMethod.java @@ -17,6 +17,8 @@ package org.openqa.selenium.remote.http; +import java.util.Locale; + public enum HttpMethod { DELETE, GET, @@ -34,7 +36,7 @@ public static HttpMethod getHttpMethod(String method) { } try { - return HttpMethod.valueOf(method.toUpperCase()); + return HttpMethod.valueOf(method.toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("No enum constant for method: " + method); } diff --git a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java index d0b9f76d41e57..6fe1ef7c9a47c 100644 --- a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java +++ b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java @@ -37,6 +37,7 @@ import java.time.Duration; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.concurrent.CancellationException; import java.util.concurrent.CompletableFuture; @@ -544,7 +545,7 @@ public List select(URI uri) { if (proxy == null) { return List.of(); } - if (uri.getScheme().toLowerCase().startsWith("http")) { + if (uri.getScheme().toLowerCase(Locale.ENGLISH).startsWith("http")) { return List.of(proxy); } return List.of(); diff --git a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java index 22d47eda29e19..3491d9c1bbf00 100644 --- a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java +++ b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java @@ -24,6 +24,7 @@ import java.net.http.HttpRequest.BodyPublisher; import java.net.http.HttpRequest.BodyPublishers; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -94,7 +95,7 @@ public java.net.http.HttpRequest createRequest(HttpRequest req, HttpMethod metho req.forEachHeader( (name, value) -> { // This prevents the IllegalArgumentException that states 'restricted header name: ...' - if (IGNORE_HEADERS.contains(name.toLowerCase())) { + if (IGNORE_HEADERS.contains(name.toLowerCase(Locale.ENGLISH))) { return; } builder.header(name, value); diff --git a/java/src/org/openqa/selenium/remote/service/DriverService.java b/java/src/org/openqa/selenium/remote/service/DriverService.java index 0e0c04f693d9c..87d7e7cb75d61 100644 --- a/java/src/org/openqa/selenium/remote/service/DriverService.java +++ b/java/src/org/openqa/selenium/remote/service/DriverService.java @@ -242,8 +242,10 @@ public void start() throws IOException { processFinished.cancel(true); break; case PROCESS_DIED: + int exitValue = process.exitValue(); process = null; - throw new WebDriverException("Driver server process died prematurely."); + throw new WebDriverException( + "Driver server process died prematurely, exit value: " + exitValue); case PROCESS_IS_ACTIVE: process.shutdown(); throw new WebDriverException("Timed out waiting for driver server to bind the port."); diff --git a/java/src/org/openqa/selenium/support/Color.java b/java/src/org/openqa/selenium/support/Color.java index 0c772ab7cd9b8..bb11a5117741b 100644 --- a/java/src/org/openqa/selenium/support/Color.java +++ b/java/src/org/openqa/selenium/support/Color.java @@ -17,6 +17,7 @@ package org.openqa.selenium.support; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -302,7 +303,7 @@ protected Pattern getPattern() { private static class NamedColorConverter extends Converter { @Override public Color getColor(String value) { - return Colors.valueOf(value.toUpperCase()).getColorValue(); + return Colors.valueOf(value.toUpperCase(Locale.ENGLISH)).getColorValue(); } @Override diff --git a/java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java b/java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java index 0ced6710e2f99..f500774138277 100644 --- a/java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java +++ b/java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java @@ -20,14 +20,20 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.function.Function; import java.util.stream.Collectors; import net.bytebuddy.ByteBuddy; +import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; +import net.bytebuddy.implementation.FieldAccessor; import net.bytebuddy.implementation.InvocationHandlerAdapter; import net.bytebuddy.matcher.ElementMatchers; import org.openqa.selenium.Alert; @@ -183,6 +189,65 @@ @Beta public class WebDriverDecorator { + protected static class Definition { + private final Class decoratedClass; + private final Class originalClass; + + public Definition(Decorated decorated) { + this.decoratedClass = decorated.getClass(); + this.originalClass = decorated.getOriginal().getClass(); + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Definition definition = (Definition) o; + // intentionally an identity check, to ensure we get no false positive lookup due to an + // unknown implementation of decoratedClass.equals or originalClass.equals + return (decoratedClass == definition.decoratedClass) + && (originalClass == definition.originalClass); + } + + @Override + public int hashCode() { + return Arrays.hashCode( + new int[] { + System.identityHashCode(decoratedClass), System.identityHashCode(originalClass) + }); + } + } + + public interface HasTarget { + Decorated getTarget(); + + void setTarget(Decorated target); + } + + protected static class ProxyFactory { + private final Class clazz; + + private ProxyFactory(Class clazz) { + this.clazz = clazz; + } + + public T newInstance(Decorated target) { + T instance; + try { + instance = (T) clazz.newInstance(); + } catch (ReflectiveOperationException e) { + throw new AssertionError("Unable to create new proxy", e); + } + + // ensure we can later find the target to call + //noinspection unchecked + ((HasTarget) instance).setTarget(target); + + return instance; + } + } + + private final ConcurrentMap> cache; + private final Class targetWebDriverClass; private Decorated decorated; @@ -194,6 +259,7 @@ public WebDriverDecorator() { public WebDriverDecorator(Class targetClass) { this.targetWebDriverClass = targetClass; + this.cache = new ConcurrentHashMap<>(); } public final T decorate(T original) { @@ -295,18 +361,36 @@ private Object decorateResult(Object toDecorate) { return toDecorate; } - protected final Z createProxy(final Decorated decorated, Class clazz) { - Set> decoratedInterfaces = extractInterfaces(decorated); - Set> originalInterfaces = extractInterfaces(decorated.getOriginal()); - Map, InvocationHandler> derivedInterfaces = - deriveAdditionalInterfaces(decorated.getOriginal()); + protected final Z createProxy(final Decorated decorated, Class clazz) { + @SuppressWarnings("unchecked") + ProxyFactory factory = + (ProxyFactory) + cache.computeIfAbsent( + new Definition(decorated), (key) -> createProxyFactory(key, decorated, clazz)); + + return factory.newInstance(decorated); + } + + protected final ProxyFactory createProxyFactory( + Definition definition, final Decorated sample, Class clazz) { + Set> decoratedInterfaces = extractInterfaces(definition.decoratedClass); + Set> originalInterfaces = extractInterfaces(definition.originalClass); + // all samples with the same definition should have the same derivedInterfaces + Map, Function> derivedInterfaces = + deriveAdditionalInterfaces(sample.getOriginal()); final InvocationHandler handler = (proxy, method, args) -> { + // Lookup the instance to call, to reuse the clazz and handler. + @SuppressWarnings("unchecked") + Decorated instance = ((HasTarget) proxy).getTarget(); + if (instance == null) { + throw new AssertionError("Failed to get instance to call"); + } try { if (method.getDeclaringClass().equals(Object.class) || decoratedInterfaces.contains(method.getDeclaringClass())) { - return method.invoke(decorated, args); + return method.invoke(instance, args); } // Check if the class in which the method resides, implements any one of the // interfaces that we extracted from the decorated class. @@ -317,9 +401,9 @@ protected final Z createProxy(final Decorated decorated, Class clazz) eachInterface.isAssignableFrom(method.getDeclaringClass())); if (isCompatible) { - decorated.beforeCall(method, args); - Object result = decorated.call(method, args); - decorated.afterCall(method, result, args); + instance.beforeCall(method, args); + Object result = instance.call(method, args); + instance.afterCall(method, result, args); return result; } @@ -333,12 +417,15 @@ protected final Z createProxy(final Decorated decorated, Class clazz) eachInterface.isAssignableFrom(method.getDeclaringClass())); if (isCompatible) { - return derivedInterfaces.get(method.getDeclaringClass()).invoke(proxy, method, args); + return derivedInterfaces + .get(method.getDeclaringClass()) + .apply(instance.getOriginal()) + .invoke(proxy, method, args); } - return method.invoke(decorated.getOriginal(), args); + return method.invoke(instance.getOriginal(), args); } catch (InvocationTargetException e) { - return decorated.onError(method, e, args); + return instance.onError(method, e, args); } }; @@ -346,6 +433,8 @@ protected final Z createProxy(final Decorated decorated, Class clazz) allInterfaces.addAll(decoratedInterfaces); allInterfaces.addAll(originalInterfaces); allInterfaces.addAll(derivedInterfaces.keySet()); + // ensure a decorated driver can get decorated again + allInterfaces.remove(HasTarget.class); Class[] allInterfacesArray = allInterfaces.toArray(new Class[0]); Class proxy = @@ -354,20 +443,15 @@ protected final Z createProxy(final Decorated decorated, Class clazz) .implement(allInterfacesArray) .method(ElementMatchers.any()) .intercept(InvocationHandlerAdapter.of(handler)) + .defineField("target", Decorated.class, Visibility.PRIVATE) + .implement(HasTarget.class) + .intercept(FieldAccessor.ofField("target")) .make() .load(clazz.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) .getLoaded() .asSubclass(clazz); - try { - return proxy.newInstance(); - } catch (ReflectiveOperationException e) { - throw new IllegalStateException("Unable to create new proxy", e); - } - } - - static Set> extractInterfaces(final Object object) { - return extractInterfaces(object.getClass()); + return new ProxyFactory(proxy); } private static Set> extractInterfaces(final Class clazz) { @@ -393,43 +477,46 @@ private static void extractInterfaces(final Set> collector, final Class extractInterfaces(collector, clazz.getSuperclass()); } - private Map, InvocationHandler> deriveAdditionalInterfaces(Object object) { - Map, InvocationHandler> handlers = new HashMap<>(); + private Map, Function> deriveAdditionalInterfaces(Z sample) { + Map, Function> handlers = new HashMap<>(); - if (object instanceof WebDriver && !(object instanceof WrapsDriver)) { + if (sample instanceof WebDriver && !(sample instanceof WrapsDriver)) { handlers.put( WrapsDriver.class, - (proxy, method, args) -> { - if ("getWrappedDriver".equals(method.getName())) { - return object; - } - throw new UnsupportedOperationException(method.getName()); - }); + (instance) -> + (proxy, method, args) -> { + if ("getWrappedDriver".equals(method.getName())) { + return instance; + } + throw new UnsupportedOperationException(method.getName()); + }); } - if (object instanceof WebElement && !(object instanceof WrapsElement)) { + if (sample instanceof WebElement && !(sample instanceof WrapsElement)) { handlers.put( WrapsElement.class, - (proxy, method, args) -> { - if ("getWrappedElement".equals(method.getName())) { - return object; - } - throw new UnsupportedOperationException(method.getName()); - }); + (instance) -> + (proxy, method, args) -> { + if ("getWrappedElement".equals(method.getName())) { + return instance; + } + throw new UnsupportedOperationException(method.getName()); + }); } try { - Method toJson = object.getClass().getDeclaredMethod("toJson"); + Method toJson = sample.getClass().getDeclaredMethod("toJson"); toJson.setAccessible(true); handlers.put( JsonSerializer.class, - ((proxy, method, args) -> { - if ("toJson".equals(method.getName())) { - return toJson.invoke(object); - } - throw new UnsupportedOperationException(method.getName()); - })); + (instance) -> + ((proxy, method, args) -> { + if ("toJson".equals(method.getName())) { + return toJson.invoke(instance); + } + throw new UnsupportedOperationException(method.getName()); + })); } catch (NoSuchMethodException e) { // Fine. Just fall through } diff --git a/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java b/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java index bb02186d91057..25b195b1b5068 100644 --- a/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java +++ b/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java @@ -21,6 +21,7 @@ import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; @@ -301,7 +302,7 @@ private void fireAfterEvents( private String createEventMethodName(String prefix, String originalMethodName) { return prefix - + originalMethodName.substring(0, 1).toUpperCase() + + originalMethodName.substring(0, 1).toUpperCase(Locale.ENGLISH) + originalMethodName.substring(1); } diff --git a/java/src/org/openqa/selenium/support/ui/Select.java b/java/src/org/openqa/selenium/support/ui/Select.java index 5f4021b8b172d..264585e5417f6 100644 --- a/java/src/org/openqa/selenium/support/ui/Select.java +++ b/java/src/org/openqa/selenium/support/ui/Select.java @@ -40,7 +40,7 @@ public class Select implements ISelect, WrapsElement { public Select(WebElement element) { String tagName = element.getTagName(); - if (null == tagName || !"select".equals(tagName.toLowerCase())) { + if (!"select".equalsIgnoreCase(tagName)) { throw new UnexpectedTagNameException("select", tagName); } diff --git a/java/test/org/openqa/selenium/ClickTest.java b/java/test/org/openqa/selenium/ClickTest.java index e491a42ebf2d5..dafd357d6f855 100644 --- a/java/test/org/openqa/selenium/ClickTest.java +++ b/java/test/org/openqa/selenium/ClickTest.java @@ -269,6 +269,11 @@ public void testShouldBeAbleToClickOnAnElementGreaterThanTwoViewports() { @SwitchToTopAfterTest @Test @NotYetImplemented(SAFARI) + @Ignore( + value = FIREFOX, + reason = + "Clicking on element doesn't work if element is in iframe outside of viewport in Beta", + issue = "https://bugzilla.mozilla.org/show_bug.cgi?id=1937115") public void testShouldBeAbleToClickOnAnElementInFrameGreaterThanTwoViewports() { String url = appServer.whereIs("click_too_big_in_frame.html"); driver.get(url); diff --git a/java/test/org/openqa/selenium/NoSuchShadowRootTest.java b/java/test/org/openqa/selenium/NoSuchShadowRootTest.java index f945aa6d4561e..78e776366d512 100644 --- a/java/test/org/openqa/selenium/NoSuchShadowRootTest.java +++ b/java/test/org/openqa/selenium/NoSuchShadowRootTest.java @@ -34,6 +34,6 @@ public void getNoSuchShadowRoot() { driver.get(pages.shadowRootPage); WebElement nonExistentShadowRootElement = driver.findElement(By.id("noShadowRoot")); assertThatExceptionOfType(NoSuchShadowRootException.class) - .isThrownBy(() -> nonExistentShadowRootElement.getShadowRoot()); + .isThrownBy(nonExistentShadowRootElement::getShadowRoot); } } diff --git a/java/test/org/openqa/selenium/UploadTest.java b/java/test/org/openqa/selenium/UploadTest.java index ae67b01aa3613..308ca7a4d1e96 100644 --- a/java/test/org/openqa/selenium/UploadTest.java +++ b/java/test/org/openqa/selenium/UploadTest.java @@ -29,7 +29,6 @@ import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Arrays; import java.util.List; @@ -179,7 +178,7 @@ private File createTmpFile(String content) { try { File f = File.createTempFile("webdriver", "tmp"); f.deleteOnExit(); - Files.write(f.toPath(), content.getBytes(StandardCharsets.UTF_8)); + Files.writeString(f.toPath(), content); return f; } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/java/test/org/openqa/selenium/edge/EdgeOptionsTest.java b/java/test/org/openqa/selenium/edge/EdgeOptionsTest.java index b0e552108c604..158eee1180a3d 100644 --- a/java/test/org/openqa/selenium/edge/EdgeOptionsTest.java +++ b/java/test/org/openqa/selenium/edge/EdgeOptionsTest.java @@ -242,7 +242,7 @@ private void checkCommonStructure(EdgeOptions options) { private File createTempFile(Path tmpDir, String content) { try { Path file = Files.createTempFile(tmpDir, "tmp", "ext"); - Files.write(file, content.getBytes(Charset.defaultCharset())); + Files.writeString(file, content, Charset.defaultCharset()); return file.toFile(); } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/java/test/org/openqa/selenium/environment/webserver/AppServerTestBase.java b/java/test/org/openqa/selenium/environment/webserver/AppServerTestBase.java index 8244ff07c94b2..b174fa2b95700 100644 --- a/java/test/org/openqa/selenium/environment/webserver/AppServerTestBase.java +++ b/java/test/org/openqa/selenium/environment/webserver/AppServerTestBase.java @@ -17,7 +17,6 @@ package org.openqa.selenium.environment.webserver; -import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.openqa.selenium.remote.http.Contents.string; @@ -135,7 +134,7 @@ void uploadsFile() throws Throwable { String FILE_CONTENTS = "Uploaded file"; File testFile = File.createTempFile("webdriver", "tmp"); testFile.deleteOnExit(); - Files.write(testFile.toPath(), FILE_CONTENTS.getBytes(UTF_8)); + Files.writeString(testFile.toPath(), FILE_CONTENTS); driver.get(server.whereIs("upload.html")); driver.findElement(By.id("upload")).sendKeys(testFile.getAbsolutePath()); diff --git a/java/test/org/openqa/selenium/environment/webserver/FedCmConfigHandler.java b/java/test/org/openqa/selenium/environment/webserver/FedCmConfigHandler.java new file mode 100644 index 0000000000000..bb7f17fe91614 --- /dev/null +++ b/java/test/org/openqa/selenium/environment/webserver/FedCmConfigHandler.java @@ -0,0 +1,46 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium.environment.webserver; + +import java.io.UncheckedIOException; +import java.util.Map; +import org.openqa.selenium.remote.http.Contents; +import org.openqa.selenium.remote.http.HttpHandler; +import org.openqa.selenium.remote.http.HttpRequest; +import org.openqa.selenium.remote.http.HttpResponse; + +class FedCmConfigHandler implements HttpHandler { + + @Override + public HttpResponse execute(HttpRequest req) throws UncheckedIOException { + HttpResponse response = new HttpResponse(); + response.setHeader("Content-Type", "application/json"); + response.setHeader("Cache-Control", "no-store"); + + response.setContent( + Contents.asJson( + Map.of( + "accounts_endpoint", "accounts.json", + "client_metadata_endpoint", "client_metadata.json", + "id_assertion_endpoint", "id_assertion.json", + "signin_url", "signin", + "login_url", "login"))); + + return response; + } +} diff --git a/java/test/org/openqa/selenium/environment/webserver/HandlersForTests.java b/java/test/org/openqa/selenium/environment/webserver/HandlersForTests.java index cb99cc3a334e5..72ac648d37c8f 100644 --- a/java/test/org/openqa/selenium/environment/webserver/HandlersForTests.java +++ b/java/test/org/openqa/selenium/environment/webserver/HandlersForTests.java @@ -56,9 +56,10 @@ public HandlersForTests(String hostname, int port, Path tempPageDir) { .setContent(Contents.string("

authorized

", UTF_8))) .with(new BasicAuthenticationFilter("test", "test")), Route.get("/.well-known/web-identity").to(WellKnownWebIdentityHandler::new), + Route.get("/fedcm/config.json").to(FedCmConfigHandler::new), Route.get("/echo").to(EchoHandler::new), Route.get("/cookie").to(CookieHandler::new), - Route.post("/fedcm/id_assertion").to(FedCmIdAssertion::new), + Route.post("/fedcm/id_assertion.json").to(FedCmIdAssertion::new), Route.get("/encoding").to(EncodingHandler::new), Route.matching(req -> req.getUri().startsWith("/generated/")) .to(() -> new GeneratedJsTestHandler("/generated")), diff --git a/java/test/org/openqa/selenium/environment/webserver/WellKnownWebIdentityHandler.java b/java/test/org/openqa/selenium/environment/webserver/WellKnownWebIdentityHandler.java index ad6372767d5e8..d474c66fdf2e1 100644 --- a/java/test/org/openqa/selenium/environment/webserver/WellKnownWebIdentityHandler.java +++ b/java/test/org/openqa/selenium/environment/webserver/WellKnownWebIdentityHandler.java @@ -35,7 +35,7 @@ public HttpResponse execute(HttpRequest req) throws UncheckedIOException { HttpResponse response = new HttpResponse(); response.setHeader("Content-Type", "application/json"); response.setHeader("Cache-Control", "no-store"); - String targetLocation = UrlPath.relativeToContext(req, "/fedcm/fedcm.json"); + String targetLocation = UrlPath.relativeToContext(req, "https://idp.com"); response.setContent(Contents.string(String.format(RESPONSE_STRING, targetLocation), UTF_8)); diff --git a/java/test/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementTest.java b/java/test/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementTest.java index ddb9b5b462f45..f6690f388aa00 100644 --- a/java/test/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementTest.java +++ b/java/test/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementTest.java @@ -19,8 +19,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assumptions.assumeThat; -import static org.assertj.core.api.InstanceOfAssertFactories.MAP; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.openqa.selenium.testing.drivers.Browser.CHROME; @@ -28,48 +26,40 @@ import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; +import java.util.List; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.openqa.selenium.InvalidSelectorException; -import org.openqa.selenium.JavascriptException; -import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.By; +import org.openqa.selenium.NoAlertPresentException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.environment.InProcessTestEnvironment; +import org.openqa.selenium.environment.webserver.AppServer; import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.testing.JupiterTestBase; -import org.openqa.selenium.testing.NeedsSecureServer; -import org.openqa.selenium.testing.NotYetImplemented; -@NeedsSecureServer -class FederatedCredentialManagementTest extends JupiterTestBase { +class FederatedCredentialManagementTest { - private JavascriptExecutor jsAwareDriver; private HasFederatedCredentialManagement fedcmDriver; + private WebDriver localDriver; + InProcessTestEnvironment environment = new InProcessTestEnvironment(true); + AppServer appServer = environment.getAppServer(); @BeforeEach public void setup() { ChromeOptions options = (ChromeOptions) CHROME.getCapabilities(); - // options.setAcceptInsecureCerts(true); + options.setAcceptInsecureCerts(true); options.addArguments( String.format("host-resolver-rules=MAP localhost:443 localhost:%d", getSecurePort())); options.addArguments("ignore-certificate-errors"); - localDriver = seleniumExtension.createNewDriver(options); + options.addArguments("--enable-fedcm-without-well-known-enforcement"); + localDriver = new ChromeDriver(options); assumeThat(localDriver).isInstanceOf(HasFederatedCredentialManagement.class); - jsAwareDriver = (JavascriptExecutor) localDriver; fedcmDriver = (HasFederatedCredentialManagement) localDriver; - localDriver.get(appServer.whereIsSecure("/fedcm/fedcm.html")); - } - - private Object triggerFedCm() { - return jsAwareDriver.executeScript("triggerFedCm()"); - } - - private void waitForDialog() { - WebDriverWait wait = new WebDriverWait(localDriver, Duration.ofSeconds(5)); - wait.until( - driver -> - ((HasFederatedCredentialManagement) driver).getFederatedCredentialManagementDialog() - != null); + localDriver.get(appServer.whereIsSecure("/fedcm/fedcm_async.html")); } private int getSecurePort() { @@ -82,62 +72,106 @@ private int getSecurePort() { } } + @AfterEach + public void teardown() { + localDriver.quit(); + appServer.stop(); + } + + private void waitForDialog() { + WebDriverWait wait = new WebDriverWait(localDriver, Duration.ofSeconds(20)); + wait.until( + driver -> + ((HasFederatedCredentialManagement) driver).getFederatedCredentialManagementDialog() + != null); + } + @Test - @NotYetImplemented( - value = CHROME, - reason = "https://github.com/SeleniumHQ/selenium/pull/12096#issuecomment-2017760822") void testDismissDialog() { fedcmDriver.setDelayEnabled(false); assertNull(fedcmDriver.getFederatedCredentialManagementDialog()); - Object response = triggerFedCm(); + WebElement triggerButton = localDriver.findElement(By.id("triggerButton")); + triggerButton.click(); waitForDialog(); FederatedCredentialManagementDialog dialog = fedcmDriver.getFederatedCredentialManagementDialog(); - assertEquals("Sign in to localhost with localhost", dialog.getTitle()); - assertEquals("AccountChooser", dialog.getDialogType()); - + assertThat(dialog.getTitle()).contains("Sign in to"); + assertThat(dialog.getSubtitle()).isNull(); + assertThat(dialog.getDialogType()).isEqualTo("AccountChooser"); dialog.cancelDialog(); - // Check that the dialog was indeed closed (i.e. the promise now resolves). - assertThrows( - JavascriptException.class, - () -> { - try { - jsAwareDriver.executeScript("await promise"); - } catch (InvalidSelectorException ex) { - // Due to a bug in Chromedriver (https://crbug.com/1454586), we may - // get an invalid selector exception here instead of a JavascriptException. - // Turn it into a JavascriptException to make the test pass for now. - throw new JavascriptException(ex.getMessage(), ex); - } - }); + // Check that the dialog was indeed closed. Unable to get the dialog type since the dialog was + // closed. + assertThrows(NoAlertPresentException.class, dialog::getDialogType); } @Test - @NotYetImplemented( - value = CHROME, - reason = "https://github.com/SeleniumHQ/selenium/pull/12096#issuecomment-2017760822") void testSelectAccount() { - fedcmDriver.setDelayEnabled(false); assertNull(fedcmDriver.getFederatedCredentialManagementDialog()); - Object response = triggerFedCm(); - + WebElement triggerButton = localDriver.findElement(By.id("triggerButton")); + triggerButton.click(); waitForDialog(); FederatedCredentialManagementDialog dialog = fedcmDriver.getFederatedCredentialManagementDialog(); - assertEquals("Sign in to localhost with localhost", dialog.getTitle()); - assertEquals("AccountChooser", dialog.getDialogType()); + assertThat(dialog.getTitle()).contains("Sign in to"); + assertThat(dialog.getSubtitle()).isNull(); + assertThat(dialog.getDialogType()).isEqualTo("AccountChooser"); + + List accountList = dialog.getAccounts(); + assertThat(accountList.size()).isEqualTo(2); + dialog.selectAccount(1); + } - dialog.selectAccount(0); + @Test + void testGetAccounts() { + assertNull(fedcmDriver.getFederatedCredentialManagementDialog()); + + WebElement triggerButton = localDriver.findElement(By.id("triggerButton")); + triggerButton.click(); + + waitForDialog(); + + FederatedCredentialManagementDialog dialog = + fedcmDriver.getFederatedCredentialManagementDialog(); - response = jsAwareDriver.executeScript("return await promise"); - assertThat(response).asInstanceOf(MAP).containsEntry("token", "a token"); + assertThat(dialog.getTitle()).contains("Sign in to"); + assertThat(dialog.getSubtitle()).isNull(); + assertThat(dialog.getDialogType()).isEqualTo("AccountChooser"); + + List accountList = dialog.getAccounts(); + assertThat(accountList.size()).isEqualTo(2); + + FederatedCredentialManagementAccount account1 = accountList.get(0); + + assertThat(account1.getName()).isEqualTo("John Doe"); + assertThat(account1.getEmail()).isEqualTo("john_doe@idp.example"); + assertThat(account1.getAccountid()).isEqualTo("1234"); + assertThat(account1.getGivenName()).isEqualTo("John"); + assertThat(account1.getIdpConfigUrl()).contains("/fedcm/config.json"); + assertThat(account1.getPictureUrl()).isEqualTo("https://idp.example/profile/123"); + assertThat(account1.getLoginState()).isEqualTo("SignUp"); + assertThat(account1.getTermsOfServiceUrl()) + .isEqualTo("https://rp.example/terms_of_service.html"); + assertThat(account1.getPrivacyPolicyUrl()).isEqualTo("https://rp.example/privacy_policy.html"); + + FederatedCredentialManagementAccount account2 = accountList.get(1); + + assertThat(account2.getName()).isEqualTo("Aisha Ahmad"); + assertThat(account2.getEmail()).isEqualTo("aisha@idp.example"); + assertThat(account2.getAccountid()).isEqualTo("5678"); + assertThat(account2.getGivenName()).isEqualTo("Aisha"); + assertThat(account2.getIdpConfigUrl()).contains("/fedcm/config.json"); + assertThat(account2.getPictureUrl()).isEqualTo("https://idp.example/profile/567"); + assertThat(account2.getLoginState()).isEqualTo("SignUp"); + assertThat(account2.getTermsOfServiceUrl()) + .isEqualTo("https://rp.example/terms_of_service.html"); + assertThat(account2.getPrivacyPolicyUrl()).isEqualTo("https://rp.example/privacy_policy.html"); } } diff --git a/java/test/org/openqa/selenium/grid/data/DefaultSlotMatcherTest.java b/java/test/org/openqa/selenium/grid/data/DefaultSlotMatcherTest.java index 42140dca9ef7e..ef6156d9cde99 100644 --- a/java/test/org/openqa/selenium/grid/data/DefaultSlotMatcherTest.java +++ b/java/test/org/openqa/selenium/grid/data/DefaultSlotMatcherTest.java @@ -28,6 +28,29 @@ class DefaultSlotMatcherTest { private final DefaultSlotMatcher slotMatcher = new DefaultSlotMatcher(); + private final SemanticVersionComparator comparator = new SemanticVersionComparator(); + + @Test + void testBrowserVersionMatch() { + assertThat(comparator.compare("", "")).isEqualTo(0); + assertThat(comparator.compare("", "130.0")).isEqualTo(1); + assertThat(comparator.compare("131.0.6778.85", "131")).isEqualTo(0); + assertThat(comparator.compare("131.0.6778.85", "131.0")).isEqualTo(0); + assertThat(comparator.compare("131.0.6778.85", "131.0.6778")).isEqualTo(0); + assertThat(comparator.compare("131.0.6778.85", "131.0.6778.95")).isEqualTo(-1); + assertThat(comparator.compare("130.0", "130.0")).isEqualTo(0); + assertThat(comparator.compare("130.0", "130")).isEqualTo(0); + assertThat(comparator.compare("130.0.1", "130")).isEqualTo(0); + assertThat(comparator.compare("130.0.1", "130.0.1")).isEqualTo(0); + assertThat(comparator.compare("133.0a1", "133")).isEqualTo(0); + assertThat(comparator.compare("133", "133.0a1")).isEqualTo(1); + assertThat(comparator.compare("dev", "Dev")).isEqualTo(0); + assertThat(comparator.compare("Beta", "beta")).isEqualTo(0); + assertThat(comparator.compare("130.0.1", "130.0.2")).isEqualTo(-1); + assertThat(comparator.compare("130.1", "130.0")).isEqualTo(1); + assertThat(comparator.compare("131.0", "130.0")).isEqualTo(1); + assertThat(comparator.compare("130.0", "131")).isEqualTo(-1); + } @Test void fullMatch() { diff --git a/java/test/org/openqa/selenium/grid/distributor/AddingNodesTest.java b/java/test/org/openqa/selenium/grid/distributor/AddingNodesTest.java index 1485d04fca4c6..2ed1ab9cd76aa 100644 --- a/java/test/org/openqa/selenium/grid/distributor/AddingNodesTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/AddingNodesTest.java @@ -109,6 +109,7 @@ public void setUpDistributor() throws MalformedURLException { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -450,6 +451,9 @@ public boolean tryAcquireConnection(SessionId id) { return false; } + @Override + public void releaseConnection(SessionId id) {} + @Override public boolean isSupporting(Capabilities capabilities) { return Objects.equals("cake", capabilities.getCapability("cheese")); diff --git a/java/test/org/openqa/selenium/grid/distributor/DistributorDrainingTest.java b/java/test/org/openqa/selenium/grid/distributor/DistributorDrainingTest.java index 13e9bc533f4ba..1170c1e73149f 100644 --- a/java/test/org/openqa/selenium/grid/distributor/DistributorDrainingTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/DistributorDrainingTest.java @@ -54,6 +54,7 @@ void drainedNodeDoesNotShutDownIfNotEmpty() throws InterruptedException { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); LocalNode node = @@ -106,6 +107,7 @@ void drainedNodeShutsDownAfterSessionsFinish() throws InterruptedException { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); LocalNode node = @@ -182,6 +184,7 @@ void testDrainedNodeShutsDownOnceEmpty() throws InterruptedException { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); LocalNode node = @@ -234,6 +237,7 @@ void drainingNodeDoesNotAcceptNewSessions() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); LocalNode node = diff --git a/java/test/org/openqa/selenium/grid/distributor/DistributorNodeAvailabilityTest.java b/java/test/org/openqa/selenium/grid/distributor/DistributorNodeAvailabilityTest.java index daf24309b53bf..97dddc4f19898 100644 --- a/java/test/org/openqa/selenium/grid/distributor/DistributorNodeAvailabilityTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/DistributorNodeAvailabilityTest.java @@ -97,6 +97,7 @@ void shouldBeAbleToRemoveANode() throws MalformedURLException { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -147,6 +148,7 @@ void shouldIncludeHostsThatAreUpInHostList() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); handler.addHandler(sessions); @@ -219,6 +221,7 @@ void shouldNotRemoveNodeWhoseHealthCheckPassesBeforeThreshold() throws Interrupt new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -281,6 +284,7 @@ void shouldReturnNodesThatWereDownToPoolOfNodesOnceTheyMarkTheirHealthCheckPasse new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -338,6 +342,7 @@ void shouldBeAbleToAddANodeAndCreateASession() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); LocalNode node = diff --git a/java/test/org/openqa/selenium/grid/distributor/DistributorTest.java b/java/test/org/openqa/selenium/grid/distributor/DistributorTest.java index 5776adf158600..1fcb2be6e1e07 100644 --- a/java/test/org/openqa/selenium/grid/distributor/DistributorTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/DistributorTest.java @@ -84,6 +84,7 @@ void creatingASessionAddsItToTheSessionMap() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -134,6 +135,7 @@ void shouldReleaseSlotOnceSessionEnds() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -203,6 +205,7 @@ void shouldNotStartASessionIfTheCapabilitiesAreNotSupported() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); handler.addHandler(sessions); @@ -243,6 +246,7 @@ void attemptingToStartASessionWhichFailsMarksAsTheSlotAsAvailable() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); diff --git a/java/test/org/openqa/selenium/grid/distributor/DistributorTestBase.java b/java/test/org/openqa/selenium/grid/distributor/DistributorTestBase.java index 664655a695b6f..c54e5826ca7a7 100644 --- a/java/test/org/openqa/selenium/grid/distributor/DistributorTestBase.java +++ b/java/test/org/openqa/selenium/grid/distributor/DistributorTestBase.java @@ -106,6 +106,7 @@ public void setUp() throws URISyntaxException { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); diff --git a/java/test/org/openqa/selenium/grid/distributor/SessionSchedulingTest.java b/java/test/org/openqa/selenium/grid/distributor/SessionSchedulingTest.java index 4ca45082e4cb4..5b4b8ad209f83 100644 --- a/java/test/org/openqa/selenium/grid/distributor/SessionSchedulingTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/SessionSchedulingTest.java @@ -66,6 +66,7 @@ void theMostLightlyLoadedNodeIsSelectedFirst() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -121,6 +122,7 @@ void shouldUseLastSessionCreatedTimeAsTieBreaker() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); Node leastRecent = createNode(caps, 5, 0); @@ -192,6 +194,7 @@ void shouldNotScheduleAJobIfAllSlotsAreBeingUsed() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -247,6 +250,7 @@ void shouldPrioritizeHostsWithTheMostSlotsAvailableForASessionType() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); diff --git a/java/test/org/openqa/selenium/grid/distributor/local/LocalDistributorTest.java b/java/test/org/openqa/selenium/grid/distributor/local/LocalDistributorTest.java index 3ce2fe80d8352..af5adb64025e0 100644 --- a/java/test/org/openqa/selenium/grid/distributor/local/LocalDistributorTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/local/LocalDistributorTest.java @@ -118,6 +118,7 @@ void testAddNodeToDistributor() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); Distributor distributor = @@ -157,6 +158,7 @@ void testRemoveNodeFromDistributor() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); Distributor distributor = @@ -195,6 +197,7 @@ void testAddSameNodeTwice() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); Distributor distributor = @@ -228,6 +231,7 @@ void shouldBeAbleToAddMultipleSessionsConcurrently() throws Exception { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); @@ -321,6 +325,7 @@ void testDrainNodeFromDistributor() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); Distributor distributor = @@ -366,6 +371,7 @@ void testDrainNodeFromNode() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); Distributor distributor = @@ -396,6 +402,7 @@ void slowStartingNodesShouldNotCauseReservationsToBeSerialized() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); diff --git a/java/test/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelectorTest.java b/java/test/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelectorTest.java index d05e9d1c5f81b..df3eecbd5d53a 100644 --- a/java/test/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelectorTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelectorTest.java @@ -87,6 +87,43 @@ void numberOfSupportedBrowsersByNodeIsCorrect() { assertThat(supportedBrowsersByNode).isEqualTo(1); } + @Test + void nodesAreOrderedNodesByBrowserVersion() { + Capabilities caps = new ImmutableCapabilities("browserName", "chrome"); + + NodeStatus node1 = + createNodeWithStereotypes( + Arrays.asList( + ImmutableMap.of("browserName", "chrome", "browserVersion", "131.0"), + ImmutableMap.of("browserName", "chrome", "browserVersion", "132.0"))); + NodeStatus node2 = + createNodeWithStereotypes( + Arrays.asList(ImmutableMap.of("browserName", "chrome", "browserVersion", "131.0"))); + NodeStatus node3 = + createNodeWithStereotypes( + Arrays.asList(ImmutableMap.of("browserName", "chrome", "browserVersion", ""))); + NodeStatus node4 = + createNodeWithStereotypes( + Arrays.asList(ImmutableMap.of("browserName", "chrome", "browserVersion", "131.1"))); + NodeStatus node5 = + createNodeWithStereotypes( + Arrays.asList(ImmutableMap.of("browserName", "chrome", "browserVersion", "beta"))); + Set nodes = ImmutableSet.of(node1, node2, node3, node4, node5); + + Set slots = selector.selectSlot(caps, nodes, new DefaultSlotMatcher()); + + ImmutableSet nodeIds = + slots.stream().map(SlotId::getOwningNodeId).distinct().collect(toImmutableSet()); + + assertThat(nodeIds) + .containsSequence( + node3.getNodeId(), + node1.getNodeId(), + node4.getNodeId(), + node2.getNodeId(), + node5.getNodeId()); + } + @Test void nodesAreOrderedNodesByNumberOfSupportedBrowsers() { Set nodes = new HashSet<>(); @@ -254,6 +291,20 @@ private NodeStatus createNode(String... browsers) { return myNode.getStatus(); } + private NodeStatus createNodeWithStereotypes(List stereotypes) { + URI uri = createUri(); + LocalNode.Builder nodeBuilder = + LocalNode.builder(tracer, bus, uri, uri, new Secret("cornish yarg")); + nodeBuilder.maximumConcurrentSessions(stereotypes.size()); + stereotypes.forEach( + stereotype -> { + Capabilities caps = new ImmutableCapabilities(stereotype); + nodeBuilder.add(caps, new TestSessionFactory((id, c) -> new Handler(c))); + }); + Node myNode = nodeBuilder.build(); + return myNode.getStatus(); + } + private URI createUri() { try { return new URI("http://localhost:" + random.nextInt()); diff --git a/java/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java b/java/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java index e14db18b8a0bc..3a442dac664d4 100644 --- a/java/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java +++ b/java/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java @@ -121,6 +121,7 @@ public void setupGrid() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); diff --git a/java/test/org/openqa/selenium/grid/node/NodeTest.java b/java/test/org/openqa/selenium/grid/node/NodeTest.java index b9e8fcc7399de..4ce9e7e019ff6 100644 --- a/java/test/org/openqa/selenium/grid/node/NodeTest.java +++ b/java/test/org/openqa/selenium/grid/node/NodeTest.java @@ -36,7 +36,6 @@ import java.io.UncheckedIOException; import java.net.URI; import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.time.Clock; @@ -917,7 +916,7 @@ private File createFile(String content, File directory) { try { File f = new File(directory.getAbsolutePath(), UUID.randomUUID().toString()); f.deleteOnExit(); - Files.write(directory.toPath(), content.getBytes(StandardCharsets.UTF_8)); + Files.writeString(directory.toPath(), content); return f; } catch (IOException e) { throw new RuntimeException(e); @@ -928,7 +927,7 @@ private File createTmpFile(String content) { try { File f = File.createTempFile("webdriver", "tmp"); f.deleteOnExit(); - Files.write(f.toPath(), content.getBytes(StandardCharsets.UTF_8)); + Files.writeString(f.toPath(), content); return f; } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/java/test/org/openqa/selenium/grid/node/relay/RelayOptionsTest.java b/java/test/org/openqa/selenium/grid/node/relay/RelayOptionsTest.java index 8b02b1e595f7c..e376c13e41fc4 100644 --- a/java/test/org/openqa/selenium/grid/node/relay/RelayOptionsTest.java +++ b/java/test/org/openqa/selenium/grid/node/relay/RelayOptionsTest.java @@ -137,10 +137,7 @@ void protocolVersionThrowsConfigException() { Config config = new TomlConfig(new StringReader(String.join("\n", rawConfig))); RelayOptions relayOptions = new RelayOptions(config); assertThatExceptionOfType(ConfigException.class) - .isThrownBy( - () -> { - relayOptions.getServiceProtocolVersion(); - }) + .isThrownBy(relayOptions::getServiceProtocolVersion) .withMessageContaining("Unsupported protocol version provided: HTTP/0.9"); } diff --git a/java/test/org/openqa/selenium/grid/router/DistributedTest.java b/java/test/org/openqa/selenium/grid/router/DistributedTest.java index 821711b2c5be6..46eb746d48b77 100644 --- a/java/test/org/openqa/selenium/grid/router/DistributedTest.java +++ b/java/test/org/openqa/selenium/grid/router/DistributedTest.java @@ -30,8 +30,12 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.openqa.selenium.Capabilities; +import org.openqa.selenium.HasCapabilities; import org.openqa.selenium.SessionNotCreatedException; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.bidi.BiDi; +import org.openqa.selenium.bidi.BiDiProvider; import org.openqa.selenium.grid.config.MapConfig; import org.openqa.selenium.grid.config.MemoizedConfig; import org.openqa.selenium.grid.config.TomlConfig; @@ -43,6 +47,7 @@ import org.openqa.selenium.netty.server.NettyServer; import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.remote.http.ClientConfig; +import org.openqa.selenium.remote.http.ConnectionFailedException; import org.openqa.selenium.remote.http.Contents; import org.openqa.selenium.remote.http.HttpClient; import org.openqa.selenium.remote.http.HttpMethod; @@ -76,7 +81,9 @@ public void setupServers() { + "\n" + "override-max-sessions = true" + "\n" - + "max-sessions = 2"))); + + "max-sessions = 2" + + "\n" + + "connection-limit-per-session = 3"))); tearDowns.add(deployment); server = deployment.getServer(); @@ -192,4 +199,46 @@ void clientTimeoutDoesNotLeakARunningBrowser() throws Exception { Safely.safelyCall(healthy::quit); } } + + @Test + void connectionLimitIsRespected() throws Exception { + assertThat(server.isStarted()).isTrue(); + + // don't use the RemoteWebDriver.builder here, using it does create an unknown number of + // connections + WebDriver driver = new RemoteWebDriver(server.getUrl(), browser.getCapabilities()); + + try { + Capabilities caps = ((HasCapabilities) driver).getCapabilities(); + BiDiProvider biDiProvider = new BiDiProvider(); + + BiDi cnn1 = biDiProvider.getImplementation(caps, null).getBiDi(); + BiDi cnn2 = biDiProvider.getImplementation(caps, null).getBiDi(); + BiDi cnn3 = biDiProvider.getImplementation(caps, null).getBiDi(); + + Assertions.assertThrows( + ConnectionFailedException.class, + () -> biDiProvider.getImplementation(caps, null).getBiDi()); + cnn1.close(); + BiDi cnn4 = biDiProvider.getImplementation(caps, null).getBiDi(); + + Assertions.assertThrows( + ConnectionFailedException.class, + () -> biDiProvider.getImplementation(caps, null).getBiDi()); + cnn2.close(); + cnn3.close(); + BiDi cnn5 = biDiProvider.getImplementation(caps, null).getBiDi(); + BiDi cnn6 = biDiProvider.getImplementation(caps, null).getBiDi(); + + Assertions.assertThrows( + ConnectionFailedException.class, + () -> biDiProvider.getImplementation(caps, null).getBiDi()); + + cnn4.close(); + cnn5.close(); + cnn6.close(); + } finally { + Safely.safelyCall(driver::quit); + } + } } diff --git a/java/test/org/openqa/selenium/grid/router/JmxTest.java b/java/test/org/openqa/selenium/grid/router/JmxTest.java index 2369abb4c60c1..2561eee7f8871 100644 --- a/java/test/org/openqa/selenium/grid/router/JmxTest.java +++ b/java/test/org/openqa/selenium/grid/router/JmxTest.java @@ -225,6 +225,7 @@ void shouldBeAbleToRegisterSessionQueue() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), new Secret(""), 5); @@ -278,6 +279,7 @@ void shouldBeAbleToMonitorHub() throws Exception { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), secret, 5); diff --git a/java/test/org/openqa/selenium/grid/router/NewSessionCreationTest.java b/java/test/org/openqa/selenium/grid/router/NewSessionCreationTest.java index a19476080d410..5ff4d19a37754 100644 --- a/java/test/org/openqa/selenium/grid/router/NewSessionCreationTest.java +++ b/java/test/org/openqa/selenium/grid/router/NewSessionCreationTest.java @@ -101,6 +101,7 @@ void ensureJsCannotCreateANewSession() throws URISyntaxException { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(60), + Duration.ofSeconds(1), registrationSecret, 5); @@ -189,6 +190,7 @@ void shouldNotRetryNewSessionRequestOnUnexpectedError() throws URISyntaxExceptio new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(10), + Duration.ofSeconds(1), registrationSecret, 5); handler.addHandler(queue); @@ -264,6 +266,7 @@ void shouldRejectRequestForUnsupportedCaps() throws URISyntaxException { new DefaultSlotMatcher(), Duration.ofSeconds(5), Duration.ofSeconds(60), + Duration.ofSeconds(1), registrationSecret, 5); handler.addHandler(queue); diff --git a/java/test/org/openqa/selenium/grid/router/RouterTest.java b/java/test/org/openqa/selenium/grid/router/RouterTest.java index 15d36c5291963..352495f738ed4 100644 --- a/java/test/org/openqa/selenium/grid/router/RouterTest.java +++ b/java/test/org/openqa/selenium/grid/router/RouterTest.java @@ -128,6 +128,7 @@ public void setUp() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); handler.addHandler(queue); diff --git a/java/test/org/openqa/selenium/grid/router/SessionCleanUpTest.java b/java/test/org/openqa/selenium/grid/router/SessionCleanUpTest.java index d6a8e529df597..9944736ccb727 100644 --- a/java/test/org/openqa/selenium/grid/router/SessionCleanUpTest.java +++ b/java/test/org/openqa/selenium/grid/router/SessionCleanUpTest.java @@ -145,6 +145,7 @@ void shouldRemoveSessionAfterNodeIsShutDownGracefully() { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(10), + Duration.ofSeconds(1), registrationSecret, 5); handler.addHandler(queue); @@ -261,6 +262,7 @@ void shouldRemoveSessionAfterNodeIsDown() throws URISyntaxException { new DefaultSlotMatcher(), Duration.ofSeconds(2), Duration.ofSeconds(2), + Duration.ofSeconds(1), registrationSecret, 5); diff --git a/java/test/org/openqa/selenium/grid/router/SessionQueueGridTest.java b/java/test/org/openqa/selenium/grid/router/SessionQueueGridTest.java index 246dc41b10d5e..be3d74506d727 100644 --- a/java/test/org/openqa/selenium/grid/router/SessionQueueGridTest.java +++ b/java/test/org/openqa/selenium/grid/router/SessionQueueGridTest.java @@ -110,6 +110,7 @@ public void setup() throws URISyntaxException, MalformedURLException { new DefaultSlotMatcher(), Duration.ofSeconds(5), Duration.ofSeconds(60), + Duration.ofSeconds(1), registrationSecret, 5); handler.addHandler(queue); diff --git a/java/test/org/openqa/selenium/grid/router/SessionQueueGridWithTimeoutTest.java b/java/test/org/openqa/selenium/grid/router/SessionQueueGridWithTimeoutTest.java index 9e67ccf4d1b6c..cd48aef93b0ba 100644 --- a/java/test/org/openqa/selenium/grid/router/SessionQueueGridWithTimeoutTest.java +++ b/java/test/org/openqa/selenium/grid/router/SessionQueueGridWithTimeoutTest.java @@ -108,6 +108,7 @@ public void setup() throws URISyntaxException, MalformedURLException { new DefaultSlotMatcher(), Duration.ofSeconds(1), Duration.ofSeconds(5), // low timeout to allow simulating it + Duration.ofSeconds(1), registrationSecret, 5); handler.addHandler(queue); diff --git a/java/test/org/openqa/selenium/grid/server/BaseServerOptionsTest.java b/java/test/org/openqa/selenium/grid/server/BaseServerOptionsTest.java index 7aea4479e9300..c92225edfe7a1 100644 --- a/java/test/org/openqa/selenium/grid/server/BaseServerOptionsTest.java +++ b/java/test/org/openqa/selenium/grid/server/BaseServerOptionsTest.java @@ -52,12 +52,7 @@ void externalUriFailsForNonUriStrings() { BaseServerOptions options = new BaseServerOptions(new MapConfig(Map.of("server", Map.of("external-url", "not a URL")))); - Exception exception = - assertThrows( - RuntimeException.class, - () -> { - options.getExternalUri(); - }); + Exception exception = assertThrows(RuntimeException.class, options::getExternalUri); assertThat(exception.getMessage()) .as("External URI must be parseable as URI.") diff --git a/java/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java b/java/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java index b099243066e26..97f85db5bfd9a 100644 --- a/java/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java +++ b/java/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java @@ -129,6 +129,7 @@ public static Stream data() { new DefaultSlotMatcher(), Duration.ofSeconds(1), Duration.ofSeconds(Debug.isDebugging() ? 9999 : 5), + Duration.ofSeconds(1), REGISTRATION_SECRET, 5); return new TestData(local, local); @@ -142,6 +143,7 @@ public static Stream data() { new DefaultSlotMatcher(), Duration.ofSeconds(1), Duration.ofSeconds(Debug.isDebugging() ? 9999 : 5), + Duration.ofSeconds(1), REGISTRATION_SECRET, 5); diff --git a/java/test/org/openqa/selenium/grid/web/ResourceHandlerTest.java b/java/test/org/openqa/selenium/grid/web/ResourceHandlerTest.java index 32ce041aa7435..8c76ac80cf4dc 100644 --- a/java/test/org/openqa/selenium/grid/web/ResourceHandlerTest.java +++ b/java/test/org/openqa/selenium/grid/web/ResourceHandlerTest.java @@ -19,7 +19,6 @@ import static java.net.HttpURLConnection.HTTP_MOVED_TEMP; import static java.net.HttpURLConnection.HTTP_OK; -import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; import static org.openqa.selenium.remote.http.HttpMethod.GET; @@ -48,7 +47,7 @@ public void getPath() throws IOException { @Test void shouldLoadContent() throws IOException { - Files.write(base.resolve("content.txt"), "I like cheese".getBytes(UTF_8)); + Files.writeString(base.resolve("content.txt"), "I like cheese"); HttpHandler handler = new ResourceHandler(new PathResource(base)); HttpResponse res = handler.execute(new HttpRequest(GET, "/content.txt")); @@ -90,7 +89,7 @@ void canBeNestedWithinARoute() throws IOException { Path contents = base.resolve("cheese").resolve("cake.txt"); Files.createDirectories(contents.getParent()); - Files.write(contents, "delicious".getBytes(UTF_8)); + Files.writeString(contents, "delicious"); HttpHandler handler = Route.prefix("/peas").to(Route.combine(new ResourceHandler(new PathResource(base)))); @@ -109,7 +108,7 @@ void canBeNestedWithinARoute() throws IOException { @Test void shouldRedirectToIndexPageIfOneExists() throws IOException { Path index = base.resolve("index.html"); - Files.write(index, "Cheese".getBytes(UTF_8)); + Files.writeString(index, "Cheese"); ResourceHandler handler = new ResourceHandler(new PathResource(base)); HttpResponse res = handler.execute(new HttpRequest(GET, "/")); diff --git a/java/test/org/openqa/selenium/remote/TracedCommandExecutorTest.java b/java/test/org/openqa/selenium/remote/TracedCommandExecutorTest.java index e747b712092fc..6a7aa226826f4 100644 --- a/java/test/org/openqa/selenium/remote/TracedCommandExecutorTest.java +++ b/java/test/org/openqa/selenium/remote/TracedCommandExecutorTest.java @@ -17,6 +17,7 @@ package org.openqa.selenium.remote; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -48,7 +49,7 @@ class TracedCommandExecutorTest { public void createMocksAndTracedCommandExecutor() { MockitoAnnotations.initMocks(this); when(tracer.getCurrentContext()).thenReturn(traceContext); - when(traceContext.createSpan("command")).thenReturn(span); + when(traceContext.createSpan(anyString())).thenReturn(span); tracedCommandExecutor = new TracedCommandExecutor(commandExecutor, tracer); } @@ -109,4 +110,18 @@ void canCreateSpanWithCommandName() throws IOException { verify(span, times(1)).close(); verifyNoMoreInteractions(span); } + + @Test + void canCreateSpanWithCommandNameAsSpanName() throws IOException { + SessionId sessionId = new SessionId(UUID.randomUUID()); + Command command = new Command(sessionId, "findElement"); + + tracedCommandExecutor.execute(command); + + verify(traceContext).createSpan("findElement"); + verify(span).setAttribute("sessionId", sessionId.toString()); + verify(span).setAttribute("command", "findElement"); + verify(span).close(); + verifyNoMoreInteractions(span); + } } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java index ac61d70a166ef..82355b11ba2c6 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java @@ -31,6 +31,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.UUID; import java.util.function.Consumer; import java.util.function.Function; import org.junit.jupiter.api.Tag; @@ -163,6 +164,55 @@ void findElement() { verifyDecoratingFunction($ -> $.findElement(By.id("test")), found, WebElement::click); } + @Test + void doesNotCreateTooManyClasses() { + final WebElement found0 = mock(WebElement.class); + final WebElement found1 = mock(WebElement.class); + final WebElement found2 = mock(WebElement.class); + Function f = $ -> $.findElement(By.id("test")); + Function> f2 = $ -> $.findElements(By.id("test")); + Fixture fixture = new Fixture(); + when(f.apply(fixture.original)).thenReturn(found0); + when(f2.apply(fixture.original)).thenReturn(List.of(found0, found1, found2)); + + WebElement proxy0 = f.apply(fixture.decorated); + WebElement proxy1 = f.apply(fixture.decorated); + WebElement proxy2 = f.apply(fixture.decorated); + + assertThat(proxy0.getClass()).isSameAs(proxy1.getClass()); + assertThat(proxy1.getClass()).isSameAs(proxy2.getClass()); + + List proxies = f2.apply(fixture.decorated); + + assertThat(proxy0.getClass()).isSameAs(proxies.get(0).getClass()); + assertThat(proxy0.getClass()).isSameAs(proxies.get(1).getClass()); + assertThat(proxy0.getClass()).isSameAs(proxies.get(2).getClass()); + } + + @Test + void doesHitTheCorrectInstance() { + String uuid0 = UUID.randomUUID().toString(); + String uuid1 = UUID.randomUUID().toString(); + String uuid2 = UUID.randomUUID().toString(); + final WebElement found0 = mock(WebElement.class); + final WebElement found1 = mock(WebElement.class); + final WebElement found2 = mock(WebElement.class); + when(found0.getTagName()).thenReturn(uuid0); + when(found1.getTagName()).thenReturn(uuid1); + when(found2.getTagName()).thenReturn(uuid2); + + Fixture fixture = new Fixture(); + Function> f = $ -> $.findElements(By.id("test")); + + when(f.apply(fixture.original)).thenReturn(List.of(found0, found1, found2)); + + List proxies = f.apply(fixture.decorated); + + assertThat(proxies.get(0).getTagName()).isEqualTo(uuid0); + assertThat(proxies.get(1).getTagName()).isEqualTo(uuid1); + assertThat(proxies.get(2).getTagName()).isEqualTo(uuid2); + } + @Test void findElementNotFound() { Fixture fixture = new Fixture(); diff --git a/java/test/org/openqa/selenium/testing/TestUtilities.java b/java/test/org/openqa/selenium/testing/TestUtilities.java index 3cbe9971a7526..21abfa50b8e77 100644 --- a/java/test/org/openqa/selenium/testing/TestUtilities.java +++ b/java/test/org/openqa/selenium/testing/TestUtilities.java @@ -20,7 +20,6 @@ import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Map; import java.util.regex.Matcher; @@ -175,7 +174,7 @@ public static File createTmpFile(String content) { try { File f = File.createTempFile("webdriver", "tmp"); f.deleteOnExit(); - Files.write(f.toPath(), content.getBytes(StandardCharsets.UTF_8)); + Files.writeString(f.toPath(), content); return f; } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/java/test/org/openqa/selenium/testing/drivers/Browser.java b/java/test/org/openqa/selenium/testing/drivers/Browser.java index a75d321bd7ac8..3037087237032 100644 --- a/java/test/org/openqa/selenium/testing/drivers/Browser.java +++ b/java/test/org/openqa/selenium/testing/drivers/Browser.java @@ -21,6 +21,7 @@ import static org.openqa.selenium.remote.CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.logging.Logger; import org.openqa.selenium.Capabilities; @@ -172,7 +173,7 @@ public static Browser detect() { } try { - return Browser.valueOf(browserName.toUpperCase()); + return Browser.valueOf(browserName.toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException e) { throw new RuntimeException( String.format("Cannot determine driver from name %s", browserName), e); diff --git a/javascript/atoms/BUILD.bazel b/javascript/atoms/BUILD.bazel index 58b2a498a7865..2ba2f8efdd125 100644 --- a/javascript/atoms/BUILD.bazel +++ b/javascript/atoms/BUILD.bazel @@ -40,7 +40,11 @@ closure_js_library( ":dom", ":errors", ":events", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom:tagname", + "@io_bazel_rules_closure//closure/library/math:coordinate", + "@io_bazel_rules_closure//closure/library/math:vec2", + "@io_bazel_rules_closure//closure/library/style", ], ) @@ -59,7 +63,8 @@ closure_js_library( "JSC_USE_OF_GOOG_PROVIDE", ], deps = [ - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/color:names", ], ) @@ -86,7 +91,15 @@ closure_js_library( ":events", ":locators", ":useragent", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/dom:selection", + "@io_bazel_rules_closure//closure/library/dom:tagname", + "@io_bazel_rules_closure//closure/library/math:coordinate", + "@io_bazel_rules_closure//closure/library/structs:map", + "@io_bazel_rules_closure//closure/library/structs:set", + "@io_bazel_rules_closure//closure/library/useragent", + "@io_bazel_rules_closure//closure/library/useragent:product", ], ) @@ -102,7 +115,10 @@ closure_js_library( deps = [ ":errors", ":useragent", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/dom:nodetype", + "@io_bazel_rules_closure//closure/library/dom:tagname", ], ) @@ -123,7 +139,16 @@ closure_js_library( ":domcore", ":json", ":useragent", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/dom:nodetype", + "@io_bazel_rules_closure//closure/library/dom:tagname", + "@io_bazel_rules_closure//closure/library/math", + "@io_bazel_rules_closure//closure/library/math:coordinate", + "@io_bazel_rules_closure//closure/library/math:rect", + "@io_bazel_rules_closure//closure/library/string", + "@io_bazel_rules_closure//closure/library/style", + "@io_bazel_rules_closure//closure/library/useragent", ], ) @@ -158,7 +183,12 @@ closure_js_library( ":errors", ":json", ":useragent", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/events:browserevent", + "@io_bazel_rules_closure//closure/library/style", + "@io_bazel_rules_closure//closure/library/useragent", + "@io_bazel_rules_closure//closure/library/useragent:product", ], ) @@ -179,7 +209,8 @@ closure_js_library( ":dom", ":errors", ":locators", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/dom:tagname", ], ) @@ -219,7 +250,10 @@ closure_js_library( ":bot", ":errors", ":json", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom:nodetype", + "@io_bazel_rules_closure//closure/library/object", + "@io_bazel_rules_closure//closure/library/useragent", ], ) @@ -231,7 +265,8 @@ closure_js_library( ], deps = [ ":useragent", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/json", + "@io_bazel_rules_closure//closure/library/useragent", ], ) @@ -256,7 +291,13 @@ closure_js_library( ":json", ":useragent", "//third_party/js/wgxpath", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/dom:nodetype", + "@io_bazel_rules_closure//closure/library/math:rect", + "@io_bazel_rules_closure//closure/library/string", + "@io_bazel_rules_closure//closure/library/useragent", + "@io_bazel_rules_closure//closure/library/useragent:product", ], ) @@ -268,7 +309,12 @@ closure_js_library( "JSC_UNKNOWN_EXPR_TYPE", "JSC_USE_OF_GOOG_PROVIDE", ], - deps = ["@io_bazel_rules_closure//closure/library"], + deps = [ + "@io_bazel_rules_closure//closure/library/string", + "@io_bazel_rules_closure//closure/library/useragent", + "@io_bazel_rules_closure//closure/library/useragent:product", + "@io_bazel_rules_closure//closure/library/useragent:product_isversion", + ], ) closure_js_library( @@ -302,7 +348,9 @@ closure_js_library( ":bot", ":errors", ":useragent", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/dom:nodetype", + "@io_bazel_rules_closure//closure/library/string", + "@io_bazel_rules_closure//closure/library/useragent", ], ) @@ -315,7 +363,6 @@ closure_js_library( ], deps = [ ":useragent", - "@io_bazel_rules_closure//closure/library", ], ) diff --git a/javascript/atoms/fragments/BUILD.bazel b/javascript/atoms/fragments/BUILD.bazel index ab01274a7c13c..8db66efffcee7 100644 --- a/javascript/atoms/fragments/BUILD.bazel +++ b/javascript/atoms/fragments/BUILD.bazel @@ -108,7 +108,7 @@ closure_fragment( "//javascript/chrome-driver:__pkg__", ], deps = [ - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/style", ], ) diff --git a/javascript/chrome-driver/BUILD.bazel b/javascript/chrome-driver/BUILD.bazel index 6896a39619caa..dfccf371882dc 100644 --- a/javascript/chrome-driver/BUILD.bazel +++ b/javascript/chrome-driver/BUILD.bazel @@ -15,7 +15,11 @@ closure_js_library( deps = [ "//javascript/atoms:dom", "//javascript/atoms:locators", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/math:coordinate", + "@io_bazel_rules_closure//closure/library/math:rect", + "@io_bazel_rules_closure//closure/library/math:size", + "@io_bazel_rules_closure//closure/library/style", ], ) @@ -24,7 +28,9 @@ closure_fragment( browsers = ["chrome"], function = "goog.style.getPageOffset", module = "goog.style", - deps = ["@io_bazel_rules_closure//closure/library"], + deps = [ + "@io_bazel_rules_closure//closure/library/style", + ], ) closure_fragment( @@ -135,7 +141,7 @@ closure_js_library( testonly = 1, srcs = glob(["**/*.js"]), visibility = ["//javascript:__pkg__"], - deps = ["@io_bazel_rules_closure//closure/library"], + deps = [], ) filegroup( diff --git a/javascript/grid-ui/package.json b/javascript/grid-ui/package.json index ca39d5fd49049..bbf966599ee54 100644 --- a/javascript/grid-ui/package.json +++ b/javascript/grid-ui/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "dependencies": { - "@apollo/client": "3.11.9", + "@apollo/client": "3.12.4", "@emotion/react": "11.13.3", "@emotion/styled": "11.13.0", "@mui/icons-material": "5.15.18", diff --git a/javascript/ie-driver/BUILD.bazel b/javascript/ie-driver/BUILD.bazel index 920d79eb80488..80d7c7548b8df 100644 --- a/javascript/ie-driver/BUILD.bazel +++ b/javascript/ie-driver/BUILD.bazel @@ -23,7 +23,8 @@ closure_js_library( "//javascript/atoms:errors", "//javascript/atoms:locators", "//javascript/atoms:useragent", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/math:coordinate", + "@io_bazel_rules_closure//closure/library/style", ], ) diff --git a/javascript/rules_closure_shell.patch b/javascript/rules_closure_shell.patch deleted file mode 100644 index 932afebe364a7..0000000000000 --- a/javascript/rules_closure_shell.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/closure/compiler/closure_js_deps.bzl b/closure/compiler/closure_js_deps.bzl -index 197c621..6db3aa8 100644 ---- a/closure/compiler/closure_js_deps.bzl -+++ b/closure/compiler/closure_js_deps.bzl -@@ -52,6 +52,7 @@ def _impl(ctx): - ) - ]), - executable = ctx.executable._depswriter, -+ use_default_shell_env = True, - progress_message = "Calculating %d JavaScript deps to %s" % ( - len(js.srcs.to_list()), - ctx.outputs.out.short_path, diff --git a/javascript/webdriver/BUILD.bazel b/javascript/webdriver/BUILD.bazel index 517dbd3172555..4523e905354c2 100644 --- a/javascript/webdriver/BUILD.bazel +++ b/javascript/webdriver/BUILD.bazel @@ -20,7 +20,6 @@ closure_js_library( visibility = ["//javascript/remote:__pkg__"], deps = [ "//javascript/atoms:errors", - "@io_bazel_rules_closure//closure/library", ], ) @@ -41,7 +40,7 @@ closure_js_library( "JSC_USE_OF_GOOG_PROVIDE", ], visibility = ["//javascript:__pkg__"], - deps = ["@io_bazel_rules_closure//closure/library"], + deps = [], ) filegroup( diff --git a/javascript/webdriver/atoms/BUILD.bazel b/javascript/webdriver/atoms/BUILD.bazel index 67d55ad050b93..6bc79eb4a4917 100644 --- a/javascript/webdriver/atoms/BUILD.bazel +++ b/javascript/webdriver/atoms/BUILD.bazel @@ -37,7 +37,11 @@ closure_js_library( "//javascript/atoms:domcore", "//javascript/atoms:html5", "//javascript/webdriver:key", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/dom:tagname", + "@io_bazel_rules_closure//closure/library/math:coordinate", + "@io_bazel_rules_closure//closure/library/style", ], ) @@ -51,7 +55,8 @@ closure_js_library( visibility = ["//visibility:private"], deps = [ "//javascript/atoms:domcore", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom:tagname", ], ) @@ -295,6 +300,5 @@ closure_js_library( "//javascript/webdriver:__pkg__", ], deps = [ - "@io_bazel_rules_closure//closure/library", ], ) diff --git a/javascript/webdriver/atoms/inject/BUILD.bazel b/javascript/webdriver/atoms/inject/BUILD.bazel index 338a7beb8ea92..2e3ac2b393f3c 100644 --- a/javascript/webdriver/atoms/inject/BUILD.bazel +++ b/javascript/webdriver/atoms/inject/BUILD.bazel @@ -38,7 +38,7 @@ closure_js_library( "//javascript/atoms:action", "//javascript/atoms:inject", "//javascript/webdriver/atoms:atoms-lib", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/json", ], ) @@ -68,7 +68,7 @@ closure_js_library( "//javascript/atoms:inject", "//javascript/atoms:useragent", "//javascript/webdriver/atoms:atoms-lib", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/json", ], ) @@ -97,7 +97,7 @@ closure_js_library( ":execute-script", "//javascript/atoms:inject", "//javascript/atoms:locators", - "@io_bazel_rules_closure//closure/library", + "@io_bazel_rules_closure//closure/library/json", ], ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ad1e348f4198..88724d0867754 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,8 +11,8 @@ importers: javascript/grid-ui: dependencies: '@apollo/client': - specifier: 3.11.9 - version: 3.11.9(@types/react@18.2.72)(graphql@16.9.0)(react-dom@18.3.1)(react@18.3.1) + specifier: 3.12.4 + version: 3.12.4(@types/react@18.2.72)(graphql@16.9.0)(react-dom@18.3.1)(react@18.3.1) '@emotion/react': specifier: 11.13.3 version: 11.13.3(@types/react@18.2.72)(react@18.3.1) @@ -171,24 +171,24 @@ importers: packages: - /@adobe/css-tools@4.4.0: - resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + /@adobe/css-tools@4.4.1: + resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} dev: true /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - /@apollo/client@3.11.9(@types/react@18.2.72)(graphql@16.9.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-aQ6VL+CPO1G4DLS/3FelfA+nl+ZQCP5qeN1NS6J8xh9wumUM/2W1ccneqCYmbTMDtoSunxE1BV2W6u0FF4axwQ==} + /@apollo/client@3.12.4(@types/react@18.2.72)(graphql@16.9.0)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-S/eC9jxEW9Jg1BjD6AZonE1fHxYuvC3gFHop8FRQkUdeK63MmBD5r0DOrN2WlJbwha1MSD6A97OwXwjaujEQpA==} peerDependencies: graphql: ^15.0.0 || ^16.0.0 graphql-ws: ^5.5.5 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc subscriptions-transport-ws: ^0.9.0 || ^0.11.0 peerDependenciesMeta: graphql-ws: @@ -207,7 +207,7 @@ packages: graphql: 16.9.0 graphql-tag: 2.12.6(graphql@16.9.0) hoist-non-react-statics: 3.3.2 - optimism: 0.18.0 + optimism: 0.18.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -229,8 +229,8 @@ packages: js-tokens: 4.0.0 picocolors: 1.1.1 - /@babel/compat-data@7.26.2: - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + /@babel/compat-data@7.26.3: + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} engines: {node: '>=6.9.0'} /@babel/core@7.26.0: @@ -239,46 +239,46 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 + '@babel/generator': 7.26.3 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/generator@7.26.2: - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + /@babel/generator@7.26.3: + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 - '@jridgewell/gen-mapping': 0.3.5 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 3.1.0 /@babel/helper-annotate-as-pure@7.25.9: resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 dev: true /@babel/helper-compilation-targets@7.25.9: resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.26.2 + '@babel/compat-data': 7.26.3 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 + browserslist: 4.24.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -286,8 +286,8 @@ packages: resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color @@ -300,7 +300,7 @@ packages: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -326,14 +326,14 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 - /@babel/parser@7.26.2: - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + /@babel/parser@7.26.3: + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 /@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0): resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} @@ -378,7 +378,7 @@ packages: '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color dev: true @@ -422,25 +422,25 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 - /@babel/traverse@7.25.9: - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + /@babel/traverse@7.26.4: + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/types': 7.26.0 - debug: 4.3.7 + '@babel/types': 7.26.3 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.26.0: - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + /@babel/types@7.26.3: + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.25.9 @@ -450,14 +450,14 @@ packages: resolution: {integrity: sha512-1uLNT5NZsUVIGS4syuHwTzZ8HycMPyr6POA3FCE4GbMtc4rhoJk8aZKtNIRthJYfL+iioppi+rTfH3olMPr9nA==} dev: false - /@emotion/babel-plugin@11.12.0: - resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + /@emotion/babel-plugin@11.13.5: + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} dependencies: '@babel/helper-module-imports': 7.25.9 '@babel/runtime': 7.26.0 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.2 + '@emotion/serialize': 1.3.3 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -468,12 +468,12 @@ packages: - supports-color dev: false - /@emotion/cache@11.13.1: - resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + /@emotion/cache@11.14.0: + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} dependencies: '@emotion/memoize': 0.9.0 '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.1 + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 dev: false @@ -502,11 +502,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.26.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/cache': 11.13.1 - '@emotion/serialize': 1.3.2 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.1 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 '@types/react': 18.2.72 hoist-non-react-statics: 3.3.2 @@ -515,13 +515,13 @@ packages: - supports-color dev: false - /@emotion/serialize@1.3.2: - resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + /@emotion/serialize@1.3.3: + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} dependencies: '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.1 + '@emotion/utils': 1.4.2 csstype: 3.1.3 dev: false @@ -540,12 +540,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.26.0 - '@emotion/babel-plugin': 11.12.0 + '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 '@emotion/react': 11.13.3(@types/react@18.2.72)(react@18.3.1) - '@emotion/serialize': 1.3.2 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.1 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 '@types/react': 18.2.72 react: 18.3.1 transitivePeerDependencies: @@ -556,16 +556,16 @@ packages: resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} dev: false - /@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1): - resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + /@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1): + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} peerDependencies: react: '>=16.8.0' dependencies: react: 18.3.1 dev: false - /@emotion/utils@1.4.1: - resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + /@emotion/utils@1.4.2: + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} dev: false /@emotion/weak-memoize@0.4.0: @@ -817,8 +817,8 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@eslint/object-schema': 2.1.4 - debug: 4.3.7(supports-color@9.4.0) + '@eslint/object-schema': 2.1.5 + debug: 4.4.0(supports-color@9.4.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -834,7 +834,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.7 + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -846,12 +846,12 @@ packages: - supports-color dev: true - /@eslint/eslintrc@3.1.0(supports-color@9.4.0): - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + /@eslint/eslintrc@3.2.0(supports-color@9.4.0): + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.0(supports-color@9.4.0) espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -873,13 +873,13 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@eslint/object-schema@2.1.4: - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + /@eslint/object-schema@2.1.5: + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@eslint/plugin-kit@0.2.2: - resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} + /@eslint/plugin-kit@0.2.4: + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: levn: 0.4.1 @@ -940,7 +940,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -992,8 +992,8 @@ packages: chalk: 4.1.2 dev: false - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + /@jridgewell/gen-mapping@0.3.8: + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.2.1 @@ -1011,7 +1011,7 @@ packages: /@jridgewell/source-map@0.3.6: resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 dev: true @@ -1024,8 +1024,8 @@ packages: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - /@jsdoc/salty@0.2.8: - resolution: {integrity: sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==} + /@jsdoc/salty@0.2.9: + resolution: {integrity: sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==} engines: {node: '>=v12.0.0'} dependencies: lodash: 4.17.21 @@ -1044,8 +1044,8 @@ packages: dependencies: '@babel/runtime': 7.26.0 '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) - '@mui/types': 7.2.19(@types/react@18.2.72) - '@mui/utils': 5.16.6(@types/react@18.2.72)(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.2.72) + '@mui/utils': 5.16.13(@types/react@18.2.72)(react@18.3.1) '@popperjs/core': 2.11.8 '@types/react': 18.2.72 clsx: 2.1.1 @@ -1054,8 +1054,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@mui/core-downloads-tracker@5.16.7: - resolution: {integrity: sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==} + /@mui/core-downloads-tracker@5.16.13: + resolution: {integrity: sha512-xe5RwI0Q2O709Bd2Y7l1W1NIwNmln0y+xaGk5VgX3vDJbkQEqzdfTFZ73e0CkEZgJwyiWgk5HY0l8R4nysOxjw==} dev: false /@mui/icons-material@5.15.18(@mui/material@5.15.18)(@types/react@18.2.72)(react@18.3.1): @@ -1096,12 +1096,12 @@ packages: '@emotion/react': 11.13.3(@types/react@18.2.72)(react@18.3.1) '@emotion/styled': 11.13.0(@emotion/react@11.13.3)(@types/react@18.2.72)(react@18.3.1) '@mui/base': 5.0.0-beta.40(@types/react@18.2.72)(react-dom@18.3.1)(react@18.3.1) - '@mui/core-downloads-tracker': 5.16.7 - '@mui/system': 5.16.7(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(@types/react@18.2.72)(react@18.3.1) - '@mui/types': 7.2.19(@types/react@18.2.72) - '@mui/utils': 5.16.6(@types/react@18.2.72)(react@18.3.1) + '@mui/core-downloads-tracker': 5.16.13 + '@mui/system': 5.16.13(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(@types/react@18.2.72)(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.2.72) + '@mui/utils': 5.16.13(@types/react@18.2.72)(react@18.3.1) '@types/react': 18.2.72 - '@types/react-transition-group': 4.4.11 + '@types/react-transition-group': 4.4.12(@types/react@18.2.72) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -1111,30 +1111,30 @@ packages: react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) dev: false - /@mui/private-theming@5.16.6(@types/react@18.2.72)(react@18.3.1): - resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} + /@mui/private-theming@5.16.13(@types/react@18.2.72)(react@18.3.1): + resolution: {integrity: sha512-+s0FklvDvO7j0yBZn19DIIT3rLfub2fWvXGtMX49rG/xHfDFcP7fbWbZKHZMMP/2/IoTRDrZCbY1iP0xZlmuJA==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true dependencies: '@babel/runtime': 7.26.0 - '@mui/utils': 5.16.6(@types/react@18.2.72)(react@18.3.1) + '@mui/utils': 5.16.13(@types/react@18.2.72)(react@18.3.1) '@types/react': 18.2.72 prop-types: 15.8.1 react: 18.3.1 dev: false - /@mui/styled-engine@5.16.6(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(react@18.3.1): - resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} + /@mui/styled-engine@5.16.13(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(react@18.3.1): + resolution: {integrity: sha512-2XNHEG8/o1ucSLhTA9J+HIIXjzlnEc0OV7kneeUQ5JukErPYT2zc6KYBDLjlKWrzQyvnQzbiffjjspgHUColZg==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -1142,7 +1142,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.26.0 - '@emotion/cache': 11.13.1 + '@emotion/cache': 11.14.0 '@emotion/react': 11.13.3(@types/react@18.2.72)(react@18.3.1) '@emotion/styled': 11.13.0(@emotion/react@11.13.3)(@types/react@18.2.72)(react@18.3.1) csstype: 3.1.3 @@ -1150,14 +1150,14 @@ packages: react: 18.3.1 dev: false - /@mui/system@5.16.7(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(@types/react@18.2.72)(react@18.3.1): - resolution: {integrity: sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==} + /@mui/system@5.16.13(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(@types/react@18.2.72)(react@18.3.1): + resolution: {integrity: sha512-JnO3VH3yNoAmgyr44/2jiS1tcNwshwAqAaG5fTEEjHQbkuZT/mvPYj2GC1cON0zEQ5V03xrCNl/D+gU9AXibpw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -1169,10 +1169,10 @@ packages: '@babel/runtime': 7.26.0 '@emotion/react': 11.13.3(@types/react@18.2.72)(react@18.3.1) '@emotion/styled': 11.13.0(@emotion/react@11.13.3)(@types/react@18.2.72)(react@18.3.1) - '@mui/private-theming': 5.16.6(@types/react@18.2.72)(react@18.3.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(react@18.3.1) - '@mui/types': 7.2.19(@types/react@18.2.72) - '@mui/utils': 5.16.6(@types/react@18.2.72)(react@18.3.1) + '@mui/private-theming': 5.16.13(@types/react@18.2.72)(react@18.3.1) + '@mui/styled-engine': 5.16.13(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.2.72) + '@mui/utils': 5.16.13(@types/react@18.2.72)(react@18.3.1) '@types/react': 18.2.72 clsx: 2.1.1 csstype: 3.1.3 @@ -1180,8 +1180,8 @@ packages: react: 18.3.1 dev: false - /@mui/types@7.2.19(@types/react@18.2.72): - resolution: {integrity: sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==} + /@mui/types@7.2.20(@types/react@18.2.72): + resolution: {integrity: sha512-straFHD7L8v05l/N5vcWk+y7eL9JF0C2mtph/y4BPm3gn2Eh61dDwDB65pa8DLss3WJfDXYC7Kx5yjP0EmXpgw==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: @@ -1191,24 +1191,24 @@ packages: '@types/react': 18.2.72 dev: false - /@mui/utils@5.16.6(@types/react@18.2.72)(react@18.3.1): - resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} + /@mui/utils@5.16.13(@types/react@18.2.72)(react@18.3.1): + resolution: {integrity: sha512-35kLiShnDPByk57Mz4PP66fQUodCFiOD92HfpW6dK9lc7kjhZsKHRKeYPgWuwEHeXwYsCSFtBCW4RZh/8WT+TQ==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true dependencies: '@babel/runtime': 7.26.0 - '@mui/types': 7.2.19(@types/react@18.2.72) - '@types/prop-types': 15.7.13 + '@mui/types': 7.2.20(@types/react@18.2.72) + '@types/prop-types': 15.7.14 '@types/react': 18.2.72 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 - react-is: 18.3.1 + react-is: 19.0.0 dev: false /@nodelib/fs.scandir@2.1.5: @@ -1229,7 +1229,7 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 dev: true /@novnc/novnc@1.4.0: @@ -1314,7 +1314,7 @@ packages: resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} dependencies: - '@adobe/css-tools': 4.4.0 + '@adobe/css-tools': 4.4.1 aria-query: 5.3.2 chalk: 3.0.0 css.escape: 1.5.1 @@ -1414,8 +1414,8 @@ packages: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: false - /@types/prop-types@15.7.13: - resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + /@types/prop-types@15.7.14: + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} /@types/react-dom@18.2.22: resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} @@ -1443,8 +1443,10 @@ packages: '@types/react': 18.2.72 dev: false - /@types/react-transition-group@4.4.11: - resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + /@types/react-transition-group@4.4.12(@types/react@18.2.72): + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' dependencies: '@types/react': 18.2.72 dev: false @@ -1452,7 +1454,7 @@ packages: /@types/react@18.2.72: resolution: {integrity: sha512-/e7GWxGzXQF7OJAua7UAYqYi/4VpXEfbGtmYQcAQwP3SjjjAXfybTf/JK5S+SaetB/ChXl8Y2g1hCsj7jDXxcg==} dependencies: - '@types/prop-types': 15.7.13 + '@types/prop-types': 15.7.14 csstype: 3.1.3 /@types/semver@7.5.8: @@ -1489,7 +1491,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.3.7 + debug: 4.4.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -1514,7 +1516,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - debug: 4.3.7 + debug: 4.4.0 eslint: 8.57.1 typescript: 5.6.3 transitivePeerDependencies: @@ -1541,7 +1543,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.3.7 + debug: 4.4.0 eslint: 8.57.1 tsutils: 3.21.0(typescript@5.6.3) typescript: 5.6.3 @@ -1565,7 +1567,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -1603,8 +1605,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + /@ungap/structured-clone@1.2.1: + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} dev: true /@wry/caches@1.0.1: @@ -1628,13 +1630,6 @@ packages: tslib: 2.8.1 dev: false - /@wry/trie@0.4.3: - resolution: {integrity: sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==} - engines: {node: '>=8'} - dependencies: - tslib: 2.8.1 - dev: false - /@wry/trie@0.5.0: resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} engines: {node: '>=8'} @@ -1725,12 +1720,12 @@ packages: engines: {node: '>= 0.4'} dev: true - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.3 + is-array-buffer: 3.0.5 dev: true /array-flatten@1.1.1: @@ -1741,12 +1736,12 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + get-intrinsic: 1.2.6 + is-string: 1.1.1 dev: true /array-union@2.1.0: @@ -1758,9 +1753,9 @@ packages: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -1770,31 +1765,31 @@ packages: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + /array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-shim-unscopables: 1.0.2 dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + /array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-shim-unscopables: 1.0.2 dev: true @@ -1802,25 +1797,24 @@ packages: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.6 + is-array-buffer: 3.0.5 dev: true /async@3.2.6: @@ -1840,9 +1834,9 @@ packages: '@babel/core': ^7.1.2 dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.2 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color dev: false @@ -1852,7 +1846,7 @@ packages: dependencies: '@babel/runtime': 7.26.0 cosmiconfig: 6.0.0 - resolve: 1.22.8 + resolve: 1.22.10 dev: false /babel-plugin-macros@3.1.0: @@ -1861,7 +1855,7 @@ packages: dependencies: '@babel/runtime': 7.26.0 cosmiconfig: 7.1.0 - resolve: 1.22.8 + resolve: 1.22.10 dev: false /balanced-match@1.0.2: @@ -1921,15 +1915,15 @@ packages: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + /browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001679 - electron-to-chromium: 1.5.55 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.76 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) /btoa@1.2.1: resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} @@ -1959,17 +1953,32 @@ packages: engines: {node: '>= 0.8'} dev: true - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + /call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + dev: true + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.6 set-function-length: 1.2.2 dev: true + /call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + dev: true + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1986,8 +1995,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001679: - resolution: {integrity: sha512-j2YqID/YwpLnKzCmBOS4tlZdWprXm3ZmQLBH9ZBXFOhoxLA46fwyBvx6toCBWBmnuwUY/qB3kEU6gFx8qgCroA==} + /caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} /catharsis@0.9.0: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} @@ -2047,7 +2056,7 @@ packages: peerDependencies: jsdoc: '>=3.x <=4.x' dependencies: - '@jsdoc/salty': 0.2.8 + '@jsdoc/salty': 0.2.9 fs-extra: 10.1.0 html-minifier-terser: 7.2.0 jsdoc: 4.0.4 @@ -2157,8 +2166,8 @@ packages: yaml: 1.10.2 dev: false - /cross-spawn@7.0.5: - resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} dependencies: path-key: 3.1.1 @@ -2177,31 +2186,31 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 dev: true - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 dev: true - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 dev: true /debug@2.6.9(supports-color@9.4.0): @@ -2227,8 +2236,8 @@ packages: ms: 2.1.3 dev: true - /debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2238,8 +2247,8 @@ packages: dependencies: ms: 2.1.3 - /debug@4.3.7(supports-color@8.1.1): - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + /debug@4.4.0(supports-color@8.1.1): + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2251,8 +2260,8 @@ packages: supports-color: 8.1.1 dev: true - /debug@4.3.7(supports-color@9.4.0): - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + /debug@4.4.0(supports-color@9.4.0): + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2273,24 +2282,24 @@ packages: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.6 + is-arguments: 1.2.0 + is-array-buffer: 3.0.5 + is-date-object: 1.1.0 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 isarray: 2.0.5 object-is: 1.1.6 object-keys: 1.1.1 - object.assign: 4.1.5 + object.assign: 4.1.7 regexp.prototype.flags: 1.5.3 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 + side-channel: 1.1.0 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 dev: true /deep-is@0.1.4: @@ -2301,9 +2310,9 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 dev: true /define-properties@1.2.1: @@ -2393,6 +2402,15 @@ packages: tslib: 2.8.1 dev: true + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: false @@ -2409,8 +2427,8 @@ packages: jake: 10.9.2 dev: false - /electron-to-chromium@1.5.55: - resolution: {integrity: sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==} + /electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2425,8 +2443,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + /enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 @@ -2443,63 +2461,62 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + /es-abstract@1.23.7: + resolution: {integrity: sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.6 + get-symbol-description: 1.1.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.5 + object.assign: 4.1.7 regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + safe-array-concat: 1.1.3 + safe-regex-test: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 dev: true /es-errors@1.3.0: @@ -2510,36 +2527,37 @@ packages: /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 + call-bind: 1.0.8 + get-intrinsic: 1.2.6 + has-symbols: 1.1.0 + is-arguments: 1.2.0 is-map: 2.0.3 is-set: 2.0.3 - is-string: 1.0.7 + is-string: 1.1.1 isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 + stop-iteration-iterator: 1.1.0 dev: true - /es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + /es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.3 - safe-array-concat: 1.1.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.4 + safe-array-concat: 1.1.3 dev: true /es-object-atoms@1.0.0: @@ -2553,7 +2571,7 @@ packages: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 has-tostringtag: 1.0.2 hasown: 2.0.2 dev: true @@ -2564,13 +2582,13 @@ packages: hasown: 2.0.2 dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 dev: true /esbuild@0.24.0: @@ -2639,14 +2657,14 @@ packages: eslint: 9.14.0(supports-color@9.4.0) dev: true - /eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.2)(eslint@8.57.1): + /eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.3)(eslint@8.57.1): resolution: {integrity: sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==} peerDependencies: eslint: ^8.8.0 eslint-plugin-react: ^7.28.0 dependencies: eslint: 8.57.1 - eslint-plugin-react: 7.37.2(eslint@8.57.1) + eslint-plugin-react: 7.37.3(eslint@8.57.1) dev: true /eslint-config-standard-with-typescript@23.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1)(typescript@5.6.3): @@ -2690,8 +2708,8 @@ packages: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color dev: true @@ -2762,22 +2780,22 @@ packages: '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.6.3) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -2808,9 +2826,9 @@ packages: eslint-plugin-es: 4.1.0(eslint@8.57.1) eslint-utils: 3.0.0(eslint@8.57.1) ignore: 5.3.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 minimatch: 3.1.2 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.6.3 dev: true @@ -2821,7 +2839,7 @@ packages: eslint: '>=8.23.0' dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0) - enhanced-resolve: 5.17.1 + enhanced-resolve: 5.18.0 eslint: 9.14.0(supports-color@9.4.0) eslint-plugin-es-x: 7.8.0(eslint@9.14.0) get-tsconfig: 4.8.1 @@ -2866,18 +2884,18 @@ packages: eslint: 8.57.1 dev: true - /eslint-plugin-react@7.37.2(eslint@8.57.1): - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + /eslint-plugin-react@7.37.3(eslint@8.57.1): + resolution: {integrity: sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.0 + es-iterator-helpers: 1.2.1 eslint: 8.57.1 estraverse: 5.3.0 hasown: 2.0.2 @@ -2885,11 +2903,11 @@ packages: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 dev: true @@ -2977,11 +2995,11 @@ packages: '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.2.1 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.5 - debug: 4.3.7 + cross-spawn: 7.0.6 + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -3026,9 +3044,9 @@ packages: '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.18.0(supports-color@9.4.0) '@eslint/core': 0.7.0 - '@eslint/eslintrc': 3.1.0(supports-color@9.4.0) + '@eslint/eslintrc': 3.2.0(supports-color@9.4.0) '@eslint/js': 9.14.0 - '@eslint/plugin-kit': 0.2.2 + '@eslint/plugin-kit': 0.2.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 @@ -3036,8 +3054,8 @@ packages: '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.5 - debug: 4.3.7(supports-color@9.4.0) + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@9.4.0) escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -3194,8 +3212,8 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + /fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} dependencies: reusify: 1.0.4 dev: true @@ -3272,7 +3290,7 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 dev: true @@ -3281,7 +3299,7 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 dev: true @@ -3290,8 +3308,8 @@ packages: hasBin: true dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + /flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} dev: true /for-each@0.3.3: @@ -3333,14 +3351,16 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.3 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 dev: true /functions-have-names@1.2.3: @@ -3355,15 +3375,20 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + /get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.0.0 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 dev: true /get-stdin@8.0.0: @@ -3371,13 +3396,13 @@ packages: engines: {node: '>=10'} dev: true - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 dev: true /get-tsconfig@4.8.1: @@ -3449,7 +3474,7 @@ packages: engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 dev: true /globby@11.1.0: @@ -3464,10 +3489,9 @@ packages: slash: 3.0.0 dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.4 + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} dev: true /graceful-fs@4.2.11: @@ -3512,8 +3536,9 @@ packages: duplexer: 0.1.2 dev: false - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} dev: true /has-flag@4.0.0: @@ -3528,16 +3553,18 @@ packages: /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 dev: true - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 dev: true - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} dev: true @@ -3545,7 +3572,7 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 dev: true /hasown@2.0.2: @@ -3576,7 +3603,7 @@ packages: entities: 4.5.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.36.0 + terser: 5.37.0 dev: true /http-errors@1.6.3: @@ -3647,13 +3674,13 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 dev: true /ipaddr.js@1.9.1: @@ -3661,20 +3688,21 @@ packages: engines: {node: '>= 0.10'} dev: true - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + /is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 has-tostringtag: 1.0.2 dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 dev: true /is-arrayish@0.2.1: @@ -3687,10 +3715,11 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 dev: true /is-binary-path@2.1.0: @@ -3700,11 +3729,11 @@ packages: binary-extensions: 2.3.0 dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + /is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 has-tostringtag: 1.0.2 dev: true @@ -3717,23 +3746,26 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + is-typed-array: 1.1.15 dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 dev: true @@ -3748,10 +3780,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 dev: true /is-fullwidth-code-point@3.0.0: @@ -3777,15 +3810,11 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 dev: true @@ -3803,12 +3832,14 @@ packages: engines: {node: '>=8'} dev: true - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 dev: true /is-set@2.0.3: @@ -3816,32 +3847,35 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 dev: true - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 dev: true /is-unicode-supported@0.1.0: @@ -3854,18 +3888,19 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + /is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 dev: true - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 dev: true /is-wsl@2.2.0: @@ -3886,14 +3921,15 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} + /iterator.prototype@1.1.4: + resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 + define-data-property: 1.1.4 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.6 + has-symbols: 1.1.0 + reflect.getprototypeof: 1.0.9 set-function-name: 2.0.2 dev: true @@ -3981,8 +4017,8 @@ packages: engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@babel/parser': 7.26.2 - '@jsdoc/salty': 0.2.8 + '@babel/parser': 7.26.3 + '@jsdoc/salty': 0.2.9 '@types/markdown-it': 14.1.2 bluebird: 3.7.2 catharsis: 0.9.0 @@ -3998,8 +4034,8 @@ packages: underscore: 1.13.7 dev: true - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true @@ -4048,9 +4084,9 @@ packages: engines: {node: '>=4.0'} dependencies: array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 dev: true /jszip@3.10.1: @@ -4215,6 +4251,11 @@ packages: hasBin: true dev: true + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + dev: true + /md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} dependencies: @@ -4320,7 +4361,7 @@ packages: peerDependencies: mocha: '>=2.2.5' dependencies: - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.0(supports-color@9.4.0) md5: 2.3.0 mkdirp: 3.0.1 mocha: 10.8.2 @@ -4338,7 +4379,7 @@ packages: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -4407,8 +4448,8 @@ packages: tslib: 2.8.1 dev: true - /node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + /node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -4419,8 +4460,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + /object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} dev: true @@ -4428,7 +4469,7 @@ packages: resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 dev: true @@ -4437,13 +4478,15 @@ packages: engines: {node: '>= 0.4'} dev: true - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 object-keys: 1.1.1 dev: true @@ -4451,7 +4494,7 @@ packages: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 dev: true @@ -4460,9 +4503,9 @@ packages: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-object-atoms: 1.0.0 dev: true @@ -4470,16 +4513,17 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 dev: true - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + /object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 dev: true @@ -4504,12 +4548,12 @@ packages: is-wsl: 2.2.0 dev: false - /optimism@0.18.0: - resolution: {integrity: sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==} + /optimism@0.18.1: + resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==} dependencies: '@wry/caches': 1.0.1 '@wry/context': 0.7.4 - '@wry/trie': 0.4.3 + '@wry/trie': 0.5.0 tslib: 2.8.1 dev: false @@ -4776,7 +4820,7 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 dev: true /queue-microtask@1.2.3: @@ -4828,6 +4872,10 @@ packages: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: false + /react-is@19.0.0: + resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} + dev: false + /react-lifecycles-compat@3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: false @@ -4916,17 +4964,18 @@ packages: strip-indent: 3.0.0 dev: true - /reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + /reflect.getprototypeof@1.0.9: + resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + dunder-proto: 1.0.1 + es-abstract: 1.23.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.4 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + which-builtin-type: 1.2.1 dev: true /regenerator-runtime@0.14.1: @@ -4936,7 +4985,7 @@ packages: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 @@ -4985,11 +5034,12 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -4997,7 +5047,7 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -5034,13 +5084,14 @@ packages: queue-microtask: 1.2.3 dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + has-symbols: 1.1.0 isarray: 2.0.5 dev: true @@ -5051,13 +5102,13 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-regex: 1.1.4 + is-regex: 1.2.1 dev: true /safer-buffer@2.1.2: @@ -5140,8 +5191,8 @@ packages: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.2.6 + gopd: 1.2.0 has-property-descriptors: 1.0.2 dev: true @@ -5186,14 +5237,44 @@ packages: commander: 9.5.0 dev: true - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 + object-inspect: 1.13.3 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 dev: true /sinon@19.0.2: @@ -5279,11 +5360,12 @@ packages: engines: {node: '>= 0.8'} dev: true - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + /stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} dependencies: - internal-slot: 1.0.7 + es-errors: 1.3.0 + internal-slot: 1.1.0 dev: true /streamsearch@1.1.0: @@ -5299,45 +5381,51 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + /string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-errors: 1.3.0 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 regexp.prototype.flags: 1.5.3 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 dev: true /string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 dev: true - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.7 es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 dev: true - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 dev: true @@ -5346,7 +5434,7 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 dev: true @@ -5431,8 +5519,8 @@ packages: rimraf: 2.6.3 dev: false - /terser@5.36.0: - resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} + /terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -5479,12 +5567,12 @@ packages: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 - eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.2)(eslint@8.57.1) + eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.3)(eslint@8.57.1) eslint-config-standard-with-typescript: 23.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1)(typescript@5.6.3) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) - eslint-plugin-react: 7.37.2(eslint@8.57.1) + eslint-plugin-react: 7.37.3(eslint@8.57.1) minimist: 1.2.8 pkg-conf: 4.0.0 standard-engine: 15.1.0 @@ -5556,48 +5644,49 @@ packages: mime-types: 2.1.35 dev: true - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.9 dev: true - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.9 dev: true /typedarray@0.0.6: @@ -5614,13 +5703,14 @@ packages: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} dev: true - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 dev: true /underscore@1.13.7: @@ -5641,13 +5731,13 @@ packages: engines: {node: '>= 0.8'} dev: true - /update-browserslist-db@1.1.1(browserslist@4.24.2): + /update-browserslist-db@1.1.1(browserslist@4.24.3): resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.24.2 + browserslist: 4.24.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -5676,32 +5766,34 @@ packages: loose-envify: 1.4.0 dev: false - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 dev: true - /which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} dependencies: - function.prototype.name: 1.1.6 + call-bound: 1.0.3 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 + is-regex: 1.2.1 + is-weakref: 1.1.0 isarray: 2.0.5 - which-boxed-primitive: 1.0.2 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 dev: true /which-collection@1.0.2: @@ -5711,17 +5803,18 @@ packages: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + /which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 dev: true diff --git a/py/BUILD.bazel b/py/BUILD.bazel index 47158c4ab59ed..49fae4aecd61d 100644 --- a/py/BUILD.bazel +++ b/py/BUILD.bazel @@ -231,7 +231,6 @@ pkg_files( "CHANGES", "README.rst", "pyproject.toml", - "setup.py", ":license", ":selenium-pkg", ":selenium-pkginfo", diff --git a/py/docs/requirements.txt b/py/docs/requirements.txt index f95cd9e1f1493..37102cb397363 100644 --- a/py/docs/requirements.txt +++ b/py/docs/requirements.txt @@ -1,2 +1,2 @@ -Jinja2==3.1.4 +Jinja2==3.1.5 Sphinx==7.1.2 diff --git a/py/docs/source/index.rst b/py/docs/source/index.rst index 54123b5d600ca..9f8c9ed892d56 100755 --- a/py/docs/source/index.rst +++ b/py/docs/source/index.rst @@ -35,7 +35,7 @@ If you have `pip `_ on your system, you can simply install Alternately, you can download the source distribution from `PyPI `, unarchive it, and run:: - python setup.py install + python -m pip install . Note: You may want to consider using `virtualenv `_ to create isolated Python environments. diff --git a/py/generate.py b/py/generate.py index 026e80673b40f..0763084423168 100644 --- a/py/generate.py +++ b/py/generate.py @@ -36,7 +36,7 @@ from pathlib import Path import re from textwrap import dedent, indent as tw_indent -import typing +from typing import Optional , cast, List, Union, Iterator import inflection # type: ignore @@ -206,11 +206,11 @@ def from_json(cls, type): class CdpProperty: ''' A property belonging to a non-primitive CDP type. ''' name: str - description: typing.Optional[str] - type: typing.Optional[str] - ref: typing.Optional[str] - enum: typing.List[str] - items: typing.Optional[CdpItems] + description: Optional[str] + type: Optional[str] + ref: Optional[str] + enum: List[str] + items: Optional[CdpItems] optional: bool experimental: bool deprecated: bool @@ -236,7 +236,7 @@ def py_annotation(self): ann = py_ref else: ann = CdpPrimitiveType.get_annotation( - typing.cast(str, self.type)) + cast(str, self.type)) if self.optional: ann = f'typing.Optional[{ann}]' return ann @@ -316,11 +316,11 @@ def generate_from_json(self, dict_): class CdpType: ''' A top-level CDP type. ''' id: str - description: typing.Optional[str] + description: Optional[str] type: str - items: typing.Optional[CdpItems] - enum: typing.List[str] - properties: typing.List[CdpProperty] + items: Optional[CdpItems] + enum: List[str] + properties: List[CdpProperty] @classmethod def from_json(cls, type_): @@ -500,7 +500,7 @@ def generate_code(self): py_type = f"{ref_to_python(self.ref)}" else: py_type = CdpPrimitiveType.get_annotation( - typing.cast(str, self.type)) + cast(str, self.type)) if self.optional: py_type = f'typing.Optional[{py_type}]' code = f"{self.py_name}: {py_type}" @@ -585,8 +585,8 @@ class CdpCommand: description: str experimental: bool deprecated: bool - parameters: typing.List[CdpParameter] - returns: typing.List[CdpReturn] + parameters: List[CdpParameter] + returns: List[CdpReturn] domain: str @property @@ -605,8 +605,8 @@ def from_json(cls, command, domain) -> 'CdpCommand': command.get('description'), command.get('experimental', False), command.get('deprecated', False), - [typing.cast(CdpParameter, CdpParameter.from_json(p)) for p in parameters], - [typing.cast(CdpReturn, CdpReturn.from_json(r)) for r in returns], + [cast(CdpParameter, CdpParameter.from_json(p)) for p in parameters], + [cast(CdpReturn, CdpReturn.from_json(r)) for r in returns], domain, ) @@ -712,10 +712,10 @@ def get_refs(self): class CdpEvent: ''' A CDP event object. ''' name: str - description: typing.Optional[str] + description: Optional[str] deprecated: bool experimental: bool - parameters: typing.List[CdpParameter] + parameters: List[CdpParameter] domain: str @property @@ -731,7 +731,7 @@ def from_json(cls, json: dict, domain: str): json.get('description'), json.get('deprecated', False), json.get('experimental', False), - [typing.cast(CdpParameter, CdpParameter.from_json(p)) + [cast(CdpParameter, CdpParameter.from_json(p)) for p in json.get('parameters', [])], domain ) @@ -786,12 +786,12 @@ def get_refs(self): class CdpDomain: ''' A CDP domain contains metadata, types, commands, and events. ''' domain: str - description: typing.Optional[str] + description: Optional[str] experimental: bool - dependencies: typing.List[str] - types: typing.List[CdpType] - commands: typing.List[CdpCommand] - events: typing.List[CdpEvent] + dependencies: List[str] + types: List[CdpType] + commands: List[CdpCommand] + events: List[CdpEvent] @property def module(self): @@ -826,8 +826,8 @@ def generate_code(self): code += import_code code += '\n\n' code += '\n' - item_iter_t = typing.Union[CdpEvent, CdpCommand, CdpType] - item_iter: typing.Iterator[item_iter_t] = itertools.chain( + item_iter_t = Union[CdpEvent, CdpCommand, CdpType] + item_iter: Iterator[item_iter_t] = itertools.chain( iter(self.types), iter(self.commands), iter(self.events), diff --git a/py/pyproject.toml b/py/pyproject.toml index e99a03cd5d7a2..a30b604e49be0 100644 --- a/py/pyproject.toml +++ b/py/pyproject.toml @@ -44,6 +44,9 @@ exclude = ["test*"] namespaces = false # include-package-data is `true` by default in pyproject.toml +[[tool.setuptools-rust.bins]] +target = "selenium.webdriver.common.selenium-manager" + [project.urls] Repository = "https://github.com/SeleniumHQ/selenium/" BugTracker = "https://github.com/SeleniumHQ/selenium/issues" diff --git a/py/requirements.txt b/py/requirements.txt index ab36a657d16d1..3dfbe58c683ab 100644 --- a/py/requirements.txt +++ b/py/requirements.txt @@ -4,7 +4,7 @@ certifi==2023.11.17 cffi==1.16.0 cryptography==42.0.8 secretstorage==3.3.3 -debugpy==1.8.7 +debugpy==1.8.11 filetype==1.2.0 h11==0.14.0 idna==3.7 @@ -13,7 +13,7 @@ inflection==0.5.1 iniconfig==2.0.0 more-itertools==10.1.0 multidict==6.0.5 -outcome==1.3.0 +outcome==1.3.0.post0 packaging==23.2 pluggy==1.3.0 py==1.11.0 diff --git a/py/requirements_lock.txt b/py/requirements_lock.txt index 4b1abe117b69f..a081808cccea8 100644 --- a/py/requirements_lock.txt +++ b/py/requirements_lock.txt @@ -209,33 +209,33 @@ cryptography==42.0.8 \ # -r py/requirements.txt # pyopenssl # secretstorage -debugpy==1.8.7 \ - --hash=sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba \ - --hash=sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2 \ - --hash=sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e \ - --hash=sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037 \ - --hash=sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa \ - --hash=sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca \ - --hash=sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39 \ - --hash=sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7 \ - --hash=sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706 \ - --hash=sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae \ - --hash=sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9 \ - --hash=sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d \ - --hash=sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211 \ - --hash=sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2 \ - --hash=sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55 \ - --hash=sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907 \ - --hash=sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596 \ - --hash=sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b \ - --hash=sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda \ - --hash=sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c \ - --hash=sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81 \ - --hash=sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f \ - --hash=sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0 \ - --hash=sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40 \ - --hash=sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9 \ - --hash=sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7 +debugpy==1.8.11 \ + --hash=sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920 \ + --hash=sha256:116bf8342062246ca749013df4f6ea106f23bc159305843491f64672a55af2e5 \ + --hash=sha256:189058d03a40103a57144752652b3ab08ff02b7595d0ce1f651b9acc3a3a35a0 \ + --hash=sha256:23dc34c5e03b0212fa3c49a874df2b8b1b8fda95160bd79c01eb3ab51ea8d851 \ + --hash=sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b \ + --hash=sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd \ + --hash=sha256:32db46ba45849daed7ccf3f2e26f7a386867b077f39b2a974bb5c4c2c3b0a280 \ + --hash=sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9 \ + --hash=sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1 \ + --hash=sha256:52c3cf9ecda273a19cc092961ee34eb9ba8687d67ba34cc7b79a521c1c64c4c0 \ + --hash=sha256:52d8a3166c9f2815bfae05f386114b0b2d274456980d41f320299a8d9a5615a7 \ + --hash=sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f \ + --hash=sha256:654130ca6ad5de73d978057eaf9e582244ff72d4574b3e106fb8d3d2a0d32458 \ + --hash=sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57 \ + --hash=sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e \ + --hash=sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308 \ + --hash=sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296 \ + --hash=sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3 \ + --hash=sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1 \ + --hash=sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1 \ + --hash=sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e \ + --hash=sha256:ad7efe588c8f5cf940f40c3de0cd683cc5b76819446abaa50dc0829a30c094db \ + --hash=sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28 \ + --hash=sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737 \ + --hash=sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768 \ + --hash=sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1 # via -r py/requirements.txt docutils==0.20.1 \ --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ @@ -292,7 +292,9 @@ jaraco-classes==3.3.0 \ jeepney==0.8.0 \ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 - # via secretstorage + # via + # keyring + # secretstorage keyring==24.3.0 \ --hash=sha256:4446d35d636e6a10b8bce7caa66913dd9eca5fd222ca03a3d42c38608ac30836 \ --hash=sha256:e730ecffd309658a08ee82535a3b5ec4b4c8669a9be11efb66249d8e0aeb9a25 @@ -421,9 +423,9 @@ nh3==0.2.15 \ --hash=sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3 \ --hash=sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6 # via readme-renderer -outcome==1.3.0 \ - --hash=sha256:588ef4dc10b64e8df160d8d1310c44e1927129a66d6d2ef86845cef512c5f24c \ - --hash=sha256:7b688fd82db72f4b0bc9e883a00359d4d4179cd97d27f09c9644d0c842ba7786 +outcome==1.3.0.post0 \ + --hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8 \ + --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b # via # -r py/requirements.txt # pytest-trio @@ -520,7 +522,9 @@ rich==13.7.0 \ secretstorage==3.3.3 \ --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 - # via -r py/requirements.txt + # via + # -r py/requirements.txt + # keyring sniffio==1.3.1 \ --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \ --hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc diff --git a/py/selenium/types.py b/py/selenium/types.py index a776904b4a4bd..f055ea1452fff 100644 --- a/py/selenium/types.py +++ b/py/selenium/types.py @@ -16,10 +16,14 @@ # under the License. """Selenium type definitions.""" -import typing +from typing import IO +from typing import Any +from typing import Iterable +from typing import Type +from typing import Union -AnyKey = typing.Union[str, int, float] -WaitExcTypes = typing.Iterable[typing.Type[Exception]] +AnyKey = Union[str, int, float] +WaitExcTypes = Iterable[Type[Exception]] # Service Types -SubprocessStdAlias = typing.Union[int, str, typing.IO[typing.Any]] +SubprocessStdAlias = Union[int, str, IO[Any]] diff --git a/py/selenium/webdriver/chrome/service.py b/py/selenium/webdriver/chrome/service.py index e151f768d5618..40f94841b2304 100644 --- a/py/selenium/webdriver/chrome/service.py +++ b/py/selenium/webdriver/chrome/service.py @@ -14,7 +14,11 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing + + +from typing import List +from typing import Mapping +from typing import Optional from selenium.types import SubprocessStdAlias from selenium.webdriver.chromium import service @@ -35,9 +39,9 @@ def __init__( self, executable_path=None, port: int = 0, - service_args: typing.Optional[typing.List[str]] = None, + service_args: Optional[List[str]] = None, log_output: SubprocessStdAlias = None, - env: typing.Optional[typing.Mapping[str, str]] = None, + env: Optional[Mapping[str, str]] = None, **kwargs, ) -> None: super().__init__( diff --git a/py/selenium/webdriver/chromium/service.py b/py/selenium/webdriver/chromium/service.py index aebedec40f509..f6c71e3ba719a 100644 --- a/py/selenium/webdriver/chromium/service.py +++ b/py/selenium/webdriver/chromium/service.py @@ -14,8 +14,10 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing from io import IOBase +from typing import List +from typing import Mapping +from typing import Optional from selenium.types import SubprocessStdAlias from selenium.webdriver.common import service @@ -36,9 +38,9 @@ def __init__( self, executable_path: str = None, port: int = 0, - service_args: typing.Optional[typing.List[str]] = None, + service_args: Optional[List[str]] = None, log_output: SubprocessStdAlias = None, - env: typing.Optional[typing.Mapping[str, str]] = None, + env: Optional[Mapping[str, str]] = None, driver_path_env_key: str = None, **kwargs, ) -> None: @@ -47,7 +49,7 @@ def __init__( if isinstance(log_output, str): self.service_args.append(f"--log-path={log_output}") - self.log_output: typing.Optional[IOBase] = None + self.log_output: Optional[IOBase] = None elif isinstance(log_output, IOBase): self.log_output = log_output else: @@ -62,5 +64,5 @@ def __init__( **kwargs, ) - def command_line_args(self) -> typing.List[str]: + def command_line_args(self) -> List[str]: return [f"--port={self.port}"] + self.service_args diff --git a/py/selenium/webdriver/chromium/webdriver.py b/py/selenium/webdriver/chromium/webdriver.py index af563f41672a8..93124c68a0d0c 100644 --- a/py/selenium/webdriver/chromium/webdriver.py +++ b/py/selenium/webdriver/chromium/webdriver.py @@ -138,7 +138,7 @@ def execute_cdp_cmd(self, cmd: str, cmd_args: dict): For example to getResponseBody: {'base64Encoded': False, 'body': 'response body string'} """ - return self.execute("executeCdpCommand", {"cmd": cmd, "params": cmd_args})["value"] + return super().execute_cdp_cmd(cmd, cmd_args) def get_sinks(self) -> list: """:Returns: A list of sinks available for Cast.""" diff --git a/py/selenium/webdriver/common/actions/pointer_input.py b/py/selenium/webdriver/common/actions/pointer_input.py index ce5e1c53c91f9..0d7e7a87188c1 100644 --- a/py/selenium/webdriver/common/actions/pointer_input.py +++ b/py/selenium/webdriver/common/actions/pointer_input.py @@ -14,7 +14,10 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing + +from typing import Any +from typing import Dict +from typing import Optional from typing import Union from selenium.common.exceptions import InvalidArgumentException @@ -41,7 +44,7 @@ def create_pointer_move( duration=DEFAULT_MOVE_DURATION, x: float = 0, y: float = 0, - origin: typing.Optional[WebElement] = None, + origin: Optional[WebElement] = None, **kwargs, ): action = {"type": "pointerMove", "duration": duration, "x": x, "y": y, **kwargs} @@ -67,7 +70,7 @@ def create_pause(self, pause_duration: Union[int, float] = 0) -> None: def encode(self): return {"type": self.type, "parameters": {"pointerType": self.kind}, "id": self.name, "actions": self.actions} - def _convert_keys(self, actions: typing.Dict[str, typing.Any]): + def _convert_keys(self, actions: Dict[str, Any]): out = {} for k, v in actions.items(): if v is None: diff --git a/py/selenium/webdriver/common/bidi/cdp.py b/py/selenium/webdriver/common/bidi/cdp.py index c9ed47825e4da..2d40ed9ddc66e 100644 --- a/py/selenium/webdriver/common/bidi/cdp.py +++ b/py/selenium/webdriver/common/bidi/cdp.py @@ -30,18 +30,23 @@ import json import logging import pathlib -import typing from collections import defaultdict from contextlib import asynccontextmanager from contextlib import contextmanager from dataclasses import dataclass +from typing import Any +from typing import AsyncGenerator +from typing import AsyncIterator +from typing import Generator +from typing import Type +from typing import TypeVar import trio from trio_websocket import ConnectionClosed as WsConnectionClosed from trio_websocket import connect_websocket_url logger = logging.getLogger("trio_cdp") -T = typing.TypeVar("T") +T = TypeVar("T") MAX_WS_MESSAGE_SIZE = 2**24 devtools = None @@ -184,7 +189,7 @@ class CmEventProxy: value set that contains the returned event. """ - value: typing.Any = None + value: Any = None class CdpBase: @@ -197,7 +202,7 @@ def __init__(self, ws, session_id, target_id): self.inflight_cmd = {} self.inflight_result = {} - async def execute(self, cmd: typing.Generator[dict, T, typing.Any]) -> T: + async def execute(self, cmd: Generator[dict, T, Any]) -> T: """Execute a command on the server and wait for the result. :param cmd: any CDP command @@ -236,7 +241,7 @@ def listen(self, *event_types, buffer_size=10): return receiver @asynccontextmanager - async def wait_for(self, event_type: typing.Type[T], buffer_size=10) -> typing.AsyncGenerator[CmEventProxy, None]: + async def wait_for(self, event_type: Type[T], buffer_size=10) -> AsyncGenerator[CmEventProxy, None]: """Wait for an event of the given type and return it. This is an async context manager, so you should open it inside @@ -406,7 +411,7 @@ async def aclose(self): await self.ws.aclose() @asynccontextmanager - async def open_session(self, target_id) -> typing.AsyncIterator[CdpSession]: + async def open_session(self, target_id) -> AsyncIterator[CdpSession]: """This context manager opens a session and enables the "simple" style of calling CDP APIs. @@ -468,7 +473,7 @@ async def _reader_task(self): @asynccontextmanager -async def open_cdp(url) -> typing.AsyncIterator[CdpConnection]: +async def open_cdp(url) -> AsyncIterator[CdpConnection]: """This async context manager opens a connection to the browser specified by ``url`` before entering the block, then closes the connection when the block exits. diff --git a/py/selenium/webdriver/common/bidi/script.py b/py/selenium/webdriver/common/bidi/script.py index 6819a5cf63436..1dc8d101d670e 100644 --- a/py/selenium/webdriver/common/bidi/script.py +++ b/py/selenium/webdriver/common/bidi/script.py @@ -15,8 +15,8 @@ # specific language governing permissions and limitations # under the License. -import typing from dataclasses import dataclass +from typing import List from .session import session_subscribe from .session import session_unsubscribe @@ -76,7 +76,7 @@ class ConsoleLogEntry: text: str timestamp: str method: str - args: typing.List[dict] + args: List[dict] type_: str @classmethod diff --git a/py/setup.py b/py/selenium/webdriver/common/fedcm/__init__.py old mode 100755 new mode 100644 similarity index 58% rename from py/setup.py rename to py/selenium/webdriver/common/fedcm/__init__.py index 0f93e33f0ecae..a5b1e6f85a09e --- a/py/setup.py +++ b/py/selenium/webdriver/common/fedcm/__init__.py @@ -14,25 +14,3 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. - -from distutils.command.install import INSTALL_SCHEMES -from os.path import dirname, join, abspath -from setuptools import setup -from setuptools.command.install import install -from setuptools_rust import Binding, RustExtension - - -for scheme in INSTALL_SCHEMES.values(): - scheme['data'] = scheme['purelib'] - -setup_args = { - 'cmdclass': {'install': install}, - 'rust_extensions': [ - RustExtension( - {"selenium-manager": "selenium.webdriver.common.selenium-manager"}, - binding=Binding.Exec - ) - ], -} - -setup(**setup_args) diff --git a/py/selenium/webdriver/common/fedcm/account.py b/py/selenium/webdriver/common/fedcm/account.py index 6b8c20b12c781..7258ea677426b 100644 --- a/py/selenium/webdriver/common/fedcm/account.py +++ b/py/selenium/webdriver/common/fedcm/account.py @@ -24,6 +24,17 @@ class LoginState(Enum): SIGN_UP = "SignUp" +class _AccountDescriptor: + def __init__(self, name): + self.name = name + + def __get__(self, obj, cls) -> Optional[str]: + return obj._account_data.get(self.name) + + def __set__(self, obj, value) -> None: + raise AttributeError("Cannot set readonly attribute") + + class Account: """Represents an account displayed in a FedCM account list. @@ -31,41 +42,15 @@ class Account: https://w3c-fedid.github.io/FedCM/#webdriver-accountlist """ + account_id = _AccountDescriptor("accountId") + email = _AccountDescriptor("email") + name = _AccountDescriptor("name") + given_name = _AccountDescriptor("givenName") + picture_url = _AccountDescriptor("pictureUrl") + idp_config_url = _AccountDescriptor("idpConfigUrl") + terms_of_service_url = _AccountDescriptor("termsOfServiceUrl") + privacy_policy_url = _AccountDescriptor("privacyPolicyUrl") + login_state = _AccountDescriptor("loginState") + def __init__(self, account_data): self._account_data = account_data - - @property - def account_id(self) -> Optional[str]: - return self._account_data.get("accountId") - - @property - def email(self) -> Optional[str]: - return self._account_data.get("email") - - @property - def name(self) -> Optional[str]: - return self._account_data.get("name") - - @property - def given_name(self) -> Optional[str]: - return self._account_data.get("givenName") - - @property - def picture_url(self) -> Optional[str]: - return self._account_data.get("pictureUrl") - - @property - def idp_config_url(self) -> Optional[str]: - return self._account_data.get("idpConfigUrl") - - @property - def terms_of_service_url(self) -> Optional[str]: - return self._account_data.get("termsOfServiceUrl") - - @property - def privacy_policy_url(self) -> Optional[str]: - return self._account_data.get("privacyPolicyUrl") - - @property - def login_state(self) -> Optional[str]: - return self._account_data.get("loginState") diff --git a/py/selenium/webdriver/common/options.py b/py/selenium/webdriver/common/options.py index b31fcc348ce18..9d838a09c0fc2 100644 --- a/py/selenium/webdriver/common/options.py +++ b/py/selenium/webdriver/common/options.py @@ -14,11 +14,12 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing + import warnings from abc import ABCMeta from abc import abstractmethod from enum import Enum +from typing import Optional from selenium.common.exceptions import InvalidArgumentException from selenium.webdriver.common.proxy import Proxy @@ -457,9 +458,9 @@ def set_capability(self, name, value) -> None: def enable_mobile( self, - android_package: typing.Optional[str] = None, - android_activity: typing.Optional[str] = None, - device_serial: typing.Optional[str] = None, + android_package: Optional[str] = None, + android_activity: Optional[str] = None, + device_serial: Optional[str] = None, ) -> None: """Enables mobile browser use for browsers that support it. diff --git a/py/selenium/webdriver/common/service.py b/py/selenium/webdriver/common/service.py index 3afbced1a3e88..9c592ba75a525 100644 --- a/py/selenium/webdriver/common/service.py +++ b/py/selenium/webdriver/common/service.py @@ -18,14 +18,18 @@ import logging import os import subprocess -import typing from abc import ABC from abc import abstractmethod from io import IOBase from platform import system from subprocess import PIPE from time import sleep +from typing import IO +from typing import Any +from typing import List +from typing import Mapping from typing import Optional +from typing import Union from typing import cast from urllib import request from urllib.error import URLError @@ -46,6 +50,7 @@ class Service(ABC): :param port: Port for the service to run on, defaults to 0 where the operating system will decide. :param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file. :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. + :param driver_path_env_key: (Optional) Environment variable to use to get the path to the driver executable. """ def __init__( @@ -53,16 +58,16 @@ def __init__( executable_path: str = None, port: int = 0, log_output: SubprocessStdAlias = None, - env: typing.Optional[typing.Mapping[typing.Any, typing.Any]] = None, + env: Optional[Mapping[Any, Any]] = None, driver_path_env_key: str = None, **kwargs, ) -> None: if isinstance(log_output, str): self.log_output = cast(IOBase, open(log_output, "a+", encoding="utf-8")) elif log_output == subprocess.STDOUT: - self.log_output = cast(typing.Optional[typing.Union[int, IOBase]], None) + self.log_output = cast(Optional[Union[int, IOBase]], None) elif log_output is None or log_output == subprocess.DEVNULL: - self.log_output = cast(typing.Optional[typing.Union[int, IOBase]], subprocess.DEVNULL) + self.log_output = cast(Optional[Union[int, IOBase]], subprocess.DEVNULL) else: self.log_output = log_output @@ -80,7 +85,7 @@ def service_url(self) -> str: return f"http://{utils.join_host_port('localhost', self.port)}" @abstractmethod - def command_line_args(self) -> typing.List[str]: + def command_line_args(self) -> List[str]: """A List of program arguments (excluding the executable).""" raise NotImplementedError("This method needs to be implemented in a sub class") @@ -215,8 +220,8 @@ def _start_process(self, path: str) -> None: cmd, env=self.env, close_fds=close_file_descriptors, - stdout=cast(typing.Optional[typing.Union[int, typing.IO[typing.Any]]], self.log_output), - stderr=cast(typing.Optional[typing.Union[int, typing.IO[typing.Any]]], self.log_output), + stdout=cast(Optional[Union[int, IO[Any]]], self.log_output), + stderr=cast(Optional[Union[int, IO[Any]]], self.log_output), stdin=PIPE, creationflags=self.creation_flags, startupinfo=start_info, @@ -241,4 +246,6 @@ def _start_process(self, path: str) -> None: raise def env_path(self) -> Optional[str]: - return os.getenv(self.DRIVER_PATH_ENV_KEY, None) + if self.DRIVER_PATH_ENV_KEY: + return os.getenv(self.DRIVER_PATH_ENV_KEY, None) + return None diff --git a/py/selenium/webdriver/common/virtual_authenticator.py b/py/selenium/webdriver/common/virtual_authenticator.py index cfc467307f923..6e1deb684c898 100644 --- a/py/selenium/webdriver/common/virtual_authenticator.py +++ b/py/selenium/webdriver/common/virtual_authenticator.py @@ -16,10 +16,13 @@ # under the License. import functools -import typing from base64 import urlsafe_b64decode from base64 import urlsafe_b64encode from enum import Enum +from typing import Any +from typing import Dict +from typing import Optional +from typing import Union class Protocol(str, Enum): @@ -65,7 +68,7 @@ def __init__( self.is_user_consenting: bool = is_user_consenting self.is_user_verified: bool = is_user_verified - def to_dict(self) -> typing.Dict[str, typing.Union[str, bool]]: + def to_dict(self) -> Dict[str, Union[str, bool]]: return { "protocol": self.protocol, "transport": self.transport, @@ -82,7 +85,7 @@ def __init__( credential_id: bytes, is_resident_credential: bool, rp_id: str, - user_handle: typing.Optional[bytes], + user_handle: Optional[bytes], private_key: bytes, sign_count: int, ): @@ -117,7 +120,7 @@ def rp_id(self) -> str: return self._rp_id @property - def user_handle(self) -> typing.Optional[str]: + def user_handle(self) -> Optional[str]: if self._user_handle: return urlsafe_b64encode(self._user_handle).decode() return None @@ -147,7 +150,7 @@ def create_non_resident_credential(cls, id: bytes, rp_id: str, private_key: byte @classmethod def create_resident_credential( - cls, id: bytes, rp_id: str, user_handle: typing.Optional[bytes], private_key: bytes, sign_count: int + cls, id: bytes, rp_id: str, user_handle: Optional[bytes], private_key: bytes, sign_count: int ) -> "Credential": """Creates a resident (i.e. stateful) credential. @@ -163,7 +166,7 @@ def create_resident_credential( """ return cls(id, True, rp_id, user_handle, private_key, sign_count) - def to_dict(self) -> typing.Dict[str, typing.Any]: + def to_dict(self) -> Dict[str, Any]: credential_data = { "credentialId": self.id, "isResidentCredential": self._is_resident_credential, @@ -178,7 +181,7 @@ def to_dict(self) -> typing.Dict[str, typing.Any]: return credential_data @classmethod - def from_dict(cls, data: typing.Dict[str, typing.Any]) -> "Credential": + def from_dict(cls, data: Dict[str, Any]) -> "Credential": _id = urlsafe_b64decode(f"{data['credentialId']}==") is_resident_credential = bool(data["isResidentCredential"]) rp_id = data.get("rpId", None) diff --git a/py/selenium/webdriver/edge/service.py b/py/selenium/webdriver/edge/service.py index b2c7f02faf4f7..ea49d8c5ca3a0 100644 --- a/py/selenium/webdriver/edge/service.py +++ b/py/selenium/webdriver/edge/service.py @@ -14,7 +14,10 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing + +from typing import List +from typing import Mapping +from typing import Optional from selenium.types import SubprocessStdAlias from selenium.webdriver.chromium import service @@ -36,8 +39,8 @@ def __init__( executable_path: str = None, port: int = 0, log_output: SubprocessStdAlias = None, - service_args: typing.Optional[typing.List[str]] = None, - env: typing.Optional[typing.Mapping[str, str]] = None, + service_args: Optional[List[str]] = None, + env: Optional[Mapping[str, str]] = None, driver_path_env_key: str = None, **kwargs, ) -> None: diff --git a/py/selenium/webdriver/firefox/service.py b/py/selenium/webdriver/firefox/service.py index e34431480547e..59c8c18058b3b 100644 --- a/py/selenium/webdriver/firefox/service.py +++ b/py/selenium/webdriver/firefox/service.py @@ -14,8 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing from typing import List +from typing import Mapping +from typing import Optional from selenium.types import SubprocessStdAlias from selenium.webdriver.common import service @@ -37,9 +38,9 @@ def __init__( self, executable_path: str = None, port: int = 0, - service_args: typing.Optional[typing.List[str]] = None, + service_args: Optional[List[str]] = None, log_output: SubprocessStdAlias = None, - env: typing.Optional[typing.Mapping[str, str]] = None, + env: Optional[Mapping[str, str]] = None, driver_path_env_key: str = None, **kwargs, ) -> None: diff --git a/py/selenium/webdriver/ie/service.py b/py/selenium/webdriver/ie/service.py index b8fac381d9f35..bd9c116ced459 100644 --- a/py/selenium/webdriver/ie/service.py +++ b/py/selenium/webdriver/ie/service.py @@ -14,8 +14,8 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing from typing import List +from typing import Optional from selenium.types import SubprocessStdAlias from selenium.webdriver.common import service @@ -28,9 +28,9 @@ def __init__( self, executable_path: str = None, port: int = 0, - host: typing.Optional[str] = None, - service_args: typing.Optional[typing.List[str]] = None, - log_level: typing.Optional[str] = None, + host: Optional[str] = None, + service_args: Optional[List[str]] = None, + log_level: Optional[str] = None, log_output: SubprocessStdAlias = None, driver_path_env_key: str = None, **kwargs, diff --git a/py/selenium/webdriver/remote/client_config.py b/py/selenium/webdriver/remote/client_config.py index f571d0886df54..f5eec5aaf9251 100644 --- a/py/selenium/webdriver/remote/client_config.py +++ b/py/selenium/webdriver/remote/client_config.py @@ -33,7 +33,48 @@ class AuthType(Enum): X_API_KEY = "X-API-Key" +class _ClientConfigDescriptor: + def __init__(self, name): + self.name = name + + def __get__(self, obj, cls): + return obj.__dict__[self.name] + + def __set__(self, obj, value) -> None: + obj.__dict__[self.name] = value + + class ClientConfig: + remote_server_addr = _ClientConfigDescriptor("_remote_server_addr") + """Gets and Sets Remote Server.""" + keep_alive = _ClientConfigDescriptor("_keep_alive") + """Gets and Sets Keep Alive value.""" + proxy = _ClientConfigDescriptor("_proxy") + """Gets and Sets the proxy used for communicating to the driver/server.""" + ignore_certificates = _ClientConfigDescriptor("_ignore_certificates") + """Gets and Sets the ignore certificate check value.""" + init_args_for_pool_manager = _ClientConfigDescriptor("_init_args_for_pool_manager") + """Gets and Sets the ignore certificate check.""" + timeout = _ClientConfigDescriptor("_timeout") + """Gets and Sets the timeout (in seconds) used for communicating to the + driver/server.""" + ca_certs = _ClientConfigDescriptor("_ca_certs") + """Gets and Sets the path to bundle of CA certificates.""" + username = _ClientConfigDescriptor("_username") + """Gets and Sets the username used for basic authentication to the + remote.""" + password = _ClientConfigDescriptor("_password") + """Gets and Sets the password used for basic authentication to the + remote.""" + auth_type = _ClientConfigDescriptor("_auth_type") + """Gets and Sets the type of authentication to the remote server.""" + token = _ClientConfigDescriptor("_token") + """Gets and Sets the token used for authentication to the remote server.""" + user_agent = _ClientConfigDescriptor("_user_agent") + """Gets and Sets user agent to be added to the request headers.""" + extra_headers = _ClientConfigDescriptor("_extra_headers") + """Gets and Sets extra headers to be added to the request.""" + def __init__( self, remote_server_addr: str, @@ -79,180 +120,10 @@ def __init__( else ca_certs ) - @property - def remote_server_addr(self) -> str: - """:Returns: The address of the remote server.""" - return self._remote_server_addr - - @remote_server_addr.setter - def remote_server_addr(self, value: str) -> None: - """Provides the address of the remote server.""" - self._remote_server_addr = value - - @property - def keep_alive(self) -> bool: - """:Returns: The keep alive value.""" - return self._keep_alive - - @keep_alive.setter - def keep_alive(self, value: bool) -> None: - """Toggles the keep alive value. - - :Args: - - value: whether to keep the http connection alive - """ - self._keep_alive = value - - @property - def proxy(self) -> Proxy: - """:Returns: The proxy used for communicating to the driver/server.""" - return self._proxy - - @proxy.setter - def proxy(self, proxy: Proxy) -> None: - """Provides the information for communicating with the driver or - server. - For example: Proxy(raw={"proxyType": ProxyType.SYSTEM}) - - :Args: - - value: the proxy information to use to communicate with the driver or server - """ - self._proxy = proxy - - @property - def ignore_certificates(self) -> bool: - """:Returns: The ignore certificate check value.""" - return self._ignore_certificates - - @ignore_certificates.setter - def ignore_certificates(self, ignore_certificates: bool) -> None: - """Toggles the ignore certificate check. - - :Args: - - value: value of ignore certificate check - """ - self._ignore_certificates = ignore_certificates - - @property - def init_args_for_pool_manager(self) -> dict: - """:Returns: The dictionary of arguments will be appended while - initializing the pool manager.""" - return self._init_args_for_pool_manager - - @init_args_for_pool_manager.setter - def init_args_for_pool_manager(self, init_args_for_pool_manager: dict) -> None: - """Provides dictionary of arguments will be appended while initializing the pool manager. - For example: {"init_args_for_pool_manager": {"retries": 3, "block": True}} - - :Args: - - value: the dictionary of arguments will be appended while initializing the pool manager - """ - self._init_args_for_pool_manager = init_args_for_pool_manager - - @property - def timeout(self) -> int: - """:Returns: The timeout (in seconds) used for communicating to the - driver/server.""" - return self._timeout - - @timeout.setter - def timeout(self, timeout: int) -> None: - """Provides the timeout (in seconds) for communicating with the driver - or server. - - :Args: - - value: the timeout (in seconds) to use to communicate with the driver or server - """ - self._timeout = timeout - def reset_timeout(self) -> None: """Resets the timeout to the default value of socket.""" self._timeout = socket.getdefaulttimeout() - @property - def ca_certs(self) -> str: - """:Returns: The path to bundle of CA certificates.""" - return self._ca_certs - - @ca_certs.setter - def ca_certs(self, ca_certs: str) -> None: - """Provides the path to bundle of CA certificates for establishing - secure connections. - - :Args: - - value: the path to bundle of CA certificates for establishing secure connections - """ - self._ca_certs = ca_certs - - @property - def username(self) -> str: - """Returns the username used for basic authentication to the remote - server.""" - return self._username - - @username.setter - def username(self, value: str) -> None: - """Sets the username used for basic authentication to the remote - server.""" - self._username = value - - @property - def password(self) -> str: - """Returns the password used for basic authentication to the remote - server.""" - return self._password - - @password.setter - def password(self, value: str) -> None: - """Sets the password used for basic authentication to the remote - server.""" - self._password = value - - @property - def auth_type(self) -> AuthType: - """Returns the type of authentication to the remote server.""" - return self._auth_type - - @auth_type.setter - def auth_type(self, value: AuthType) -> None: - """Sets the type of authentication to the remote server if it is not - using basic with username and password. - - :Args: value - AuthType enum value. For others, please use `extra_headers` instead - """ - self._auth_type = value - - @property - def token(self) -> str: - """Returns the token used for authentication to the remote server.""" - return self._token - - @token.setter - def token(self, value: str) -> None: - """Sets the token used for authentication to the remote server if - auth_type is not basic.""" - self._token = value - - @property - def user_agent(self) -> str: - """Returns user agent to be added to the request headers.""" - return self._user_agent - - @user_agent.setter - def user_agent(self, value: str) -> None: - """Sets user agent to be added to the request headers.""" - self._user_agent = value - - @property - def extra_headers(self) -> dict: - """Returns extra headers to be added to the request.""" - return self._extra_headers - - @extra_headers.setter - def extra_headers(self, value: dict) -> None: - """Sets extra headers to be added to the request.""" - self._extra_headers = value - def get_proxy_url(self) -> Optional[str]: """Returns the proxy URL to use for the connection.""" proxy_type = self.proxy.proxy_type diff --git a/py/selenium/webdriver/remote/shadowroot.py b/py/selenium/webdriver/remote/shadowroot.py index c9a5f81d43c05..e78167356f6b5 100644 --- a/py/selenium/webdriver/remote/shadowroot.py +++ b/py/selenium/webdriver/remote/shadowroot.py @@ -40,6 +40,32 @@ def __repr__(self) -> str: ) def find_element(self, by: str = By.ID, value: str = None): + """Find an element inside a shadow root given a By strategy and + locator. + + Parameters: + ---------- + by : selenium.webdriver.common.by.By + The locating strategy to use. Default is `By.ID`. Supported values include: + - By.ID: Locate by element ID. + - By.NAME: Locate by the `name` attribute. + - By.XPATH: Locate by an XPath expression. + - By.CSS_SELECTOR: Locate by a CSS selector. + - By.CLASS_NAME: Locate by the `class` attribute. + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.LINK_TEXT: Locate a link element by its exact text. + - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. + - RelativeBy: Locate elements relative to a specified root element. + + Example: + -------- + element = driver.find_element(By.ID, 'foo') + + Returns: + ------- + WebElement + The first matching `WebElement` found on the page. + """ if by == By.ID: by = By.CSS_SELECTOR value = f'[id="{value}"]' @@ -53,6 +79,31 @@ def find_element(self, by: str = By.ID, value: str = None): return self._execute(Command.FIND_ELEMENT_FROM_SHADOW_ROOT, {"using": by, "value": value})["value"] def find_elements(self, by: str = By.ID, value: str = None): + """Find elements inside a shadow root given a By strategy and locator. + + Parameters: + ---------- + by : selenium.webdriver.common.by.By + The locating strategy to use. Default is `By.ID`. Supported values include: + - By.ID: Locate by element ID. + - By.NAME: Locate by the `name` attribute. + - By.XPATH: Locate by an XPath expression. + - By.CSS_SELECTOR: Locate by a CSS selector. + - By.CLASS_NAME: Locate by the `class` attribute. + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.LINK_TEXT: Locate a link element by its exact text. + - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. + - RelativeBy: Locate elements relative to a specified root element. + + Example: + -------- + element = driver.find_element(By.ID, 'foo') + + Returns: + ------- + WebElement + list of `WebElements` matching locator strategy found on the page. + """ if by == By.ID: by = By.CSS_SELECTOR value = f'[id="{value}"]' diff --git a/py/selenium/webdriver/remote/webdriver.py b/py/selenium/webdriver/remote/webdriver.py index eace710c20310..d40a98d01b9fc 100644 --- a/py/selenium/webdriver/remote/webdriver.py +++ b/py/selenium/webdriver/remote/webdriver.py @@ -22,7 +22,6 @@ import pkgutil import tempfile import types -import typing import warnings import zipfile from abc import ABCMeta @@ -34,6 +33,7 @@ from typing import Dict from typing import List from typing import Optional +from typing import Type from typing import Union from selenium.common.exceptions import InvalidArgumentException @@ -252,9 +252,9 @@ def __enter__(self): def __exit__( self, - exc_type: typing.Optional[typing.Type[BaseException]], - exc: typing.Optional[BaseException], - traceback: typing.Optional[types.TracebackType], + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + traceback: Optional[types.TracebackType], ): self.quit() @@ -361,6 +361,26 @@ def _unwrap_value(self, value): return list(self._unwrap_value(item) for item in value) return value + def execute_cdp_cmd(self, cmd: str, cmd_args: dict): + """Execute Chrome Devtools Protocol command and get returned result The + command and command args should follow chrome devtools protocol + domains/commands, refer to link + https://chromedevtools.github.io/devtools-protocol/ + + :Args: + - cmd: A str, command name + - cmd_args: A dict, command args. empty dict {} if there is no command args + :Usage: + :: + + driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId}) + :Returns: + A dict, empty dict {} if there is no result to return. + For example to getResponseBody: + {'base64Encoded': False, 'body': 'response body string'} + """ + return self.execute("executeCdpCommand", {"cmd": cmd, "params": cmd_args})["value"] + def execute(self, driver_command: str, params: dict = None) -> dict: """Sends a command to be executed by a command.CommandExecutor. @@ -618,7 +638,7 @@ def get_cookies(self) -> List[dict]: """ return self.execute(Command.GET_ALL_COOKIES)["value"] - def get_cookie(self, name) -> typing.Optional[typing.Dict]: + def get_cookie(self, name) -> Optional[Dict]: """Get a single cookie by name. Returns the cookie if found, None if not. @@ -752,12 +772,28 @@ def timeouts(self, timeouts) -> None: def find_element(self, by=By.ID, value: Optional[str] = None) -> WebElement: """Find an element given a By strategy and locator. - :Usage: - :: + Parameters: + ---------- + by : selenium.webdriver.common.by.By + The locating strategy to use. Default is `By.ID`. Supported values include: + - By.ID: Locate by element ID. + - By.NAME: Locate by the `name` attribute. + - By.XPATH: Locate by an XPath expression. + - By.CSS_SELECTOR: Locate by a CSS selector. + - By.CLASS_NAME: Locate by the `class` attribute. + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.LINK_TEXT: Locate a link element by its exact text. + - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. + - RelativeBy: Locate elements relative to a specified root element. + + Example: + -------- + element = driver.find_element(By.ID, 'foo') - element = driver.find_element(By.ID, 'foo') - - :rtype: WebElement + Returns: + ------- + WebElement + The first matching `WebElement` found on the page. """ by, value = self.locator_converter.convert(by, value) @@ -772,12 +808,28 @@ def find_element(self, by=By.ID, value: Optional[str] = None) -> WebElement: def find_elements(self, by=By.ID, value: Optional[str] = None) -> List[WebElement]: """Find elements given a By strategy and locator. - :Usage: - :: + Parameters: + ---------- + by : selenium.webdriver.common.by.By + The locating strategy to use. Default is `By.ID`. Supported values include: + - By.ID: Locate by element ID. + - By.NAME: Locate by the `name` attribute. + - By.XPATH: Locate by an XPath expression. + - By.CSS_SELECTOR: Locate by a CSS selector. + - By.CLASS_NAME: Locate by the `class` attribute. + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.LINK_TEXT: Locate a link element by its exact text. + - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. + - RelativeBy: Locate elements relative to a specified root element. + + Example: + -------- + element = driver.find_element(By.ID, 'foo') - elements = driver.find_elements(By.CLASS_NAME, 'foo') - - :rtype: list of WebElement + Returns: + ------- + WebElement + list of `WebElements` matching locator strategy found on the page. """ by, value = self.locator_converter.convert(by, value) diff --git a/py/selenium/webdriver/remote/webelement.py b/py/selenium/webdriver/remote/webelement.py index 08c772eaad56e..f2b672ec17736 100644 --- a/py/selenium/webdriver/remote/webelement.py +++ b/py/selenium/webdriver/remote/webelement.py @@ -397,12 +397,28 @@ def _execute(self, command, params=None): def find_element(self, by=By.ID, value=None) -> WebElement: """Find an element given a By strategy and locator. - :Usage: - :: + Parameters: + ---------- + by : selenium.webdriver.common.by.By + The locating strategy to use. Default is `By.ID`. Supported values include: + - By.ID: Locate by element ID. + - By.NAME: Locate by the `name` attribute. + - By.XPATH: Locate by an XPath expression. + - By.CSS_SELECTOR: Locate by a CSS selector. + - By.CLASS_NAME: Locate by the `class` attribute. + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.LINK_TEXT: Locate a link element by its exact text. + - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. + - RelativeBy: Locate elements relative to a specified root element. + + Example: + -------- + element = driver.find_element(By.ID, 'foo') - element = element.find_element(By.ID, 'foo') - - :rtype: WebElement + Returns: + ------- + WebElement + The first matching `WebElement` found on the page. """ by, value = self._parent.locator_converter.convert(by, value) return self._execute(Command.FIND_CHILD_ELEMENT, {"using": by, "value": value})["value"] @@ -410,12 +426,28 @@ def find_element(self, by=By.ID, value=None) -> WebElement: def find_elements(self, by=By.ID, value=None) -> List[WebElement]: """Find elements given a By strategy and locator. - :Usage: - :: + Parameters: + ---------- + by : selenium.webdriver.common.by.By + The locating strategy to use. Default is `By.ID`. Supported values include: + - By.ID: Locate by element ID. + - By.NAME: Locate by the `name` attribute. + - By.XPATH: Locate by an XPath expression. + - By.CSS_SELECTOR: Locate by a CSS selector. + - By.CLASS_NAME: Locate by the `class` attribute. + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.LINK_TEXT: Locate a link element by its exact text. + - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. + - RelativeBy: Locate elements relative to a specified root element. + + Example: + -------- + element = driver.find_element(By.ID, 'foo') - element = element.find_elements(By.CLASS_NAME, 'foo') - - :rtype: list of WebElement + Returns: + ------- + WebElement + list of `WebElements` matching locator strategy found on the page. """ by, value = self._parent.locator_converter.convert(by, value) return self._execute(Command.FIND_CHILD_ELEMENTS, {"using": by, "value": value})["value"] diff --git a/py/selenium/webdriver/safari/options.py b/py/selenium/webdriver/safari/options.py index 4e7ef0b63b01d..74b39609d6cda 100644 --- a/py/selenium/webdriver/safari/options.py +++ b/py/selenium/webdriver/safari/options.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing +from typing import Dict from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.options import ArgOptions @@ -111,5 +111,5 @@ class Options(ArgOptions): """ @property - def default_capabilities(self) -> typing.Dict[str, str]: + def default_capabilities(self) -> Dict[str, str]: return DesiredCapabilities.SAFARI.copy() diff --git a/py/selenium/webdriver/safari/service.py b/py/selenium/webdriver/safari/service.py index bd04ab66ff483..c20e2ec85df05 100644 --- a/py/selenium/webdriver/safari/service.py +++ b/py/selenium/webdriver/safari/service.py @@ -15,7 +15,10 @@ # specific language governing permissions and limitations # under the License. -import typing + +from typing import List +from typing import Mapping +from typing import Optional from selenium.webdriver.common import service @@ -35,8 +38,8 @@ def __init__( self, executable_path: str = None, port: int = 0, - service_args: typing.Optional[typing.List[str]] = None, - env: typing.Optional[typing.Mapping[str, str]] = None, + service_args: Optional[List[str]] = None, + env: Optional[Mapping[str, str]] = None, reuse_service=False, enable_logging: bool = False, driver_path_env_key: str = None, @@ -57,7 +60,7 @@ def __init__( **kwargs, ) - def command_line_args(self) -> typing.List[str]: + def command_line_args(self) -> List[str]: return ["-p", f"{self.port}"] + self.service_args @property diff --git a/py/selenium/webdriver/support/event_firing_webdriver.py b/py/selenium/webdriver/support/event_firing_webdriver.py index 544ffbb970b6e..6cfdf7b9fb93b 100644 --- a/py/selenium/webdriver/support/event_firing_webdriver.py +++ b/py/selenium/webdriver/support/event_firing_webdriver.py @@ -14,7 +14,10 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing + +from typing import Any +from typing import List +from typing import Tuple from selenium.common.exceptions import WebDriverException from selenium.webdriver.common.by import By @@ -103,12 +106,10 @@ def quit(self) -> None: def find_element(self, by=By.ID, value=None) -> WebElement: return self._dispatch("find", (by, value, self._driver), "find_element", (by, value)) - def find_elements(self, by=By.ID, value=None) -> typing.List[WebElement]: + def find_elements(self, by=By.ID, value=None) -> List[WebElement]: return self._dispatch("find", (by, value, self._driver), "find_elements", (by, value)) - def _dispatch( - self, l_call: str, l_args: typing.Tuple[typing.Any, ...], d_call: str, d_args: typing.Tuple[typing.Any, ...] - ): + def _dispatch(self, l_call: str, l_args: Tuple[Any, ...], d_call: str, d_args: Tuple[Any, ...]): getattr(self._listener, f"before_{l_call}")(*l_args) try: result = getattr(self._driver, d_call)(*d_args) @@ -187,7 +188,7 @@ def send_keys(self, *value) -> None: def find_element(self, by=By.ID, value=None) -> WebElement: return self._dispatch("find", (by, value, self._driver), "find_element", (by, value)) - def find_elements(self, by=By.ID, value=None) -> typing.List[WebElement]: + def find_elements(self, by=By.ID, value=None) -> List[WebElement]: return self._dispatch("find", (by, value, self._driver), "find_elements", (by, value)) def _dispatch(self, l_call, l_args, d_call, d_args): diff --git a/py/selenium/webdriver/support/wait.py b/py/selenium/webdriver/support/wait.py index 35bd74a695eb8..f9e3815b6022f 100644 --- a/py/selenium/webdriver/support/wait.py +++ b/py/selenium/webdriver/support/wait.py @@ -16,10 +16,12 @@ # under the License. import time -import typing from typing import Callable from typing import Generic from typing import Literal +from typing import Optional +from typing import Tuple +from typing import Type from typing import TypeVar from typing import Union @@ -30,7 +32,7 @@ from selenium.webdriver.remote.webelement import WebElement POLL_FREQUENCY: float = 0.5 # How long to sleep in between calls to the method -IGNORED_EXCEPTIONS: typing.Tuple[typing.Type[Exception]] = (NoSuchElementException,) # default to be ignored. +IGNORED_EXCEPTIONS: Tuple[Type[Exception]] = (NoSuchElementException,) # default to be ignored. D = TypeVar("D", bound=Union[WebDriver, WebElement]) T = TypeVar("T") @@ -42,7 +44,7 @@ def __init__( driver: D, timeout: float, poll_frequency: float = POLL_FREQUENCY, - ignored_exceptions: typing.Optional[WaitExcTypes] = None, + ignored_exceptions: Optional[WaitExcTypes] = None, ): """Constructor, takes a WebDriver instance and timeout in seconds. diff --git a/py/selenium/webdriver/webkitgtk/service.py b/py/selenium/webdriver/webkitgtk/service.py index 5f42d31486143..7414556370bd0 100644 --- a/py/selenium/webdriver/webkitgtk/service.py +++ b/py/selenium/webdriver/webkitgtk/service.py @@ -14,8 +14,10 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing import warnings +from typing import List +from typing import Mapping +from typing import Optional from selenium.webdriver.common import service @@ -37,10 +39,10 @@ def __init__( self, executable_path: str = DEFAULT_EXECUTABLE_PATH, port: int = 0, - log_path: typing.Optional[str] = None, - log_output: typing.Optional[str] = None, - service_args: typing.Optional[typing.List[str]] = None, - env: typing.Optional[typing.Mapping[str, str]] = None, + log_path: Optional[str] = None, + log_output: Optional[str] = None, + service_args: Optional[List[str]] = None, + env: Optional[Mapping[str, str]] = None, **kwargs, ) -> None: self.service_args = service_args or [] @@ -56,5 +58,5 @@ def __init__( **kwargs, ) - def command_line_args(self) -> typing.List[str]: + def command_line_args(self) -> List[str]: return ["-p", f"{self.port}"] + self.service_args diff --git a/py/selenium/webdriver/wpewebkit/options.py b/py/selenium/webdriver/wpewebkit/options.py index e1bb66c162a39..5a9736c72d29e 100644 --- a/py/selenium/webdriver/wpewebkit/options.py +++ b/py/selenium/webdriver/wpewebkit/options.py @@ -14,7 +14,8 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import typing + +from typing import Dict from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.options import ArgOptions @@ -60,5 +61,5 @@ def to_capabilities(self): return caps @property - def default_capabilities(self) -> typing.Dict[str, str]: + def default_capabilities(self) -> Dict[str, str]: return DesiredCapabilities.WPEWEBKIT.copy() diff --git a/py/selenium/webdriver/wpewebkit/service.py b/py/selenium/webdriver/wpewebkit/service.py index bd90f51daf61b..8f392cf522706 100644 --- a/py/selenium/webdriver/wpewebkit/service.py +++ b/py/selenium/webdriver/wpewebkit/service.py @@ -15,7 +15,9 @@ # specific language governing permissions and limitations # under the License. import shutil -import typing +from typing import List +from typing import Mapping +from typing import Optional from selenium.webdriver.common import service @@ -37,9 +39,9 @@ def __init__( self, executable_path: str = DEFAULT_EXECUTABLE_PATH, port: int = 0, - log_output: typing.Optional[str] = None, - service_args: typing.Optional[typing.List[str]] = None, - env: typing.Optional[typing.Mapping[str, str]] = None, + log_output: Optional[str] = None, + service_args: Optional[List[str]] = None, + env: Optional[Mapping[str, str]] = None, **kwargs, ): self.service_args = service_args or [] @@ -51,5 +53,5 @@ def __init__( **kwargs, ) - def command_line_args(self) -> typing.List[str]: + def command_line_args(self) -> List[str]: return ["-p", f"{self.port}"] + self.service_args diff --git a/rb/Gemfile.lock b/rb/Gemfile.lock index 3c9f67c9bf9f8..b09123411d0c7 100644 --- a/rb/Gemfile.lock +++ b/rb/Gemfile.lock @@ -13,7 +13,7 @@ PATH GEM remote: https://rubygems.org/ specs: - activesupport (8.0.0) + activesupport (7.2.2) base64 benchmark (>= 0.3) bigdecimal @@ -25,7 +25,6 @@ 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) @@ -162,7 +161,6 @@ 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/webdriver/bidi/network.rb b/rb/lib/selenium/webdriver/bidi/network.rb index a6cdef3c344f6..ae55f9200efe4 100644 --- a/rb/lib/selenium/webdriver/bidi/network.rb +++ b/rb/lib/selenium/webdriver/bidi/network.rb @@ -26,7 +26,7 @@ class Network response_started: 'network.responseStarted', response_completed: 'network.responseCompleted', auth_required: 'network.authRequired', - FETCH_ERROR: 'network.fetchError' + fetch_error: 'network.fetchError' }.freeze PHASES = { @@ -60,6 +60,18 @@ def continue_with_auth(request_id, username, password) ) end + def continue_with_request(**args) + @bidi.send_cmd( + 'network.continueWithRequest', + request: args[:request_id], + 'body' => args[:body], + 'cookies' => args[:cookies], + 'headers' => args[:headers], + 'method' => args[:method], + 'url' => args[:url] + ) + end + def on(event, &) event = EVENTS[event] if event.is_a?(Symbol) @bidi.add_callback(event, &) diff --git a/rb/lib/selenium/webdriver/common/manager.rb b/rb/lib/selenium/webdriver/common/manager.rb index 6ba94fca8d829..99181d7700f67 100644 --- a/rb/lib/selenium/webdriver/common/manager.rb +++ b/rb/lib/selenium/webdriver/common/manager.rb @@ -65,7 +65,7 @@ def add_cookie(opts = {}) # Get the cookie with the given name # # @param [String] name the name of the cookie - # @return [Hash, nil] the cookie, or nil if it wasn't found. + # @return [Hash] the cookie, or throws a NoSuchCookieError if it wasn't found. # def cookie_named(name) diff --git a/rb/lib/selenium/webdriver/common/network.rb b/rb/lib/selenium/webdriver/common/network.rb index c78980b954bff..91bc0525c8340 100644 --- a/rb/lib/selenium/webdriver/common/network.rb +++ b/rb/lib/selenium/webdriver/common/network.rb @@ -20,11 +20,11 @@ module Selenium module WebDriver class Network - attr_reader :auth_callbacks + attr_reader :callbacks def initialize(bridge) @network = BiDi::Network.new(bridge.bidi) - @auth_callbacks = {} + @callbacks = {} end def add_authentication_handler(username, password) @@ -33,19 +33,31 @@ def add_authentication_handler(username, password) request_id = event['requestId'] @network.continue_with_auth(request_id, username, password) end - @auth_callbacks[auth_id] = intercept + @callbacks[auth_id] = intercept auth_id end - def remove_authentication_handler(id) - intercept = @auth_callbacks[id] + def remove_handler(id) + intercept = @callbacks[id] @network.remove_intercept(intercept['intercept']) - @auth_callbacks.delete(id) + @callbacks.delete(id) end - def clear_authentication_handlers - @auth_callbacks.each_key { |id| remove_authentication_handler(id) } + def clear_handlers + @callbacks.each_key { |id| remove_handler(id) } + end + + def add_request_handler + intercept = @network.add_intercept(phases: [BiDi::Network::PHASES[:before_request]]) + request_id = @network.on(:before_request) do |event| + request_id = event['requestId'] + @network.continue_with_request(request_id: request_id) + end + + @callbacks[request_id] = intercept + + request_id end end # Network end # WebDriver diff --git a/rb/selenium-webdriver.gemspec b/rb/selenium-webdriver.gemspec index 183981a1ba634..a90d703b5325d 100644 --- a/rb/selenium-webdriver.gemspec +++ b/rb/selenium-webdriver.gemspec @@ -22,6 +22,7 @@ Gem::Specification.new do |s| s.homepage = 'https://selenium.dev' s.metadata = { 'changelog_uri' => 'https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES', + 'documentation_uri' => 'https://www.selenium.dev/documentation/?tab=ruby', 'github_repo' => 'ssh://github.com/SeleniumHQ/selenium', 'source_code_uri' => 'https://github.com/SeleniumHQ/selenium/tree/trunk/rb', 'rubygems_mfa_required' => 'true', diff --git a/rb/sig/lib/selenium/webdriver/bidi/network.rbs b/rb/sig/lib/selenium/webdriver/bidi/network.rbs index 96dcdc47d89ed..44645cf05d250 100644 --- a/rb/sig/lib/selenium/webdriver/bidi/network.rbs +++ b/rb/sig/lib/selenium/webdriver/bidi/network.rbs @@ -12,6 +12,8 @@ module Selenium def add_intercept: (?phases: Array[String], ?contexts: BrowsingContext?, ?url_patterns: untyped?) -> Hash[String, String] + def continue_with_request: -> untyped + def remove_intercept: (String intercept) -> untyped def continue_with_auth: (String request_id, String username, String password) -> untyped diff --git a/rb/sig/lib/selenium/webdriver/common/manager.rbs b/rb/sig/lib/selenium/webdriver/common/manager.rbs index bf61f3e18c4b4..bb214a709a84b 100644 --- a/rb/sig/lib/selenium/webdriver/common/manager.rbs +++ b/rb/sig/lib/selenium/webdriver/common/manager.rbs @@ -11,7 +11,7 @@ module Selenium def add_cookie: (?Hash[Symbol, untyped] opts) -> void - def cookie_named: (String name) -> Hash[Symbol, untyped] + def cookie_named: (String name) -> (Hash[Symbol, untyped] | Error::NoSuchCookieError) def delete_cookie: (String name) -> String @@ -33,7 +33,7 @@ module Selenium def strip_port: (String str) -> String? - def convert_cookie: (Hash[String, untyped] cookie) -> Hash[Symbol, untyped] + def convert_cookie: (String) -> (Hash[Symbol, untyped] | Error::NoSuchCookieError) end end end diff --git a/rb/sig/lib/selenium/webdriver/common/network.rbs b/rb/sig/lib/selenium/webdriver/common/network.rbs index edd306ee3990a..2ad03a748167e 100644 --- a/rb/sig/lib/selenium/webdriver/common/network.rbs +++ b/rb/sig/lib/selenium/webdriver/common/network.rbs @@ -3,15 +3,19 @@ module Selenium class Network @network: BiDi::Network - attr_reader auth_callbacks: Hash[String, String] + @callbacks: Hash[String, String] + + attr_reader callbacks: Hash[String, String] def initialize: (Remote::Bridge bridge) -> void def add_authentication_handler: (String username, String password) -> String - def clear_authentication_handlers: -> Hash[nil, nil] + def add_request_handler: -> Integer + + def clear_handlers: -> Hash[nil, nil] - def remove_authentication_handler: (String id) -> nil + def remove_handler: (Integer id) -> nil end end end diff --git a/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb b/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb index 7aef0ba9856aa..80aad4de78e31 100644 --- a/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb @@ -56,6 +56,20 @@ class BiDi expect(driver.find_element(tag_name: 'h1').text).to eq('authorized') end end + + it 'continues with request' do + reset_driver!(web_socket_url: true) do |driver| + network = described_class.new(driver.bidi) + network.add_intercept(phases: [described_class::PHASES[:before_request]]) + network.on(:before_request) do |event| + request_id = event['requestId'] + network.continue_with_request(request_id: request_id) + end + + driver.navigate.to url_for('formPage.html') + expect(driver.find_element(name: 'login')).to be_displayed + end + end end end end diff --git a/rb/spec/integration/selenium/webdriver/fedcm_spec.rb b/rb/spec/integration/selenium/webdriver/fedcm_spec.rb index 608f3a4361294..aeee262e9a41a 100644 --- a/rb/spec/integration/selenium/webdriver/fedcm_spec.rb +++ b/rb/spec/integration/selenium/webdriver/fedcm_spec.rb @@ -50,7 +50,7 @@ module FedCM expect(dialog.title).to eq('Sign in to localhost with localhost') end - it 'returns the subtitle' do + it 'returns the subtitle', skip: 'Investigate flakiness only on pipeline' do expect(dialog.subtitle).to be_nil end diff --git a/rb/spec/integration/selenium/webdriver/manager_spec.rb b/rb/spec/integration/selenium/webdriver/manager_spec.rb index f06afd7302cc9..d8d9d791ddc74 100644 --- a/rb/spec/integration/selenium/webdriver/manager_spec.rb +++ b/rb/spec/integration/selenium/webdriver/manager_spec.rb @@ -248,6 +248,11 @@ module WebDriver driver.manage.delete_all_cookies expect(driver.manage.all_cookies).to be_empty end + + it 'throws error when fetching non-existent cookie' do + expect { driver.manage.cookie_named('non-existent') } + .to raise_exception(Error::NoSuchCookieError) + end end end # Options end # WebDriver diff --git a/rb/spec/integration/selenium/webdriver/network_spec.rb b/rb/spec/integration/selenium/webdriver/network_spec.rb index 11776a4e2c73f..2ad4bc9f5365c 100644 --- a/rb/spec/integration/selenium/webdriver/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/network_spec.rb @@ -17,7 +17,6 @@ # specific language governing permissions and limitations # under the License. - require_relative 'spec_helper' module Selenium @@ -31,7 +30,7 @@ module WebDriver reset_driver!(web_socket_url: true) do |driver| network = described_class.new(driver) network.add_authentication_handler(username, password) - expect(network.auth_callbacks.count).to be 1 + expect(network.callbacks.count).to be 1 end end @@ -39,8 +38,8 @@ module WebDriver reset_driver!(web_socket_url: true) do |driver| network = described_class.new(driver) id = network.add_authentication_handler(username, password) - network.remove_authentication_handler(id) - expect(network.auth_callbacks.count).to be 0 + network.remove_handler(id) + expect(network.callbacks.count).to be 0 end end @@ -49,8 +48,35 @@ module WebDriver network = described_class.new(driver) network.add_authentication_handler(username, password) network.add_authentication_handler(username, password) - network.clear_authentication_handlers - expect(network.auth_callbacks.count).to be 0 + network.clear_handlers + expect(network.callbacks.count).to be 0 + end + end + + it 'adds a request handler' do + reset_driver!(web_socket_url: true) do |driver| + network = described_class.new(driver) + network.add_request_handler + expect(network.callbacks.count).to be 1 + end + end + + it 'removes a request handler' do + reset_driver!(web_socket_url: true) do |driver| + network = described_class.new(driver) + id = network.add_request_handler + network.remove_handler(id) + expect(network.callbacks.count).to be 0 + end + end + + it 'clears all request handlers' do + reset_driver!(web_socket_url: true) do |driver| + network = described_class.new(driver) + network.add_request_handler + network.add_request_handler + network.clear_handlers + expect(network.callbacks.count).to be 0 end end end diff --git a/renovate.json b/renovate.json index d21056870ba50..f5aba04d1c54e 100644 --- a/renovate.json +++ b/renovate.json @@ -1,36 +1,82 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:recommended"], - "labels": ["dependencies"], "packageRules": [ { - "matchPackageNames": ["bazel", "bazelisk"], - "commitMessageSuffix": "[dotnet][java][js][py][rb][rust]" + "matchManagers": [ "bazel", "bazel-module", "bazelisk" ], + "matchPackageNames": [ "!rules_java", "!rules_jvm_external", "!contrib_rules_jvm", "!rules_dotnet", "!aspect_rules_js", "!aspect_rules_ts", "!rules_nodejs", "!rules_python", "!rules_ruby", "!rules_cc" ], + "matchDatasources": [ "!maven" ], + "commitMessagePrefix": "[dotnet][java][js][py][rb][rust]", + "labels": [ "dependencies", "c-build" ] }, { - "matchPackageNames": ["nuget"], - "commitMessagePrefix": "[dotnet]" + "matchManagers": [ "nuget" ], + "commitMessagePrefix": "[dotnet]", + "labels": [ "dependencies", "c-dotnet" ] }, { - "matchPackageNames": ["maven"], - "commitMessagePrefix": "[java]" + "matchPackageNames": [ "rules_dotnet" ], + "commitMessagePrefix": "[dotnet]", + "labels": [ "dependencies", "c-dotnet" ] }, { - "matchPackageNames": ["npm"], - "commitMessagePrefix": "[js]" + "matchManagers": [ "bazel", "bazel-module" ], + "matchDatasources": ["maven"], + "versioning": "maven", + "commitMessagePrefix": "[java]", + "labels": [ "dependencies", "c-java" ] }, { - "matchPackageNames": ["pip_requirements"], - "commitMessagePrefix": "[py]" + "matchManagers": [ "bazel-module" ], + "matchPackageNames": [ "rules_java", "rules_jvm_external", "contrib_rules_jvm" ], + "commitMessagePrefix": "[java]", + "labels": [ "dependencies", "c-java" ] }, { - "matchPackageNames": ["bundler", "ruby-version"], - "commitMessagePrefix": "[rb]" + "matchManagers": [ "maven" ], + "commitMessagePrefix": "[java]", + "labels": [ "dependencies", "c-java" ] }, { - "matchPackageNames": ["cargo"], - "commitMessagePrefix": "[rust]" + "matchManagers": [ "npm" ], + "commitMessagePrefix": "[js]", + "labels": [ "dependencies", "c-nodejs" ] + }, + { + "matchPackageNames": [ "aspect_rules_js", "aspect_rules_ts", "rules_nodejs" ], + "commitMessagePrefix": "[js]", + "labels": [ "dependencies", "c-nodejs" ] + }, + { + "matchManagers": [ "pip_requirements", "pip_setup" ], + "commitMessagePrefix": "[py]", + "labels": [ "dependencies", "c-py" ] + }, + { + "matchPackageNames": [ "rules_python" ], + "commitMessagePrefix": "[py]", + "labels": [ "dependencies", "c-py" ] + }, + { + "matchManagers": [ "bundler", "ruby-version" ], + "commitMessagePrefix": "[rb]", + "labels": [ "dependencies", "c-rb" ] + }, + { + "matchPackageNames": [ "rules_ruby" ], + "commitMessagePrefix": "[rb]", + "labels": [ "dependencies", "c-rb" ] + }, + { + "matchManagers": [ "cargo" ], + "commitMessagePrefix": "[rust]", + "labels": [ "dependencies", "c-rust" ] + }, + { + "matchPackageNames": [ "rules_cc" ], + "commitMessagePrefix": "[rust]", + "labels": [ "dependencies", "c-rust" ] } ], - "prConcurrentLimit": 5 + "prConcurrentLimit": 10 } diff --git a/rust/BUILD.bazel b/rust/BUILD.bazel index a73cab95f3726..eadc61dc6d863 100644 --- a/rust/BUILD.bazel +++ b/rust/BUILD.bazel @@ -77,7 +77,7 @@ rust_binary( name = "selenium-manager", srcs = ["src/main.rs"], edition = "2021", - version = "0.4.24", + version = "0.4.28-nightly", visibility = ["//visibility:public"], deps = [ ":selenium_manager", diff --git a/rust/Cargo.Bazel.lock b/rust/Cargo.Bazel.lock index aa489691c16ae..3ac21b2c7f8a7 100644 --- a/rust/Cargo.Bazel.lock +++ b/rust/Cargo.Bazel.lock @@ -1,5 +1,5 @@ { - "checksum": "94895b25f9b1d0a76ec78d588887353422bc623faf9ef986467b199d2a966765", + "checksum": "ad84e0341df7e7a0af9b195a8fd07fc16e345736b48a3b81f8f4cb3fb288335d", "crates": { "addr2line 0.21.0": { "name": "addr2line", @@ -255,7 +255,7 @@ "deps": { "common": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], @@ -572,14 +572,14 @@ ], "license_file": "LICENSE-APACHE" }, - "anyhow 1.0.91": { + "anyhow 1.0.94": { "name": "anyhow", - "version": "1.0.91", + "version": "1.0.94", "package_url": "https://github.com/dtolnay/anyhow", "repository": { "Http": { - "url": "https://static.crates.io/crates/anyhow/1.0.91/download", - "sha256": "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" + "url": "https://static.crates.io/crates/anyhow/1.0.94/download", + "sha256": "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" } }, "targets": [ @@ -623,7 +623,7 @@ "deps": { "common": [ { - "id": "anyhow 1.0.91", + "id": "anyhow 1.0.94", "target": "build_script_build" }, { @@ -634,7 +634,7 @@ "selects": {} }, "edition": "2018", - "version": "1.0.91" + "version": "1.0.94" }, "build_script_attrs": { "compile_data_glob": [ @@ -651,14 +651,14 @@ ], "license_file": "LICENSE-APACHE" }, - "apple-flat-package 0.18.0": { + "apple-flat-package 0.20.0": { "name": "apple-flat-package", - "version": "0.18.0", + "version": "0.20.0", "package_url": "https://github.com/indygreg/apple-platform-rs.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/apple-flat-package/0.18.0/download", - "sha256": "b6adc520e05304de5ec383487786fa20e9c636fe972e59719cdd93621a2db6f1" + "url": "https://static.crates.io/crates/apple-flat-package/0.20.0/download", + "sha256": "9c9d5a1fd8af4a376cc33d7e816a13f8ce127d52101f5dbc8061fb595397bea0" } }, "targets": [ @@ -683,15 +683,15 @@ "deps": { "common": [ { - "id": "apple-xar 0.18.0", + "id": "apple-xar 0.20.0", "target": "apple_xar" }, { - "id": "cpio-archive 0.9.0", + "id": "cpio-archive 0.10.0", "target": "cpio_archive" }, { - "id": "flate2 1.0.34", + "id": "flate2 1.0.35", "target": "flate2" }, { @@ -699,7 +699,7 @@ "target": "scroll" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" }, { @@ -707,14 +707,14 @@ "target": "serde_xml_rs" }, { - "id": "thiserror 1.0.64", + "id": "thiserror 2.0.6", "target": "thiserror" } ], "selects": {} }, "edition": "2021", - "version": "0.18.0" + "version": "0.20.0" }, "license": "MPL-2.0", "license_ids": [ @@ -722,14 +722,14 @@ ], "license_file": "LICENSE" }, - "apple-xar 0.18.0": { + "apple-xar 0.20.0": { "name": "apple-xar", - "version": "0.18.0", + "version": "0.20.0", "package_url": "https://github.com/indygreg/apple-platform-rs.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/apple-xar/0.18.0/download", - "sha256": "844e00dc1e665b3cf0bba745aa9c6464292ca512db0c11384511586701eb0335" + "url": "https://static.crates.io/crates/apple-xar/0.20.0/download", + "sha256": "9631e781df71ebd049d7b4988cdae88712324cb20eb127fd79026bc8f1335d93" } }, "targets": [ @@ -761,7 +761,7 @@ "deps": { "common": [ { - "id": "base64 0.21.7", + "id": "base64 0.22.1", "target": "base64" }, { @@ -777,7 +777,7 @@ "target": "chrono" }, { - "id": "cryptographic-message-syntax 0.26.0", + "id": "cryptographic-message-syntax 0.27.0", "target": "cryptographic_message_syntax" }, { @@ -785,7 +785,7 @@ "target": "digest" }, { - "id": "flate2 1.0.34", + "id": "flate2 1.0.35", "target": "flate2" }, { @@ -801,7 +801,7 @@ "target": "rand" }, { - "id": "reqwest 0.11.27", + "id": "reqwest 0.12.9", "target": "reqwest" }, { @@ -809,7 +809,7 @@ "target": "scroll" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" }, { @@ -829,19 +829,19 @@ "target": "signature" }, { - "id": "thiserror 1.0.64", + "id": "thiserror 2.0.6", "target": "thiserror" }, { - "id": "url 2.5.0", + "id": "url 2.5.4", "target": "url" }, { - "id": "x509-certificate 0.23.1", + "id": "x509-certificate 0.24.0", "target": "x509_certificate" }, { - "id": "xml-rs 0.8.20", + "id": "xml-rs 0.8.24", "target": "xml" }, { @@ -852,7 +852,7 @@ "selects": {} }, "edition": "2021", - "version": "0.18.0" + "version": "0.20.0" }, "license": "MPL-2.0", "license_ids": [ @@ -1062,7 +1062,7 @@ "selects": { "cfg(any())": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ] @@ -1195,7 +1195,7 @@ "target": "addr2line" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -1236,53 +1236,6 @@ ], "license_file": "LICENSE-APACHE" }, - "base64 0.21.7": { - "name": "base64", - "version": "0.21.7", - "package_url": "https://github.com/marshallpierce/rust-base64", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/base64/0.21.7/download", - "sha256": "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - } - }, - "targets": [ - { - "Library": { - "crate_name": "base64", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "base64", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "alloc", - "default", - "std" - ], - "selects": {} - }, - "edition": "2018", - "version": "0.21.7" - }, - "license": "MIT OR Apache-2.0", - "license_ids": [ - "Apache-2.0", - "MIT" - ], - "license_file": "LICENSE-APACHE" - }, "base64 0.22.1": { "name": "base64", "version": "0.22.1", @@ -1401,7 +1354,7 @@ "deps": { "common": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -1549,12 +1502,6 @@ "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default" - ], - "selects": {} - }, "edition": "2018", "version": "1.3.2" }, @@ -1810,14 +1757,14 @@ ], "license_file": "LICENSE-MIT" }, - "bytes 1.6.0": { + "bytes 1.9.0": { "name": "bytes", - "version": "1.6.0", + "version": "1.9.0", "package_url": "https://github.com/tokio-rs/bytes", "repository": { "Http": { - "url": "https://static.crates.io/crates/bytes/1.6.0/download", - "sha256": "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + "url": "https://static.crates.io/crates/bytes/1.9.0/download", + "sha256": "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" } }, "targets": [ @@ -1847,7 +1794,7 @@ "selects": {} }, "edition": "2018", - "version": "1.6.0" + "version": "1.9.0" }, "license": "MIT", "license_ids": [ @@ -1891,7 +1838,7 @@ "target": "bzip2_sys" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], @@ -1907,6 +1854,64 @@ ], "license_file": "LICENSE-APACHE" }, + "bzip2 0.5.0": { + "name": "bzip2", + "version": "0.5.0", + "package_url": "https://github.com/trifectatechfoundation/bzip2-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/bzip2/0.5.0/download", + "sha256": "bafdbf26611df8c14810e268ddceda071c297570a5fb360ceddf617fe417ef58" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bzip2", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "bzip2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bzip2-sys 0.1.11+1.0.8", + "target": "bzip2_sys" + }, + { + "id": "libc 0.2.168", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.5.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "bzip2-sys 0.1.11+1.0.8": { "name": "bzip2-sys", "version": "0.1.11+1.0.8", @@ -1955,7 +1960,7 @@ "target": "build_script_build" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], @@ -2042,67 +2047,67 @@ "selects": { "aarch64-apple-darwin": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "aarch64-unknown-linux-gnu": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "aarch64-unknown-nixos-gnu": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "arm-unknown-linux-gnueabi": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "i686-unknown-linux-gnu": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "powerpc-unknown-linux-gnu": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "s390x-unknown-linux-gnu": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "x86_64-apple-darwin": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "x86_64-unknown-freebsd": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "x86_64-unknown-linux-gnu": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "x86_64-unknown-nixos-gnu": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ] @@ -2267,7 +2272,7 @@ "target": "num_traits" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" } ], @@ -2290,12 +2295,6 @@ "target": "iana_time_zone" } ], - "aarch64-fuchsia": [ - { - "id": "iana-time-zone 0.1.60", - "target": "iana_time_zone" - } - ], "aarch64-linux-android": [ { "id": "android-tzdata 0.1.1", @@ -2312,6 +2311,12 @@ "target": "windows_targets" } ], + "aarch64-unknown-fuchsia": [ + { + "id": "iana-time-zone 0.1.60", + "target": "iana_time_zone" + } + ], "aarch64-unknown-linux-gnu": [ { "id": "iana-time-zone 0.1.60", @@ -2420,12 +2425,6 @@ "target": "iana_time_zone" } ], - "x86_64-fuchsia": [ - { - "id": "iana-time-zone 0.1.60", - "target": "iana_time_zone" - } - ], "x86_64-linux-android": [ { "id": "android-tzdata 0.1.1", @@ -2448,6 +2447,12 @@ "target": "iana_time_zone" } ], + "x86_64-unknown-fuchsia": [ + { + "id": "iana-time-zone 0.1.60", + "target": "iana_time_zone" + } + ], "x86_64-unknown-linux-gnu": [ { "id": "iana-time-zone 0.1.60", @@ -2472,14 +2477,14 @@ ], "license_file": "LICENSE.txt" }, - "clap 4.5.20": { + "clap 4.5.23": { "name": "clap", - "version": "4.5.20", + "version": "4.5.23", "package_url": "https://github.com/clap-rs/clap", "repository": { "Http": { - "url": "https://static.crates.io/crates/clap/4.5.20/download", - "sha256": "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" + "url": "https://static.crates.io/crates/clap/4.5.23/download", + "sha256": "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" } }, "targets": [ @@ -2518,7 +2523,7 @@ "deps": { "common": [ { - "id": "clap_builder 4.5.20", + "id": "clap_builder 4.5.23", "target": "clap_builder" } ], @@ -2534,7 +2539,7 @@ ], "selects": {} }, - "version": "4.5.20" + "version": "4.5.23" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -2543,14 +2548,14 @@ ], "license_file": "LICENSE-APACHE" }, - "clap_builder 4.5.20": { + "clap_builder 4.5.23": { "name": "clap_builder", - "version": "4.5.20", + "version": "4.5.23", "package_url": "https://github.com/clap-rs/clap", "repository": { "Http": { - "url": "https://static.crates.io/crates/clap_builder/4.5.20/download", - "sha256": "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" + "url": "https://static.crates.io/crates/clap_builder/4.5.23/download", + "sha256": "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" } }, "targets": [ @@ -2595,7 +2600,7 @@ "target": "anstyle" }, { - "id": "clap_lex 0.7.0", + "id": "clap_lex 0.7.4", "target": "clap_lex" }, { @@ -2606,7 +2611,7 @@ "selects": {} }, "edition": "2021", - "version": "4.5.20" + "version": "4.5.23" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -2657,7 +2662,7 @@ "target": "heck" }, { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -2665,7 +2670,7 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" } ], @@ -2681,14 +2686,14 @@ ], "license_file": "LICENSE-APACHE" }, - "clap_lex 0.7.0": { + "clap_lex 0.7.4": { "name": "clap_lex", - "version": "0.7.0", - "package_url": "https://github.com/clap-rs/clap/tree/master/clap_lex", + "version": "0.7.4", + "package_url": "https://github.com/clap-rs/clap", "repository": { "Http": { - "url": "https://static.crates.io/crates/clap_lex/0.7.0/download", - "sha256": "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + "url": "https://static.crates.io/crates/clap_lex/0.7.4/download", + "sha256": "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" } }, "targets": [ @@ -2711,7 +2716,7 @@ "**" ], "edition": "2021", - "version": "0.7.0" + "version": "0.7.4" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -2798,65 +2803,6 @@ ], "license_file": "LICENSE-APACHE" }, - "core-foundation 0.9.4": { - "name": "core-foundation", - "version": "0.9.4", - "package_url": "https://github.com/servo/core-foundation-rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/core-foundation/0.9.4/download", - "sha256": "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" - } - }, - "targets": [ - { - "Library": { - "crate_name": "core_foundation", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "core_foundation", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "default", - "link" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "core-foundation-sys 0.8.6", - "target": "core_foundation_sys" - }, - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.9.4" - }, - "license": "MIT OR Apache-2.0", - "license_ids": [ - "Apache-2.0", - "MIT" - ], - "license_file": "LICENSE-APACHE" - }, "core-foundation-sys 0.8.6": { "name": "core-foundation-sys", "version": "0.8.6", @@ -2903,14 +2849,14 @@ ], "license_file": "LICENSE-APACHE" }, - "cpio-archive 0.9.0": { + "cpio-archive 0.10.0": { "name": "cpio-archive", - "version": "0.9.0", + "version": "0.10.0", "package_url": "https://github.com/indygreg/apple-platform-rs.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/cpio-archive/0.9.0/download", - "sha256": "63d5133d716d3d82da8c76367ddb0ab1733e2629f1462e4f39947e13b8b4b741" + "url": "https://static.crates.io/crates/cpio-archive/0.10.0/download", + "sha256": "f11d34b07689c21889fc89bd7cc885b3244b0157bbededf4a1c159832cd0df05" } }, "targets": [ @@ -2947,14 +2893,14 @@ "target": "simple_file_manifest" }, { - "id": "thiserror 1.0.64", + "id": "thiserror 1.0.69", "target": "thiserror" } ], "selects": {} }, "edition": "2021", - "version": "0.9.0" + "version": "0.10.0" }, "license": "MPL-2.0", "license_ids": [ @@ -2996,25 +2942,25 @@ "selects": { "aarch64-linux-android": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "cfg(all(target_arch = \"aarch64\", target_os = \"linux\"))": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "cfg(all(target_arch = \"aarch64\", target_vendor = \"apple\"))": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "cfg(all(target_arch = \"loongarch64\", target_os = \"linux\"))": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ] @@ -3305,14 +3251,14 @@ ], "license_file": "LICENSE-APACHE" }, - "cryptographic-message-syntax 0.26.0": { + "cryptographic-message-syntax 0.27.0": { "name": "cryptographic-message-syntax", - "version": "0.26.0", + "version": "0.27.0", "package_url": "https://github.com/indygreg/cryptography-rs.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/cryptographic-message-syntax/0.26.0/download", - "sha256": "43c324ba1028cef7e3a71a00cbf585637bb0215dec2f6a2b566d094190a1309b" + "url": "https://static.crates.io/crates/cryptographic-message-syntax/0.27.0/download", + "sha256": "97a99e58d7755c646cb3f2a138d99f90da4c495282e1700b82daff8a48759ce0" } }, "targets": [ @@ -3334,6 +3280,13 @@ "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "default", + "http" + ], + "selects": {} + }, "deps": { "common": [ { @@ -3341,7 +3294,7 @@ "target": "bcder" }, { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -3357,7 +3310,7 @@ "target": "pem" }, { - "id": "reqwest 0.11.27", + "id": "reqwest 0.12.9", "target": "reqwest" }, { @@ -3369,20 +3322,20 @@ "target": "signature" }, { - "id": "x509-certificate 0.23.1", + "id": "x509-certificate 0.24.0", "target": "x509_certificate" } ], "selects": {} }, "edition": "2021", - "version": "0.26.0" + "version": "0.27.0" }, "license": "MPL-2.0", "license_ids": [ "MPL-2.0" ], - "license_file": null + "license_file": "LICENSE" }, "debpkg 0.6.0": { "name": "debpkg", @@ -3428,7 +3381,7 @@ "target": "bzip2" }, { - "id": "flate2 1.0.34", + "id": "flate2 1.0.35", "target": "flate2" }, { @@ -3444,7 +3397,7 @@ "target": "log" }, { - "id": "tar 0.4.42", + "id": "tar 0.4.43", "target": "tar" }, { @@ -3511,7 +3464,7 @@ "target": "const_oid" }, { - "id": "zeroize 1.7.0", + "id": "zeroize 1.8.1", "target": "zeroize" } ], @@ -3615,7 +3568,7 @@ "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -3623,7 +3576,7 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" } ], @@ -3832,7 +3785,7 @@ ], "cfg(unix)": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], @@ -3886,7 +3839,7 @@ "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -3894,7 +3847,7 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" } ], @@ -4023,62 +3976,6 @@ ], "license_file": "LICENSE-APACHE" }, - "encoding_rs 0.8.34": { - "name": "encoding_rs", - "version": "0.8.34", - "package_url": "https://github.com/hsivonen/encoding_rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/encoding_rs/0.8.34/download", - "sha256": "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" - } - }, - "targets": [ - { - "Library": { - "crate_name": "encoding_rs", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "encoding_rs", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "alloc", - "default" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "cfg-if 1.0.0", - "target": "cfg_if" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.8.34" - }, - "license": "(Apache-2.0 OR MIT) AND BSD-3-Clause", - "license_ids": [ - "Apache-2.0", - "BSD-3-Clause", - "MIT" - ], - "license_file": "LICENSE-APACHE" - }, "env_filter 0.1.0": { "name": "env_filter", "version": "0.1.0", @@ -4250,14 +4147,14 @@ ], "license_file": "LICENSE-APACHE" }, - "errno 0.3.9": { + "errno 0.3.10": { "name": "errno", - "version": "0.3.9", + "version": "0.3.10", "package_url": "https://github.com/lambda-fairy/rust-errno", "repository": { "Http": { - "url": "https://static.crates.io/crates/errno/0.3.9/download", - "sha256": "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" + "url": "https://static.crates.io/crates/errno/0.3.10/download", + "sha256": "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" } }, "targets": [ @@ -4290,32 +4187,32 @@ "selects": { "cfg(target_os = \"hermit\")": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "cfg(target_os = \"wasi\")": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "cfg(unix)": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "cfg(windows)": [ { - "id": "windows-sys 0.52.0", + "id": "windows-sys 0.59.0", "target": "windows_sys" } ] } }, "edition": "2018", - "version": "0.3.9" + "version": "0.3.10" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -4454,7 +4351,7 @@ ], "cfg(unix)": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], @@ -4535,14 +4432,14 @@ ], "license_file": "LICENSE-APACHE" }, - "flate2 1.0.34": { + "flate2 1.0.35": { "name": "flate2", - "version": "1.0.34", + "version": "1.0.35", "package_url": "https://github.com/rust-lang/flate2-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/flate2/1.0.34/download", - "sha256": "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" + "url": "https://static.crates.io/crates/flate2/1.0.35/download", + "sha256": "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" } }, "targets": [ @@ -4594,7 +4491,7 @@ "selects": {} }, "edition": "2018", - "version": "1.0.34" + "version": "1.0.35" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -4705,20 +4602,20 @@ ], "license_file": "LICENSE-APACHE" }, - "futures 0.3.30": { - "name": "futures", - "version": "0.3.30", - "package_url": "https://github.com/rust-lang/futures-rs", + "fs2 0.4.3": { + "name": "fs2", + "version": "0.4.3", + "package_url": "https://github.com/danburkert/fs2-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/futures/0.3.30/download", - "sha256": "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" + "url": "https://static.crates.io/crates/fs2/0.4.3/download", + "sha256": "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" } }, "targets": [ { "Library": { - "crate_name": "futures", + "crate_name": "fs2", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -4729,18 +4626,112 @@ } } ], - "library_target_name": "futures", + "library_target_name": "fs2", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "alloc", - "async-await", - "default", - "executor", - "futures-executor", + "deps": { + "common": [], + "selects": { + "cfg(unix)": [ + { + "id": "libc 0.2.168", + "target": "libc" + } + ], + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2015", + "version": "0.4.3" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "fs_extra 1.3.0": { + "name": "fs_extra", + "version": "1.3.0", + "package_url": "https://github.com/webdesus/fs_extra", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/fs_extra/1.3.0/download", + "sha256": "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "fs_extra", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "fs_extra", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.3.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE" + }, + "futures 0.3.30": { + "name": "futures", + "version": "0.3.30", + "package_url": "https://github.com/rust-lang/futures-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/futures/0.3.30/download", + "sha256": "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "futures", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "futures", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "async-await", + "default", + "executor", + "futures-executor", "std" ], "selects": {} @@ -4834,15 +4825,15 @@ "aarch64-apple-ios-sim": [ "default" ], - "aarch64-fuchsia": [ - "default" - ], "aarch64-linux-android": [ "default" ], "aarch64-pc-windows-msvc": [ "default" ], + "aarch64-unknown-fuchsia": [ + "default" + ], "aarch64-unknown-linux-gnu": [ "default" ], @@ -4900,9 +4891,6 @@ "x86_64-apple-ios": [ "default" ], - "x86_64-fuchsia": [ - "default" - ], "x86_64-linux-android": [ "default" ], @@ -4912,6 +4900,9 @@ "x86_64-unknown-freebsd": [ "default" ], + "x86_64-unknown-fuchsia": [ + "default" + ], "x86_64-unknown-linux-gnu": [ "default" ], @@ -4990,15 +4981,15 @@ "aarch64-apple-ios-sim": [ "default" ], - "aarch64-fuchsia": [ - "default" - ], "aarch64-linux-android": [ "default" ], "aarch64-pc-windows-msvc": [ "default" ], + "aarch64-unknown-fuchsia": [ + "default" + ], "aarch64-unknown-linux-gnu": [ "default" ], @@ -5056,9 +5047,6 @@ "x86_64-apple-ios": [ "default" ], - "x86_64-fuchsia": [ - "default" - ], "x86_64-linux-android": [ "default" ], @@ -5068,6 +5056,9 @@ "x86_64-unknown-freebsd": [ "default" ], + "x86_64-unknown-fuchsia": [ + "default" + ], "x86_64-unknown-linux-gnu": [ "default" ], @@ -5228,7 +5219,7 @@ "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -5236,7 +5227,7 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" } ], @@ -5286,104 +5277,7 @@ "alloc", "std" ], - "selects": { - "aarch64-apple-darwin": [ - "default" - ], - "aarch64-apple-ios": [ - "default" - ], - "aarch64-apple-ios-sim": [ - "default" - ], - "aarch64-fuchsia": [ - "default" - ], - "aarch64-linux-android": [ - "default" - ], - "aarch64-pc-windows-msvc": [ - "default" - ], - "aarch64-unknown-linux-gnu": [ - "default" - ], - "aarch64-unknown-nixos-gnu": [ - "default" - ], - "aarch64-unknown-nto-qnx710": [ - "default" - ], - "arm-unknown-linux-gnueabi": [ - "default" - ], - "armv7-linux-androideabi": [ - "default" - ], - "armv7-unknown-linux-gnueabi": [ - "default" - ], - "i686-apple-darwin": [ - "default" - ], - "i686-linux-android": [ - "default" - ], - "i686-pc-windows-msvc": [ - "default" - ], - "i686-unknown-freebsd": [ - "default" - ], - "i686-unknown-linux-gnu": [ - "default" - ], - "powerpc-unknown-linux-gnu": [ - "default" - ], - "riscv32imc-unknown-none-elf": [ - "default" - ], - "riscv64gc-unknown-none-elf": [ - "default" - ], - "s390x-unknown-linux-gnu": [ - "default" - ], - "thumbv7em-none-eabi": [ - "default" - ], - "thumbv8m.main-none-eabi": [ - "default" - ], - "x86_64-apple-darwin": [ - "default" - ], - "x86_64-apple-ios": [ - "default" - ], - "x86_64-fuchsia": [ - "default" - ], - "x86_64-linux-android": [ - "default" - ], - "x86_64-pc-windows-msvc": [ - "default" - ], - "x86_64-unknown-freebsd": [ - "default" - ], - "x86_64-unknown-linux-gnu": [ - "default" - ], - "x86_64-unknown-nixos-gnu": [ - "default" - ], - "x86_64-unknown-none": [ - "default" - ] - } + "selects": {} }, "edition": "2018", "version": "0.3.30" @@ -5724,7 +5618,7 @@ ], "cfg(unix)": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ] @@ -5825,20 +5719,20 @@ ], "license_file": "LICENSE-APACHE" }, - "h2 0.3.26": { - "name": "h2", - "version": "0.3.26", - "package_url": "https://github.com/hyperium/h2", + "hashbrown 0.12.3": { + "name": "hashbrown", + "version": "0.12.3", + "package_url": "https://github.com/rust-lang/hashbrown", "repository": { "Http": { - "url": "https://static.crates.io/crates/h2/0.3.26/download", - "sha256": "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" + "url": "https://static.crates.io/crates/hashbrown/0.12.3/download", + "sha256": "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" } }, "targets": [ { "Library": { - "crate_name": "h2", + "crate_name": "hashbrown", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -5849,101 +5743,14 @@ } } ], - "library_target_name": "h2", + "library_target_name": "hashbrown", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { + "crate_features": { "common": [ - { - "id": "bytes 1.6.0", - "target": "bytes" - }, - { - "id": "fnv 1.0.7", - "target": "fnv" - }, - { - "id": "futures-core 0.3.30", - "target": "futures_core" - }, - { - "id": "futures-sink 0.3.30", - "target": "futures_sink" - }, - { - "id": "futures-util 0.3.30", - "target": "futures_util" - }, - { - "id": "http 0.2.12", - "target": "http" - }, - { - "id": "indexmap 2.2.6", - "target": "indexmap" - }, - { - "id": "slab 0.4.9", - "target": "slab" - }, - { - "id": "tokio 1.40.0", - "target": "tokio" - }, - { - "id": "tokio-util 0.7.11", - "target": "tokio_util" - }, - { - "id": "tracing 0.1.40", - "target": "tracing" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.3.26" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE" - }, - "hashbrown 0.12.3": { - "name": "hashbrown", - "version": "0.12.3", - "package_url": "https://github.com/rust-lang/hashbrown", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/hashbrown/0.12.3/download", - "sha256": "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - } - }, - "targets": [ - { - "Library": { - "crate_name": "hashbrown", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "hashbrown", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "raw" + "raw" ], "selects": {} }, @@ -6177,62 +5984,6 @@ ], "license_file": "LICENSE-APACHE" }, - "http 0.2.12": { - "name": "http", - "version": "0.2.12", - "package_url": "https://github.com/hyperium/http", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/http/0.2.12/download", - "sha256": "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" - } - }, - "targets": [ - { - "Library": { - "crate_name": "http", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "http", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "bytes 1.6.0", - "target": "bytes" - }, - { - "id": "fnv 1.0.7", - "target": "fnv" - }, - { - "id": "itoa 1.0.11", - "target": "itoa" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.2.12" - }, - "license": "MIT OR Apache-2.0", - "license_ids": [ - "Apache-2.0", - "MIT" - ], - "license_file": "LICENSE-APACHE" - }, "http 1.1.0": { "name": "http", "version": "1.1.0", @@ -6272,7 +6023,7 @@ "deps": { "common": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -6296,61 +6047,6 @@ ], "license_file": "LICENSE-APACHE" }, - "http-body 0.4.6": { - "name": "http-body", - "version": "0.4.6", - "package_url": "https://github.com/hyperium/http-body", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/http-body/0.4.6/download", - "sha256": "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" - } - }, - "targets": [ - { - "Library": { - "crate_name": "http_body", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "http_body", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "bytes 1.6.0", - "target": "bytes" - }, - { - "id": "http 0.2.12", - "target": "http" - }, - { - "id": "pin-project-lite 0.2.14", - "target": "pin_project_lite" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.4.6" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE" - }, "http-body 1.0.0": { "name": "http-body", "version": "1.0.0", @@ -6383,7 +6079,7 @@ "deps": { "common": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -6434,7 +6130,7 @@ "deps": { "common": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -6540,45 +6236,6 @@ ], "license_file": "LICENSE-APACHE" }, - "httpdate 1.0.3": { - "name": "httpdate", - "version": "1.0.3", - "package_url": "https://github.com/pyfisch/httpdate", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/httpdate/1.0.3/download", - "sha256": "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - } - }, - "targets": [ - { - "Library": { - "crate_name": "httpdate", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "httpdate", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "edition": "2021", - "version": "1.0.3" - }, - "license": "MIT OR Apache-2.0", - "license_ids": [ - "Apache-2.0", - "MIT" - ], - "license_file": "LICENSE-APACHE" - }, "humantime 2.1.0": { "name": "humantime", "version": "2.1.0", @@ -6618,14 +6275,14 @@ ], "license_file": "LICENSE-APACHE" }, - "hyper 0.14.28": { + "hyper 1.3.1": { "name": "hyper", - "version": "0.14.28", + "version": "1.3.1", "package_url": "https://github.com/hyperium/hyper", "repository": { "Http": { - "url": "https://static.crates.io/crates/hyper/0.14.28/download", - "sha256": "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" + "url": "https://static.crates.io/crates/hyper/1.3.1/download", + "sha256": "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" } }, "targets": [ @@ -6650,53 +6307,37 @@ "crate_features": { "common": [ "client", - "h2", - "http1", - "http2", - "runtime", - "socket2", - "tcp" + "default", + "http1" ], "selects": {} }, "deps": { "common": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { "id": "futures-channel 0.3.30", "target": "futures_channel" }, - { - "id": "futures-core 0.3.30", - "target": "futures_core" - }, { "id": "futures-util 0.3.30", "target": "futures_util" }, { - "id": "h2 0.3.26", - "target": "h2" - }, - { - "id": "http 0.2.12", + "id": "http 1.1.0", "target": "http" }, { - "id": "http-body 0.4.6", + "id": "http-body 1.0.0", "target": "http_body" }, { "id": "httparse 1.8.0", "target": "httparse" }, - { - "id": "httpdate 1.0.3", - "target": "httpdate" - }, { "id": "itoa 1.0.11", "target": "itoa" @@ -6706,21 +6347,13 @@ "target": "pin_project_lite" }, { - "id": "socket2 0.5.7", - "target": "socket2" + "id": "smallvec 1.13.2", + "target": "smallvec" }, { - "id": "tokio 1.40.0", + "id": "tokio 1.42.0", "target": "tokio" }, - { - "id": "tower-service 0.3.2", - "target": "tower_service" - }, - { - "id": "tracing 0.1.40", - "target": "tracing" - }, { "id": "want 0.3.1", "target": "want" @@ -6728,8 +6361,8 @@ ], "selects": {} }, - "edition": "2018", - "version": "0.14.28" + "edition": "2021", + "version": "1.3.1" }, "license": "MIT", "license_ids": [ @@ -6737,20 +6370,20 @@ ], "license_file": "LICENSE" }, - "hyper 1.3.1": { - "name": "hyper", - "version": "1.3.1", - "package_url": "https://github.com/hyperium/hyper", + "hyper-rustls 0.27.2": { + "name": "hyper-rustls", + "version": "0.27.2", + "package_url": "https://github.com/rustls/hyper-rustls", "repository": { "Http": { - "url": "https://static.crates.io/crates/hyper/1.3.1/download", - "sha256": "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" + "url": "https://static.crates.io/crates/hyper-rustls/0.27.2/download", + "sha256": "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" } }, "targets": [ { "Library": { - "crate_name": "hyper", + "crate_name": "hyper_rustls", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -6761,29 +6394,23 @@ } } ], - "library_target_name": "hyper", + "library_target_name": "hyper_rustls", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "client", - "default", - "http1" + "http1", + "ring", + "tls12", + "webpki-roots", + "webpki-tokio" ], "selects": {} }, "deps": { "common": [ - { - "id": "bytes 1.6.0", - "target": "bytes" - }, - { - "id": "futures-channel 0.3.30", - "target": "futures_channel" - }, { "id": "futures-util 0.3.30", "target": "futures_util" @@ -6793,182 +6420,24 @@ "target": "http" }, { - "id": "http-body 1.0.0", - "target": "http_body" + "id": "hyper 1.3.1", + "target": "hyper" }, { - "id": "httparse 1.8.0", - "target": "httparse" + "id": "hyper-util 0.1.3", + "target": "hyper_util" }, { - "id": "itoa 1.0.11", - "target": "itoa" + "id": "rustls 0.23.12", + "target": "rustls" }, { - "id": "pin-project-lite 0.2.14", - "target": "pin_project_lite" + "id": "rustls-pki-types 1.7.0", + "target": "rustls_pki_types", + "alias": "pki_types" }, { - "id": "smallvec 1.13.2", - "target": "smallvec" - }, - { - "id": "tokio 1.40.0", - "target": "tokio" - }, - { - "id": "want 0.3.1", - "target": "want" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "1.3.1" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE" - }, - "hyper-rustls 0.24.2": { - "name": "hyper-rustls", - "version": "0.24.2", - "package_url": "https://github.com/rustls/hyper-rustls", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/hyper-rustls/0.24.2/download", - "sha256": "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" - } - }, - "targets": [ - { - "Library": { - "crate_name": "hyper_rustls", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "hyper_rustls", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "futures-util 0.3.30", - "target": "futures_util" - }, - { - "id": "http 0.2.12", - "target": "http" - }, - { - "id": "hyper 0.14.28", - "target": "hyper" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "tokio 1.40.0", - "target": "tokio" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.24.2" - }, - "license": "Apache-2.0 OR ISC OR MIT", - "license_ids": [ - "Apache-2.0", - "ISC", - "MIT" - ], - "license_file": "LICENSE" - }, - "hyper-rustls 0.27.2": { - "name": "hyper-rustls", - "version": "0.27.2", - "package_url": "https://github.com/rustls/hyper-rustls", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/hyper-rustls/0.27.2/download", - "sha256": "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" - } - }, - "targets": [ - { - "Library": { - "crate_name": "hyper_rustls", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "hyper_rustls", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "http1", - "ring", - "tls12", - "webpki-roots", - "webpki-tokio" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "futures-util 0.3.30", - "target": "futures_util" - }, - { - "id": "http 1.1.0", - "target": "http" - }, - { - "id": "hyper 1.3.1", - "target": "hyper" - }, - { - "id": "hyper-util 0.1.3", - "target": "hyper_util" - }, - { - "id": "rustls 0.23.12", - "target": "rustls" - }, - { - "id": "rustls-pki-types 1.7.0", - "target": "rustls_pki_types", - "alias": "pki_types" - }, - { - "id": "tokio 1.40.0", + "id": "tokio 1.42.0", "target": "tokio" }, { @@ -7039,7 +6508,7 @@ "deps": { "common": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -7071,7 +6540,7 @@ "target": "socket2" }, { - "id": "tokio 1.40.0", + "id": "tokio 1.42.0", "target": "tokio" }, { @@ -7259,20 +6728,20 @@ ], "license_file": "LICENSE-APACHE" }, - "idna 0.5.0": { - "name": "idna", - "version": "0.5.0", - "package_url": "https://github.com/servo/rust-url/", + "icu_collections 1.5.0": { + "name": "icu_collections", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/idna/0.5.0/download", - "sha256": "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" + "url": "https://static.crates.io/crates/icu_collections/1.5.0/download", + "sha256": "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" } }, "targets": [ { "Library": { - "crate_name": "idna", + "crate_name": "icu_collections", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7283,56 +6752,60 @@ } } ], - "library_target_name": "idna", + "library_target_name": "icu_collections", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { + "deps": { "common": [ - "alloc", - "default", - "std" + { + "id": "yoke 0.7.5", + "target": "yoke" + }, + { + "id": "zerofrom 0.1.5", + "target": "zerofrom" + }, + { + "id": "zerovec 0.10.4", + "target": "zerovec" + } ], "selects": {} }, - "deps": { + "edition": "2021", + "proc_macro_deps": { "common": [ { - "id": "unicode-bidi 0.3.15", - "target": "unicode_bidi" - }, - { - "id": "unicode-normalization 0.1.23", - "target": "unicode_normalization" + "id": "displaydoc 0.2.5", + "target": "displaydoc" } ], "selects": {} }, - "edition": "2018", - "version": "0.5.0" + "version": "1.5.0" }, - "license": "MIT OR Apache-2.0", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "indexmap 1.9.3": { - "name": "indexmap", - "version": "1.9.3", - "package_url": "https://github.com/bluss/indexmap", + "icu_locid 1.5.0": { + "name": "icu_locid", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/indexmap/1.9.3/download", - "sha256": "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" + "url": "https://static.crates.io/crates/icu_locid/1.5.0/download", + "sha256": "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" } }, "targets": [ { "Library": { - "crate_name": "indexmap", + "crate_name": "icu_locid", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7341,79 +6814,72 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], - "library_target_name": "indexmap", + "library_target_name": "icu_locid", "common_attrs": { "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "zerovec" + ], + "selects": {} + }, "deps": { "common": [ { - "id": "hashbrown 0.12.3", - "target": "hashbrown" + "id": "litemap 0.7.4", + "target": "litemap" }, { - "id": "indexmap 1.9.3", - "target": "build_script_build" + "id": "tinystr 0.7.6", + "target": "tinystr" + }, + { + "id": "writeable 0.5.5", + "target": "writeable" + }, + { + "id": "zerovec 0.10.4", + "target": "zerovec" } ], "selects": {} }, "edition": "2021", - "version": "1.9.3" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ], - "deps": { + "proc_macro_deps": { "common": [ { - "id": "autocfg 1.3.0", - "target": "autocfg" + "id": "displaydoc 0.2.5", + "target": "displaydoc" } ], "selects": {} - } + }, + "version": "1.5.0" }, - "license": "Apache-2.0 OR MIT", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "indexmap 2.2.6": { - "name": "indexmap", - "version": "2.2.6", - "package_url": "https://github.com/indexmap-rs/indexmap", + "icu_locid_transform 1.5.0": { + "name": "icu_locid_transform", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/indexmap/2.2.6/download", - "sha256": "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" + "url": "https://static.crates.io/crates/icu_locid_transform/1.5.0/download", + "sha256": "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" } }, "targets": [ { "Library": { - "crate_name": "indexmap", + "crate_name": "icu_locid_transform", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7424,55 +6890,74 @@ } } ], - "library_target_name": "indexmap", + "library_target_name": "icu_locid_transform", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "default", - "std" + "compiled_data" ], "selects": {} }, "deps": { "common": [ { - "id": "equivalent 1.0.1", - "target": "equivalent" + "id": "icu_locid 1.5.0", + "target": "icu_locid" }, { - "id": "hashbrown 0.14.5", - "target": "hashbrown" - } - ], - "selects": {} - }, + "id": "icu_locid_transform_data 1.5.0", + "target": "icu_locid_transform_data" + }, + { + "id": "icu_provider 1.5.0", + "target": "icu_provider" + }, + { + "id": "tinystr 0.7.6", + "target": "tinystr" + }, + { + "id": "zerovec 0.10.4", + "target": "zerovec" + } + ], + "selects": {} + }, "edition": "2021", - "version": "2.2.6" + "proc_macro_deps": { + "common": [ + { + "id": "displaydoc 0.2.5", + "target": "displaydoc" + } + ], + "selects": {} + }, + "version": "1.5.0" }, - "license": "Apache-2.0 OR MIT", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "infer 0.8.1": { - "name": "infer", - "version": "0.8.1", - "package_url": "https://github.com/bojand/infer", + "icu_locid_transform_data 1.5.0": { + "name": "icu_locid_transform_data", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/infer/0.8.1/download", - "sha256": "e035cede526e0b21d5adffc9fa0eb4ef5d6026fe9c5b0bfe8084b9472b587a55" + "url": "https://static.crates.io/crates/icu_locid_transform_data/1.5.0/download", + "sha256": "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" } }, "targets": [ { "Library": { - "crate_name": "infer", + "crate_name": "icu_locid_transform_data", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7483,52 +6968,34 @@ } } ], - "library_target_name": "infer", + "library_target_name": "icu_locid_transform_data", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "alloc", - "cfb", - "default", - "std" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "cfb 0.7.3", - "target": "cfb" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.8.1" + "edition": "2021", + "version": "1.5.0" }, - "license": "MIT", + "license": "Unicode-3.0", "license_ids": [ - "MIT" + "Unicode-3.0" ], "license_file": "LICENSE" }, - "infer 0.16.0": { - "name": "infer", - "version": "0.16.0", - "package_url": "https://github.com/bojand/infer", + "icu_normalizer 1.5.0": { + "name": "icu_normalizer", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/infer/0.16.0/download", - "sha256": "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" + "url": "https://static.crates.io/crates/icu_normalizer/1.5.0/download", + "sha256": "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" } }, "targets": [ { "Library": { - "crate_name": "infer", + "crate_name": "icu_normalizer", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7539,98 +7006,91 @@ } } ], - "library_target_name": "infer", + "library_target_name": "icu_normalizer", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "alloc", - "cfb", - "default", - "std" + "compiled_data", + "default" ], "selects": {} }, "deps": { "common": [ { - "id": "cfb 0.7.3", - "target": "cfb" + "id": "icu_collections 1.5.0", + "target": "icu_collections" + }, + { + "id": "icu_normalizer_data 1.5.0", + "target": "icu_normalizer_data" + }, + { + "id": "icu_properties 1.5.1", + "target": "icu_properties" + }, + { + "id": "icu_provider 1.5.0", + "target": "icu_provider" + }, + { + "id": "smallvec 1.13.2", + "target": "smallvec" + }, + { + "id": "utf16_iter 1.0.5", + "target": "utf16_iter" + }, + { + "id": "utf8_iter 1.0.4", + "target": "utf8_iter" + }, + { + "id": "write16 1.0.0", + "target": "write16" + }, + { + "id": "zerovec 0.10.4", + "target": "zerovec" } ], "selects": {} }, - "edition": "2018", - "version": "0.16.0" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE" - }, - "ipnet 2.9.0": { - "name": "ipnet", - "version": "2.9.0", - "package_url": "https://github.com/krisprice/ipnet", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/ipnet/2.9.0/download", - "sha256": "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - } - }, - "targets": [ - { - "Library": { - "crate_name": "ipnet", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "ipnet", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { + "edition": "2021", + "proc_macro_deps": { "common": [ - "default", - "std" + { + "id": "displaydoc 0.2.5", + "target": "displaydoc" + } ], "selects": {} }, - "edition": "2018", - "version": "2.9.0" + "version": "1.5.0" }, - "license": "MIT OR Apache-2.0", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "is_executable 1.0.4": { - "name": "is_executable", - "version": "1.0.4", - "package_url": "https://github.com/fitzgen/is_executable", + "icu_normalizer_data 1.5.0": { + "name": "icu_normalizer_data", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/is_executable/1.0.4/download", - "sha256": "d4a1b5bad6f9072935961dfbf1cced2f3d129963d091b6f69f007fe04e758ae2" + "url": "https://static.crates.io/crates/icu_normalizer_data/1.5.0/download", + "sha256": "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" } }, "targets": [ { "Library": { - "crate_name": "is_executable", + "crate_name": "icu_normalizer_data", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7641,46 +7101,34 @@ } } ], - "library_target_name": "is_executable", + "library_target_name": "icu_normalizer_data", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { - "common": [], - "selects": { - "cfg(target_os = \"windows\")": [ - { - "id": "winapi 0.3.9", - "target": "winapi" - } - ] - } - }, "edition": "2021", - "version": "1.0.4" + "version": "1.5.0" }, - "license": "Apache-2.0/MIT", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "is_terminal_polyfill 1.70.0": { - "name": "is_terminal_polyfill", - "version": "1.70.0", - "package_url": "https://github.com/polyfill-rs/is_terminal_polyfill", + "icu_properties 1.5.1": { + "name": "icu_properties", + "version": "1.5.1", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/is_terminal_polyfill/1.70.0/download", - "sha256": "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + "url": "https://static.crates.io/crates/icu_properties/1.5.1/download", + "sha256": "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" } }, "targets": [ { "Library": { - "crate_name": "is_terminal_polyfill", + "crate_name": "icu_properties", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7691,41 +7139,79 @@ } } ], - "library_target_name": "is_terminal_polyfill", + "library_target_name": "icu_properties", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ + "compiled_data", "default" ], "selects": {} }, + "deps": { + "common": [ + { + "id": "icu_collections 1.5.0", + "target": "icu_collections" + }, + { + "id": "icu_locid_transform 1.5.0", + "target": "icu_locid_transform" + }, + { + "id": "icu_properties_data 1.5.0", + "target": "icu_properties_data" + }, + { + "id": "icu_provider 1.5.0", + "target": "icu_provider" + }, + { + "id": "tinystr 0.7.6", + "target": "tinystr" + }, + { + "id": "zerovec 0.10.4", + "target": "zerovec" + } + ], + "selects": {} + }, "edition": "2021", - "version": "1.70.0" + "proc_macro_deps": { + "common": [ + { + "id": "displaydoc 0.2.5", + "target": "displaydoc" + } + ], + "selects": {} + }, + "version": "1.5.1" }, - "license": "MIT OR Apache-2.0", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "itoa 1.0.11": { - "name": "itoa", - "version": "1.0.11", - "package_url": "https://github.com/dtolnay/itoa", + "icu_properties_data 1.5.0": { + "name": "icu_properties_data", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/itoa/1.0.11/download", - "sha256": "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + "url": "https://static.crates.io/crates/icu_properties_data/1.5.0/download", + "sha256": "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" } }, "targets": [ { "Library": { - "crate_name": "itoa", + "crate_name": "icu_properties_data", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7736,35 +7222,34 @@ } } ], - "library_target_name": "itoa", + "library_target_name": "icu_properties_data", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2018", - "version": "1.0.11" + "edition": "2021", + "version": "1.5.0" }, - "license": "MIT OR Apache-2.0", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "jobserver 0.1.31": { - "name": "jobserver", - "version": "0.1.31", - "package_url": "https://github.com/rust-lang/jobserver-rs", + "icu_provider 1.5.0": { + "name": "icu_provider", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/jobserver/0.1.31/download", - "sha256": "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" + "url": "https://static.crates.io/crates/icu_provider/1.5.0/download", + "sha256": "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" } }, "targets": [ { "Library": { - "crate_name": "jobserver", + "crate_name": "icu_provider", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7775,46 +7260,86 @@ } } ], - "library_target_name": "jobserver", + "library_target_name": "icu_provider", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { - "common": [], - "selects": { - "cfg(unix)": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ] - } + "crate_features": { + "common": [ + "macros" + ], + "selects": {} }, - "edition": "2021", - "version": "0.1.31" + "deps": { + "common": [ + { + "id": "icu_locid 1.5.0", + "target": "icu_locid" + }, + { + "id": "stable_deref_trait 1.2.0", + "target": "stable_deref_trait" + }, + { + "id": "tinystr 0.7.6", + "target": "tinystr" + }, + { + "id": "writeable 0.5.5", + "target": "writeable" + }, + { + "id": "yoke 0.7.5", + "target": "yoke" + }, + { + "id": "zerofrom 0.1.5", + "target": "zerofrom" + }, + { + "id": "zerovec 0.10.4", + "target": "zerovec" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "displaydoc 0.2.5", + "target": "displaydoc" + }, + { + "id": "icu_provider_macros 1.5.0", + "target": "icu_provider_macros" + } + ], + "selects": {} + }, + "version": "1.5.0" }, - "license": "MIT OR Apache-2.0", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "js-sys 0.3.69": { - "name": "js-sys", - "version": "0.3.69", - "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys", + "icu_provider_macros 1.5.0": { + "name": "icu_provider_macros", + "version": "1.5.0", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/js-sys/0.3.69/download", - "sha256": "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" + "url": "https://static.crates.io/crates/icu_provider_macros/1.5.0/download", + "sha256": "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" } }, "targets": [ { - "Library": { - "crate_name": "js_sys", + "ProcMacro": { + "crate_name": "icu_provider_macros", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7825,7 +7350,7 @@ } } ], - "library_target_name": "js_sys", + "library_target_name": "icu_provider_macros", "common_attrs": { "compile_data_glob": [ "**" @@ -7833,36 +7358,43 @@ "deps": { "common": [ { - "id": "wasm-bindgen 0.2.92", - "target": "wasm_bindgen" + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.90", + "target": "syn" } ], "selects": {} }, - "edition": "2018", - "version": "0.3.69" + "edition": "2021", + "version": "1.5.0" }, - "license": "MIT OR Apache-2.0", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "libc 0.2.160": { - "name": "libc", - "version": "0.2.160", - "package_url": "https://github.com/rust-lang/libc", + "idna 1.0.3": { + "name": "idna", + "version": "1.0.3", + "package_url": "https://github.com/servo/rust-url/", "repository": { "Http": { - "url": "https://static.crates.io/crates/libc/0.2.160/download", - "sha256": "f0b21006cd1874ae9e650973c565615676dc4a274c965bb0a73796dac838ce4f" + "url": "https://static.crates.io/crates/idna/1.0.3/download", + "sha256": "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" } }, "targets": [ { "Library": { - "crate_name": "libc", + "crate_name": "idna", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -7871,106 +7403,40 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], - "library_target_name": "libc", + "library_target_name": "idna", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "default", + "alloc", + "compiled_data", "std" ], - "selects": { - "aarch64-apple-darwin": [ - "extra_traits" - ], - "aarch64-apple-ios": [ - "extra_traits" - ], - "aarch64-apple-ios-sim": [ - "extra_traits" - ], - "aarch64-fuchsia": [ - "extra_traits" - ], - "aarch64-linux-android": [ - "extra_traits" - ], - "aarch64-unknown-nto-qnx710": [ - "extra_traits" - ], - "armv7-linux-androideabi": [ - "extra_traits" - ], - "i686-apple-darwin": [ - "extra_traits" - ], - "i686-linux-android": [ - "extra_traits" - ], - "i686-unknown-freebsd": [ - "extra_traits" - ], - "powerpc-unknown-linux-gnu": [ - "extra_traits" - ], - "s390x-unknown-linux-gnu": [ - "extra_traits" - ], - "wasm32-wasi": [ - "extra_traits" - ], - "x86_64-apple-darwin": [ - "extra_traits" - ], - "x86_64-apple-ios": [ - "extra_traits" - ], - "x86_64-fuchsia": [ - "extra_traits" - ], - "x86_64-linux-android": [ - "extra_traits" - ], - "x86_64-unknown-freebsd": [ - "extra_traits" - ] - } + "selects": {} }, "deps": { "common": [ { - "id": "libc 0.2.160", - "target": "build_script_build" + "id": "idna_adapter 1.2.0", + "target": "idna_adapter" + }, + { + "id": "smallvec 1.13.2", + "target": "smallvec" + }, + { + "id": "utf8_iter 1.0.4", + "target": "utf8_iter" } ], "selects": {} }, - "edition": "2015", - "version": "0.2.160" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ] + "edition": "2018", + "version": "1.0.3" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -7979,20 +7445,20 @@ ], "license_file": "LICENSE-APACHE" }, - "libredox 0.1.3": { - "name": "libredox", - "version": "0.1.3", - "package_url": "https://gitlab.redox-os.org/redox-os/libredox.git", + "idna_adapter 1.2.0": { + "name": "idna_adapter", + "version": "1.2.0", + "package_url": "https://github.com/hsivonen/idna_adapter", "repository": { "Http": { - "url": "https://static.crates.io/crates/libredox/0.1.3/download", - "sha256": "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" + "url": "https://static.crates.io/crates/idna_adapter/1.2.0/download", + "sha256": "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" } }, "targets": [ { "Library": { - "crate_name": "libredox", + "crate_name": "idna_adapter", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8003,47 +7469,54 @@ } } ], - "library_target_name": "libredox", + "library_target_name": "idna_adapter", "common_attrs": { "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "compiled_data" + ], + "selects": {} + }, "deps": { "common": [ { - "id": "bitflags 2.5.0", - "target": "bitflags" + "id": "icu_normalizer 1.5.0", + "target": "icu_normalizer" }, { - "id": "libc 0.2.160", - "target": "libc" + "id": "icu_properties 1.5.1", + "target": "icu_properties" } ], "selects": {} }, "edition": "2021", - "version": "0.1.3" + "version": "1.2.0" }, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "license_ids": [ + "Apache-2.0", "MIT" ], - "license_file": "LICENSE" + "license_file": "LICENSE-APACHE" }, - "libz-sys 1.1.20": { - "name": "libz-sys", - "version": "1.1.20", - "package_url": "https://github.com/rust-lang/libz-sys", + "indexmap 1.9.3": { + "name": "indexmap", + "version": "1.9.3", + "package_url": "https://github.com/bluss/indexmap", "repository": { "Http": { - "url": "https://static.crates.io/crates/libz-sys/1.1.20/download", - "sha256": "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" + "url": "https://static.crates.io/crates/indexmap/1.9.3/download", + "sha256": "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" } }, "targets": [ { "Library": { - "crate_name": "libz_sys", + "crate_name": "indexmap", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8066,7 +7539,7 @@ } } ], - "library_target_name": "libz_sys", + "library_target_name": "indexmap", "common_attrs": { "compile_data_glob": [ "**" @@ -8074,14 +7547,18 @@ "deps": { "common": [ { - "id": "libz-sys 1.1.20", + "id": "hashbrown 0.12.3", + "target": "hashbrown" + }, + { + "id": "indexmap 1.9.3", "target": "build_script_build" } ], "selects": {} }, - "edition": "2018", - "version": "1.1.20" + "edition": "2021", + "version": "1.9.3" }, "build_script_attrs": { "compile_data_glob": [ @@ -8093,43 +7570,34 @@ "deps": { "common": [ { - "id": "cc 1.1.30", - "target": "cc" - }, - { - "id": "pkg-config 0.3.30", - "target": "pkg_config" - }, - { - "id": "vcpkg 0.2.15", - "target": "vcpkg" + "id": "autocfg 1.3.0", + "target": "autocfg" } ], "selects": {} - }, - "links": "z" + } }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "linux-raw-sys 0.4.14": { - "name": "linux-raw-sys", - "version": "0.4.14", - "package_url": "https://github.com/sunfishcode/linux-raw-sys", + "indexmap 2.2.6": { + "name": "indexmap", + "version": "2.2.6", + "package_url": "https://github.com/indexmap-rs/indexmap", "repository": { "Http": { - "url": "https://static.crates.io/crates/linux-raw-sys/0.4.14/download", - "sha256": "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + "url": "https://static.crates.io/crates/indexmap/2.2.6/download", + "sha256": "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" } }, "targets": [ { "Library": { - "crate_name": "linux_raw_sys", + "crate_name": "indexmap", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8140,85 +7608,55 @@ } } ], - "library_target_name": "linux_raw_sys", + "library_target_name": "indexmap", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "general", - "ioctl", - "no_std" + "default", + "std" ], - "selects": { - "aarch64-unknown-linux-gnu": [ - "elf", - "errno", - "std" - ], - "aarch64-unknown-nixos-gnu": [ - "elf", - "errno", - "std" - ], - "arm-unknown-linux-gnueabi": [ - "elf", - "errno", - "std" - ], - "armv7-unknown-linux-gnueabi": [ - "elf", - "errno", - "std" - ], - "i686-unknown-linux-gnu": [ - "elf", - "errno", - "std" - ], - "powerpc-unknown-linux-gnu": [ - "std" - ], - "s390x-unknown-linux-gnu": [ - "std" - ], - "x86_64-unknown-linux-gnu": [ - "elf", - "errno", - "std" - ], - "x86_64-unknown-nixos-gnu": [ - "elf", - "errno", - "std" - ] - } + "selects": {} + }, + "deps": { + "common": [ + { + "id": "equivalent 1.0.1", + "target": "equivalent" + }, + { + "id": "hashbrown 0.14.5", + "target": "hashbrown" + } + ], + "selects": {} }, "edition": "2021", - "version": "0.4.14" + "version": "2.2.6" }, - "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "log 0.4.22": { - "name": "log", - "version": "0.4.22", - "package_url": "https://github.com/rust-lang/log", + "infer 0.8.1": { + "name": "infer", + "version": "0.8.1", + "package_url": "https://github.com/bojand/infer", "repository": { "Http": { - "url": "https://static.crates.io/crates/log/0.4.22/download", - "sha256": "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + "url": "https://static.crates.io/crates/infer/0.8.1/download", + "sha256": "e035cede526e0b21d5adffc9fa0eb4ef5d6026fe9c5b0bfe8084b9472b587a55" } }, "targets": [ { "Library": { - "crate_name": "log", + "crate_name": "infer", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8229,41 +7667,52 @@ } } ], - "library_target_name": "log", + "library_target_name": "infer", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ + "alloc", + "cfb", + "default", "std" ], "selects": {} }, - "edition": "2021", - "version": "0.4.22" + "deps": { + "common": [ + { + "id": "cfb 0.7.3", + "target": "cfb" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.8.1" }, - "license": "MIT OR Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0", "MIT" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "lzma-rust 0.1.7": { - "name": "lzma-rust", - "version": "0.1.7", - "package_url": "https://github.com/dyz1990/sevenz-rust/tree/main/lzma-rust", + "infer 0.16.0": { + "name": "infer", + "version": "0.16.0", + "package_url": "https://github.com/bojand/infer", "repository": { "Http": { - "url": "https://static.crates.io/crates/lzma-rust/0.1.7/download", - "sha256": "5baab2bbbd7d75a144d671e9ff79270e903957d92fb7386fd39034c709bd2661" + "url": "https://static.crates.io/crates/infer/0.16.0/download", + "sha256": "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" } }, "targets": [ { "Library": { - "crate_name": "lzma_rust", + "crate_name": "infer", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8274,49 +7723,52 @@ } } ], - "library_target_name": "lzma_rust", + "library_target_name": "infer", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "encoder" + "alloc", + "cfb", + "default", + "std" ], "selects": {} }, "deps": { "common": [ { - "id": "byteorder 1.5.0", - "target": "byteorder" + "id": "cfb 0.7.3", + "target": "cfb" } ], "selects": {} }, - "edition": "2021", - "version": "0.1.7" + "edition": "2018", + "version": "0.16.0" }, - "license": "Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0" + "MIT" ], - "license_file": null + "license_file": "LICENSE" }, - "lzma-sys 0.1.20": { - "name": "lzma-sys", - "version": "0.1.20", - "package_url": "https://github.com/alexcrichton/xz2-rs", + "ipnet 2.9.0": { + "name": "ipnet", + "version": "2.9.0", + "package_url": "https://github.com/krisprice/ipnet", "repository": { "Http": { - "url": "https://static.crates.io/crates/lzma-sys/0.1.20/download", - "sha256": "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" + "url": "https://static.crates.io/crates/ipnet/2.9.0/download", + "sha256": "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" } }, "targets": [ { "Library": { - "crate_name": "lzma_sys", + "crate_name": "ipnet", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8325,90 +7777,44 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], - "library_target_name": "lzma_sys", + "library_target_name": "ipnet", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "static" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "libc 0.2.160", - "target": "libc" - }, - { - "id": "lzma-sys 0.1.20", - "target": "build_script_build" - } + "default", + "std" ], "selects": {} }, "edition": "2018", - "version": "0.1.20" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "cc 1.1.30", - "target": "cc" - }, - { - "id": "pkg-config 0.3.30", - "target": "pkg_config" - } - ], - "selects": {} - }, - "links": "lzma" + "version": "2.9.0" }, - "license": "MIT/Apache-2.0", + "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "md-5 0.10.6": { - "name": "md-5", - "version": "0.10.6", - "package_url": "https://github.com/RustCrypto/hashes", + "is_executable 1.0.4": { + "name": "is_executable", + "version": "1.0.4", + "package_url": "https://github.com/fitzgen/is_executable", "repository": { "Http": { - "url": "https://static.crates.io/crates/md-5/0.10.6/download", - "sha256": "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" + "url": "https://static.crates.io/crates/is_executable/1.0.4/download", + "sha256": "d4a1b5bad6f9072935961dfbf1cced2f3d129963d091b6f69f007fe04e758ae2" } }, "targets": [ { "Library": { - "crate_name": "md5", + "crate_name": "is_executable", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8419,55 +7825,46 @@ } } ], - "library_target_name": "md5", + "library_target_name": "is_executable", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default", - "std" - ], - "selects": {} - }, "deps": { - "common": [ - { - "id": "cfg-if 1.0.0", - "target": "cfg_if" - }, - { - "id": "digest 0.10.7", - "target": "digest" - } - ], - "selects": {} + "common": [], + "selects": { + "cfg(target_os = \"windows\")": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } }, - "edition": "2018", - "version": "0.10.6" + "edition": "2021", + "version": "1.0.4" }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0/MIT", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "memchr 2.7.4": { - "name": "memchr", - "version": "2.7.4", - "package_url": "https://github.com/BurntSushi/memchr", + "is_terminal_polyfill 1.70.0": { + "name": "is_terminal_polyfill", + "version": "1.70.0", + "package_url": "https://github.com/polyfill-rs/is_terminal_polyfill", "repository": { "Http": { - "url": "https://static.crates.io/crates/memchr/2.7.4/download", - "sha256": "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + "url": "https://static.crates.io/crates/is_terminal_polyfill/1.70.0/download", + "sha256": "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" } }, "targets": [ { "Library": { - "crate_name": "memchr", + "crate_name": "is_terminal_polyfill", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8478,43 +7875,41 @@ } } ], - "library_target_name": "memchr", + "library_target_name": "is_terminal_polyfill", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "alloc", - "default", - "std" + "default" ], "selects": {} }, "edition": "2021", - "version": "2.7.4" + "version": "1.70.0" }, - "license": "Unlicense OR MIT", + "license": "MIT OR Apache-2.0", "license_ids": [ - "MIT", - "Unlicense" + "Apache-2.0", + "MIT" ], - "license_file": "LICENSE-MIT" + "license_file": "LICENSE-APACHE" }, - "mime 0.3.17": { - "name": "mime", - "version": "0.3.17", - "package_url": "https://github.com/hyperium/mime", + "itoa 1.0.11": { + "name": "itoa", + "version": "1.0.11", + "package_url": "https://github.com/dtolnay/itoa", "repository": { "Http": { - "url": "https://static.crates.io/crates/mime/0.3.17/download", - "sha256": "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + "url": "https://static.crates.io/crates/itoa/1.0.11/download", + "sha256": "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" } }, "targets": [ { "Library": { - "crate_name": "mime", + "crate_name": "itoa", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8525,13 +7920,13 @@ } } ], - "library_target_name": "mime", + "library_target_name": "itoa", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2015", - "version": "0.3.17" + "edition": "2018", + "version": "1.0.11" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -8540,20 +7935,20 @@ ], "license_file": "LICENSE-APACHE" }, - "miniz_oxide 0.7.2": { - "name": "miniz_oxide", - "version": "0.7.2", - "package_url": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide", + "jobserver 0.1.31": { + "name": "jobserver", + "version": "0.1.31", + "package_url": "https://github.com/rust-lang/jobserver-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/miniz_oxide/0.7.2/download", - "sha256": "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" + "url": "https://static.crates.io/crates/jobserver/0.1.31/download", + "sha256": "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" } }, "targets": [ { "Library": { - "crate_name": "miniz_oxide", + "crate_name": "jobserver", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8564,45 +7959,46 @@ } } ], - "library_target_name": "miniz_oxide", + "library_target_name": "jobserver", "common_attrs": { "compile_data_glob": [ "**" ], "deps": { - "common": [ - { - "id": "adler 1.0.2", - "target": "adler" - } - ], - "selects": {} + "common": [], + "selects": { + "cfg(unix)": [ + { + "id": "libc 0.2.168", + "target": "libc" + } + ] + } }, - "edition": "2018", - "version": "0.7.2" + "edition": "2021", + "version": "0.1.31" }, - "license": "MIT OR Zlib OR Apache-2.0", + "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", - "MIT", - "Zlib" + "MIT" ], - "license_file": "LICENSE" + "license_file": "LICENSE-APACHE" }, - "miniz_oxide 0.8.0": { - "name": "miniz_oxide", - "version": "0.8.0", - "package_url": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide", + "js-sys 0.3.69": { + "name": "js-sys", + "version": "0.3.69", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys", "repository": { "Http": { - "url": "https://static.crates.io/crates/miniz_oxide/0.8.0/download", - "sha256": "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" + "url": "https://static.crates.io/crates/js-sys/0.3.69/download", + "sha256": "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" } }, "targets": [ { "Library": { - "crate_name": "miniz_oxide", + "crate_name": "js_sys", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8613,51 +8009,44 @@ } } ], - "library_target_name": "miniz_oxide", + "library_target_name": "js_sys", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "with-alloc" - ], - "selects": {} - }, "deps": { "common": [ { - "id": "adler2 2.0.0", - "target": "adler2" + "id": "wasm-bindgen 0.2.92", + "target": "wasm_bindgen" } ], "selects": {} }, - "edition": "2021", - "version": "0.8.0" + "edition": "2018", + "version": "0.3.69" }, - "license": "MIT OR Zlib OR Apache-2.0", + "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", - "MIT", - "Zlib" + "MIT" ], - "license_file": "LICENSE" + "license_file": "LICENSE-APACHE" }, - "mio 1.0.2": { - "name": "mio", - "version": "1.0.2", - "package_url": "https://github.com/tokio-rs/mio", + "libc 0.2.168": { + "name": "libc", + "version": "0.2.168", + "package_url": "https://github.com/rust-lang/libc", "repository": { "Http": { - "url": "https://static.crates.io/crates/mio/1.0.2/download", - "sha256": "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" + "url": "https://static.crates.io/crates/libc/0.2.168/download", + "sha256": "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" } }, "targets": [ { "Library": { - "crate_name": "mio", + "crate_name": "libc", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8666,78 +8055,128 @@ ] } } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } } ], - "library_target_name": "mio", + "library_target_name": "libc", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "net", - "os-ext", - "os-poll" + "default", + "std" ], - "selects": {} - }, - "deps": { - "common": [], "selects": { - "cfg(target_os = \"hermit\")": [ - { - "id": "hermit-abi 0.3.9", - "target": "hermit_abi", - "alias": "libc" - } + "aarch64-apple-darwin": [ + "extra_traits" ], - "cfg(target_os = \"wasi\")": [ - { - "id": "libc 0.2.160", - "target": "libc" - }, - { - "id": "wasi 0.11.0+wasi-snapshot-preview1", - "target": "wasi" - } + "aarch64-apple-ios": [ + "extra_traits" ], - "cfg(unix)": [ - { - "id": "libc 0.2.160", - "target": "libc" - } + "aarch64-apple-ios-sim": [ + "extra_traits" ], - "cfg(windows)": [ - { - "id": "windows-sys 0.52.0", - "target": "windows_sys" - } + "aarch64-linux-android": [ + "extra_traits" + ], + "aarch64-unknown-fuchsia": [ + "extra_traits" + ], + "aarch64-unknown-nto-qnx710": [ + "extra_traits" + ], + "armv7-linux-androideabi": [ + "extra_traits" + ], + "i686-apple-darwin": [ + "extra_traits" + ], + "i686-linux-android": [ + "extra_traits" + ], + "i686-unknown-freebsd": [ + "extra_traits" + ], + "powerpc-unknown-linux-gnu": [ + "extra_traits" + ], + "s390x-unknown-linux-gnu": [ + "extra_traits" + ], + "wasm32-wasip1": [ + "extra_traits" + ], + "x86_64-apple-darwin": [ + "extra_traits" + ], + "x86_64-apple-ios": [ + "extra_traits" + ], + "x86_64-linux-android": [ + "extra_traits" + ], + "x86_64-unknown-freebsd": [ + "extra_traits" + ], + "x86_64-unknown-fuchsia": [ + "extra_traits" ] } }, + "deps": { + "common": [ + { + "id": "libc 0.2.168", + "target": "build_script_build" + } + ], + "selects": {} + }, "edition": "2021", - "version": "1.0.2" + "version": "0.2.168" }, - "license": "MIT", + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", "license_ids": [ + "Apache-2.0", "MIT" ], - "license_file": "LICENSE" + "license_file": "LICENSE-APACHE" }, - "nt-time 0.8.1": { - "name": "nt-time", - "version": "0.8.1", - "package_url": "https://github.com/sorairolake/nt-time", + "libredox 0.1.3": { + "name": "libredox", + "version": "0.1.3", + "package_url": "https://gitlab.redox-os.org/redox-os/libredox.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/nt-time/0.8.1/download", - "sha256": "2de419e64947cd8830e66beb584acc3fb42ed411d103e3c794dda355d1b374b5" + "url": "https://static.crates.io/crates/libredox/0.1.3/download", + "sha256": "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" } }, "targets": [ { "Library": { - "crate_name": "nt_time", + "crate_name": "libredox", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8748,90 +8187,47 @@ } } ], - "library_target_name": "nt_time", + "library_target_name": "libredox", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default", - "std" - ], - "selects": {} - }, "deps": { "common": [ { - "id": "time 0.3.36", - "target": "time" + "id": "bitflags 2.5.0", + "target": "bitflags" + }, + { + "id": "libc 0.2.168", + "target": "libc" } ], "selects": {} }, "edition": "2021", - "version": "0.8.1" - }, - "license": "Apache-2.0 OR MIT", - "license_ids": [ - "Apache-2.0", - "MIT" - ], - "license_file": "LICENSES" - }, - "num-conv 0.1.0": { - "name": "num-conv", - "version": "0.1.0", - "package_url": "https://github.com/jhpratt/num-conv", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/num-conv/0.1.0/download", - "sha256": "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - } - }, - "targets": [ - { - "Library": { - "crate_name": "num_conv", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "num_conv", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "edition": "2021", - "version": "0.1.0" + "version": "0.1.3" }, - "license": "MIT OR Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0", "MIT" ], - "license_file": "LICENSE-Apache" + "license_file": "LICENSE" }, - "num-traits 0.2.19": { - "name": "num-traits", - "version": "0.2.19", - "package_url": "https://github.com/rust-num/num-traits", + "libz-sys 1.1.20": { + "name": "libz-sys", + "version": "1.1.20", + "package_url": "https://github.com/rust-lang/libz-sys", "repository": { "Http": { - "url": "https://static.crates.io/crates/num-traits/0.2.19/download", - "sha256": "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" + "url": "https://static.crates.io/crates/libz-sys/1.1.20/download", + "sha256": "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" } }, "targets": [ { "Library": { - "crate_name": "num_traits", + "crate_name": "libz_sys", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8854,7 +8250,7 @@ } } ], - "library_target_name": "num_traits", + "library_target_name": "libz_sys", "common_attrs": { "compile_data_glob": [ "**" @@ -8862,14 +8258,14 @@ "deps": { "common": [ { - "id": "num-traits 0.2.19", + "id": "libz-sys 1.1.20", "target": "build_script_build" } ], "selects": {} }, - "edition": "2021", - "version": "0.2.19" + "edition": "2018", + "version": "1.1.20" }, "build_script_attrs": { "compile_data_glob": [ @@ -8881,12 +8277,21 @@ "deps": { "common": [ { - "id": "autocfg 1.3.0", - "target": "autocfg" + "id": "cc 1.1.30", + "target": "cc" + }, + { + "id": "pkg-config 0.3.30", + "target": "pkg_config" + }, + { + "id": "vcpkg 0.2.15", + "target": "vcpkg" } ], "selects": {} - } + }, + "links": "z" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -8895,20 +8300,20 @@ ], "license_file": "LICENSE-APACHE" }, - "object 0.32.2": { - "name": "object", - "version": "0.32.2", - "package_url": "https://github.com/gimli-rs/object", + "linux-raw-sys 0.4.14": { + "name": "linux-raw-sys", + "version": "0.4.14", + "package_url": "https://github.com/sunfishcode/linux-raw-sys", "repository": { "Http": { - "url": "https://static.crates.io/crates/object/0.32.2/download", - "sha256": "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" + "url": "https://static.crates.io/crates/linux-raw-sys/0.4.14/download", + "sha256": "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" } }, "targets": [ { "Library": { - "crate_name": "object", + "crate_name": "linux_raw_sys", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8919,57 +8324,129 @@ } } ], - "library_target_name": "object", + "library_target_name": "linux_raw_sys", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "archive", - "coff", - "elf", - "macho", - "pe", - "read_core", - "unaligned", - "xcoff" + "general", + "ioctl", + "no_std" ], - "selects": {} + "selects": { + "aarch64-unknown-linux-gnu": [ + "elf", + "errno", + "std" + ], + "aarch64-unknown-nixos-gnu": [ + "elf", + "errno", + "std" + ], + "arm-unknown-linux-gnueabi": [ + "elf", + "errno", + "std" + ], + "armv7-unknown-linux-gnueabi": [ + "elf", + "errno", + "std" + ], + "i686-unknown-linux-gnu": [ + "elf", + "errno", + "std" + ], + "powerpc-unknown-linux-gnu": [ + "std" + ], + "s390x-unknown-linux-gnu": [ + "std" + ], + "x86_64-unknown-linux-gnu": [ + "elf", + "errno", + "std" + ], + "x86_64-unknown-nixos-gnu": [ + "elf", + "errno", + "std" + ] + } }, - "deps": { - "common": [ - { - "id": "memchr 2.7.4", - "target": "memchr" + "edition": "2021", + "version": "0.4.14" + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "litemap 0.7.4": { + "name": "litemap", + "version": "0.7.4", + "package_url": "https://github.com/unicode-org/icu4x", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/litemap/0.7.4/download", + "sha256": "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + } + }, + "targets": [ + { + "Library": { + "crate_name": "litemap", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] } + } + } + ], + "library_target_name": "litemap", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc" ], "selects": {} }, - "edition": "2018", - "version": "0.32.2" + "edition": "2021", + "version": "0.7.4" }, - "license": "Apache-2.0 OR MIT", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "once_cell 1.19.0": { - "name": "once_cell", - "version": "1.19.0", - "package_url": "https://github.com/matklad/once_cell", + "log 0.4.22": { + "name": "log", + "version": "0.4.22", + "package_url": "https://github.com/rust-lang/log", "repository": { "Http": { - "url": "https://static.crates.io/crates/once_cell/1.19.0/download", - "sha256": "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + "url": "https://static.crates.io/crates/log/0.4.22/download", + "sha256": "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" } }, "targets": [ { "Library": { - "crate_name": "once_cell", + "crate_name": "log", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -8980,118 +8457,19 @@ } } ], - "library_target_name": "once_cell", + "library_target_name": "log", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "alloc", - "race", "std" ], - "selects": { - "aarch64-apple-darwin": [ - "default" - ], - "aarch64-apple-ios": [ - "default" - ], - "aarch64-apple-ios-sim": [ - "default" - ], - "aarch64-fuchsia": [ - "default" - ], - "aarch64-linux-android": [ - "default" - ], - "aarch64-pc-windows-msvc": [ - "default" - ], - "aarch64-unknown-linux-gnu": [ - "default" - ], - "aarch64-unknown-nixos-gnu": [ - "default" - ], - "aarch64-unknown-nto-qnx710": [ - "default" - ], - "arm-unknown-linux-gnueabi": [ - "default" - ], - "armv7-linux-androideabi": [ - "default" - ], - "armv7-unknown-linux-gnueabi": [ - "default" - ], - "i686-apple-darwin": [ - "default" - ], - "i686-linux-android": [ - "default" - ], - "i686-pc-windows-msvc": [ - "default" - ], - "i686-unknown-freebsd": [ - "default" - ], - "i686-unknown-linux-gnu": [ - "default" - ], - "powerpc-unknown-linux-gnu": [ - "default" - ], - "riscv32imc-unknown-none-elf": [ - "default" - ], - "riscv64gc-unknown-none-elf": [ - "default" - ], - "s390x-unknown-linux-gnu": [ - "default" - ], - "thumbv7em-none-eabi": [ - "default" - ], - "thumbv8m.main-none-eabi": [ - "default" - ], - "x86_64-apple-darwin": [ - "default" - ], - "x86_64-apple-ios": [ - "default" - ], - "x86_64-fuchsia": [ - "default" - ], - "x86_64-linux-android": [ - "default" - ], - "x86_64-pc-windows-msvc": [ - "default" - ], - "x86_64-unknown-freebsd": [ - "default" - ], - "x86_64-unknown-linux-gnu": [ - "default" - ], - "x86_64-unknown-nixos-gnu": [ - "default" - ], - "x86_64-unknown-none": [ - "default" - ] - } + "selects": {} }, "edition": "2021", - "version": "1.19.0" + "version": "0.4.22" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -9100,20 +8478,20 @@ ], "license_file": "LICENSE-APACHE" }, - "option-ext 0.2.0": { - "name": "option-ext", - "version": "0.2.0", - "package_url": "https://github.com/soc/option-ext.git", + "lzma-rust 0.1.7": { + "name": "lzma-rust", + "version": "0.1.7", + "package_url": "https://github.com/dyz1990/sevenz-rust/tree/main/lzma-rust", "repository": { "Http": { - "url": "https://static.crates.io/crates/option-ext/0.2.0/download", - "sha256": "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + "url": "https://static.crates.io/crates/lzma-rust/0.1.7/download", + "sha256": "5baab2bbbd7d75a144d671e9ff79270e903957d92fb7386fd39034c709bd2661" } }, "targets": [ { "Library": { - "crate_name": "option_ext", + "crate_name": "lzma_rust", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9124,34 +8502,49 @@ } } ], - "library_target_name": "option_ext", + "library_target_name": "lzma_rust", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2015", - "version": "0.2.0" + "crate_features": { + "common": [ + "encoder" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "byteorder 1.5.0", + "target": "byteorder" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.7" }, - "license": "MPL-2.0", + "license": "Apache-2.0", "license_ids": [ - "MPL-2.0" + "Apache-2.0" ], - "license_file": "LICENSE.txt" + "license_file": null }, - "pem 3.0.4": { - "name": "pem", - "version": "3.0.4", - "package_url": "https://github.com/jcreekmore/pem-rs.git", + "lzma-sys 0.1.20": { + "name": "lzma-sys", + "version": "0.1.20", + "package_url": "https://github.com/alexcrichton/xz2-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/pem/3.0.4/download", - "sha256": "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" + "url": "https://static.crates.io/crates/lzma-sys/0.1.20/download", + "sha256": "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" } }, "targets": [ { "Library": { - "crate_name": "pem", + "crate_name": "lzma_sys", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9160,52 +8553,90 @@ ] } } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } } ], - "library_target_name": "pem", + "library_target_name": "lzma_sys", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "default", - "std" + "static" ], "selects": {} }, "deps": { "common": [ { - "id": "base64 0.22.1", - "target": "base64" + "id": "libc 0.2.168", + "target": "libc" + }, + { + "id": "lzma-sys 0.1.20", + "target": "build_script_build" } ], "selects": {} }, - "edition": "2021", - "version": "3.0.4" + "edition": "2018", + "version": "0.1.20" }, - "license": "MIT", + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.1.30", + "target": "cc" + }, + { + "id": "pkg-config 0.3.30", + "target": "pkg_config" + } + ], + "selects": {} + }, + "links": "lzma" + }, + "license": "MIT/Apache-2.0", "license_ids": [ + "Apache-2.0", "MIT" ], - "license_file": "LICENSE.md" + "license_file": "LICENSE-APACHE" }, - "percent-encoding 2.3.1": { - "name": "percent-encoding", - "version": "2.3.1", - "package_url": "https://github.com/servo/rust-url/", + "md-5 0.10.6": { + "name": "md-5", + "version": "0.10.6", + "package_url": "https://github.com/RustCrypto/hashes", "repository": { "Http": { - "url": "https://static.crates.io/crates/percent-encoding/2.3.1/download", - "sha256": "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + "url": "https://static.crates.io/crates/md-5/0.10.6/download", + "sha256": "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" } }, "targets": [ { "Library": { - "crate_name": "percent_encoding", + "crate_name": "md5", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9216,21 +8647,33 @@ } } ], - "library_target_name": "percent_encoding", + "library_target_name": "md5", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "alloc", "default", "std" ], "selects": {} }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "digest 0.10.7", + "target": "digest" + } + ], + "selects": {} + }, "edition": "2018", - "version": "2.3.1" + "version": "0.10.6" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -9239,20 +8682,20 @@ ], "license_file": "LICENSE-APACHE" }, - "pin-project 1.1.5": { - "name": "pin-project", - "version": "1.1.5", - "package_url": "https://github.com/taiki-e/pin-project", + "memchr 2.7.4": { + "name": "memchr", + "version": "2.7.4", + "package_url": "https://github.com/BurntSushi/memchr", "repository": { "Http": { - "url": "https://static.crates.io/crates/pin-project/1.1.5/download", - "sha256": "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" + "url": "https://static.crates.io/crates/memchr/2.7.4/download", + "sha256": "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" } }, "targets": [ { "Library": { - "crate_name": "pin_project", + "crate_name": "memchr", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9263,44 +8706,43 @@ } } ], - "library_target_name": "pin_project", + "library_target_name": "memchr", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2021", - "proc_macro_deps": { + "crate_features": { "common": [ - { - "id": "pin-project-internal 1.1.5", - "target": "pin_project_internal" - } + "alloc", + "default", + "std" ], "selects": {} }, - "version": "1.1.5" + "edition": "2021", + "version": "2.7.4" }, - "license": "Apache-2.0 OR MIT", + "license": "Unlicense OR MIT", "license_ids": [ - "Apache-2.0", - "MIT" + "MIT", + "Unlicense" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE-MIT" }, - "pin-project-internal 1.1.5": { - "name": "pin-project-internal", - "version": "1.1.5", - "package_url": "https://github.com/taiki-e/pin-project", + "mime 0.3.17": { + "name": "mime", + "version": "0.3.17", + "package_url": "https://github.com/hyperium/mime", "repository": { "Http": { - "url": "https://static.crates.io/crates/pin-project-internal/1.1.5/download", - "sha256": "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" + "url": "https://static.crates.io/crates/mime/0.3.17/download", + "sha256": "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" } }, "targets": [ { - "ProcMacro": { - "crate_name": "pin_project_internal", + "Library": { + "crate_name": "mime", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9311,52 +8753,35 @@ } } ], - "library_target_name": "pin_project_internal", + "library_target_name": "mime", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { - "common": [ - { - "id": "proc-macro2 1.0.88", - "target": "proc_macro2" - }, - { - "id": "quote 1.0.37", - "target": "quote" - }, - { - "id": "syn 2.0.79", - "target": "syn" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "1.1.5" + "edition": "2015", + "version": "0.3.17" }, - "license": "Apache-2.0 OR MIT", + "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "pin-project-lite 0.2.14": { - "name": "pin-project-lite", - "version": "0.2.14", - "package_url": "https://github.com/taiki-e/pin-project-lite", + "miniz_oxide 0.7.2": { + "name": "miniz_oxide", + "version": "0.7.2", + "package_url": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide", "repository": { "Http": { - "url": "https://static.crates.io/crates/pin-project-lite/0.2.14/download", - "sha256": "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + "url": "https://static.crates.io/crates/miniz_oxide/0.7.2/download", + "sha256": "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" } }, "targets": [ { "Library": { - "crate_name": "pin_project_lite", + "crate_name": "miniz_oxide", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9367,35 +8792,45 @@ } } ], - "library_target_name": "pin_project_lite", + "library_target_name": "miniz_oxide", "common_attrs": { "compile_data_glob": [ "**" ], + "deps": { + "common": [ + { + "id": "adler 1.0.2", + "target": "adler" + } + ], + "selects": {} + }, "edition": "2018", - "version": "0.2.14" + "version": "0.7.2" }, - "license": "Apache-2.0 OR MIT", + "license": "MIT OR Zlib OR Apache-2.0", "license_ids": [ "Apache-2.0", - "MIT" + "MIT", + "Zlib" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "pin-utils 0.1.0": { - "name": "pin-utils", - "version": "0.1.0", - "package_url": "https://github.com/rust-lang-nursery/pin-utils", + "miniz_oxide 0.8.0": { + "name": "miniz_oxide", + "version": "0.8.0", + "package_url": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide", "repository": { "Http": { - "url": "https://static.crates.io/crates/pin-utils/0.1.0/download", - "sha256": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + "url": "https://static.crates.io/crates/miniz_oxide/0.8.0/download", + "sha256": "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" } }, "targets": [ { "Library": { - "crate_name": "pin_utils", + "crate_name": "miniz_oxide", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9406,35 +8841,51 @@ } } ], - "library_target_name": "pin_utils", + "library_target_name": "miniz_oxide", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2018", - "version": "0.1.0" + "crate_features": { + "common": [ + "with-alloc" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "adler2 2.0.0", + "target": "adler2" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.8.0" }, - "license": "MIT OR Apache-2.0", + "license": "MIT OR Zlib OR Apache-2.0", "license_ids": [ "Apache-2.0", - "MIT" + "MIT", + "Zlib" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "pkg-config 0.3.30": { - "name": "pkg-config", - "version": "0.3.30", - "package_url": "https://github.com/rust-lang/pkg-config-rs", + "mio 1.0.2": { + "name": "mio", + "version": "1.0.2", + "package_url": "https://github.com/tokio-rs/mio", "repository": { "Http": { - "url": "https://static.crates.io/crates/pkg-config/0.3.30/download", - "sha256": "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + "url": "https://static.crates.io/crates/mio/1.0.2/download", + "sha256": "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" } }, "targets": [ { "Library": { - "crate_name": "pkg_config", + "crate_name": "mio", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9445,35 +8896,76 @@ } } ], - "library_target_name": "pkg_config", + "library_target_name": "mio", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2015", - "version": "0.3.30" + "crate_features": { + "common": [ + "net", + "os-ext", + "os-poll" + ], + "selects": {} + }, + "deps": { + "common": [], + "selects": { + "cfg(target_os = \"hermit\")": [ + { + "id": "hermit-abi 0.3.9", + "target": "hermit_abi", + "alias": "libc" + } + ], + "cfg(target_os = \"wasi\")": [ + { + "id": "libc 0.2.168", + "target": "libc" + }, + { + "id": "wasi 0.11.0+wasi-snapshot-preview1", + "target": "wasi" + } + ], + "cfg(unix)": [ + { + "id": "libc 0.2.168", + "target": "libc" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.52.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2021", + "version": "1.0.2" }, - "license": "MIT OR Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0", "MIT" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "powerfmt 0.2.0": { - "name": "powerfmt", - "version": "0.2.0", - "package_url": "https://github.com/jhpratt/powerfmt", + "nt-time 0.8.1": { + "name": "nt-time", + "version": "0.8.1", + "package_url": "https://github.com/sorairolake/nt-time", "repository": { "Http": { - "url": "https://static.crates.io/crates/powerfmt/0.2.0/download", - "sha256": "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + "url": "https://static.crates.io/crates/nt-time/0.8.1/download", + "sha256": "2de419e64947cd8830e66beb584acc3fb42ed411d103e3c794dda355d1b374b5" } }, "targets": [ { "Library": { - "crate_name": "powerfmt", + "crate_name": "nt_time", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9484,35 +8976,51 @@ } } ], - "library_target_name": "powerfmt", + "library_target_name": "nt_time", "common_attrs": { "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "time 0.3.36", + "target": "time" + } + ], + "selects": {} + }, "edition": "2021", - "version": "0.2.0" + "version": "0.8.1" }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], - "license_file": "LICENSE-Apache" + "license_file": "LICENSES" }, - "ppv-lite86 0.2.17": { - "name": "ppv-lite86", - "version": "0.2.17", - "package_url": "https://github.com/cryptocorrosion/cryptocorrosion", + "num-conv 0.1.0": { + "name": "num-conv", + "version": "0.1.0", + "package_url": "https://github.com/jhpratt/num-conv", "repository": { "Http": { - "url": "https://static.crates.io/crates/ppv-lite86/0.2.17/download", - "sha256": "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + "url": "https://static.crates.io/crates/num-conv/0.1.0/download", + "sha256": "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" } }, "targets": [ { "Library": { - "crate_name": "ppv_lite86", + "crate_name": "num_conv", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9523,42 +9031,35 @@ } } ], - "library_target_name": "ppv_lite86", + "library_target_name": "num_conv", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "simd", - "std" - ], - "selects": {} - }, - "edition": "2018", - "version": "0.2.17" + "edition": "2021", + "version": "0.1.0" }, - "license": "MIT/Apache-2.0", + "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", "MIT" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE-Apache" }, - "predicates 3.1.0": { - "name": "predicates", - "version": "3.1.0", - "package_url": "https://github.com/assert-rs/predicates-rs", - "repository": { + "num-traits 0.2.19": { + "name": "num-traits", + "version": "0.2.19", + "package_url": "https://github.com/rust-num/num-traits", + "repository": { "Http": { - "url": "https://static.crates.io/crates/predicates/3.1.0/download", - "sha256": "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8" + "url": "https://static.crates.io/crates/num-traits/0.2.19/download", + "sha256": "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" } }, "targets": [ { "Library": { - "crate_name": "predicates", + "crate_name": "num_traits", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9567,38 +9068,53 @@ ] } } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } } ], - "library_target_name": "predicates", + "library_target_name": "num_traits", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { + "deps": { "common": [ - "diff" + { + "id": "num-traits 0.2.19", + "target": "build_script_build" + } ], "selects": {} }, + "edition": "2021", + "version": "0.2.19" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ], "deps": { "common": [ { - "id": "anstyle 1.0.8", - "target": "anstyle" - }, - { - "id": "difflib 0.4.0", - "target": "difflib" - }, - { - "id": "predicates-core 1.0.6", - "target": "predicates_core" + "id": "autocfg 1.3.0", + "target": "autocfg" } ], "selects": {} - }, - "edition": "2021", - "version": "3.1.0" + } }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -9607,20 +9123,20 @@ ], "license_file": "LICENSE-APACHE" }, - "predicates-core 1.0.6": { - "name": "predicates-core", - "version": "1.0.6", - "package_url": "https://github.com/assert-rs/predicates-rs/tree/master/crates/core", + "object 0.32.2": { + "name": "object", + "version": "0.32.2", + "package_url": "https://github.com/gimli-rs/object", "repository": { "Http": { - "url": "https://static.crates.io/crates/predicates-core/1.0.6/download", - "sha256": "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + "url": "https://static.crates.io/crates/object/0.32.2/download", + "sha256": "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" } }, "targets": [ { "Library": { - "crate_name": "predicates_core", + "crate_name": "object", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9631,35 +9147,57 @@ } } ], - "library_target_name": "predicates_core", + "library_target_name": "object", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2021", - "version": "1.0.6" + "crate_features": { + "common": [ + "archive", + "coff", + "elf", + "macho", + "pe", + "read_core", + "unaligned", + "xcoff" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memchr 2.7.4", + "target": "memchr" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.32.2" }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "predicates-tree 1.0.9": { - "name": "predicates-tree", - "version": "1.0.9", - "package_url": "https://github.com/assert-rs/predicates-rs/tree/master/crates/tree", + "once_cell 1.19.0": { + "name": "once_cell", + "version": "1.19.0", + "package_url": "https://github.com/matklad/once_cell", "repository": { "Http": { - "url": "https://static.crates.io/crates/predicates-tree/1.0.9/download", - "sha256": "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" + "url": "https://static.crates.io/crates/once_cell/1.19.0/download", + "sha256": "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" } }, "targets": [ { "Library": { - "crate_name": "predicates_tree", + "crate_name": "once_cell", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9670,26 +9208,118 @@ } } ], - "library_target_name": "predicates_tree", + "library_target_name": "once_cell", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { + "crate_features": { "common": [ - { - "id": "predicates-core 1.0.6", - "target": "predicates_core" - }, - { - "id": "termtree 0.4.1", - "target": "termtree" - } + "alloc", + "race", + "std" ], - "selects": {} + "selects": { + "aarch64-apple-darwin": [ + "default" + ], + "aarch64-apple-ios": [ + "default" + ], + "aarch64-apple-ios-sim": [ + "default" + ], + "aarch64-linux-android": [ + "default" + ], + "aarch64-pc-windows-msvc": [ + "default" + ], + "aarch64-unknown-fuchsia": [ + "default" + ], + "aarch64-unknown-linux-gnu": [ + "default" + ], + "aarch64-unknown-nixos-gnu": [ + "default" + ], + "aarch64-unknown-nto-qnx710": [ + "default" + ], + "arm-unknown-linux-gnueabi": [ + "default" + ], + "armv7-linux-androideabi": [ + "default" + ], + "armv7-unknown-linux-gnueabi": [ + "default" + ], + "i686-apple-darwin": [ + "default" + ], + "i686-linux-android": [ + "default" + ], + "i686-pc-windows-msvc": [ + "default" + ], + "i686-unknown-freebsd": [ + "default" + ], + "i686-unknown-linux-gnu": [ + "default" + ], + "powerpc-unknown-linux-gnu": [ + "default" + ], + "riscv32imc-unknown-none-elf": [ + "default" + ], + "riscv64gc-unknown-none-elf": [ + "default" + ], + "s390x-unknown-linux-gnu": [ + "default" + ], + "thumbv7em-none-eabi": [ + "default" + ], + "thumbv8m.main-none-eabi": [ + "default" + ], + "x86_64-apple-darwin": [ + "default" + ], + "x86_64-apple-ios": [ + "default" + ], + "x86_64-linux-android": [ + "default" + ], + "x86_64-pc-windows-msvc": [ + "default" + ], + "x86_64-unknown-freebsd": [ + "default" + ], + "x86_64-unknown-fuchsia": [ + "default" + ], + "x86_64-unknown-linux-gnu": [ + "default" + ], + "x86_64-unknown-nixos-gnu": [ + "default" + ], + "x86_64-unknown-none": [ + "default" + ] + } }, "edition": "2021", - "version": "1.0.9" + "version": "1.19.0" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -9698,20 +9328,20 @@ ], "license_file": "LICENSE-APACHE" }, - "proc-macro2 1.0.88": { - "name": "proc-macro2", - "version": "1.0.88", - "package_url": "https://github.com/dtolnay/proc-macro2", + "option-ext 0.2.0": { + "name": "option-ext", + "version": "0.2.0", + "package_url": "https://github.com/soc/option-ext.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/proc-macro2/1.0.88/download", - "sha256": "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" + "url": "https://static.crates.io/crates/option-ext/0.2.0/download", + "sha256": "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" } }, "targets": [ { "Library": { - "crate_name": "proc_macro2", + "crate_name": "option_ext", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9720,77 +9350,36 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], - "library_target_name": "proc_macro2", + "library_target_name": "option_ext", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default", - "proc-macro" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "proc-macro2 1.0.88", - "target": "build_script_build" - }, - { - "id": "unicode-ident 1.0.13", - "target": "unicode_ident" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "1.0.88" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ] + "edition": "2015", + "version": "0.2.0" }, - "license": "MIT OR Apache-2.0", + "license": "MPL-2.0", "license_ids": [ - "Apache-2.0", - "MIT" + "MPL-2.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE.txt" }, - "quinn 0.11.3": { - "name": "quinn", - "version": "0.11.3", - "package_url": "https://github.com/quinn-rs/quinn", + "pem 3.0.4": { + "name": "pem", + "version": "3.0.4", + "package_url": "https://github.com/jcreekmore/pem-rs.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/quinn/0.11.3/download", - "sha256": "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156" + "url": "https://static.crates.io/crates/pem/3.0.4/download", + "sha256": "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" } }, "targets": [ { "Library": { - "crate_name": "quinn", + "crate_name": "pem", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9801,78 +9390,50 @@ } } ], - "library_target_name": "quinn", + "library_target_name": "pem", "common_attrs": { "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, "deps": { "common": [ { - "id": "bytes 1.6.0", - "target": "bytes" - }, - { - "id": "pin-project-lite 0.2.14", - "target": "pin_project_lite" - }, - { - "id": "quinn-proto 0.11.6", - "target": "quinn_proto", - "alias": "proto" - }, - { - "id": "quinn-udp 0.5.4", - "target": "quinn_udp", - "alias": "udp" - }, - { - "id": "rustc-hash 2.0.0", - "target": "rustc_hash" - }, - { - "id": "socket2 0.5.7", - "target": "socket2" - }, - { - "id": "thiserror 1.0.64", - "target": "thiserror" - }, - { - "id": "tokio 1.40.0", - "target": "tokio" - }, - { - "id": "tracing 0.1.40", - "target": "tracing" + "id": "base64 0.22.1", + "target": "base64" } ], "selects": {} }, "edition": "2021", - "version": "0.11.3" + "version": "3.0.4" }, - "license": "MIT OR Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0", "MIT" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE.md" }, - "quinn-proto 0.11.6": { - "name": "quinn-proto", - "version": "0.11.6", - "package_url": "https://github.com/quinn-rs/quinn", + "percent-encoding 2.3.1": { + "name": "percent-encoding", + "version": "2.3.1", + "package_url": "https://github.com/servo/rust-url/", "repository": { "Http": { - "url": "https://static.crates.io/crates/quinn-proto/0.11.6/download", - "sha256": "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" + "url": "https://static.crates.io/crates/percent-encoding/2.3.1/download", + "sha256": "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" } }, "targets": [ { "Library": { - "crate_name": "quinn_proto", + "crate_name": "percent_encoding", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9883,46 +9444,117 @@ } } ], - "library_target_name": "quinn_proto", + "library_target_name": "percent_encoding", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { + "crate_features": { "common": [ - { - "id": "bytes 1.6.0", - "target": "bytes" - }, - { - "id": "rand 0.8.5", - "target": "rand" - }, - { - "id": "rustc-hash 2.0.0", - "target": "rustc_hash" - }, - { - "id": "slab 0.4.9", - "target": "slab" - }, - { - "id": "thiserror 1.0.64", - "target": "thiserror" - }, - { - "id": "tinyvec 1.6.0", - "target": "tinyvec" - }, - { - "id": "tracing 0.1.40", - "target": "tracing" - } + "alloc", + "std" ], - "selects": {} + "selects": { + "aarch64-apple-darwin": [ + "default" + ], + "aarch64-apple-ios": [ + "default" + ], + "aarch64-apple-ios-sim": [ + "default" + ], + "aarch64-linux-android": [ + "default" + ], + "aarch64-pc-windows-msvc": [ + "default" + ], + "aarch64-unknown-fuchsia": [ + "default" + ], + "aarch64-unknown-linux-gnu": [ + "default" + ], + "aarch64-unknown-nixos-gnu": [ + "default" + ], + "aarch64-unknown-nto-qnx710": [ + "default" + ], + "arm-unknown-linux-gnueabi": [ + "default" + ], + "armv7-linux-androideabi": [ + "default" + ], + "armv7-unknown-linux-gnueabi": [ + "default" + ], + "i686-apple-darwin": [ + "default" + ], + "i686-linux-android": [ + "default" + ], + "i686-pc-windows-msvc": [ + "default" + ], + "i686-unknown-freebsd": [ + "default" + ], + "i686-unknown-linux-gnu": [ + "default" + ], + "powerpc-unknown-linux-gnu": [ + "default" + ], + "riscv32imc-unknown-none-elf": [ + "default" + ], + "riscv64gc-unknown-none-elf": [ + "default" + ], + "s390x-unknown-linux-gnu": [ + "default" + ], + "thumbv7em-none-eabi": [ + "default" + ], + "thumbv8m.main-none-eabi": [ + "default" + ], + "x86_64-apple-darwin": [ + "default" + ], + "x86_64-apple-ios": [ + "default" + ], + "x86_64-linux-android": [ + "default" + ], + "x86_64-pc-windows-msvc": [ + "default" + ], + "x86_64-unknown-freebsd": [ + "default" + ], + "x86_64-unknown-fuchsia": [ + "default" + ], + "x86_64-unknown-linux-gnu": [ + "default" + ], + "x86_64-unknown-nixos-gnu": [ + "default" + ], + "x86_64-unknown-none": [ + "default" + ] + } }, - "edition": "2021", - "version": "0.11.6" + "edition": "2018", + "version": "2.3.1" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -9931,20 +9563,20 @@ ], "license_file": "LICENSE-APACHE" }, - "quinn-udp 0.5.4": { - "name": "quinn-udp", - "version": "0.5.4", - "package_url": "https://github.com/quinn-rs/quinn", + "pin-project 1.1.5": { + "name": "pin-project", + "version": "1.1.5", + "package_url": "https://github.com/taiki-e/pin-project", "repository": { "Http": { - "url": "https://static.crates.io/crates/quinn-udp/0.5.4/download", - "sha256": "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" + "url": "https://static.crates.io/crates/pin-project/1.1.5/download", + "sha256": "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" } }, "targets": [ { "Library": { - "crate_name": "quinn_udp", + "crate_name": "pin_project", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -9955,59 +9587,44 @@ } } ], - "library_target_name": "quinn_udp", + "library_target_name": "pin_project", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { + "edition": "2021", + "proc_macro_deps": { "common": [ { - "id": "libc 0.2.160", - "target": "libc" - }, - { - "id": "socket2 0.5.7", - "target": "socket2" + "id": "pin-project-internal 1.1.5", + "target": "pin_project_internal" } ], - "selects": { - "cfg(windows)": [ - { - "id": "once_cell 1.19.0", - "target": "once_cell" - }, - { - "id": "windows-sys 0.52.0", - "target": "windows_sys" - } - ] - } + "selects": {} }, - "edition": "2021", - "version": "0.5.4" + "version": "1.1.5" }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "quote 1.0.37": { - "name": "quote", - "version": "1.0.37", - "package_url": "https://github.com/dtolnay/quote", + "pin-project-internal 1.1.5": { + "name": "pin-project-internal", + "version": "1.1.5", + "package_url": "https://github.com/taiki-e/pin-project", "repository": { "Http": { - "url": "https://static.crates.io/crates/quote/1.0.37/download", - "sha256": "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" + "url": "https://static.crates.io/crates/pin-project-internal/1.1.5/download", + "sha256": "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" } }, "targets": [ { - "Library": { - "crate_name": "quote", + "ProcMacro": { + "crate_name": "pin_project_internal", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10018,51 +9635,52 @@ } } ], - "library_target_name": "quote", + "library_target_name": "pin_project_internal", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default", - "proc-macro" - ], - "selects": {} - }, "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.90", + "target": "syn" } ], "selects": {} }, - "edition": "2018", - "version": "1.0.37" + "edition": "2021", + "version": "1.1.5" }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "rand 0.8.5": { - "name": "rand", - "version": "0.8.5", - "package_url": "https://github.com/rust-random/rand", + "pin-project-lite 0.2.14": { + "name": "pin-project-lite", + "version": "0.2.14", + "package_url": "https://github.com/taiki-e/pin-project-lite", "repository": { "Http": { - "url": "https://static.crates.io/crates/rand/0.8.5/download", - "sha256": "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" + "url": "https://static.crates.io/crates/pin-project-lite/0.2.14/download", + "sha256": "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" } }, "targets": [ { "Library": { - "crate_name": "rand", + "crate_name": "pin_project_lite", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10073,205 +9691,35 @@ } } ], - "library_target_name": "rand", + "library_target_name": "pin_project_lite", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "alloc", - "default", - "getrandom", - "libc", - "rand_chacha", - "std", - "std_rng" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "rand_chacha 0.3.1", - "target": "rand_chacha" - }, - { - "id": "rand_core 0.6.4", - "target": "rand_core" - } - ], - "selects": { - "aarch64-apple-darwin": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "aarch64-apple-ios": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "aarch64-apple-ios-sim": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "aarch64-fuchsia": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "aarch64-linux-android": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "aarch64-unknown-linux-gnu": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "aarch64-unknown-nixos-gnu": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "aarch64-unknown-nto-qnx710": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "arm-unknown-linux-gnueabi": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "armv7-linux-androideabi": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "armv7-unknown-linux-gnueabi": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "i686-apple-darwin": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "i686-linux-android": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "i686-unknown-freebsd": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "i686-unknown-linux-gnu": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "powerpc-unknown-linux-gnu": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "s390x-unknown-linux-gnu": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "x86_64-apple-darwin": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "x86_64-apple-ios": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "x86_64-fuchsia": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "x86_64-linux-android": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "x86_64-unknown-freebsd": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "x86_64-unknown-linux-gnu": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "x86_64-unknown-nixos-gnu": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ] - } - }, "edition": "2018", - "version": "0.8.5" + "version": "0.2.14" }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "rand_chacha 0.3.1": { - "name": "rand_chacha", - "version": "0.3.1", - "package_url": "https://github.com/rust-random/rand", + "pin-utils 0.1.0": { + "name": "pin-utils", + "version": "0.1.0", + "package_url": "https://github.com/rust-lang-nursery/pin-utils", "repository": { "Http": { - "url": "https://static.crates.io/crates/rand_chacha/0.3.1/download", - "sha256": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" + "url": "https://static.crates.io/crates/pin-utils/0.1.0/download", + "sha256": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" } }, "targets": [ { "Library": { - "crate_name": "rand_chacha", + "crate_name": "pin_utils", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10282,32 +9730,13 @@ } } ], - "library_target_name": "rand_chacha", + "library_target_name": "pin_utils", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "std" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "ppv-lite86 0.2.17", - "target": "ppv_lite86" - }, - { - "id": "rand_core 0.6.4", - "target": "rand_core" - } - ], - "selects": {} - }, "edition": "2018", - "version": "0.3.1" + "version": "0.1.0" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -10316,20 +9745,20 @@ ], "license_file": "LICENSE-APACHE" }, - "rand_core 0.6.4": { - "name": "rand_core", - "version": "0.6.4", - "package_url": "https://github.com/rust-random/rand", + "pkg-config 0.3.30": { + "name": "pkg-config", + "version": "0.3.30", + "package_url": "https://github.com/rust-lang/pkg-config-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/rand_core/0.6.4/download", - "sha256": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + "url": "https://static.crates.io/crates/pkg-config/0.3.30/download", + "sha256": "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" } }, "targets": [ { "Library": { - "crate_name": "rand_core", + "crate_name": "pkg_config", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10340,30 +9769,13 @@ } } ], - "library_target_name": "rand_core", + "library_target_name": "pkg_config", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "alloc", - "getrandom", - "std" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "getrandom 0.2.15", - "target": "getrandom" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.6.4" + "edition": "2015", + "version": "0.3.30" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -10372,20 +9784,20 @@ ], "license_file": "LICENSE-APACHE" }, - "redox_syscall 0.4.1": { - "name": "redox_syscall", - "version": "0.4.1", - "package_url": "https://gitlab.redox-os.org/redox-os/syscall", + "powerfmt 0.2.0": { + "name": "powerfmt", + "version": "0.2.0", + "package_url": "https://github.com/jhpratt/powerfmt", "repository": { "Http": { - "url": "https://static.crates.io/crates/redox_syscall/0.4.1/download", - "sha256": "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" + "url": "https://static.crates.io/crates/powerfmt/0.2.0/download", + "sha256": "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" } }, "targets": [ { "Library": { - "crate_name": "syscall", + "crate_name": "powerfmt", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10396,43 +9808,35 @@ } } ], - "library_target_name": "syscall", + "library_target_name": "powerfmt", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { - "common": [ - { - "id": "bitflags 1.3.2", - "target": "bitflags" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.4.1" + "edition": "2021", + "version": "0.2.0" }, - "license": "MIT", + "license": "MIT OR Apache-2.0", "license_ids": [ + "Apache-2.0", "MIT" ], - "license_file": "LICENSE" + "license_file": "LICENSE-Apache" }, - "redox_users 0.4.5": { - "name": "redox_users", - "version": "0.4.5", - "package_url": "https://gitlab.redox-os.org/redox-os/users", + "ppv-lite86 0.2.17": { + "name": "ppv-lite86", + "version": "0.2.17", + "package_url": "https://github.com/cryptocorrosion/cryptocorrosion", "repository": { "Http": { - "url": "https://static.crates.io/crates/redox_users/0.4.5/download", - "sha256": "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" + "url": "https://static.crates.io/crates/ppv-lite86/0.2.17/download", + "sha256": "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" } }, "targets": [ { "Library": { - "crate_name": "redox_users", + "crate_name": "ppv_lite86", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10443,51 +9847,42 @@ } } ], - "library_target_name": "redox_users", + "library_target_name": "ppv_lite86", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { + "crate_features": { "common": [ - { - "id": "getrandom 0.2.15", - "target": "getrandom" - }, - { - "id": "libredox 0.1.3", - "target": "libredox" - }, - { - "id": "thiserror 1.0.64", - "target": "thiserror" - } + "simd", + "std" ], "selects": {} }, - "edition": "2021", - "version": "0.4.5" + "edition": "2018", + "version": "0.2.17" }, - "license": "MIT", + "license": "MIT/Apache-2.0", "license_ids": [ + "Apache-2.0", "MIT" ], - "license_file": "LICENSE" + "license_file": "LICENSE-APACHE" }, - "regex 1.11.1": { - "name": "regex", - "version": "1.11.1", - "package_url": "https://github.com/rust-lang/regex", + "predicates 3.1.0": { + "name": "predicates", + "version": "3.1.0", + "package_url": "https://github.com/assert-rs/predicates-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/regex/1.11.1/download", - "sha256": "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" + "url": "https://static.crates.io/crates/predicates/3.1.0/download", + "sha256": "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8" } }, "targets": [ { "Library": { - "crate_name": "regex", + "crate_name": "predicates", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10498,56 +9893,36 @@ } } ], - "library_target_name": "regex", + "library_target_name": "predicates", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "default", - "perf", - "perf-backtrack", - "perf-cache", - "perf-dfa", - "perf-inline", - "perf-literal", - "perf-onepass", - "std", - "unicode", - "unicode-age", - "unicode-bool", - "unicode-case", - "unicode-gencat", - "unicode-perl", - "unicode-script", - "unicode-segment" + "diff" ], "selects": {} }, "deps": { "common": [ { - "id": "aho-corasick 1.1.3", - "target": "aho_corasick" - }, - { - "id": "memchr 2.7.4", - "target": "memchr" + "id": "anstyle 1.0.8", + "target": "anstyle" }, { - "id": "regex-automata 0.4.8", - "target": "regex_automata" + "id": "difflib 0.4.0", + "target": "difflib" }, { - "id": "regex-syntax 0.8.5", - "target": "regex_syntax" + "id": "predicates-core 1.0.6", + "target": "predicates_core" } ], "selects": {} }, "edition": "2021", - "version": "1.11.1" + "version": "3.1.0" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -10556,20 +9931,20 @@ ], "license_file": "LICENSE-APACHE" }, - "regex-automata 0.4.8": { - "name": "regex-automata", - "version": "0.4.8", - "package_url": "https://github.com/rust-lang/regex/tree/master/regex-automata", + "predicates-core 1.0.6": { + "name": "predicates-core", + "version": "1.0.6", + "package_url": "https://github.com/assert-rs/predicates-rs/tree/master/crates/core", "repository": { "Http": { - "url": "https://static.crates.io/crates/regex-automata/0.4.8/download", - "sha256": "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" + "url": "https://static.crates.io/crates/predicates-core/1.0.6/download", + "sha256": "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" } }, "targets": [ { "Library": { - "crate_name": "regex_automata", + "crate_name": "predicates_core", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10580,58 +9955,13 @@ } } ], - "library_target_name": "regex_automata", + "library_target_name": "predicates_core", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "alloc", - "dfa-onepass", - "dfa-search", - "hybrid", - "meta", - "nfa-backtrack", - "nfa-pikevm", - "nfa-thompson", - "perf-inline", - "perf-literal", - "perf-literal-multisubstring", - "perf-literal-substring", - "std", - "syntax", - "unicode", - "unicode-age", - "unicode-bool", - "unicode-case", - "unicode-gencat", - "unicode-perl", - "unicode-script", - "unicode-segment", - "unicode-word-boundary" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "aho-corasick 1.1.3", - "target": "aho_corasick" - }, - { - "id": "memchr 2.7.4", - "target": "memchr" - }, - { - "id": "regex-syntax 0.8.5", - "target": "regex_syntax" - } - ], - "selects": {} - }, "edition": "2021", - "version": "0.4.8" + "version": "1.0.6" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -10640,20 +9970,20 @@ ], "license_file": "LICENSE-APACHE" }, - "regex-syntax 0.8.5": { - "name": "regex-syntax", - "version": "0.8.5", - "package_url": "https://github.com/rust-lang/regex/tree/master/regex-syntax", + "predicates-tree 1.0.9": { + "name": "predicates-tree", + "version": "1.0.9", + "package_url": "https://github.com/assert-rs/predicates-rs/tree/master/crates/tree", "repository": { "Http": { - "url": "https://static.crates.io/crates/regex-syntax/0.8.5/download", - "sha256": "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + "url": "https://static.crates.io/crates/predicates-tree/1.0.9/download", + "sha256": "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" } }, "targets": [ { "Library": { - "crate_name": "regex_syntax", + "crate_name": "predicates_tree", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10664,28 +9994,26 @@ } } ], - "library_target_name": "regex_syntax", + "library_target_name": "predicates_tree", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { + "deps": { "common": [ - "default", - "std", - "unicode", - "unicode-age", - "unicode-bool", - "unicode-case", - "unicode-gencat", - "unicode-perl", - "unicode-script", - "unicode-segment" + { + "id": "predicates-core 1.0.6", + "target": "predicates_core" + }, + { + "id": "termtree 0.4.1", + "target": "termtree" + } ], "selects": {} }, "edition": "2021", - "version": "0.8.5" + "version": "1.0.9" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -10694,20 +10022,20 @@ ], "license_file": "LICENSE-APACHE" }, - "relative-path 1.9.3": { - "name": "relative-path", - "version": "1.9.3", - "package_url": "https://github.com/udoprog/relative-path", + "proc-macro2 1.0.92": { + "name": "proc-macro2", + "version": "1.0.92", + "package_url": "https://github.com/dtolnay/proc-macro2", "repository": { "Http": { - "url": "https://static.crates.io/crates/relative-path/1.9.3/download", - "sha256": "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + "url": "https://static.crates.io/crates/proc-macro2/1.0.92/download", + "sha256": "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" } }, "targets": [ { "Library": { - "crate_name": "relative_path", + "crate_name": "proc_macro2", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10716,43 +10044,77 @@ ] } } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } } ], - "library_target_name": "relative_path", + "library_target_name": "proc_macro2", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "default" + "default", + "proc-macro" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.92", + "target": "build_script_build" + }, + { + "id": "unicode-ident 1.0.13", + "target": "unicode_ident" + } ], "selects": {} }, "edition": "2021", - "version": "1.9.3" + "version": "1.0.92" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ] }, "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", "MIT" ], - "license_file": null + "license_file": "LICENSE-APACHE" }, - "reqwest 0.11.27": { - "name": "reqwest", - "version": "0.11.27", - "package_url": "https://github.com/seanmonstar/reqwest", + "quinn 0.11.3": { + "name": "quinn", + "version": "0.11.3", + "package_url": "https://github.com/quinn-rs/quinn", "repository": { "Http": { - "url": "https://static.crates.io/crates/reqwest/0.11.27/download", - "sha256": "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" + "url": "https://static.crates.io/crates/quinn/0.11.3/download", + "sha256": "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156" } }, "targets": [ { "Library": { - "crate_name": "reqwest", + "crate_name": "quinn", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -10763,857 +10125,891 @@ } } ], - "library_target_name": "reqwest", + "library_target_name": "quinn", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { + "deps": { "common": [ - "__rustls", - "__tls", - "blocking", - "hyper-rustls", - "rustls", - "rustls-tls", - "rustls-tls-webpki-roots", - "tokio-rustls", - "webpki-roots" + { + "id": "bytes 1.9.0", + "target": "bytes" + }, + { + "id": "pin-project-lite 0.2.14", + "target": "pin_project_lite" + }, + { + "id": "quinn-proto 0.11.6", + "target": "quinn_proto", + "alias": "proto" + }, + { + "id": "quinn-udp 0.5.4", + "target": "quinn_udp", + "alias": "udp" + }, + { + "id": "rustc-hash 2.0.0", + "target": "rustc_hash" + }, + { + "id": "socket2 0.5.7", + "target": "socket2" + }, + { + "id": "thiserror 1.0.69", + "target": "thiserror" + }, + { + "id": "tokio 1.42.0", + "target": "tokio" + }, + { + "id": "tracing 0.1.40", + "target": "tracing" + } ], "selects": {} }, + "edition": "2021", + "version": "0.11.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "quinn-proto 0.11.6": { + "name": "quinn-proto", + "version": "0.11.6", + "package_url": "https://github.com/quinn-rs/quinn", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/quinn-proto/0.11.6/download", + "sha256": "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" + } + }, + "targets": [ + { + "Library": { + "crate_name": "quinn_proto", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "quinn_proto", + "common_attrs": { + "compile_data_glob": [ + "**" + ], "deps": { "common": [ { - "id": "base64 0.21.7", - "target": "base64" - }, - { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "futures-core 0.3.30", - "target": "futures_core" + "id": "rand 0.8.5", + "target": "rand" }, { - "id": "futures-util 0.3.30", - "target": "futures_util" + "id": "rustc-hash 2.0.0", + "target": "rustc_hash" }, { - "id": "http 0.2.12", - "target": "http" + "id": "slab 0.4.9", + "target": "slab" }, { - "id": "serde 1.0.210", - "target": "serde" + "id": "thiserror 1.0.69", + "target": "thiserror" }, { - "id": "serde_urlencoded 0.7.1", - "target": "serde_urlencoded" + "id": "tinyvec 1.6.0", + "target": "tinyvec" }, { - "id": "sync_wrapper 0.1.2", - "target": "sync_wrapper" - }, + "id": "tracing 0.1.40", + "target": "tracing" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.11.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "quinn-udp 0.5.4": { + "name": "quinn-udp", + "version": "0.5.4", + "package_url": "https://github.com/quinn-rs/quinn", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/quinn-udp/0.5.4/download", + "sha256": "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" + } + }, + "targets": [ + { + "Library": { + "crate_name": "quinn_udp", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "quinn_udp", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ { - "id": "tower-service 0.3.2", - "target": "tower_service" + "id": "libc 0.2.168", + "target": "libc" }, { - "id": "url 2.5.0", - "target": "url" + "id": "socket2 0.5.7", + "target": "socket2" } ], "selects": { - "aarch64-apple-darwin": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, + "cfg(windows)": [ { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" + "id": "once_cell 1.19.0", + "target": "once_cell" }, { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, + "id": "windows-sys 0.52.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2021", + "version": "0.5.4" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "quote 1.0.37": { + "name": "quote", + "version": "1.0.37", + "package_url": "https://github.com/dtolnay/quote", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/quote/1.0.37/download", + "sha256": "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" + } + }, + "targets": [ + { + "Library": { + "crate_name": "quote", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "quote", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "proc-macro" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.37" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "rand 0.8.5": { + "name": "rand", + "version": "0.8.5", + "package_url": "https://github.com/rust-random/rand", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/rand/0.8.5/download", + "sha256": "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rand", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "rand", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "default", + "getrandom", + "libc", + "rand_chacha", + "std", + "std_rng" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "rand_chacha 0.3.1", + "target": "rand_chacha" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + } + ], + "selects": { + "aarch64-apple-darwin": [ { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" + "id": "libc 0.2.168", + "target": "libc" } ], "aarch64-apple-ios": [ { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" + "id": "libc 0.2.168", + "target": "libc" } ], "aarch64-apple-ios-sim": [ { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "aarch64-linux-android": [ { - "id": "rustls 0.21.12", - "target": "rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "aarch64-unknown-fuchsia": [ { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "aarch64-unknown-linux-gnu": [ { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "aarch64-unknown-nixos-gnu": [ { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" + "id": "libc 0.2.168", + "target": "libc" } ], - "aarch64-fuchsia": [ + "aarch64-unknown-nto-qnx710": [ { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "arm-unknown-linux-gnueabi": [ { - "id": "rustls 0.21.12", - "target": "rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "armv7-linux-androideabi": [ { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "armv7-unknown-linux-gnueabi": [ { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "i686-apple-darwin": [ { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" + "id": "libc 0.2.168", + "target": "libc" } ], - "aarch64-linux-android": [ + "i686-linux-android": [ { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "i686-unknown-freebsd": [ { - "id": "rustls 0.21.12", - "target": "rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "i686-unknown-linux-gnu": [ { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "powerpc-unknown-linux-gnu": [ { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "s390x-unknown-linux-gnu": [ { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" + "id": "libc 0.2.168", + "target": "libc" } ], - "aarch64-pc-windows-msvc": [ + "x86_64-apple-darwin": [ { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "x86_64-apple-ios": [ { - "id": "rustls 0.21.12", - "target": "rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "x86_64-linux-android": [ { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "x86_64-unknown-freebsd": [ { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "x86_64-unknown-fuchsia": [ { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" + "id": "libc 0.2.168", + "target": "libc" } ], - "aarch64-unknown-linux-gnu": [ + "x86_64-unknown-linux-gnu": [ { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, + "id": "libc 0.2.168", + "target": "libc" + } + ], + "x86_64-unknown-nixos-gnu": [ { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "aarch64-unknown-nixos-gnu": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "aarch64-unknown-nto-qnx710": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "arm-unknown-linux-gnueabi": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "armv7-linux-androideabi": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "armv7-unknown-linux-gnueabi": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "cfg(not(target_arch = \"wasm32\"))": [ - { - "id": "encoding_rs 0.8.34", - "target": "encoding_rs" - }, - { - "id": "h2 0.3.26", - "target": "h2" - }, - { - "id": "http-body 0.4.6", - "target": "http_body" - }, - { - "id": "hyper 0.14.28", - "target": "hyper" - }, - { - "id": "ipnet 2.9.0", - "target": "ipnet" - }, - { - "id": "log 0.4.22", - "target": "log" - }, - { - "id": "mime 0.3.17", - "target": "mime" - }, - { - "id": "once_cell 1.19.0", - "target": "once_cell" - }, - { - "id": "percent-encoding 2.3.1", - "target": "percent_encoding" - }, - { - "id": "pin-project-lite 0.2.14", - "target": "pin_project_lite" - }, - { - "id": "tokio 1.40.0", - "target": "tokio" - } - ], - "cfg(target_arch = \"wasm32\")": [ - { - "id": "js-sys 0.3.69", - "target": "js_sys" - }, - { - "id": "serde_json 1.0.128", - "target": "serde_json" - }, - { - "id": "wasm-bindgen 0.2.92", - "target": "wasm_bindgen" - }, - { - "id": "wasm-bindgen-futures 0.4.42", - "target": "wasm_bindgen_futures" - }, - { - "id": "web-sys 0.3.69", - "target": "web_sys" - } - ], - "cfg(target_os = \"macos\")": [ - { - "id": "system-configuration 0.5.1", - "target": "system_configuration" - } - ], - "cfg(windows)": [ - { - "id": "winreg 0.50.0", - "target": "winreg" - } - ], - "i686-apple-darwin": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "i686-linux-android": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "i686-pc-windows-msvc": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "i686-unknown-freebsd": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "i686-unknown-linux-gnu": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "powerpc-unknown-linux-gnu": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "riscv32imc-unknown-none-elf": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "riscv64gc-unknown-none-elf": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "s390x-unknown-linux-gnu": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "thumbv7em-none-eabi": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "thumbv8m.main-none-eabi": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-apple-darwin": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-apple-ios": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-fuchsia": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-linux-android": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-pc-windows-msvc": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-unknown-freebsd": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-unknown-linux-gnu": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-unknown-nixos-gnu": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" - } - ], - "x86_64-unknown-none": [ - { - "id": "hyper-rustls 0.24.2", - "target": "hyper_rustls" - }, - { - "id": "rustls 0.21.12", - "target": "rustls" - }, - { - "id": "rustls-pemfile 1.0.4", - "target": "rustls_pemfile" - }, - { - "id": "tokio-rustls 0.24.1", - "target": "tokio_rustls" - }, - { - "id": "webpki-roots 0.25.4", - "target": "webpki_roots" + "id": "libc 0.2.168", + "target": "libc" } ] } }, + "edition": "2018", + "version": "0.8.5" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "rand_chacha 0.3.1": { + "name": "rand_chacha", + "version": "0.3.1", + "package_url": "https://github.com/rust-random/rand", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/rand_chacha/0.3.1/download", + "sha256": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rand_chacha", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "rand_chacha", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "ppv-lite86 0.2.17", + "target": "ppv_lite86" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.3.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "rand_core 0.6.4": { + "name": "rand_core", + "version": "0.6.4", + "package_url": "https://github.com/rust-random/rand", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/rand_core/0.6.4/download", + "sha256": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rand_core", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "rand_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "getrandom", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "getrandom 0.2.15", + "target": "getrandom" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.6.4" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "redox_syscall 0.4.1": { + "name": "redox_syscall", + "version": "0.4.1", + "package_url": "https://gitlab.redox-os.org/redox-os/syscall", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/redox_syscall/0.4.1/download", + "sha256": "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "syscall", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "syscall", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "bitflags 1.3.2", + "target": "bitflags" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.4.1" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE" + }, + "redox_users 0.4.5": { + "name": "redox_users", + "version": "0.4.5", + "package_url": "https://gitlab.redox-os.org/redox-os/users", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/redox_users/0.4.5/download", + "sha256": "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" + } + }, + "targets": [ + { + "Library": { + "crate_name": "redox_users", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "redox_users", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "getrandom 0.2.15", + "target": "getrandom" + }, + { + "id": "libredox 0.1.3", + "target": "libredox" + }, + { + "id": "thiserror 1.0.69", + "target": "thiserror" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.5" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE" + }, + "regex 1.11.1": { + "name": "regex", + "version": "1.11.1", + "package_url": "https://github.com/rust-lang/regex", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/regex/1.11.1/download", + "sha256": "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "regex", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "perf", + "perf-backtrack", + "perf-cache", + "perf-dfa", + "perf-inline", + "perf-literal", + "perf-onepass", + "std", + "unicode", + "unicode-age", + "unicode-bool", + "unicode-case", + "unicode-gencat", + "unicode-perl", + "unicode-script", + "unicode-segment" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aho-corasick 1.1.3", + "target": "aho_corasick" + }, + { + "id": "memchr 2.7.4", + "target": "memchr" + }, + { + "id": "regex-automata 0.4.8", + "target": "regex_automata" + }, + { + "id": "regex-syntax 0.8.5", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.11.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "regex-automata 0.4.8": { + "name": "regex-automata", + "version": "0.4.8", + "package_url": "https://github.com/rust-lang/regex/tree/master/regex-automata", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/regex-automata/0.4.8/download", + "sha256": "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_automata", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "regex_automata", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "dfa-onepass", + "dfa-search", + "hybrid", + "meta", + "nfa-backtrack", + "nfa-pikevm", + "nfa-thompson", + "perf-inline", + "perf-literal", + "perf-literal-multisubstring", + "perf-literal-substring", + "std", + "syntax", + "unicode", + "unicode-age", + "unicode-bool", + "unicode-case", + "unicode-gencat", + "unicode-perl", + "unicode-script", + "unicode-segment", + "unicode-word-boundary" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aho-corasick 1.1.3", + "target": "aho_corasick" + }, + { + "id": "memchr 2.7.4", + "target": "memchr" + }, + { + "id": "regex-syntax 0.8.5", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.8" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "regex-syntax 0.8.5": { + "name": "regex-syntax", + "version": "0.8.5", + "package_url": "https://github.com/rust-lang/regex/tree/master/regex-syntax", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/regex-syntax/0.8.5/download", + "sha256": "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_syntax", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "regex_syntax", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std", + "unicode", + "unicode-age", + "unicode-bool", + "unicode-case", + "unicode-gencat", + "unicode-perl", + "unicode-script", + "unicode-segment" + ], + "selects": {} + }, "edition": "2021", - "version": "0.11.27" + "version": "0.8.5" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -11622,14 +11018,59 @@ ], "license_file": "LICENSE-APACHE" }, - "reqwest 0.12.8": { + "relative-path 1.9.3": { + "name": "relative-path", + "version": "1.9.3", + "package_url": "https://github.com/udoprog/relative-path", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/relative-path/1.9.3/download", + "sha256": "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + } + }, + "targets": [ + { + "Library": { + "crate_name": "relative_path", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "relative_path", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2021", + "version": "1.9.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "reqwest 0.12.9": { "name": "reqwest", - "version": "0.12.8", + "version": "0.12.9", "package_url": "https://github.com/seanmonstar/reqwest", "repository": { "Http": { - "url": "https://static.crates.io/crates/reqwest/0.12.8/download", - "sha256": "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" + "url": "https://static.crates.io/crates/reqwest/0.12.9/download", + "sha256": "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" } }, "targets": [ @@ -11656,8 +11097,10 @@ "__rustls", "__rustls-ring", "__tls", + "blocking", "rustls-tls", - "rustls-tls-webpki-roots" + "rustls-tls-webpki-roots", + "rustls-tls-webpki-roots-no-provider" ], "selects": {} }, @@ -11668,7 +11111,7 @@ "target": "base64" }, { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -11684,7 +11127,7 @@ "target": "http" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" }, { @@ -11700,12 +11143,16 @@ "target": "tower_service" }, { - "id": "url 2.5.0", + "id": "url 2.5.4", "target": "url" } ], "selects": { "aarch64-apple-darwin": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11732,6 +11179,10 @@ } ], "aarch64-apple-ios": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11758,6 +11209,10 @@ } ], "aarch64-apple-ios-sim": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11783,7 +11238,11 @@ "target": "webpki_roots" } ], - "aarch64-fuchsia": [ + "aarch64-linux-android": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11809,7 +11268,11 @@ "target": "webpki_roots" } ], - "aarch64-linux-android": [ + "aarch64-pc-windows-msvc": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11835,7 +11298,11 @@ "target": "webpki_roots" } ], - "aarch64-pc-windows-msvc": [ + "aarch64-unknown-fuchsia": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11862,6 +11329,10 @@ } ], "aarch64-unknown-linux-gnu": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11888,6 +11359,10 @@ } ], "aarch64-unknown-nixos-gnu": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11914,6 +11389,10 @@ } ], "aarch64-unknown-nto-qnx710": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11940,6 +11419,10 @@ } ], "arm-unknown-linux-gnueabi": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11966,6 +11449,10 @@ } ], "armv7-linux-androideabi": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -11992,6 +11479,10 @@ } ], "armv7-unknown-linux-gnueabi": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12059,7 +11550,7 @@ "target": "pin_project_lite" }, { - "id": "tokio 1.40.0", + "id": "tokio 1.42.0", "target": "tokio" } ], @@ -12069,7 +11560,7 @@ "target": "js_sys" }, { - "id": "serde_json 1.0.128", + "id": "serde_json 1.0.133", "target": "serde_json" }, { @@ -12092,6 +11583,10 @@ } ], "i686-apple-darwin": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12118,6 +11613,10 @@ } ], "i686-linux-android": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12144,6 +11643,10 @@ } ], "i686-pc-windows-msvc": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12170,6 +11673,10 @@ } ], "i686-unknown-freebsd": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12196,6 +11703,10 @@ } ], "i686-unknown-linux-gnu": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12222,6 +11733,10 @@ } ], "powerpc-unknown-linux-gnu": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12248,6 +11763,10 @@ } ], "riscv32imc-unknown-none-elf": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12274,6 +11793,10 @@ } ], "riscv64gc-unknown-none-elf": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12300,6 +11823,10 @@ } ], "s390x-unknown-linux-gnu": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12326,6 +11853,10 @@ } ], "thumbv7em-none-eabi": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12352,6 +11883,10 @@ } ], "thumbv8m.main-none-eabi": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12378,6 +11913,10 @@ } ], "x86_64-apple-darwin": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12404,6 +11943,10 @@ } ], "x86_64-apple-ios": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12429,7 +11972,11 @@ "target": "webpki_roots" } ], - "x86_64-fuchsia": [ + "x86_64-linux-android": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12455,7 +12002,11 @@ "target": "webpki_roots" } ], - "x86_64-linux-android": [ + "x86_64-pc-windows-msvc": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12481,7 +12032,11 @@ "target": "webpki_roots" } ], - "x86_64-pc-windows-msvc": [ + "x86_64-unknown-freebsd": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12507,7 +12062,11 @@ "target": "webpki_roots" } ], - "x86_64-unknown-freebsd": [ + "x86_64-unknown-fuchsia": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12534,6 +12093,10 @@ } ], "x86_64-unknown-linux-gnu": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12560,6 +12123,10 @@ } ], "x86_64-unknown-nixos-gnu": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12586,6 +12153,10 @@ } ], "x86_64-unknown-none": [ + { + "id": "futures-channel 0.3.30", + "target": "futures_channel" + }, { "id": "hyper-rustls 0.27.2", "target": "hyper_rustls" @@ -12614,7 +12185,7 @@ } }, "edition": "2021", - "version": "0.12.8" + "version": "0.12.9" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -12694,7 +12265,7 @@ "selects": { "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(target_arch = \"aarch64\", target_arch = \"arm\")))": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], @@ -12863,7 +12434,7 @@ "target": "glob" }, { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -12883,7 +12454,7 @@ "target": "build_script_build" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" }, { @@ -13046,14 +12617,14 @@ ], "license_file": "LICENSE-APACHE" }, - "rustix 0.38.37": { + "rustix 0.38.42": { "name": "rustix", - "version": "0.38.37", + "version": "0.38.42", "package_url": "https://github.com/bytecodealliance/rustix", "repository": { "Http": { - "url": "https://static.crates.io/crates/rustix/0.38.37/download", - "sha256": "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" + "url": "https://static.crates.io/crates/rustix/0.38.42/download", + "sha256": "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" } }, "targets": [ @@ -13105,247 +12676,247 @@ "target": "bitflags" }, { - "id": "rustix 0.38.37", + "id": "rustix 0.38.42", "target": "build_script_build" } ], "selects": { "aarch64-apple-darwin": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "aarch64-apple-ios": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "aarch64-apple-ios-sim": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], - "aarch64-fuchsia": [ + "aarch64-linux-android": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], - "aarch64-linux-android": [ + "aarch64-unknown-fuchsia": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "aarch64-unknown-nto-qnx710": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "armv7-linux-androideabi": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], - "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))": [ + "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", target_arch = \"s390x\"), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))": [ { "id": "linux-raw-sys 0.4.14", "target": "linux_raw_sys" } ], - "cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))": [ + "cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", target_arch = \"s390x\"), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))": [ { "id": "linux-raw-sys 0.4.14", "target": "linux_raw_sys" } ], - "cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))": [ + "cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", target_arch = \"s390x\"), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "cfg(windows)": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "windows-sys 0.52.0", + "id": "windows-sys 0.59.0", "target": "windows_sys" } ], "i686-apple-darwin": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "i686-linux-android": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "i686-unknown-freebsd": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "powerpc-unknown-linux-gnu": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "s390x-unknown-linux-gnu": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], - "wasm32-wasi": [ + "wasm32-wasip1": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "x86_64-apple-darwin": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], "x86_64-apple-ios": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], - "x86_64-fuchsia": [ + "x86_64-linux-android": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], - "x86_64-linux-android": [ + "x86_64-unknown-freebsd": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], - "x86_64-unknown-freebsd": [ + "x86_64-unknown-fuchsia": [ { - "id": "errno 0.3.9", + "id": "errno 0.3.10", "target": "errno", "alias": "libc_errno" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ] } }, "edition": "2021", - "version": "0.38.37" + "version": "0.38.42" }, "build_script_attrs": { "compile_data_glob": [ @@ -13362,110 +12933,6 @@ ], "license_file": "LICENSE-APACHE" }, - "rustls 0.21.12": { - "name": "rustls", - "version": "0.21.12", - "package_url": "https://github.com/rustls/rustls", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/rustls/0.21.12/download", - "sha256": "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" - } - }, - "targets": [ - { - "Library": { - "crate_name": "rustls", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "rustls", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "dangerous_configuration", - "default", - "log", - "logging", - "tls12" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "log 0.4.22", - "target": "log" - }, - { - "id": "ring 0.17.8", - "target": "ring" - }, - { - "id": "rustls 0.21.12", - "target": "build_script_build" - }, - { - "id": "rustls-webpki 0.101.7", - "target": "webpki" - }, - { - "id": "sct 0.7.1", - "target": "sct" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.21.12" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ], - "link_deps": { - "common": [ - { - "id": "ring 0.17.8", - "target": "ring" - } - ], - "selects": {} - } - }, - "license": "Apache-2.0 OR ISC OR MIT", - "license_ids": [ - "Apache-2.0", - "ISC", - "MIT" - ], - "license_file": "LICENSE-APACHE" - }, "rustls 0.23.12": { "name": "rustls", "version": "0.23.12", @@ -13543,7 +13010,7 @@ "target": "subtle" }, { - "id": "zeroize 1.7.0", + "id": "zeroize 1.8.1", "target": "zeroize" } ], @@ -13577,55 +13044,6 @@ ], "license_file": "LICENSE-APACHE" }, - "rustls-pemfile 1.0.4": { - "name": "rustls-pemfile", - "version": "1.0.4", - "package_url": "https://github.com/rustls/pemfile", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/rustls-pemfile/1.0.4/download", - "sha256": "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" - } - }, - "targets": [ - { - "Library": { - "crate_name": "rustls_pemfile", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "rustls_pemfile", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "base64 0.21.7", - "target": "base64" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "1.0.4" - }, - "license": "Apache-2.0 OR ISC OR MIT", - "license_ids": [ - "Apache-2.0", - "ISC", - "MIT" - ], - "license_file": "LICENSE" - }, "rustls-pemfile 2.1.2": { "name": "rustls-pemfile", "version": "2.1.2", @@ -13734,65 +13152,6 @@ ], "license_file": "LICENSE-APACHE" }, - "rustls-webpki 0.101.7": { - "name": "rustls-webpki", - "version": "0.101.7", - "package_url": "https://github.com/rustls/webpki", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/rustls-webpki/0.101.7/download", - "sha256": "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" - } - }, - "targets": [ - { - "Library": { - "crate_name": "webpki", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "webpki", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "alloc", - "default", - "std" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "ring 0.17.8", - "target": "ring" - }, - { - "id": "untrusted 0.9.0", - "target": "untrusted" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.101.7" - }, - "license": "ISC", - "license_ids": [ - "ISC" - ], - "license_file": "LICENSE" - }, "rustls-webpki 0.102.6": { "name": "rustls-webpki", "version": "0.102.6", @@ -14013,63 +13372,8 @@ }, "targets": [ { - "ProcMacro": { - "crate_name": "scroll_derive", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "scroll_derive", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "proc-macro2 1.0.88", - "target": "proc_macro2" - }, - { - "id": "quote 1.0.37", - "target": "quote" - }, - { - "id": "syn 2.0.79", - "target": "syn" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "0.12.0" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE" - }, - "sct 0.7.1": { - "name": "sct", - "version": "0.7.1", - "package_url": "https://github.com/rustls/sct.rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/sct/0.7.1/download", - "sha256": "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" - } - }, - "targets": [ - { - "Library": { - "crate_name": "sct", + "ProcMacro": { + "crate_name": "scroll_derive", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -14080,7 +13384,7 @@ } } ], - "library_target_name": "sct", + "library_target_name": "scroll_derive", "common_attrs": { "compile_data_glob": [ "**" @@ -14088,30 +13392,32 @@ "deps": { "common": [ { - "id": "ring 0.17.8", - "target": "ring" + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" }, { - "id": "untrusted 0.9.0", - "target": "untrusted" + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.90", + "target": "syn" } ], "selects": {} }, - "edition": "2021", - "version": "0.7.1" + "edition": "2018", + "version": "0.12.0" }, - "license": "Apache-2.0 OR ISC OR MIT", + "license": "MIT", "license_ids": [ - "Apache-2.0", - "ISC", "MIT" ], "license_file": "LICENSE" }, - "selenium-manager 0.4.24": { + "selenium-manager 0.4.28-nightly": { "name": "selenium-manager", - "version": "0.4.24", + "version": "0.4.28-nightly", "package_url": "https://github.com/SeleniumHQ/selenium", "repository": null, "targets": [ @@ -14136,19 +13442,19 @@ "deps": { "common": [ { - "id": "anyhow 1.0.91", + "id": "anyhow 1.0.94", "target": "anyhow" }, { - "id": "apple-flat-package 0.18.0", + "id": "apple-flat-package 0.20.0", "target": "apple_flat_package" }, { - "id": "bzip2 0.4.4", + "id": "bzip2 0.5.0", "target": "bzip2" }, { - "id": "clap 4.5.20", + "id": "clap 4.5.23", "target": "clap" }, { @@ -14168,9 +13474,17 @@ "target": "exitcode" }, { - "id": "flate2 1.0.34", + "id": "flate2 1.0.35", "target": "flate2" }, + { + "id": "fs2 0.4.3", + "target": "fs2" + }, + { + "id": "fs_extra 1.3.0", + "target": "fs_extra" + }, { "id": "infer 0.16.0", "target": "infer" @@ -14184,15 +13498,15 @@ "target": "regex" }, { - "id": "reqwest 0.12.8", + "id": "reqwest 0.12.9", "target": "reqwest" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" }, { - "id": "serde_json 1.0.128", + "id": "serde_json 1.0.133", "target": "serde_json" }, { @@ -14200,15 +13514,15 @@ "target": "sevenz_rust" }, { - "id": "tar 0.4.42", + "id": "tar 0.4.43", "target": "tar" }, { - "id": "tempfile 3.13.0", + "id": "tempfile 3.14.0", "target": "tempfile" }, { - "id": "tokio 1.40.0", + "id": "tokio 1.42.0", "target": "tokio" }, { @@ -14220,11 +13534,15 @@ "target": "walkdir" }, { - "id": "which 6.0.3", + "id": "which 7.0.0", "target": "which" }, { - "id": "zip 2.2.0", + "id": "xz2 0.1.7", + "target": "xz2" + }, + { + "id": "zip 2.2.1", "target": "zip" } ], @@ -14248,7 +13566,7 @@ "selects": {} }, "edition": "2021", - "version": "0.4.24" + "version": "0.4.28-nightly" }, "license": "Apache-2.0", "license_ids": [ @@ -14331,14 +13649,14 @@ ], "license_file": "LICENSE-APACHE" }, - "serde 1.0.210": { + "serde 1.0.216": { "name": "serde", - "version": "1.0.210", + "version": "1.0.216", "package_url": "https://github.com/serde-rs/serde", "repository": { "Http": { - "url": "https://static.crates.io/crates/serde/1.0.210/download", - "sha256": "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" + "url": "https://static.crates.io/crates/serde/1.0.216/download", + "sha256": "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" } }, "targets": [ @@ -14384,7 +13702,7 @@ "deps": { "common": [ { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "build_script_build" } ], @@ -14394,13 +13712,13 @@ "proc_macro_deps": { "common": [ { - "id": "serde_derive 1.0.210", + "id": "serde_derive 1.0.216", "target": "serde_derive" } ], "selects": {} }, - "version": "1.0.210" + "version": "1.0.216" }, "build_script_attrs": { "compile_data_glob": [ @@ -14453,15 +13771,15 @@ "target": "log" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" }, { - "id": "thiserror 1.0.64", + "id": "thiserror 1.0.69", "target": "thiserror" }, { - "id": "xml-rs 0.8.20", + "id": "xml-rs 0.8.24", "target": "xml" } ], @@ -14476,14 +13794,14 @@ ], "license_file": "LICENSE" }, - "serde_derive 1.0.210": { + "serde_derive 1.0.216": { "name": "serde_derive", - "version": "1.0.210", + "version": "1.0.216", "package_url": "https://github.com/serde-rs/serde", "repository": { "Http": { - "url": "https://static.crates.io/crates/serde_derive/1.0.210/download", - "sha256": "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" + "url": "https://static.crates.io/crates/serde_derive/1.0.216/download", + "sha256": "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" } }, "targets": [ @@ -14514,7 +13832,7 @@ "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -14522,14 +13840,14 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" } ], "selects": {} }, "edition": "2015", - "version": "1.0.210" + "version": "1.0.216" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -14538,14 +13856,14 @@ ], "license_file": "LICENSE-APACHE" }, - "serde_json 1.0.128": { + "serde_json 1.0.133": { "name": "serde_json", - "version": "1.0.128", + "version": "1.0.133", "package_url": "https://github.com/serde-rs/json", "repository": { "Http": { - "url": "https://static.crates.io/crates/serde_json/1.0.128/download", - "sha256": "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" + "url": "https://static.crates.io/crates/serde_json/1.0.133/download", + "sha256": "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" } }, "targets": [ @@ -14601,18 +13919,18 @@ "target": "ryu" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" }, { - "id": "serde_json 1.0.128", + "id": "serde_json 1.0.133", "target": "build_script_build" } ], "selects": {} }, "edition": "2021", - "version": "1.0.128" + "version": "1.0.133" }, "build_script_attrs": { "compile_data_glob": [ @@ -14667,7 +13985,7 @@ "deps": { "common": [ { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" } ], @@ -14727,7 +14045,7 @@ "target": "ryu" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" } ], @@ -15208,134 +14526,104 @@ "**" ], "crate_features": { - "common": [], + "common": [ + "const_generics" + ], "selects": { "aarch64-apple-darwin": [ - "const_generics", "const_new" ], "aarch64-apple-ios": [ - "const_generics", "const_new" ], "aarch64-apple-ios-sim": [ - "const_generics", - "const_new" - ], - "aarch64-fuchsia": [ - "const_generics", "const_new" ], "aarch64-linux-android": [ - "const_generics", "const_new" ], "aarch64-pc-windows-msvc": [ - "const_generics", + "const_new" + ], + "aarch64-unknown-fuchsia": [ "const_new" ], "aarch64-unknown-linux-gnu": [ - "const_generics", "const_new" ], "aarch64-unknown-nixos-gnu": [ - "const_generics", "const_new" ], "aarch64-unknown-nto-qnx710": [ - "const_generics", "const_new" ], "arm-unknown-linux-gnueabi": [ - "const_generics", "const_new" ], "armv7-linux-androideabi": [ - "const_generics", "const_new" ], "armv7-unknown-linux-gnueabi": [ - "const_generics", "const_new" ], "i686-apple-darwin": [ - "const_generics", "const_new" ], "i686-linux-android": [ - "const_generics", "const_new" ], "i686-pc-windows-msvc": [ - "const_generics", "const_new" ], "i686-unknown-freebsd": [ - "const_generics", "const_new" ], "i686-unknown-linux-gnu": [ - "const_generics", "const_new" ], "powerpc-unknown-linux-gnu": [ - "const_generics", "const_new" ], "riscv32imc-unknown-none-elf": [ - "const_generics", "const_new" ], "riscv64gc-unknown-none-elf": [ - "const_generics", "const_new" ], "s390x-unknown-linux-gnu": [ - "const_generics", "const_new" ], "thumbv7em-none-eabi": [ - "const_generics", "const_new" ], "thumbv8m.main-none-eabi": [ - "const_generics", "const_new" ], "x86_64-apple-darwin": [ - "const_generics", "const_new" ], "x86_64-apple-ios": [ - "const_generics", - "const_new" - ], - "x86_64-fuchsia": [ - "const_generics", "const_new" ], "x86_64-linux-android": [ - "const_generics", "const_new" ], "x86_64-pc-windows-msvc": [ - "const_generics", "const_new" ], "x86_64-unknown-freebsd": [ - "const_generics", + "const_new" + ], + "x86_64-unknown-fuchsia": [ "const_new" ], "x86_64-unknown-linux-gnu": [ - "const_generics", "const_new" ], "x86_64-unknown-nixos-gnu": [ - "const_generics", "const_new" ], "x86_64-unknown-none": [ - "const_generics", "const_new" ] } @@ -15390,7 +14678,7 @@ "selects": { "cfg(unix)": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], @@ -15510,6 +14798,51 @@ ], "license_file": "LICENSE-APACHE" }, + "stable_deref_trait 1.2.0": { + "name": "stable_deref_trait", + "version": "1.2.0", + "package_url": "https://github.com/storyyeller/stable_deref_trait", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/stable_deref_trait/1.2.0/download", + "sha256": "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "stable_deref_trait", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "stable_deref_trait", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc" + ], + "selects": {} + }, + "edition": "2015", + "version": "1.2.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "strsim 0.11.1": { "name": "strsim", "version": "0.11.1", @@ -15586,14 +14919,14 @@ ], "license_file": "LICENSE" }, - "syn 2.0.79": { + "syn 2.0.90": { "name": "syn", - "version": "2.0.79", + "version": "2.0.90", "package_url": "https://github.com/dtolnay/syn", "repository": { "Http": { - "url": "https://static.crates.io/crates/syn/2.0.79/download", - "sha256": "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" + "url": "https://static.crates.io/crates/syn/2.0.90/download", + "sha256": "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" } }, "targets": [ @@ -15621,6 +14954,7 @@ "default", "derive", "extra-traits", + "fold", "full", "parsing", "printing", @@ -15633,7 +14967,7 @@ "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -15648,7 +14982,7 @@ "selects": {} }, "edition": "2021", - "version": "2.0.79" + "version": "2.0.90" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -15657,44 +14991,6 @@ ], "license_file": "LICENSE-APACHE" }, - "sync_wrapper 0.1.2": { - "name": "sync_wrapper", - "version": "0.1.2", - "package_url": "https://github.com/Actyx/sync_wrapper", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/sync_wrapper/0.1.2/download", - "sha256": "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - } - }, - "targets": [ - { - "Library": { - "crate_name": "sync_wrapper", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "sync_wrapper", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "edition": "2018", - "version": "0.1.2" - }, - "license": "Apache-2.0", - "license_ids": [ - "Apache-2.0" - ], - "license_file": "LICENSE" - }, "sync_wrapper 1.0.1": { "name": "sync_wrapper", "version": "1.0.1", @@ -15749,20 +15045,20 @@ ], "license_file": "LICENSE" }, - "system-configuration 0.5.1": { - "name": "system-configuration", - "version": "0.5.1", - "package_url": "https://github.com/mullvad/system-configuration-rs", + "synstructure 0.13.1": { + "name": "synstructure", + "version": "0.13.1", + "package_url": "https://github.com/mystor/synstructure", "repository": { "Http": { - "url": "https://static.crates.io/crates/system-configuration/0.5.1/download", - "sha256": "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" + "url": "https://static.crates.io/crates/synstructure/0.13.1/download", + "sha256": "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" } }, "targets": [ { "Library": { - "crate_name": "system_configuration", + "crate_name": "synstructure", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -15773,122 +15069,52 @@ } } ], - "library_target_name": "system_configuration", + "library_target_name": "synstructure", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { + "crate_features": { "common": [ - { - "id": "bitflags 1.3.2", - "target": "bitflags" - }, - { - "id": "core-foundation 0.9.4", - "target": "core_foundation" - }, - { - "id": "system-configuration-sys 0.5.0", - "target": "system_configuration_sys" - } + "default", + "proc-macro" ], "selects": {} }, - "edition": "2021", - "version": "0.5.1" - }, - "license": "MIT OR Apache-2.0", - "license_ids": [ - "Apache-2.0", - "MIT" - ], - "license_file": null - }, - "system-configuration-sys 0.5.0": { - "name": "system-configuration-sys", - "version": "0.5.0", - "package_url": "https://github.com/mullvad/system-configuration-rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/system-configuration-sys/0.5.0/download", - "sha256": "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" - } - }, - "targets": [ - { - "Library": { - "crate_name": "system_configuration_sys", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "system_configuration_sys", - "common_attrs": { - "compile_data_glob": [ - "**" - ], "deps": { "common": [ { - "id": "core-foundation-sys 0.8.6", - "target": "core_foundation_sys" + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" }, { - "id": "libc 0.2.160", - "target": "libc" + "id": "quote 1.0.37", + "target": "quote" }, { - "id": "system-configuration-sys 0.5.0", - "target": "build_script_build" + "id": "syn 2.0.90", + "target": "syn" } ], "selects": {} }, - "edition": "2021", - "version": "0.5.0" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ] + "edition": "2018", + "version": "0.13.1" }, - "license": "MIT OR Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0", "MIT" ], - "license_file": null + "license_file": "LICENSE" }, - "tar 0.4.42": { + "tar 0.4.43": { "name": "tar", - "version": "0.4.42", + "version": "0.4.43", "package_url": "https://github.com/alexcrichton/tar-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/tar/0.4.42/download", - "sha256": "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" + "url": "https://static.crates.io/crates/tar/0.4.43/download", + "sha256": "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" } }, "targets": [ @@ -15943,13 +15169,13 @@ "target": "xattr" } ], - "aarch64-fuchsia": [ + "aarch64-linux-android": [ { "id": "xattr 1.3.1", "target": "xattr" } ], - "aarch64-linux-android": [ + "aarch64-unknown-fuchsia": [ { "id": "xattr 1.3.1", "target": "xattr" @@ -15993,7 +15219,7 @@ ], "cfg(unix)": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ], @@ -16045,19 +15271,19 @@ "target": "xattr" } ], - "x86_64-fuchsia": [ + "x86_64-linux-android": [ { "id": "xattr 1.3.1", "target": "xattr" } ], - "x86_64-linux-android": [ + "x86_64-unknown-freebsd": [ { "id": "xattr 1.3.1", "target": "xattr" } ], - "x86_64-unknown-freebsd": [ + "x86_64-unknown-fuchsia": [ { "id": "xattr 1.3.1", "target": "xattr" @@ -16078,7 +15304,7 @@ } }, "edition": "2021", - "version": "0.4.42" + "version": "0.4.43" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -16087,14 +15313,14 @@ ], "license_file": "LICENSE-APACHE" }, - "tempfile 3.13.0": { + "tempfile 3.14.0": { "name": "tempfile", - "version": "3.13.0", + "version": "3.14.0", "package_url": "https://github.com/Stebalien/tempfile", "repository": { "Http": { - "url": "https://static.crates.io/crates/tempfile/3.13.0/download", - "sha256": "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" + "url": "https://static.crates.io/crates/tempfile/3.14.0/download", + "sha256": "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" } }, "targets": [ @@ -16134,7 +15360,7 @@ "selects": { "cfg(any(unix, target_os = \"wasi\"))": [ { - "id": "rustix 0.38.37", + "id": "rustix 0.38.42", "target": "rustix" } ], @@ -16147,7 +15373,7 @@ } }, "edition": "2021", - "version": "3.13.0" + "version": "3.14.0" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -16177,31 +15403,108 @@ "**/*.rs" ] } - } - } - ], - "library_target_name": "termtree", - "common_attrs": { + } + } + ], + "library_target_name": "termtree", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "0.4.1" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE" + }, + "thiserror 1.0.69": { + "name": "thiserror", + "version": "1.0.69", + "package_url": "https://github.com/dtolnay/thiserror", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/thiserror/1.0.69/download", + "sha256": "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" + } + }, + "targets": [ + { + "Library": { + "crate_name": "thiserror", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "thiserror", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "thiserror 1.0.69", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "thiserror-impl 1.0.69", + "target": "thiserror_impl" + } + ], + "selects": {} + }, + "version": "1.0.69" + }, + "build_script_attrs": { "compile_data_glob": [ "**" ], - "edition": "2018", - "version": "0.4.1" + "data_glob": [ + "**" + ] }, - "license": "MIT", + "license": "MIT OR Apache-2.0", "license_ids": [ + "Apache-2.0", "MIT" ], - "license_file": "LICENSE" + "license_file": "LICENSE-APACHE" }, - "thiserror 1.0.64": { + "thiserror 2.0.6": { "name": "thiserror", - "version": "1.0.64", + "version": "2.0.6", "package_url": "https://github.com/dtolnay/thiserror", "repository": { "Http": { - "url": "https://static.crates.io/crates/thiserror/1.0.64/download", - "sha256": "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" + "url": "https://static.crates.io/crates/thiserror/2.0.6/download", + "sha256": "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" } }, "targets": [ @@ -16235,10 +15538,17 @@ "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, "deps": { "common": [ { - "id": "thiserror 1.0.64", + "id": "thiserror 2.0.6", "target": "build_script_build" } ], @@ -16248,13 +15558,13 @@ "proc_macro_deps": { "common": [ { - "id": "thiserror-impl 1.0.64", + "id": "thiserror-impl 2.0.6", "target": "thiserror_impl" } ], "selects": {} }, - "version": "1.0.64" + "version": "2.0.6" }, "build_script_attrs": { "compile_data_glob": [ @@ -16271,14 +15581,70 @@ ], "license_file": "LICENSE-APACHE" }, - "thiserror-impl 1.0.64": { + "thiserror-impl 1.0.69": { + "name": "thiserror-impl", + "version": "1.0.69", + "package_url": "https://github.com/dtolnay/thiserror", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/thiserror-impl/1.0.69/download", + "sha256": "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "thiserror_impl", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "thiserror_impl", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.90", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.0.69" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "thiserror-impl 2.0.6": { "name": "thiserror-impl", - "version": "1.0.64", + "version": "2.0.6", "package_url": "https://github.com/dtolnay/thiserror", "repository": { "Http": { - "url": "https://static.crates.io/crates/thiserror-impl/1.0.64/download", - "sha256": "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" + "url": "https://static.crates.io/crates/thiserror-impl/2.0.6/download", + "sha256": "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" } }, "targets": [ @@ -16303,7 +15669,7 @@ "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -16311,14 +15677,14 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" } ], "selects": {} }, "edition": "2021", - "version": "1.0.64" + "version": "2.0.6" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -16495,20 +15861,20 @@ ], "license_file": "LICENSE-Apache" }, - "tinyvec 1.6.0": { - "name": "tinyvec", - "version": "1.6.0", - "package_url": "https://github.com/Lokathor/tinyvec", + "tinystr 0.7.6": { + "name": "tinystr", + "version": "0.7.6", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/tinyvec/1.6.0/download", - "sha256": "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" + "url": "https://static.crates.io/crates/tinystr/0.7.6/download", + "sha256": "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" } }, "targets": [ { "Library": { - "crate_name": "tinyvec", + "crate_name": "tinystr", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -16519,7 +15885,7 @@ } } ], - "library_target_name": "tinyvec", + "library_target_name": "tinystr", "common_attrs": { "compile_data_glob": [ "**" @@ -16527,20 +15893,66 @@ "crate_features": { "common": [ "alloc", - "default", - "tinyvec_macros" + "zerovec" ], "selects": {} }, "deps": { "common": [ { - "id": "tinyvec_macros 0.1.1", - "target": "tinyvec_macros" + "id": "zerovec 0.10.4", + "target": "zerovec" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "displaydoc 0.2.5", + "target": "displaydoc" } ], "selects": {} }, + "version": "0.7.6" + }, + "license": "Unicode-3.0", + "license_ids": [ + "Unicode-3.0" + ], + "license_file": "LICENSE" + }, + "tinyvec 1.6.0": { + "name": "tinyvec", + "version": "1.6.0", + "package_url": "https://github.com/Lokathor/tinyvec", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/tinyvec/1.6.0/download", + "sha256": "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tinyvec", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "tinyvec", + "common_attrs": { + "compile_data_glob": [ + "**" + ], "edition": "2018", "version": "1.6.0" }, @@ -16592,14 +16004,14 @@ ], "license_file": "LICENSE-APACHE.md" }, - "tokio 1.40.0": { + "tokio 1.42.0": { "name": "tokio", - "version": "1.40.0", + "version": "1.42.0", "package_url": "https://github.com/tokio-rs/tokio", "repository": { "Http": { - "url": "https://static.crates.io/crates/tokio/1.40.0/download", - "sha256": "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" + "url": "https://static.crates.io/crates/tokio/1.42.0/download", + "sha256": "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" } }, "targets": [ @@ -16657,7 +16069,7 @@ "sync", "time" ], - "aarch64-fuchsia": [ + "aarch64-linux-android": [ "bytes", "default", "io-std", @@ -16665,22 +16077,22 @@ "sync", "time" ], - "aarch64-linux-android": [ + "aarch64-pc-windows-msvc": [ "bytes", "default", "io-std", "io-util", "sync", - "time" + "time", + "windows-sys" ], - "aarch64-pc-windows-msvc": [ + "aarch64-unknown-fuchsia": [ "bytes", "default", "io-std", "io-util", "sync", - "time", - "windows-sys" + "time" ], "aarch64-unknown-linux-gnu": [ "bytes", @@ -16835,7 +16247,7 @@ "sync", "time" ], - "x86_64-fuchsia": [ + "x86_64-linux-android": [ "bytes", "default", "io-std", @@ -16843,24 +16255,24 @@ "sync", "time" ], - "x86_64-linux-android": [ + "x86_64-pc-windows-msvc": [ "bytes", "default", "io-std", "io-util", "sync", - "time" + "time", + "windows-sys" ], - "x86_64-pc-windows-msvc": [ + "x86_64-unknown-freebsd": [ "bytes", "default", "io-std", "io-util", "sync", - "time", - "windows-sys" + "time" ], - "x86_64-unknown-freebsd": [ + "x86_64-unknown-fuchsia": [ "bytes", "default", "io-std", @@ -16908,11 +16320,11 @@ "selects": { "aarch64-apple-darwin": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -16922,11 +16334,11 @@ ], "aarch64-apple-ios": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -16936,11 +16348,11 @@ ], "aarch64-apple-ios-sim": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -16948,13 +16360,13 @@ "target": "socket2" } ], - "aarch64-fuchsia": [ + "aarch64-linux-android": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -16962,41 +16374,41 @@ "target": "socket2" } ], - "aarch64-linux-android": [ + "aarch64-pc-windows-msvc": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, - { - "id": "libc 0.2.160", - "target": "libc" - }, { "id": "socket2 0.5.7", "target": "socket2" + }, + { + "id": "windows-sys 0.52.0", + "target": "windows_sys" } ], - "aarch64-pc-windows-msvc": [ + "aarch64-unknown-fuchsia": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "socket2 0.5.7", - "target": "socket2" + "id": "libc 0.2.168", + "target": "libc" }, { - "id": "windows-sys 0.52.0", - "target": "windows_sys" + "id": "socket2 0.5.7", + "target": "socket2" } ], "aarch64-unknown-linux-gnu": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17006,11 +16418,11 @@ ], "aarch64-unknown-nixos-gnu": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17020,11 +16432,11 @@ ], "aarch64-unknown-nto-qnx710": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17034,11 +16446,11 @@ ], "arm-unknown-linux-gnueabi": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17048,11 +16460,11 @@ ], "armv7-linux-androideabi": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17062,11 +16474,11 @@ ], "armv7-unknown-linux-gnueabi": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17082,11 +16494,11 @@ ], "i686-apple-darwin": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17096,11 +16508,11 @@ ], "i686-linux-android": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17110,7 +16522,7 @@ ], "i686-pc-windows-msvc": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -17124,11 +16536,11 @@ ], "i686-unknown-freebsd": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17138,11 +16550,11 @@ ], "i686-unknown-linux-gnu": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17152,11 +16564,11 @@ ], "powerpc-unknown-linux-gnu": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17166,7 +16578,7 @@ ], "riscv32imc-unknown-none-elf": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -17176,7 +16588,7 @@ ], "riscv64gc-unknown-none-elf": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -17186,11 +16598,11 @@ ], "s390x-unknown-linux-gnu": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17200,7 +16612,7 @@ ], "thumbv7em-none-eabi": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -17210,7 +16622,7 @@ ], "thumbv8m.main-none-eabi": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { @@ -17220,11 +16632,11 @@ ], "x86_64-apple-darwin": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17234,11 +16646,11 @@ ], "x86_64-apple-ios": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17246,13 +16658,13 @@ "target": "socket2" } ], - "x86_64-fuchsia": [ + "x86_64-linux-android": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17260,41 +16672,41 @@ "target": "socket2" } ], - "x86_64-linux-android": [ + "x86_64-pc-windows-msvc": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, - { - "id": "libc 0.2.160", - "target": "libc" - }, { "id": "socket2 0.5.7", "target": "socket2" + }, + { + "id": "windows-sys 0.52.0", + "target": "windows_sys" } ], - "x86_64-pc-windows-msvc": [ + "x86_64-unknown-freebsd": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "socket2 0.5.7", - "target": "socket2" + "id": "libc 0.2.168", + "target": "libc" }, { - "id": "windows-sys 0.52.0", - "target": "windows_sys" + "id": "socket2 0.5.7", + "target": "socket2" } ], - "x86_64-unknown-freebsd": [ + "x86_64-unknown-fuchsia": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17304,11 +16716,11 @@ ], "x86_64-unknown-linux-gnu": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17318,11 +16730,11 @@ ], "x86_64-unknown-nixos-gnu": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -17332,82 +16744,27 @@ ], "x86_64-unknown-none": [ { - "id": "bytes 1.6.0", + "id": "bytes 1.9.0", "target": "bytes" }, { "id": "socket2 0.5.7", "target": "socket2" } - ] - } - }, - "edition": "2021", - "proc_macro_deps": { - "common": [ - { - "id": "tokio-macros 2.4.0", - "target": "tokio_macros" - } - ], - "selects": {} - }, - "version": "1.40.0" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE" - }, - "tokio-macros 2.4.0": { - "name": "tokio-macros", - "version": "2.4.0", - "package_url": "https://github.com/tokio-rs/tokio", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/tokio-macros/2.4.0/download", - "sha256": "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" - } - }, - "targets": [ - { - "ProcMacro": { - "crate_name": "tokio_macros", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "tokio_macros", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "proc-macro2 1.0.88", - "target": "proc_macro2" - }, - { - "id": "quote 1.0.37", - "target": "quote" - }, + ] + } + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ { - "id": "syn 2.0.79", - "target": "syn" + "id": "tokio-macros 2.4.0", + "target": "tokio_macros" } ], "selects": {} }, - "edition": "2021", - "version": "2.4.0" + "version": "1.42.0" }, "license": "MIT", "license_ids": [ @@ -17415,20 +16772,20 @@ ], "license_file": "LICENSE" }, - "tokio-rustls 0.24.1": { - "name": "tokio-rustls", - "version": "0.24.1", - "package_url": "https://github.com/rustls/tokio-rustls", + "tokio-macros 2.4.0": { + "name": "tokio-macros", + "version": "2.4.0", + "package_url": "https://github.com/tokio-rs/tokio", "repository": { "Http": { - "url": "https://static.crates.io/crates/tokio-rustls/0.24.1/download", - "sha256": "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" + "url": "https://static.crates.io/crates/tokio-macros/2.4.0/download", + "sha256": "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" } }, "targets": [ { - "Library": { - "crate_name": "tokio_rustls", + "ProcMacro": { + "crate_name": "tokio_macros", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -17439,41 +16796,36 @@ } } ], - "library_target_name": "tokio_rustls", + "library_target_name": "tokio_macros", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default", - "logging", - "tls12" - ], - "selects": {} - }, "deps": { "common": [ { - "id": "rustls 0.21.12", - "target": "rustls" + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" }, { - "id": "tokio 1.40.0", - "target": "tokio" + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.90", + "target": "syn" } ], "selects": {} }, - "edition": "2018", - "version": "0.24.1" + "edition": "2021", + "version": "2.4.0" }, - "license": "MIT/Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0", "MIT" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, "tokio-rustls 0.26.0": { "name": "tokio-rustls", @@ -17523,7 +16875,7 @@ "alias": "pki_types" }, { - "id": "tokio 1.40.0", + "id": "tokio 1.42.0", "target": "tokio" } ], @@ -17539,77 +16891,6 @@ ], "license_file": "LICENSE-APACHE" }, - "tokio-util 0.7.11": { - "name": "tokio-util", - "version": "0.7.11", - "package_url": "https://github.com/tokio-rs/tokio", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/tokio-util/0.7.11/download", - "sha256": "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" - } - }, - "targets": [ - { - "Library": { - "crate_name": "tokio_util", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "tokio_util", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "codec", - "default", - "io" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "bytes 1.6.0", - "target": "bytes" - }, - { - "id": "futures-core 0.3.30", - "target": "futures_core" - }, - { - "id": "futures-sink 0.3.30", - "target": "futures_sink" - }, - { - "id": "pin-project-lite 0.2.14", - "target": "pin_project_lite" - }, - { - "id": "tokio 1.40.0", - "target": "tokio" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.7.11" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE" - }, "toml 0.8.19": { "name": "toml", "version": "0.8.19", @@ -17650,7 +16931,7 @@ "deps": { "common": [ { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" }, { @@ -17716,7 +16997,7 @@ "deps": { "common": [ { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" } ], @@ -17776,7 +17057,7 @@ "target": "indexmap" }, { - "id": "serde 1.0.210", + "id": "serde 1.0.216", "target": "serde" }, { @@ -17868,7 +17149,7 @@ "target": "pin_project_lite" }, { - "id": "tokio 1.40.0", + "id": "tokio 1.42.0", "target": "tokio" }, { @@ -18193,20 +17474,20 @@ ], "license_file": "LICENSE" }, - "unicode-bidi 0.3.15": { - "name": "unicode-bidi", - "version": "0.3.15", - "package_url": "https://github.com/servo/unicode-bidi", + "unicode-ident 1.0.13": { + "name": "unicode-ident", + "version": "1.0.13", + "package_url": "https://github.com/dtolnay/unicode-ident", "repository": { "Http": { - "url": "https://static.crates.io/crates/unicode-bidi/0.3.15/download", - "sha256": "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + "url": "https://static.crates.io/crates/unicode-ident/1.0.13/download", + "sha256": "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" } }, "targets": [ { "Library": { - "crate_name": "unicode_bidi", + "crate_name": "unicode_ident", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -18217,42 +17498,36 @@ } } ], - "library_target_name": "unicode_bidi", + "library_target_name": "unicode_ident", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "hardcoded-data", - "std" - ], - "selects": {} - }, "edition": "2018", - "version": "0.3.15" + "version": "1.0.13" }, - "license": "MIT OR Apache-2.0", + "license": "(MIT OR Apache-2.0) AND Unicode-DFS-2016", "license_ids": [ "Apache-2.0", - "MIT" + "MIT", + "Unicode-DFS-2016" ], "license_file": "LICENSE-APACHE" }, - "unicode-ident 1.0.13": { - "name": "unicode-ident", - "version": "1.0.13", - "package_url": "https://github.com/dtolnay/unicode-ident", + "untrusted 0.9.0": { + "name": "untrusted", + "version": "0.9.0", + "package_url": "https://github.com/briansmith/untrusted", "repository": { "Http": { - "url": "https://static.crates.io/crates/unicode-ident/1.0.13/download", - "sha256": "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + "url": "https://static.crates.io/crates/untrusted/0.9.0/download", + "sha256": "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" } }, "targets": [ { "Library": { - "crate_name": "unicode_ident", + "crate_name": "untrusted", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -18263,36 +17538,34 @@ } } ], - "library_target_name": "unicode_ident", + "library_target_name": "untrusted", "common_attrs": { "compile_data_glob": [ "**" ], "edition": "2018", - "version": "1.0.13" + "version": "0.9.0" }, - "license": "(MIT OR Apache-2.0) AND Unicode-DFS-2016", + "license": "ISC", "license_ids": [ - "Apache-2.0", - "MIT", - "Unicode-DFS-2016" + "ISC" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE.txt" }, - "unicode-normalization 0.1.23": { - "name": "unicode-normalization", - "version": "0.1.23", - "package_url": "https://github.com/unicode-rs/unicode-normalization", + "url 2.5.4": { + "name": "url", + "version": "2.5.4", + "package_url": "https://github.com/servo/rust-url", "repository": { "Http": { - "url": "https://static.crates.io/crates/unicode-normalization/0.1.23/download", - "sha256": "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" + "url": "https://static.crates.io/crates/url/2.5.4/download", + "sha256": "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" } }, "targets": [ { "Library": { - "crate_name": "unicode_normalization", + "crate_name": "url", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -18303,13 +17576,14 @@ } } ], - "library_target_name": "unicode_normalization", + "library_target_name": "url", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ + "default", "std" ], "selects": {} @@ -18317,36 +17591,44 @@ "deps": { "common": [ { - "id": "tinyvec 1.6.0", - "target": "tinyvec" + "id": "form_urlencoded 1.2.1", + "target": "form_urlencoded" + }, + { + "id": "idna 1.0.3", + "target": "idna" + }, + { + "id": "percent-encoding 2.3.1", + "target": "percent_encoding" } ], "selects": {} }, "edition": "2018", - "version": "0.1.23" + "version": "2.5.4" }, - "license": "MIT/Apache-2.0", + "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "untrusted 0.9.0": { - "name": "untrusted", - "version": "0.9.0", - "package_url": "https://github.com/briansmith/untrusted", + "utf16_iter 1.0.5": { + "name": "utf16_iter", + "version": "1.0.5", + "package_url": "https://github.com/hsivonen/utf16_iter", "repository": { "Http": { - "url": "https://static.crates.io/crates/untrusted/0.9.0/download", - "sha256": "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + "url": "https://static.crates.io/crates/utf16_iter/1.0.5/download", + "sha256": "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" } }, "targets": [ { "Library": { - "crate_name": "untrusted", + "crate_name": "utf16_iter", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -18357,34 +17639,35 @@ } } ], - "library_target_name": "untrusted", + "library_target_name": "utf16_iter", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2018", - "version": "0.9.0" + "edition": "2021", + "version": "1.0.5" }, - "license": "ISC", + "license": "Apache-2.0 OR MIT", "license_ids": [ - "ISC" + "Apache-2.0", + "MIT" ], - "license_file": "LICENSE.txt" + "license_file": "LICENSE-APACHE" }, - "url 2.5.0": { - "name": "url", - "version": "2.5.0", - "package_url": "https://github.com/servo/rust-url", + "utf8_iter 1.0.4": { + "name": "utf8_iter", + "version": "1.0.4", + "package_url": "https://github.com/hsivonen/utf8_iter", "repository": { "Http": { - "url": "https://static.crates.io/crates/url/2.5.0/download", - "sha256": "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" + "url": "https://static.crates.io/crates/utf8_iter/1.0.4/download", + "sha256": "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" } }, "targets": [ { "Library": { - "crate_name": "url", + "crate_name": "utf8_iter", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -18395,38 +17678,15 @@ } } ], - "library_target_name": "url", + "library_target_name": "utf8_iter", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default" - ], - "selects": {} - }, - "deps": { - "common": [ - { - "id": "form_urlencoded 1.2.1", - "target": "form_urlencoded" - }, - { - "id": "idna 0.5.0", - "target": "idna" - }, - { - "id": "percent-encoding 2.3.1", - "target": "percent_encoding" - } - ], - "selects": {} - }, - "edition": "2018", - "version": "2.5.0" + "edition": "2021", + "version": "1.0.4" }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" @@ -18636,7 +17896,7 @@ "selects": { "cfg(unix)": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" } ] @@ -18939,7 +18199,7 @@ "target": "once_cell" }, { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -18947,7 +18207,7 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" }, { @@ -19126,7 +18386,7 @@ "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -19134,7 +18394,7 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" }, { @@ -19301,44 +18561,6 @@ ], "license_file": "LICENSE-APACHE" }, - "webpki-roots 0.25.4": { - "name": "webpki-roots", - "version": "0.25.4", - "package_url": "https://github.com/rustls/webpki-roots", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/webpki-roots/0.25.4/download", - "sha256": "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - } - }, - "targets": [ - { - "Library": { - "crate_name": "webpki_roots", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "webpki_roots", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "edition": "2018", - "version": "0.25.4" - }, - "license": "MPL-2.0", - "license_ids": [ - "MPL-2.0" - ], - "license_file": "LICENSE" - }, "webpki-roots 0.26.1": { "name": "webpki-roots", "version": "0.26.1", @@ -19387,14 +18609,14 @@ ], "license_file": "LICENSE" }, - "which 6.0.3": { + "which 7.0.0": { "name": "which", - "version": "6.0.3", + "version": "7.0.0", "package_url": "https://github.com/harryfei/which-rs.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/which/6.0.3/download", - "sha256": "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" + "url": "https://static.crates.io/crates/which/7.0.0/download", + "sha256": "c9cad3279ade7346b96e38731a641d7343dd6a53d55083dd54eadfa5a1b38c6b" } }, "targets": [ @@ -19426,7 +18648,7 @@ "selects": { "cfg(any(unix, target_os = \"wasi\", target_os = \"redox\"))": [ { - "id": "rustix 0.38.37", + "id": "rustix 0.38.42", "target": "rustix" } ], @@ -19445,7 +18667,7 @@ } }, "edition": "2021", - "version": "6.0.3" + "version": "7.0.0" }, "license": "MIT", "license_ids": [ @@ -19496,7 +18718,12 @@ ], "crate_features": { "common": [ - "winbase" + "fileapi", + "handleapi", + "processthreadsapi", + "std", + "winbase", + "winerror" ], "selects": {} }, @@ -19898,7 +19125,263 @@ "targets": [ { "Library": { - "crate_name": "windows_strings", + "crate_name": "windows_strings", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "windows_strings", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "windows-result 0.2.0", + "target": "windows_result" + }, + { + "id": "windows-targets 0.52.6", + "target": "windows_targets" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "license-apache-2.0" + }, + "windows-sys 0.48.0": { + "name": "windows-sys", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/windows-sys/0.48.0/download", + "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_sys", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "windows_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "Win32", + "Win32_Foundation", + "Win32_Globalization", + "Win32_System", + "Win32_System_Com", + "Win32_UI", + "Win32_UI_Shell", + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "windows-targets 0.48.5", + "target": "windows_targets" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "license-apache-2.0" + }, + "windows-sys 0.52.0": { + "name": "windows-sys", + "version": "0.52.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/windows-sys/0.52.0/download", + "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_sys", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "windows_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "Wdk", + "Wdk_Foundation", + "Wdk_Storage", + "Wdk_Storage_FileSystem", + "Wdk_System", + "Wdk_System_IO", + "Win32", + "Win32_Foundation", + "Win32_Networking", + "Win32_Networking_WinSock", + "Win32_Security", + "Win32_Storage", + "Win32_Storage_FileSystem", + "Win32_System", + "Win32_System_Com", + "Win32_System_Console", + "Win32_System_IO", + "Win32_System_Pipes", + "Win32_System_SystemInformation", + "Win32_System_SystemServices", + "Win32_System_Threading", + "Win32_System_WindowsProgramming", + "Win32_UI", + "Win32_UI_Shell", + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "windows-targets 0.52.6", + "target": "windows_targets" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.52.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "license-apache-2.0" + }, + "windows-sys 0.59.0": { + "name": "windows-sys", + "version": "0.59.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/windows-sys/0.59.0/download", + "sha256": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_sys", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "windows_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "Win32", + "Win32_Foundation", + "Win32_Storage", + "Win32_Storage_FileSystem", + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "windows-targets 0.52.6", + "target": "windows_targets" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.59.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "license-apache-2.0" + }, + "windows-targets 0.48.5": { + "name": "windows-targets", + "version": "0.48.5", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/windows-targets/0.48.5/download", + "sha256": "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_targets", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -19909,33 +19392,60 @@ } } ], - "library_target_name": "windows_strings", + "library_target_name": "windows_targets", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default", - "std" - ], - "selects": {} - }, "deps": { - "common": [ - { - "id": "windows-result 0.2.0", - "target": "windows_result" - }, - { - "id": "windows-targets 0.52.6", - "target": "windows_targets" - } - ], - "selects": {} + "common": [], + "selects": { + "aarch64-pc-windows-gnullvm": [ + { + "id": "windows_aarch64_gnullvm 0.48.5", + "target": "windows_aarch64_gnullvm" + } + ], + "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_aarch64_msvc 0.48.5", + "target": "windows_aarch64_msvc" + } + ], + "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(windows_raw_dylib)))": [ + { + "id": "windows_i686_gnu 0.48.5", + "target": "windows_i686_gnu" + } + ], + "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_i686_msvc 0.48.5", + "target": "windows_i686_msvc" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_gnu 0.48.5", + "target": "windows_x86_64_gnu" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_msvc 0.48.5", + "target": "windows_x86_64_msvc" + } + ], + "x86_64-pc-windows-gnullvm": [ + { + "id": "windows_x86_64_gnullvm 0.48.5", + "target": "windows_x86_64_gnullvm" + } + ] + } }, - "edition": "2021", - "version": "0.1.0" + "edition": "2018", + "version": "0.48.5" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -19944,20 +19454,20 @@ ], "license_file": "license-apache-2.0" }, - "windows-sys 0.48.0": { - "name": "windows-sys", - "version": "0.48.0", + "windows-targets 0.52.6": { + "name": "windows-targets", + "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows-sys/0.48.0/download", - "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" + "url": "https://static.crates.io/crates/windows-targets/0.52.6/download", + "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" } }, "targets": [ { "Library": { - "crate_name": "windows_sys", + "crate_name": "windows_targets", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -19968,42 +19478,66 @@ } } ], - "library_target_name": "windows_sys", + "library_target_name": "windows_targets", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "Win32", - "Win32_Foundation", - "Win32_Globalization", - "Win32_Security", - "Win32_Storage", - "Win32_Storage_FileSystem", - "Win32_System", - "Win32_System_Com", - "Win32_System_Diagnostics", - "Win32_System_Diagnostics_Debug", - "Win32_System_Registry", - "Win32_System_Time", - "Win32_UI", - "Win32_UI_Shell", - "default" - ], - "selects": {} - }, "deps": { - "common": [ - { - "id": "windows-targets 0.48.5", - "target": "windows_targets" - } - ], - "selects": {} + "common": [], + "selects": { + "aarch64-pc-windows-gnullvm": [ + { + "id": "windows_aarch64_gnullvm 0.52.6", + "target": "windows_aarch64_gnullvm" + } + ], + "cfg(all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_msvc 0.52.6", + "target": "windows_x86_64_msvc" + } + ], + "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_aarch64_msvc 0.52.6", + "target": "windows_aarch64_msvc" + } + ], + "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ + { + "id": "windows_i686_gnu 0.52.6", + "target": "windows_i686_gnu" + } + ], + "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_i686_msvc 0.52.6", + "target": "windows_i686_msvc" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_gnu 0.52.6", + "target": "windows_x86_64_gnu" + } + ], + "i686-pc-windows-gnullvm": [ + { + "id": "windows_i686_gnullvm 0.52.6", + "target": "windows_i686_gnullvm" + } + ], + "x86_64-pc-windows-gnullvm": [ + { + "id": "windows_x86_64_gnullvm 0.52.6", + "target": "windows_x86_64_gnullvm" + } + ] + } }, - "edition": "2018", - "version": "0.48.0" + "edition": "2021", + "version": "0.52.6" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -20012,20 +19546,20 @@ ], "license_file": "license-apache-2.0" }, - "windows-sys 0.52.0": { - "name": "windows-sys", - "version": "0.52.0", + "windows_aarch64_gnullvm 0.48.5": { + "name": "windows_aarch64_gnullvm", + "version": "0.48.5", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows-sys/0.52.0/download", - "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" + "url": "https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download", + "sha256": "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" } }, "targets": [ { "Library": { - "crate_name": "windows_sys", + "crate_name": "windows_aarch64_gnullvm", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20034,54 +19568,44 @@ ] } } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } } ], - "library_target_name": "windows_sys", + "library_target_name": "windows_aarch64_gnullvm", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "Wdk", - "Wdk_Foundation", - "Wdk_Storage", - "Wdk_Storage_FileSystem", - "Wdk_System", - "Wdk_System_IO", - "Win32", - "Win32_Foundation", - "Win32_Networking", - "Win32_Networking_WinSock", - "Win32_Security", - "Win32_Storage", - "Win32_Storage_FileSystem", - "Win32_System", - "Win32_System_Com", - "Win32_System_Console", - "Win32_System_IO", - "Win32_System_Pipes", - "Win32_System_SystemInformation", - "Win32_System_SystemServices", - "Win32_System_Threading", - "Win32_System_WindowsProgramming", - "Win32_UI", - "Win32_UI_Shell", - "default" - ], - "selects": {} - }, "deps": { "common": [ { - "id": "windows-targets 0.52.6", - "target": "windows_targets" + "id": "windows_aarch64_gnullvm 0.48.5", + "target": "build_script_build" } ], "selects": {} }, - "edition": "2021", - "version": "0.52.0" + "edition": "2018", + "version": "0.48.5" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ] }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -20090,20 +19614,20 @@ ], "license_file": "license-apache-2.0" }, - "windows-sys 0.59.0": { - "name": "windows-sys", - "version": "0.59.0", + "windows_aarch64_gnullvm 0.52.6": { + "name": "windows_aarch64_gnullvm", + "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows-sys/0.59.0/download", - "sha256": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" + "url": "https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download", + "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" } }, "targets": [ { "Library": { - "crate_name": "windows_sys", + "crate_name": "windows_aarch64_gnullvm", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20112,34 +19636,44 @@ ] } } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } } ], - "library_target_name": "windows_sys", + "library_target_name": "windows_aarch64_gnullvm", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "Win32", - "Win32_Foundation", - "Win32_Storage", - "Win32_Storage_FileSystem", - "default" - ], - "selects": {} - }, "deps": { "common": [ { - "id": "windows-targets 0.52.6", - "target": "windows_targets" + "id": "windows_aarch64_gnullvm 0.52.6", + "target": "build_script_build" } ], "selects": {} }, "edition": "2021", - "version": "0.59.0" + "version": "0.52.6" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ] }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -20148,20 +19682,20 @@ ], "license_file": "license-apache-2.0" }, - "windows-targets 0.48.5": { - "name": "windows-targets", + "windows_aarch64_msvc 0.48.5": { + "name": "windows_aarch64_msvc", "version": "0.48.5", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows-targets/0.48.5/download", - "sha256": "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" + "url": "https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download", + "sha256": "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" } }, "targets": [ { "Library": { - "crate_name": "windows_targets", + "crate_name": "windows_aarch64_msvc", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20170,63 +19704,45 @@ ] } } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } } ], - "library_target_name": "windows_targets", + "library_target_name": "windows_aarch64_msvc", "common_attrs": { "compile_data_glob": [ "**" ], "deps": { - "common": [], - "selects": { - "aarch64-pc-windows-gnullvm": [ - { - "id": "windows_aarch64_gnullvm 0.48.5", - "target": "windows_aarch64_gnullvm" - } - ], - "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ - { - "id": "windows_aarch64_msvc 0.48.5", - "target": "windows_aarch64_msvc" - } - ], - "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(windows_raw_dylib)))": [ - { - "id": "windows_i686_gnu 0.48.5", - "target": "windows_i686_gnu" - } - ], - "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": [ - { - "id": "windows_i686_msvc 0.48.5", - "target": "windows_i686_msvc" - } - ], - "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ - { - "id": "windows_x86_64_gnu 0.48.5", - "target": "windows_x86_64_gnu" - } - ], - "cfg(all(target_arch = \"x86_64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ - { - "id": "windows_x86_64_msvc 0.48.5", - "target": "windows_x86_64_msvc" - } - ], - "x86_64-pc-windows-gnullvm": [ - { - "id": "windows_x86_64_gnullvm 0.48.5", - "target": "windows_x86_64_gnullvm" - } - ] - } + "common": [ + { + "id": "windows_aarch64_msvc 0.48.5", + "target": "build_script_build" + } + ], + "selects": {} }, "edition": "2018", "version": "0.48.5" }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ] + }, "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", @@ -20234,20 +19750,20 @@ ], "license_file": "license-apache-2.0" }, - "windows-targets 0.52.6": { - "name": "windows-targets", + "windows_aarch64_msvc 0.52.6": { + "name": "windows_aarch64_msvc", "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows-targets/0.52.6/download", - "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" + "url": "https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download", + "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" } }, "targets": [ { "Library": { - "crate_name": "windows_targets", + "crate_name": "windows_aarch64_msvc", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20256,69 +19772,45 @@ ] } } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } } ], - "library_target_name": "windows_targets", + "library_target_name": "windows_aarch64_msvc", "common_attrs": { "compile_data_glob": [ "**" ], "deps": { - "common": [], - "selects": { - "aarch64-pc-windows-gnullvm": [ - { - "id": "windows_aarch64_gnullvm 0.52.6", - "target": "windows_aarch64_gnullvm" - } - ], - "cfg(all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), target_env = \"msvc\", not(windows_raw_dylib)))": [ - { - "id": "windows_x86_64_msvc 0.52.6", - "target": "windows_x86_64_msvc" - } - ], - "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ - { - "id": "windows_aarch64_msvc 0.52.6", - "target": "windows_aarch64_msvc" - } - ], - "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ - { - "id": "windows_i686_gnu 0.52.6", - "target": "windows_i686_gnu" - } - ], - "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": [ - { - "id": "windows_i686_msvc 0.52.6", - "target": "windows_i686_msvc" - } - ], - "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ - { - "id": "windows_x86_64_gnu 0.52.6", - "target": "windows_x86_64_gnu" - } - ], - "i686-pc-windows-gnullvm": [ - { - "id": "windows_i686_gnullvm 0.52.6", - "target": "windows_i686_gnullvm" - } - ], - "x86_64-pc-windows-gnullvm": [ - { - "id": "windows_x86_64_gnullvm 0.52.6", - "target": "windows_x86_64_gnullvm" - } - ] - } + "common": [ + { + "id": "windows_aarch64_msvc 0.52.6", + "target": "build_script_build" + } + ], + "selects": {} }, "edition": "2021", "version": "0.52.6" }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ] + }, "license": "MIT OR Apache-2.0", "license_ids": [ "Apache-2.0", @@ -20326,20 +19818,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_aarch64_gnullvm 0.48.5": { - "name": "windows_aarch64_gnullvm", + "windows_i686_gnu 0.48.5": { + "name": "windows_i686_gnu", "version": "0.48.5", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download", - "sha256": "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + "url": "https://static.crates.io/crates/windows_i686_gnu/0.48.5/download", + "sha256": "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" } }, "targets": [ { "Library": { - "crate_name": "windows_aarch64_gnullvm", + "crate_name": "windows_i686_gnu", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20362,7 +19854,7 @@ } } ], - "library_target_name": "windows_aarch64_gnullvm", + "library_target_name": "windows_i686_gnu", "common_attrs": { "compile_data_glob": [ "**" @@ -20370,7 +19862,7 @@ "deps": { "common": [ { - "id": "windows_aarch64_gnullvm 0.48.5", + "id": "windows_i686_gnu 0.48.5", "target": "build_script_build" } ], @@ -20394,20 +19886,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_aarch64_gnullvm 0.52.6": { - "name": "windows_aarch64_gnullvm", + "windows_i686_gnu 0.52.6": { + "name": "windows_i686_gnu", "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download", - "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + "url": "https://static.crates.io/crates/windows_i686_gnu/0.52.6/download", + "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" } }, "targets": [ { "Library": { - "crate_name": "windows_aarch64_gnullvm", + "crate_name": "windows_i686_gnu", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20430,7 +19922,7 @@ } } ], - "library_target_name": "windows_aarch64_gnullvm", + "library_target_name": "windows_i686_gnu", "common_attrs": { "compile_data_glob": [ "**" @@ -20438,7 +19930,7 @@ "deps": { "common": [ { - "id": "windows_aarch64_gnullvm 0.52.6", + "id": "windows_i686_gnu 0.52.6", "target": "build_script_build" } ], @@ -20462,20 +19954,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_aarch64_msvc 0.48.5": { - "name": "windows_aarch64_msvc", - "version": "0.48.5", + "windows_i686_gnullvm 0.52.6": { + "name": "windows_i686_gnullvm", + "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download", - "sha256": "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + "url": "https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download", + "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" } }, "targets": [ { "Library": { - "crate_name": "windows_aarch64_msvc", + "crate_name": "windows_i686_gnullvm", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20498,7 +19990,7 @@ } } ], - "library_target_name": "windows_aarch64_msvc", + "library_target_name": "windows_i686_gnullvm", "common_attrs": { "compile_data_glob": [ "**" @@ -20506,14 +19998,14 @@ "deps": { "common": [ { - "id": "windows_aarch64_msvc 0.48.5", + "id": "windows_i686_gnullvm 0.52.6", "target": "build_script_build" } ], "selects": {} }, - "edition": "2018", - "version": "0.48.5" + "edition": "2021", + "version": "0.52.6" }, "build_script_attrs": { "compile_data_glob": [ @@ -20529,21 +20021,21 @@ "MIT" ], "license_file": "license-apache-2.0" - }, - "windows_aarch64_msvc 0.52.6": { - "name": "windows_aarch64_msvc", - "version": "0.52.6", + }, + "windows_i686_msvc 0.48.5": { + "name": "windows_i686_msvc", + "version": "0.48.5", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download", - "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + "url": "https://static.crates.io/crates/windows_i686_msvc/0.48.5/download", + "sha256": "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" } }, "targets": [ { "Library": { - "crate_name": "windows_aarch64_msvc", + "crate_name": "windows_i686_msvc", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20566,7 +20058,7 @@ } } ], - "library_target_name": "windows_aarch64_msvc", + "library_target_name": "windows_i686_msvc", "common_attrs": { "compile_data_glob": [ "**" @@ -20574,14 +20066,14 @@ "deps": { "common": [ { - "id": "windows_aarch64_msvc 0.52.6", + "id": "windows_i686_msvc 0.48.5", "target": "build_script_build" } ], "selects": {} }, - "edition": "2021", - "version": "0.52.6" + "edition": "2018", + "version": "0.48.5" }, "build_script_attrs": { "compile_data_glob": [ @@ -20598,20 +20090,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_i686_gnu 0.48.5": { - "name": "windows_i686_gnu", - "version": "0.48.5", + "windows_i686_msvc 0.52.6": { + "name": "windows_i686_msvc", + "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_i686_gnu/0.48.5/download", - "sha256": "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + "url": "https://static.crates.io/crates/windows_i686_msvc/0.52.6/download", + "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" } }, "targets": [ { "Library": { - "crate_name": "windows_i686_gnu", + "crate_name": "windows_i686_msvc", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20634,7 +20126,7 @@ } } ], - "library_target_name": "windows_i686_gnu", + "library_target_name": "windows_i686_msvc", "common_attrs": { "compile_data_glob": [ "**" @@ -20642,14 +20134,14 @@ "deps": { "common": [ { - "id": "windows_i686_gnu 0.48.5", + "id": "windows_i686_msvc 0.52.6", "target": "build_script_build" } ], "selects": {} }, - "edition": "2018", - "version": "0.48.5" + "edition": "2021", + "version": "0.52.6" }, "build_script_attrs": { "compile_data_glob": [ @@ -20666,20 +20158,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_i686_gnu 0.52.6": { - "name": "windows_i686_gnu", - "version": "0.52.6", + "windows_x86_64_gnu 0.48.5": { + "name": "windows_x86_64_gnu", + "version": "0.48.5", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_i686_gnu/0.52.6/download", - "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + "url": "https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download", + "sha256": "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" } }, "targets": [ { "Library": { - "crate_name": "windows_i686_gnu", + "crate_name": "windows_x86_64_gnu", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20702,7 +20194,7 @@ } } ], - "library_target_name": "windows_i686_gnu", + "library_target_name": "windows_x86_64_gnu", "common_attrs": { "compile_data_glob": [ "**" @@ -20710,14 +20202,14 @@ "deps": { "common": [ { - "id": "windows_i686_gnu 0.52.6", + "id": "windows_x86_64_gnu 0.48.5", "target": "build_script_build" } ], "selects": {} }, - "edition": "2021", - "version": "0.52.6" + "edition": "2018", + "version": "0.48.5" }, "build_script_attrs": { "compile_data_glob": [ @@ -20734,20 +20226,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_i686_gnullvm 0.52.6": { - "name": "windows_i686_gnullvm", + "windows_x86_64_gnu 0.52.6": { + "name": "windows_x86_64_gnu", "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download", - "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + "url": "https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download", + "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" } }, "targets": [ { "Library": { - "crate_name": "windows_i686_gnullvm", + "crate_name": "windows_x86_64_gnu", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20770,7 +20262,7 @@ } } ], - "library_target_name": "windows_i686_gnullvm", + "library_target_name": "windows_x86_64_gnu", "common_attrs": { "compile_data_glob": [ "**" @@ -20778,7 +20270,7 @@ "deps": { "common": [ { - "id": "windows_i686_gnullvm 0.52.6", + "id": "windows_x86_64_gnu 0.52.6", "target": "build_script_build" } ], @@ -20802,20 +20294,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_i686_msvc 0.48.5": { - "name": "windows_i686_msvc", + "windows_x86_64_gnullvm 0.48.5": { + "name": "windows_x86_64_gnullvm", "version": "0.48.5", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_i686_msvc/0.48.5/download", - "sha256": "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + "url": "https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download", + "sha256": "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" } }, "targets": [ { "Library": { - "crate_name": "windows_i686_msvc", + "crate_name": "windows_x86_64_gnullvm", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20838,7 +20330,7 @@ } } ], - "library_target_name": "windows_i686_msvc", + "library_target_name": "windows_x86_64_gnullvm", "common_attrs": { "compile_data_glob": [ "**" @@ -20846,7 +20338,7 @@ "deps": { "common": [ { - "id": "windows_i686_msvc 0.48.5", + "id": "windows_x86_64_gnullvm 0.48.5", "target": "build_script_build" } ], @@ -20870,20 +20362,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_i686_msvc 0.52.6": { - "name": "windows_i686_msvc", + "windows_x86_64_gnullvm 0.52.6": { + "name": "windows_x86_64_gnullvm", "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_i686_msvc/0.52.6/download", - "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + "url": "https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download", + "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" } }, "targets": [ { "Library": { - "crate_name": "windows_i686_msvc", + "crate_name": "windows_x86_64_gnullvm", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20906,7 +20398,7 @@ } } ], - "library_target_name": "windows_i686_msvc", + "library_target_name": "windows_x86_64_gnullvm", "common_attrs": { "compile_data_glob": [ "**" @@ -20914,7 +20406,7 @@ "deps": { "common": [ { - "id": "windows_i686_msvc 0.52.6", + "id": "windows_x86_64_gnullvm 0.52.6", "target": "build_script_build" } ], @@ -20938,20 +20430,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_x86_64_gnu 0.48.5": { - "name": "windows_x86_64_gnu", + "windows_x86_64_msvc 0.48.5": { + "name": "windows_x86_64_msvc", "version": "0.48.5", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download", - "sha256": "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + "url": "https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download", + "sha256": "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" } }, "targets": [ { "Library": { - "crate_name": "windows_x86_64_gnu", + "crate_name": "windows_x86_64_msvc", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -20974,7 +20466,7 @@ } } ], - "library_target_name": "windows_x86_64_gnu", + "library_target_name": "windows_x86_64_msvc", "common_attrs": { "compile_data_glob": [ "**" @@ -20982,7 +20474,7 @@ "deps": { "common": [ { - "id": "windows_x86_64_gnu 0.48.5", + "id": "windows_x86_64_msvc 0.48.5", "target": "build_script_build" } ], @@ -21006,20 +20498,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_x86_64_gnu 0.52.6": { - "name": "windows_x86_64_gnu", + "windows_x86_64_msvc 0.52.6": { + "name": "windows_x86_64_msvc", "version": "0.52.6", "package_url": "https://github.com/microsoft/windows-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download", - "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + "url": "https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download", + "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" } }, "targets": [ { "Library": { - "crate_name": "windows_x86_64_gnu", + "crate_name": "windows_x86_64_msvc", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21042,7 +20534,7 @@ } } ], - "library_target_name": "windows_x86_64_gnu", + "library_target_name": "windows_x86_64_msvc", "common_attrs": { "compile_data_glob": [ "**" @@ -21050,7 +20542,7 @@ "deps": { "common": [ { - "id": "windows_x86_64_gnu 0.52.6", + "id": "windows_x86_64_msvc 0.52.6", "target": "build_script_build" } ], @@ -21074,20 +20566,20 @@ ], "license_file": "license-apache-2.0" }, - "windows_x86_64_gnullvm 0.48.5": { - "name": "windows_x86_64_gnullvm", - "version": "0.48.5", - "package_url": "https://github.com/microsoft/windows-rs", + "winnow 0.6.18": { + "name": "winnow", + "version": "0.6.18", + "package_url": "https://github.com/winnow-rs/winnow", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download", - "sha256": "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + "url": "https://static.crates.io/crates/winnow/0.6.18/download", + "sha256": "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" } }, "targets": [ { "Library": { - "crate_name": "windows_x86_64_gnullvm", + "crate_name": "winnow", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21096,11 +20588,45 @@ ] } } + } + ], + "library_target_name": "winnow", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "default", + "std" + ], + "selects": {} }, + "edition": "2021", + "version": "0.6.18" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE-MIT" + }, + "winsafe 0.0.19": { + "name": "winsafe", + "version": "0.0.19", + "package_url": "https://github.com/rodrigocfd/winsafe", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/winsafe/0.0.19/download", + "sha256": "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + } + }, + "targets": [ { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", + "Library": { + "crate_name": "winsafe", + "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, "include": [ @@ -21110,52 +20636,85 @@ } } ], - "library_target_name": "windows_x86_64_gnullvm", + "library_target_name": "winsafe", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { + "crate_features": { "common": [ - { - "id": "windows_x86_64_gnullvm 0.48.5", - "target": "build_script_build" - } + "kernel" ], "selects": {} }, - "edition": "2018", - "version": "0.48.5" + "edition": "2021", + "version": "0.0.19" }, - "build_script_attrs": { + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE.md" + }, + "write16 1.0.0": { + "name": "write16", + "version": "1.0.0", + "package_url": "https://github.com/hsivonen/write16", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/write16/1.0.0/download", + "sha256": "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + } + }, + "targets": [ + { + "Library": { + "crate_name": "write16", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "write16", + "common_attrs": { "compile_data_glob": [ "**" ], - "data_glob": [ - "**" - ] + "crate_features": { + "common": [ + "alloc" + ], + "selects": {} + }, + "edition": "2021", + "version": "1.0.0" }, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], - "license_file": "license-apache-2.0" + "license_file": "LICENSE-APACHE" }, - "windows_x86_64_gnullvm 0.52.6": { - "name": "windows_x86_64_gnullvm", - "version": "0.52.6", - "package_url": "https://github.com/microsoft/windows-rs", + "writeable 0.5.5": { + "name": "writeable", + "version": "0.5.5", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download", - "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + "url": "https://static.crates.io/crates/writeable/0.5.5/download", + "sha256": "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" } }, "targets": [ { "Library": { - "crate_name": "windows_x86_64_gnullvm", + "crate_name": "writeable", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21164,11 +20723,37 @@ ] } } - }, + } + ], + "library_target_name": "writeable", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "0.5.5" + }, + "license": "Unicode-3.0", + "license_ids": [ + "Unicode-3.0" + ], + "license_file": "LICENSE" + }, + "x509-certificate 0.24.0": { + "name": "x509-certificate", + "version": "0.24.0", + "package_url": "https://github.com/indygreg/cryptography-rs.git", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/x509-certificate/0.24.0/download", + "sha256": "e57b9f8bcae7c1f36479821ae826d75050c60ce55146fd86d3553ed2573e2762" + } + }, + "targets": [ { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", + "Library": { + "crate_name": "x509_certificate", + "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, "include": [ @@ -21178,52 +20763,89 @@ } } ], - "library_target_name": "windows_x86_64_gnullvm", + "library_target_name": "x509_certificate", "common_attrs": { "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "test" + ], + "selects": {} + }, "deps": { "common": [ { - "id": "windows_x86_64_gnullvm 0.52.6", - "target": "build_script_build" + "id": "bcder 0.7.4", + "target": "bcder" + }, + { + "id": "bytes 1.9.0", + "target": "bytes" + }, + { + "id": "chrono 0.4.38", + "target": "chrono" + }, + { + "id": "der 0.7.9", + "target": "der" + }, + { + "id": "hex 0.4.3", + "target": "hex" + }, + { + "id": "pem 3.0.4", + "target": "pem" + }, + { + "id": "ring 0.17.8", + "target": "ring" + }, + { + "id": "signature 2.2.0", + "target": "signature" + }, + { + "id": "spki 0.7.3", + "target": "spki" + }, + { + "id": "thiserror 1.0.69", + "target": "thiserror" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" } ], "selects": {} }, "edition": "2021", - "version": "0.52.6" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ] + "version": "0.24.0" }, - "license": "MIT OR Apache-2.0", + "license": "MPL-2.0", "license_ids": [ - "Apache-2.0", - "MIT" + "MPL-2.0" ], - "license_file": "license-apache-2.0" + "license_file": "LICENSE" }, - "windows_x86_64_msvc 0.48.5": { - "name": "windows_x86_64_msvc", - "version": "0.48.5", - "package_url": "https://github.com/microsoft/windows-rs", + "xattr 1.3.1": { + "name": "xattr", + "version": "1.3.1", + "package_url": "https://github.com/Stebalien/xattr", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download", - "sha256": "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + "url": "https://static.crates.io/crates/xattr/1.3.1/download", + "sha256": "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" } }, "targets": [ { "Library": { - "crate_name": "windows_x86_64_msvc", + "crate_name": "xattr", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21232,66 +20854,66 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], - "library_target_name": "windows_x86_64_msvc", + "library_target_name": "xattr", "common_attrs": { "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "default", + "unsupported" + ], + "selects": {} + }, "deps": { "common": [ { - "id": "windows_x86_64_msvc 0.48.5", - "target": "build_script_build" + "id": "rustix 0.38.42", + "target": "rustix" } ], - "selects": {} + "selects": { + "cfg(any(target_os = \"freebsd\", target_os = \"netbsd\"))": [ + { + "id": "libc 0.2.168", + "target": "libc" + } + ], + "cfg(target_os = \"linux\")": [ + { + "id": "linux-raw-sys 0.4.14", + "target": "linux_raw_sys" + } + ] + } }, - "edition": "2018", - "version": "0.48.5" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ] + "edition": "2021", + "version": "1.3.1" }, - "license": "MIT OR Apache-2.0", + "license": "MIT/Apache-2.0", "license_ids": [ "Apache-2.0", "MIT" ], - "license_file": "license-apache-2.0" + "license_file": "LICENSE-APACHE" }, - "windows_x86_64_msvc 0.52.6": { - "name": "windows_x86_64_msvc", - "version": "0.52.6", - "package_url": "https://github.com/microsoft/windows-rs", + "xml-rs 0.8.24": { + "name": "xml-rs", + "version": "0.8.24", + "package_url": "https://github.com/kornelski/xml-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download", - "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + "url": "https://static.crates.io/crates/xml-rs/0.8.24/download", + "sha256": "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" } }, "targets": [ { "Library": { - "crate_name": "windows_x86_64_msvc", + "crate_name": "xml", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21300,66 +20922,36 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], - "library_target_name": "windows_x86_64_msvc", + "library_target_name": "xml", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { - "common": [ - { - "id": "windows_x86_64_msvc 0.52.6", - "target": "build_script_build" - } - ], - "selects": {} - }, "edition": "2021", - "version": "0.52.6" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ] + "version": "0.8.24" }, - "license": "MIT OR Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0", "MIT" ], - "license_file": "license-apache-2.0" + "license_file": "LICENSE" }, - "winnow 0.6.18": { - "name": "winnow", - "version": "0.6.18", - "package_url": "https://github.com/winnow-rs/winnow", + "xz2 0.1.7": { + "name": "xz2", + "version": "0.1.7", + "package_url": "https://github.com/alexcrichton/xz2-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/winnow/0.6.18/download", - "sha256": "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" + "url": "https://static.crates.io/crates/xz2/0.1.7/download", + "sha256": "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" } }, "targets": [ { "Library": { - "crate_name": "winnow", + "crate_name": "xz2", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21370,42 +20962,50 @@ } } ], - "library_target_name": "winnow", + "library_target_name": "xz2", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "alloc", - "default", - "std" + "static" ], "selects": {} }, - "edition": "2021", - "version": "0.6.18" + "deps": { + "common": [ + { + "id": "lzma-sys 0.1.20", + "target": "lzma_sys" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.7" }, - "license": "MIT", + "license": "MIT/Apache-2.0", "license_ids": [ + "Apache-2.0", "MIT" ], - "license_file": "LICENSE-MIT" + "license_file": "LICENSE-APACHE" }, - "winreg 0.50.0": { - "name": "winreg", - "version": "0.50.0", - "package_url": "https://github.com/gentoo90/winreg-rs", + "yoke 0.7.5": { + "name": "yoke", + "version": "0.7.5", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/winreg/0.50.0/download", - "sha256": "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" + "url": "https://static.crates.io/crates/yoke/0.7.5/download", + "sha256": "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" } }, "targets": [ { "Library": { - "crate_name": "winreg", + "crate_name": "yoke", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21416,47 +21016,65 @@ } } ], - "library_target_name": "winreg", + "library_target_name": "yoke", "common_attrs": { "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "alloc", + "default", + "derive", + "zerofrom" + ], + "selects": {} + }, "deps": { "common": [ { - "id": "cfg-if 1.0.0", - "target": "cfg_if" + "id": "stable_deref_trait 1.2.0", + "target": "stable_deref_trait" }, { - "id": "windows-sys 0.48.0", - "target": "windows_sys" + "id": "zerofrom 0.1.5", + "target": "zerofrom" } ], "selects": {} }, - "edition": "2018", - "version": "0.50.0" + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "yoke-derive 0.7.5", + "target": "yoke_derive" + } + ], + "selects": {} + }, + "version": "0.7.5" }, - "license": "MIT", + "license": "Unicode-3.0", "license_ids": [ - "MIT" + "Unicode-3.0" ], "license_file": "LICENSE" }, - "winsafe 0.0.19": { - "name": "winsafe", - "version": "0.0.19", - "package_url": "https://github.com/rodrigocfd/winsafe", + "yoke-derive 0.7.5": { + "name": "yoke-derive", + "version": "0.7.5", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/winsafe/0.0.19/download", - "sha256": "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + "url": "https://static.crates.io/crates/yoke-derive/0.7.5/download", + "sha256": "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" } }, "targets": [ { - "Library": { - "crate_name": "winsafe", + "ProcMacro": { + "crate_name": "yoke_derive", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21467,40 +21085,55 @@ } } ], - "library_target_name": "winsafe", + "library_target_name": "yoke_derive", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { + "deps": { "common": [ - "kernel" + { + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.90", + "target": "syn" + }, + { + "id": "synstructure 0.13.1", + "target": "synstructure" + } ], "selects": {} }, "edition": "2021", - "version": "0.0.19" + "version": "0.7.5" }, - "license": "MIT", + "license": "Unicode-3.0", "license_ids": [ - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE.md" + "license_file": "LICENSE" }, - "x509-certificate 0.23.1": { - "name": "x509-certificate", - "version": "0.23.1", - "package_url": "https://github.com/indygreg/cryptography-rs.git", + "zerofrom 0.1.5": { + "name": "zerofrom", + "version": "0.1.5", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/x509-certificate/0.23.1/download", - "sha256": "66534846dec7a11d7c50a74b7cdb208b9a581cad890b7866430d438455847c85" + "url": "https://static.crates.io/crates/zerofrom/0.1.5/download", + "sha256": "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" } }, "targets": [ { "Library": { - "crate_name": "x509_certificate", + "crate_name": "zerofrom", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21511,89 +21144,50 @@ } } ], - "library_target_name": "x509_certificate", + "library_target_name": "zerofrom", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "test" + "alloc", + "derive" ], "selects": {} }, - "deps": { + "edition": "2021", + "proc_macro_deps": { "common": [ { - "id": "bcder 0.7.4", - "target": "bcder" - }, - { - "id": "bytes 1.6.0", - "target": "bytes" - }, - { - "id": "chrono 0.4.38", - "target": "chrono" - }, - { - "id": "der 0.7.9", - "target": "der" - }, - { - "id": "hex 0.4.3", - "target": "hex" - }, - { - "id": "pem 3.0.4", - "target": "pem" - }, - { - "id": "ring 0.17.8", - "target": "ring" - }, - { - "id": "signature 2.2.0", - "target": "signature" - }, - { - "id": "spki 0.7.3", - "target": "spki" - }, - { - "id": "thiserror 1.0.64", - "target": "thiserror" - }, - { - "id": "zeroize 1.7.0", - "target": "zeroize" + "id": "zerofrom-derive 0.1.5", + "target": "zerofrom_derive" } ], "selects": {} }, - "edition": "2021", - "version": "0.23.1" + "version": "0.1.5" }, - "license": "MPL-2.0", + "license": "Unicode-3.0", "license_ids": [ - "MPL-2.0" + "Unicode-3.0" ], - "license_file": null + "license_file": "LICENSE" }, - "xattr 1.3.1": { - "name": "xattr", - "version": "1.3.1", - "package_url": "https://github.com/Stebalien/xattr", + "zerofrom-derive 0.1.5": { + "name": "zerofrom-derive", + "version": "0.1.5", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/xattr/1.3.1/download", - "sha256": "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" + "url": "https://static.crates.io/crates/zerofrom-derive/0.1.5/download", + "sha256": "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" } }, "targets": [ { - "Library": { - "crate_name": "xattr", + "ProcMacro": { + "crate_name": "zerofrom_derive", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21604,64 +21198,55 @@ } } ], - "library_target_name": "xattr", + "library_target_name": "zerofrom_derive", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "default", - "unsupported" - ], - "selects": {} - }, "deps": { "common": [ { - "id": "rustix 0.38.37", - "target": "rustix" + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.90", + "target": "syn" + }, + { + "id": "synstructure 0.13.1", + "target": "synstructure" } ], - "selects": { - "cfg(any(target_os = \"freebsd\", target_os = \"netbsd\"))": [ - { - "id": "libc 0.2.160", - "target": "libc" - } - ], - "cfg(target_os = \"linux\")": [ - { - "id": "linux-raw-sys 0.4.14", - "target": "linux_raw_sys" - } - ] - } + "selects": {} }, "edition": "2021", - "version": "1.3.1" + "version": "0.1.5" }, - "license": "MIT/Apache-2.0", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "xml-rs 0.8.20": { - "name": "xml-rs", - "version": "0.8.20", - "package_url": "https://github.com/kornelski/xml-rs", + "zeroize 1.8.1": { + "name": "zeroize", + "version": "1.8.1", + "package_url": "https://github.com/RustCrypto/utils/tree/master/zeroize", "repository": { "Http": { - "url": "https://static.crates.io/crates/xml-rs/0.8.20/download", - "sha256": "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" + "url": "https://static.crates.io/crates/zeroize/1.8.1/download", + "sha256": "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" } }, "targets": [ { "Library": { - "crate_name": "xml", + "crate_name": "zeroize", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21672,34 +21257,53 @@ } } ], - "library_target_name": "xml", + "library_target_name": "zeroize", "common_attrs": { "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "alloc", + "default", + "derive", + "zeroize_derive" + ], + "selects": {} + }, "edition": "2021", - "version": "0.8.20" + "proc_macro_deps": { + "common": [ + { + "id": "zeroize_derive 1.4.2", + "target": "zeroize_derive" + } + ], + "selects": {} + }, + "version": "1.8.1" }, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "license_ids": [ + "Apache-2.0", "MIT" ], - "license_file": "LICENSE" + "license_file": "LICENSE-APACHE" }, - "xz2 0.1.7": { - "name": "xz2", - "version": "0.1.7", - "package_url": "https://github.com/alexcrichton/xz2-rs", + "zeroize_derive 1.4.2": { + "name": "zeroize_derive", + "version": "1.4.2", + "package_url": "https://github.com/RustCrypto/utils/tree/master/zeroize/derive", "repository": { "Http": { - "url": "https://static.crates.io/crates/xz2/0.1.7/download", - "sha256": "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" + "url": "https://static.crates.io/crates/zeroize_derive/1.4.2/download", + "sha256": "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" } }, "targets": [ { - "Library": { - "crate_name": "xz2", + "ProcMacro": { + "crate_name": "zeroize_derive", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21710,50 +21314,52 @@ } } ], - "library_target_name": "xz2", + "library_target_name": "zeroize_derive", "common_attrs": { "compile_data_glob": [ "**" ], - "crate_features": { - "common": [ - "static" - ], - "selects": {} - }, "deps": { "common": [ { - "id": "lzma-sys 0.1.20", - "target": "lzma_sys" + "id": "proc-macro2 1.0.92", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.90", + "target": "syn" } ], "selects": {} }, - "edition": "2018", - "version": "0.1.7" + "edition": "2021", + "version": "1.4.2" }, - "license": "MIT/Apache-2.0", + "license": "Apache-2.0 OR MIT", "license_ids": [ "Apache-2.0", "MIT" ], "license_file": "LICENSE-APACHE" }, - "zeroize 1.7.0": { - "name": "zeroize", - "version": "1.7.0", - "package_url": "https://github.com/RustCrypto/utils/tree/master/zeroize", + "zerovec 0.10.4": { + "name": "zerovec", + "version": "0.10.4", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/zeroize/1.7.0/download", - "sha256": "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" + "url": "https://static.crates.io/crates/zerovec/0.10.4/download", + "sha256": "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" } }, "targets": [ { "Library": { - "crate_name": "zeroize", + "crate_name": "zerovec", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21764,17 +21370,28 @@ } } ], - "library_target_name": "zeroize", + "library_target_name": "zerovec", "common_attrs": { "compile_data_glob": [ "**" ], "crate_features": { "common": [ - "alloc", - "default", "derive", - "zeroize_derive" + "yoke" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "yoke 0.7.5", + "target": "yoke" + }, + { + "id": "zerofrom 0.1.5", + "target": "zerofrom" + } ], "selects": {} }, @@ -21782,35 +21399,34 @@ "proc_macro_deps": { "common": [ { - "id": "zeroize_derive 1.4.2", - "target": "zeroize_derive" + "id": "zerovec-derive 0.10.3", + "target": "zerovec_derive" } ], "selects": {} }, - "version": "1.7.0" + "version": "0.10.4" }, - "license": "Apache-2.0 OR MIT", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "zeroize_derive 1.4.2": { - "name": "zeroize_derive", - "version": "1.4.2", - "package_url": "https://github.com/RustCrypto/utils/tree/master/zeroize/derive", + "zerovec-derive 0.10.3": { + "name": "zerovec-derive", + "version": "0.10.3", + "package_url": "https://github.com/unicode-org/icu4x", "repository": { "Http": { - "url": "https://static.crates.io/crates/zeroize_derive/1.4.2/download", - "sha256": "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" + "url": "https://static.crates.io/crates/zerovec-derive/0.10.3/download", + "sha256": "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" } }, "targets": [ { "ProcMacro": { - "crate_name": "zeroize_derive", + "crate_name": "zerovec_derive", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -21821,7 +21437,7 @@ } } ], - "library_target_name": "zeroize_derive", + "library_target_name": "zerovec_derive", "common_attrs": { "compile_data_glob": [ "**" @@ -21829,7 +21445,7 @@ "deps": { "common": [ { - "id": "proc-macro2 1.0.88", + "id": "proc-macro2 1.0.92", "target": "proc_macro2" }, { @@ -21837,30 +21453,29 @@ "target": "quote" }, { - "id": "syn 2.0.79", + "id": "syn 2.0.90", "target": "syn" } ], "selects": {} }, "edition": "2021", - "version": "1.4.2" + "version": "0.10.3" }, - "license": "Apache-2.0 OR MIT", + "license": "Unicode-3.0", "license_ids": [ - "Apache-2.0", - "MIT" + "Unicode-3.0" ], - "license_file": "LICENSE-APACHE" + "license_file": "LICENSE" }, - "zip 2.2.0": { + "zip 2.2.1": { "name": "zip", - "version": "2.2.0", + "version": "2.2.1", "package_url": "https://github.com/zip-rs/zip2.git", "repository": { "Http": { - "url": "https://static.crates.io/crates/zip/2.2.0/download", - "sha256": "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" + "url": "https://static.crates.io/crates/zip/2.2.1/download", + "sha256": "99d52293fc86ea7cf13971b3bb81eb21683636e7ae24c729cdaf1b7c4157a352" } }, "targets": [ @@ -21910,7 +21525,7 @@ "target": "crc32fast" }, { - "id": "flate2 1.0.34", + "id": "flate2 1.0.35", "target": "flate2" }, { @@ -21922,11 +21537,11 @@ "target": "memchr" }, { - "id": "thiserror 1.0.64", + "id": "thiserror 2.0.6", "target": "thiserror" }, { - "id": "zip 2.2.0", + "id": "zip 2.2.1", "target": "build_script_build" } ], @@ -21955,7 +21570,7 @@ ], "selects": {} }, - "version": "2.2.0" + "version": "2.2.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -22080,7 +21695,7 @@ "deps": { "common": [ { - "id": "libc 0.2.160", + "id": "libc 0.2.168", "target": "libc" }, { @@ -22214,7 +21829,7 @@ }, "binary_crates": [], "workspace_members": { - "selenium-manager 0.4.24": "rust" + "selenium-manager 0.4.28-nightly": "rust" }, "conditions": { "aarch64-apple-darwin": [ @@ -22226,9 +21841,6 @@ "aarch64-apple-ios-sim": [ "aarch64-apple-ios-sim" ], - "aarch64-fuchsia": [ - "aarch64-fuchsia" - ], "aarch64-linux-android": [ "aarch64-linux-android" ], @@ -22236,6 +21848,9 @@ "aarch64-pc-windows-msvc": [ "aarch64-pc-windows-msvc" ], + "aarch64-unknown-fuchsia": [ + "aarch64-unknown-fuchsia" + ], "aarch64-unknown-linux-gnu": [ "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu" @@ -22258,7 +21873,7 @@ "cfg(all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), target_env = \"msvc\", not(windows_raw_dylib)))": [ "x86_64-pc-windows-msvc" ], - "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))": [ + "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", target_arch = \"s390x\"), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))": [ "aarch64-linux-android", "armv7-linux-androideabi", "i686-linux-android", @@ -22274,7 +21889,7 @@ "armv7-linux-androideabi", "armv7-unknown-linux-gnueabi" ], - "cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))": [ + "cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", target_arch = \"s390x\"), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))": [ "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "arm-unknown-linux-gnueabi", @@ -22283,12 +21898,12 @@ "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu" ], - "cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))": [ + "cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", target_arch = \"s390x\"), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))": [ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", + "aarch64-unknown-fuchsia", "aarch64-unknown-nto-qnx710", "armv7-linux-androideabi", "i686-apple-darwin", @@ -22301,12 +21916,12 @@ "thumbv7em-none-eabi", "thumbv8m.main-none-eabi", "wasm32-unknown-unknown", - "wasm32-wasi", + "wasm32-wasip1", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-none" ], "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ @@ -22354,9 +21969,9 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", "aarch64-pc-windows-msvc", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22372,10 +21987,10 @@ "thumbv8m.main-none-eabi", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-pc-windows-msvc", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu", "x86_64-unknown-none" @@ -22384,9 +21999,9 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", "aarch64-pc-windows-msvc", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22397,10 +22012,10 @@ "i686-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-pc-windows-msvc", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu", "x86_64-unknown-none" @@ -22409,9 +22024,9 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", "aarch64-pc-windows-msvc", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22422,10 +22037,10 @@ "i686-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-pc-windows-msvc", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu", "x86_64-unknown-none" @@ -22446,8 +22061,8 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22460,12 +22075,12 @@ "i686-unknown-linux-gnu", "powerpc-unknown-linux-gnu", "s390x-unknown-linux-gnu", - "wasm32-wasi", + "wasm32-wasip1", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu" ], @@ -22473,8 +22088,8 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22487,12 +22102,12 @@ "i686-unknown-linux-gnu", "powerpc-unknown-linux-gnu", "s390x-unknown-linux-gnu", - "wasm32-wasi", + "wasm32-wasip1", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu" ], @@ -22500,9 +22115,9 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", "aarch64-pc-windows-msvc", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22518,10 +22133,10 @@ "s390x-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-pc-windows-msvc", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu" ], @@ -22530,8 +22145,8 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22549,12 +22164,12 @@ "thumbv7em-none-eabi", "thumbv8m.main-none-eabi", "wasm32-unknown-unknown", - "wasm32-wasi", + "wasm32-wasip1", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu", "x86_64-unknown-none" @@ -22563,9 +22178,9 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", "aarch64-pc-windows-msvc", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22585,17 +22200,17 @@ "thumbv8m.main-none-eabi", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-pc-windows-msvc", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu", "x86_64-unknown-none" ], "cfg(target_arch = \"wasm32\")": [ "wasm32-unknown-unknown", - "wasm32-wasi" + "wasm32-wasip1" ], "cfg(target_feature = \"atomics\")": [], "cfg(target_os = \"android\")": [ @@ -22617,14 +22232,9 @@ "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu" ], - "cfg(target_os = \"macos\")": [ - "aarch64-apple-darwin", - "i686-apple-darwin", - "x86_64-apple-darwin" - ], "cfg(target_os = \"redox\")": [], "cfg(target_os = \"wasi\")": [ - "wasm32-wasi" + "wasm32-wasip1" ], "cfg(target_os = \"windows\")": [ "aarch64-pc-windows-msvc", @@ -22636,8 +22246,8 @@ "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-ios-sim", - "aarch64-fuchsia", "aarch64-linux-android", + "aarch64-unknown-fuchsia", "aarch64-unknown-linux-gnu", "aarch64-unknown-nixos-gnu", "aarch64-unknown-nto-qnx710", @@ -22652,9 +22262,9 @@ "s390x-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-apple-ios", - "x86_64-fuchsia", "x86_64-linux-android", "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu" ], @@ -22701,8 +22311,8 @@ "wasm32-unknown-unknown": [ "wasm32-unknown-unknown" ], - "wasm32-wasi": [ - "wasm32-wasi" + "wasm32-wasip1": [ + "wasm32-wasip1" ], "x86_64-apple-darwin": [ "x86_64-apple-darwin" @@ -22710,9 +22320,6 @@ "x86_64-apple-ios": [ "x86_64-apple-ios" ], - "x86_64-fuchsia": [ - "x86_64-fuchsia" - ], "x86_64-linux-android": [ "x86_64-linux-android" ], @@ -22724,6 +22331,9 @@ "x86_64-unknown-freebsd": [ "x86_64-unknown-freebsd" ], + "x86_64-unknown-fuchsia": [ + "x86_64-unknown-fuchsia" + ], "x86_64-unknown-linux-gnu": [ "x86_64-unknown-linux-gnu", "x86_64-unknown-nixos-gnu" @@ -22736,33 +22346,37 @@ ] }, "direct_deps": [ - "anyhow 1.0.91", - "apple-flat-package 0.18.0", - "bzip2 0.4.4", - "clap 4.5.20", + "anyhow 1.0.94", + "apple-flat-package 0.20.0", + "bzip2 0.5.0", + "clap 4.5.23", "debpkg 0.6.0", "directories 5.0.1", "env_logger 0.11.5", "exitcode 1.1.2", - "flate2 1.0.34", + "flate2 1.0.35", + "fs2 0.4.3", + "fs_extra 1.3.0", "infer 0.16.0", "log 0.4.22", "regex 1.11.1", - "reqwest 0.12.8", - "serde 1.0.210", - "serde_json 1.0.128", + "reqwest 0.12.9", + "serde 1.0.216", + "serde_json 1.0.133", "sevenz-rust 0.6.1", - "tar 0.4.42", - "tempfile 3.13.0", - "tokio 1.40.0", + "tar 0.4.43", + "tempfile 3.14.0", + "tokio 1.42.0", "toml 0.8.19", "walkdir 2.5.0", - "which 6.0.3", - "zip 2.2.0" + "which 7.0.0", + "xz2 0.1.7", + "zip 2.2.1" ], "direct_dev_deps": [ "assert_cmd 2.0.16", "is_executable 1.0.4", "rstest 0.19.0" - ] + ], + "unused_patches": [] } diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 2696beb8223eb..4fd86b331d003 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -98,18 +98,18 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" dependencies = [ "backtrace", ] [[package]] name = "apple-flat-package" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6adc520e05304de5ec383487786fa20e9c636fe972e59719cdd93621a2db6f1" +checksum = "9c9d5a1fd8af4a376cc33d7e816a13f8ce127d52101f5dbc8061fb595397bea0" dependencies = [ "apple-xar", "cpio-archive", @@ -117,18 +117,18 @@ dependencies = [ "scroll", "serde", "serde-xml-rs", - "thiserror", + "thiserror 2.0.6", ] [[package]] name = "apple-xar" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "844e00dc1e665b3cf0bba745aa9c6464292ca512db0c11384511586701eb0335" +checksum = "9631e781df71ebd049d7b4988cdae88712324cb20eb127fd79026bc8f1335d93" dependencies = [ - "base64 0.21.7", + "base64", "bcder", - "bzip2", + "bzip2 0.4.4", "chrono", "cryptographic-message-syntax", "digest", @@ -136,14 +136,14 @@ dependencies = [ "log", "md-5", "rand", - "reqwest 0.11.27", + "reqwest", "scroll", "serde", "serde-xml-rs", "sha1", "sha2", "signature", - "thiserror", + "thiserror 2.0.6", "url", "x509-certificate", "xml-rs", @@ -208,12 +208,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -297,9 +291,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "bzip2" @@ -311,6 +305,16 @@ dependencies = [ "libc", ] +[[package]] +name = "bzip2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafdbf26611df8c14810e268ddceda071c297570a5fb360ceddf617fe417ef58" +dependencies = [ + "bzip2-sys", + "libc", +] + [[package]] name = "bzip2-sys" version = "0.1.11+1.0.8" @@ -367,9 +371,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -377,9 +381,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -401,9 +405,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" @@ -417,16 +421,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -435,14 +429,14 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpio-archive" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d5133d716d3d82da8c76367ddb0ab1733e2629f1462e4f39947e13b8b4b741" +checksum = "f11d34b07689c21889fc89bd7cc885b3244b0157bbededf4a1c159832cd0df05" dependencies = [ "chrono", "is_executable", "simple-file-manifest", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -496,16 +490,16 @@ dependencies = [ [[package]] name = "cryptographic-message-syntax" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c324ba1028cef7e3a71a00cbf585637bb0215dec2f6a2b566d094190a1309b" +checksum = "97a99e58d7755c646cb3f2a138d99f90da4c495282e1700b82daff8a48759ce0" dependencies = [ "bcder", "bytes", "chrono", "hex", "pem", - "reqwest 0.11.27", + "reqwest", "ring", "signature", "x509-certificate", @@ -519,7 +513,7 @@ checksum = "7ffffa9a03449467cfac11c9a4260556f477de22a935bb5e9475153de323c337" dependencies = [ "ar", "arrayvec", - "bzip2", + "bzip2 0.4.4", "flate2", "indexmap 1.9.3", "infer 0.8.1", @@ -619,15 +613,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - [[package]] name = "env_filter" version = "0.1.0" @@ -659,12 +644,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -704,9 +689,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "libz-sys", @@ -728,6 +713,22 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures" version = "0.3.30" @@ -856,25 +857,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -914,17 +896,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -936,17 +907,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.0" @@ -954,7 +914,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -965,8 +925,8 @@ checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" dependencies = [ "bytes", "futures-core", - "http 1.1.0", - "http-body 1.0.0", + "http", + "http-body", "pin-project-lite", ] @@ -976,42 +936,12 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.3.1" @@ -1021,8 +951,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.0", + "http", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -1031,20 +961,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.28", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.2" @@ -1052,15 +968,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.3.1", + "http", + "hyper", "hyper-util", - "rustls 0.23.12", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tower-service", - "webpki-roots 0.26.1", + "webpki-roots", ] [[package]] @@ -1072,9 +988,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "hyper 1.3.1", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -1106,14 +1022,143 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1201,9 +1246,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.160" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b21006cd1874ae9e650973c565615676dc4a274c965bb0a73796dac838ce4f" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "libredox" @@ -1232,6 +1277,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "log" version = "0.4.22" @@ -1362,7 +1413,7 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.22.1", + "base64", "serde", ] @@ -1451,9 +1502,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -1469,9 +1520,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.12", + "rustls", "socket2", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -1486,9 +1537,9 @@ dependencies = [ "rand", "ring", "rustc-hash", - "rustls 0.23.12", + "rustls", "slab", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tracing", ] @@ -1562,7 +1613,7 @@ checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1602,60 +1653,20 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.28", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.25.4", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ - "base64 0.22.1", + "base64", "bytes", + "futures-channel", "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.0", + "http", + "http-body", "http-body-util", - "hyper 1.3.1", - "hyper-rustls 0.27.2", + "hyper", + "hyper-rustls", "hyper-util", "ipnet", "js-sys", @@ -1665,21 +1676,21 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.12", - "rustls-pemfile 2.1.2", + "rustls", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.26.1", + "webpki-roots", "windows-registry", ] @@ -1750,27 +1761,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", + "windows-sys 0.59.0", ] [[package]] @@ -1782,27 +1781,18 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.6", + "rustls-webpki", "subtle", "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.22.1", + "base64", "rustls-pki-types", ] @@ -1812,16 +1802,6 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "rustls-webpki" version = "0.102.6" @@ -1868,35 +1848,27 @@ dependencies = [ "syn", ] -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "selenium-manager" -version = "0.4.24" +version = "0.4.28-nightly" dependencies = [ "anyhow", "apple-flat-package", "assert_cmd", - "bzip2", + "bzip2 0.5.0", "clap", "debpkg", "directories", "env_logger", "exitcode", "flate2", + "fs2", + "fs_extra", "infer 0.16.0", "is_executable", "log", "regex", - "reqwest 0.12.8", + "reqwest", "rstest", "serde", "serde_json", @@ -1907,6 +1879,7 @@ dependencies = [ "toml", "walkdir", "which", + "xz2", "zip", ] @@ -1918,9 +1891,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] @@ -1933,15 +1906,15 @@ checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" dependencies = [ "log", "serde", - "thiserror", + "thiserror 1.0.69", "xml-rs", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", @@ -1950,9 +1923,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -2082,6 +2055,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.11.1" @@ -2096,21 +2075,15 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.79" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.1" @@ -2121,31 +2094,21 @@ dependencies = [ ] [[package]] -name = "system-configuration" -version = "0.5.1" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "tar" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -2154,9 +2117,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -2173,18 +2136,38 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +dependencies = [ + "thiserror-impl 2.0.6", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" dependencies = [ "proc-macro2", "quote", @@ -2221,6 +2204,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -2238,9 +2231,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -2263,40 +2256,17 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.12", + "rustls", "rustls-pki-types", "tokio", ] -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - [[package]] name = "toml" version = "0.8.19" @@ -2391,27 +2361,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - [[package]] name = "untrusted" version = "0.9.0" @@ -2420,15 +2375,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.1" @@ -2563,12 +2530,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - [[package]] name = "webpki-roots" version = "0.26.1" @@ -2580,9 +2541,9 @@ dependencies = [ [[package]] name = "which" -version = "6.0.3" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" +checksum = "c9cad3279ade7346b96e38731a641d7343dd6a53d55083dd54eadfa5a1b38c6b" dependencies = [ "either", "home", @@ -2817,27 +2778,29 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "winsafe" version = "0.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "x509-certificate" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66534846dec7a11d7c50a74b7cdb208b9a581cad890b7866430d438455847c85" +checksum = "e57b9f8bcae7c1f36479821ae826d75050c60ce55146fd86d3553ed2573e2762" dependencies = [ "bcder", "bytes", @@ -2848,7 +2811,7 @@ dependencies = [ "ring", "signature", "spki", - "thiserror", + "thiserror 1.0.69", "zeroize", ] @@ -2865,9 +2828,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.20" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" +checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" [[package]] name = "xz2" @@ -2878,11 +2841,56 @@ dependencies = [ "lzma-sys", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -2898,11 +2906,33 @@ dependencies = [ "syn", ] +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zip" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" +checksum = "99d52293fc86ea7cf13971b3bb81eb21683636e7ae24c729cdaf1b7c4157a352" dependencies = [ "arbitrary", "crc32fast", @@ -2911,7 +2941,7 @@ dependencies = [ "flate2", "indexmap 2.2.6", "memchr", - "thiserror", + "thiserror 2.0.6", ] [[package]] diff --git a/rust/Cargo.toml b/rust/Cargo.toml index f5854e15f80ff..33fa599154fc5 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "selenium-manager" -version = "0.4.24" # don't forget to update rust/BUILD.bazel +version = "0.4.28-nightly" # don't forget to update rust/BUILD.bazel edition = "2021" authors = ["Selenium , } #[derive(Serialize, Deserialize, Debug)] pub struct Release { - #[serde(rename = "ReleaseId")] + #[serde(rename = "ReleaseId", alias = "releaseId")] pub release_id: u32, - #[serde(rename = "Platform")] + #[serde(rename = "Platform", alias = "platform")] pub platform: String, - #[serde(rename = "Architecture")] + #[serde(rename = "Architecture", alias = "architecture")] pub architecture: String, - #[serde(rename = "CVEs")] + #[serde(rename = "CVEs", alias = "cves")] pub cves: Vec, - #[serde(rename = "ProductVersion")] + #[serde(rename = "ProductVersion", alias = "productVersion")] pub product_version: String, - #[serde(rename = "Artifacts")] + #[serde(rename = "Artifacts", alias = "artifacts")] pub artifacts: Vec, - #[serde(rename = "PublishedTime")] + #[serde(rename = "PublishedTime", alias = "publishedTime")] pub published_time: String, - #[serde(rename = "ExpectedExpiryDate")] + #[serde(rename = "ExpectedExpiryDate", alias = "expectedExpiryDate")] pub expected_expiry_date: String, } #[derive(Serialize, Deserialize, Debug)] pub struct Artifact { - #[serde(rename = "ArtifactName")] + #[serde(rename = "ArtifactName", alias = "artifactName")] pub artifact_name: String, - #[serde(rename = "Location")] + #[serde(rename = "Location", alias = "location")] pub location: String, - #[serde(rename = "Hash")] + #[serde(rename = "Hash", alias = "hash")] pub hash: String, - #[serde(rename = "HashAlgorithm")] + #[serde(rename = "HashAlgorithm", alias = "hashAlgorithm")] pub hash_algorithm: String, - #[serde(rename = "SizeInBytes")] + #[serde(rename = "SizeInBytes", alias = "sizeInBytes")] pub size_in_bytes: u32, } diff --git a/rust/src/files.rs b/rust/src/files.rs index a753f8456b358..8dc208a3cfb85 100644 --- a/rust/src/files.rs +++ b/rust/src/files.rs @@ -27,6 +27,7 @@ use apple_flat_package::PkgReader; use bzip2::read::BzDecoder; use directories::BaseDirs; use flate2::read::GzDecoder; +use fs_extra::dir::{move_dir, CopyOptions}; use regex::Regex; use std::fs; use std::fs::File; @@ -35,6 +36,7 @@ use std::io::{BufReader, Cursor, Read}; use std::path::{Path, PathBuf}; use tar::Archive; use walkdir::{DirEntry, WalkDir}; +use xz2::read::XzDecoder; use zip::ZipArchive; pub const PARSE_ERROR: &str = "Wrong browser/driver version"; @@ -49,6 +51,7 @@ const DMG: &str = "dmg"; const EXE: &str = "exe"; const DEB: &str = "deb"; const MSI: &str = "msi"; +const XZ: &str = "xz"; const SEVEN_ZIP_HEADER: &[u8; 6] = b"7z\xBC\xAF\x27\x1C"; const UNCOMPRESS_MACOS_ERR_MSG: &str = "{} files are only supported in macOS"; @@ -123,7 +126,17 @@ pub fn uncompress( } else if extension.eq_ignore_ascii_case(GZ) { untargz(compressed_file, target, log)? } else if extension.eq_ignore_ascii_case(BZ2) { - uncompress_bz2(compressed_file, target, log)? + uncompress_tar( + &mut BzDecoder::new(File::open(compressed_file)?), + target, + log, + )? + } else if extension.eq_ignore_ascii_case(XZ) { + uncompress_tar( + &mut XzDecoder::new(File::open(compressed_file)?), + target, + log, + )? } else if extension.eq_ignore_ascii_case(PKG) { uncompress_pkg(compressed_file, target, log)? } else if extension.eq_ignore_ascii_case(DMG) { @@ -131,7 +144,7 @@ pub fn uncompress( } else if extension.eq_ignore_ascii_case(EXE) { uncompress_sfx(compressed_file, target, log)? } else if extension.eq_ignore_ascii_case(DEB) { - uncompress_deb(compressed_file, target, log, os, volume.unwrap_or_default())? + uncompress_deb(compressed_file, target, log, volume.unwrap_or_default())? } else if extension.eq_ignore_ascii_case(MSI) { install_msi(compressed_file, log, os)? } else if extension.eq_ignore_ascii_case(XML) || extension.eq_ignore_ascii_case(HTML) { @@ -146,6 +159,7 @@ pub fn uncompress( extension ))); } + Ok(()) } @@ -164,15 +178,23 @@ pub fn uncompress_sfx(compressed_file: &str, target: &Path, log: &Logger) -> Res sevenz_rust::decompress(file_reader, zip_parent).unwrap(); let zip_parent_str = path_to_string(zip_parent); - let target_str = path_to_string(target); let core_str = format!(r"{}\core", zip_parent_str); + move_folder_content(&core_str, &target, &log)?; + + Ok(()) +} + +pub fn move_folder_content(source: &str, target: &Path, log: &Logger) -> Result<(), Error> { log.trace(format!( - "Moving extracted files and folders from {} to {}", - core_str, target_str + "Moving files and folders from {} to {}", + source, + target.display() )); create_parent_path_if_not_exists(target)?; - fs::rename(&core_str, &target_str)?; - + let mut options = CopyOptions::new(); + options.content_only = true; + options.skip_exist = true; + move_dir(source, target, &options)?; Ok(()) } @@ -249,7 +271,6 @@ pub fn uncompress_deb( compressed_file: &str, target: &Path, log: &Logger, - os: &str, label: &str, ) -> Result<(), Error> { let zip_parent = Path::new(compressed_file).parent().unwrap(); @@ -264,21 +285,17 @@ pub fn uncompress_deb( deb_pkg.data()?.unpack(zip_parent)?; let zip_parent_str = path_to_string(zip_parent); - let target_str = path_to_string(target); let opt_edge_str = format!("{}/opt/microsoft/{}", zip_parent_str, label); - let opt_edge_mv = format!("mv {} {}", opt_edge_str, target_str); - let command = Command::new_single(opt_edge_mv.clone()); - log.trace(format!( - "Moving extracted files and folders from {} to {}", - opt_edge_str, target_str - )); - create_parent_path_if_not_exists(target)?; - run_shell_command_by_os(os, command)?; - let target_path = Path::new(target); - if target_path.parent().unwrap().read_dir()?.next().is_none() { - fs::rename(&opt_edge_str, &target_str)?; + + // Exception due to bad symbolic link in unstable distributions. For example: + // microsoft-edge -> /opt/microsoft/msedge-beta/microsoft-edge-beta + if !label.eq("msedge") { + let link = format!("{}/microsoft-edge", opt_edge_str); + fs::remove_file(Path::new(&link)).unwrap_or_default(); } + move_folder_content(&opt_edge_str, &target, &log)?; + Ok(()) } @@ -317,24 +334,20 @@ pub fn untargz(compressed_file: &str, target: &Path, log: &Logger) -> Result<(), Ok(()) } -pub fn uncompress_bz2(compressed_file: &str, target: &Path, log: &Logger) -> Result<(), Error> { +pub fn uncompress_tar(decoder: &mut dyn Read, target: &Path, log: &Logger) -> Result<(), Error> { log.trace(format!( - "Uncompress {} to {}", - compressed_file, + "Uncompress compressed tarball to {}", target.display() )); - let mut bz_decoder = BzDecoder::new(File::open(compressed_file)?); let mut buffer: Vec = Vec::new(); - bz_decoder.read_to_end(&mut buffer)?; + decoder.read_to_end(&mut buffer)?; let mut archive = Archive::new(Cursor::new(buffer)); - if !target.exists() { - for entry in archive.entries()? { - let mut entry_decoder = entry?; - let entry_path: PathBuf = entry_decoder.path()?.iter().skip(1).collect(); - let entry_target = target.join(entry_path); - fs::create_dir_all(entry_target.parent().unwrap())?; - entry_decoder.unpack(entry_target)?; - } + for entry in archive.entries()? { + let mut entry_decoder = entry?; + let entry_path: PathBuf = entry_decoder.path()?.iter().skip(1).collect(); + let entry_target = target.join(entry_path); + fs::create_dir_all(entry_target.parent().unwrap())?; + entry_decoder.unpack(entry_target)?; } Ok(()) } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 3df601e79bd2c..a2c2411bcb763 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -21,14 +21,14 @@ use crate::config::{str_to_os, ManagerConfig}; use crate::downloads::download_to_tmp_folder; use crate::edge::{EdgeManager, EDGEDRIVER_NAME, EDGE_NAMES, WEBVIEW2_NAME}; use crate::files::{ - capitalize, collect_files_from_cache, create_parent_path_if_not_exists, - create_path_if_not_exists, default_cache_folder, find_latest_from_cache, get_binary_extension, - path_to_string, + capitalize, collect_files_from_cache, create_path_if_not_exists, default_cache_folder, + find_latest_from_cache, get_binary_extension, path_to_string, }; use crate::files::{parse_version, uncompress, BrowserPath}; use crate::firefox::{FirefoxManager, FIREFOX_NAME, GECKODRIVER_NAME}; use crate::grid::GRID_NAME; use crate::iexplorer::{IExplorerManager, IEDRIVER_NAME, IE_NAMES}; +use crate::lock::Lock; use crate::logger::Logger; use crate::metadata::{ create_browser_metadata, create_stats_metadata, get_browser_version_from_metadata, @@ -59,6 +59,7 @@ pub mod files; pub mod firefox; pub mod grid; pub mod iexplorer; +pub mod lock; pub mod logger; pub mod metadata; pub mod mirror; @@ -184,6 +185,22 @@ pub trait SeleniumManager { // ---------------------------------------------------------- fn download_driver(&mut self) -> Result<(), Error> { + let driver_path_in_cache = self.get_driver_path_in_cache()?; + let driver_name_with_extension = self.get_driver_name_with_extension(); + + let mut lock = Lock::acquire( + &self.get_logger(), + &driver_path_in_cache, + Some(driver_name_with_extension.clone()), + )?; + if !lock.exists() && driver_path_in_cache.exists() { + self.get_logger().debug(format!( + "Driver already in cache: {}", + driver_path_in_cache.display() + )); + return Ok(()); + } + let driver_url = self.get_driver_url()?; self.get_logger().debug(format!( "Downloading {} {} from {}", @@ -196,20 +213,20 @@ pub trait SeleniumManager { if self.is_grid() { let driver_path_in_cache = self.get_driver_path_in_cache()?; - create_parent_path_if_not_exists(&driver_path_in_cache)?; - Ok(fs::rename(driver_zip_file, driver_path_in_cache)?) + fs::rename(driver_zip_file, driver_path_in_cache)?; } else { - let driver_path_in_cache = self.get_driver_path_in_cache()?; - let driver_name_with_extension = self.get_driver_name_with_extension(); - Ok(uncompress( + uncompress( &driver_zip_file, &driver_path_in_cache, self.get_logger(), self.get_os(), Some(driver_name_with_extension), None, - )?) + )?; } + + lock.release(); + Ok(()) } fn download_browser( @@ -304,6 +321,17 @@ pub trait SeleniumManager { ))); } + let browser_path_in_cache = self.get_browser_path_in_cache()?; + let mut lock = Lock::acquire(&self.get_logger(), &browser_path_in_cache, None)?; + if !lock.exists() && browser_binary_path.exists() { + self.get_logger().debug(format!( + "Browser already in cache: {}", + browser_binary_path.display() + )); + self.set_browser_path(path_to_string(&browser_binary_path)); + return Ok(Some(browser_binary_path.clone())); + } + let browser_url = self.get_browser_url_for_download(original_browser_version)?; self.get_logger().debug(format!( "Downloading {} {} from {}", @@ -318,12 +346,13 @@ pub trait SeleniumManager { self.get_browser_label_for_download(original_browser_version)?; uncompress( &driver_zip_file, - &self.get_browser_path_in_cache()?, - self.get_logger(), + &browser_path_in_cache, + &self.get_logger(), self.get_os(), None, browser_label_for_download, )?; + lock.release(); } if browser_binary_path.exists() { self.set_browser_path(path_to_string(&browser_binary_path)); diff --git a/rust/src/lock.rs b/rust/src/lock.rs new file mode 100644 index 0000000000000..cd074b94ceab0 --- /dev/null +++ b/rust/src/lock.rs @@ -0,0 +1,65 @@ +// 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. + +use crate::logger::Logger; +use anyhow::Error; +use std::fs::File; +use std::path::{Path, PathBuf}; + +use crate::files::{create_parent_path_if_not_exists, create_path_if_not_exists}; +use fs2::FileExt; +use std::fs; + +const LOCK_FILE: &str = "sm.lock"; + +pub struct Lock { + file: File, + path: PathBuf, +} + +impl Lock { + // Acquire file lock to prevent race conditions accessing the cache folder by concurrent SM processes + pub fn acquire( + log: &Logger, + target: &Path, + single_file: Option, + ) -> Result { + let lock_folder = if single_file.is_some() { + create_parent_path_if_not_exists(target)?; + target.parent().unwrap() + } else { + create_path_if_not_exists(target)?; + target + }; + let path = lock_folder.join(LOCK_FILE); + let file = File::create(&path)?; + + log.debug(format!("Acquiring lock: {}", path.display())); + file.lock_exclusive().unwrap_or_default(); + + Ok(Self { file, path }) + } + + pub fn release(&mut self) { + fs::remove_file(&self.path).unwrap_or_default(); + self.file.unlock().unwrap_or_default(); + } + + pub fn exists(&mut self) -> bool { + self.path.exists() + } +} diff --git a/scripts/pinned_browsers.py b/scripts/pinned_browsers.py index b41b169577f46..7dd7a4bf09e60 100755 --- a/scripts/pinned_browsers.py +++ b/scripts/pinned_browsers.py @@ -175,10 +175,24 @@ def chrome(selected_version): return content +def convert_keys_to_lowercase(obj): + if isinstance(obj, dict): + return {k.lower(): convert_keys_to_lowercase(v) for k, v in obj.items()} + elif isinstance(obj, list): + return [convert_keys_to_lowercase(i) for i in obj] + else: + return obj + + +def case_insensitive_json_loads(json_str): + data = json.loads(json_str) + return convert_keys_to_lowercase(data) + + def edge(): content = "" r = http.request("GET", "https://edgeupdates.microsoft.com/api/products") - all_data = json.loads(r.data) + all_data = case_insensitive_json_loads(r.data) linux = None linux_hash = None @@ -187,20 +201,20 @@ def edge(): version = None for data in all_data: - if not "Stable" == data.get("Product"): + if not "Stable" == data.get("product"): continue - for release in data["Releases"]: - if "MacOS" == release.get("Platform"): - for artifact in release["Artifacts"]: - if "pkg" == artifact["ArtifactName"]: - mac = artifact["Location"] - mac_hash = artifact["Hash"] - mac_version = release["ProductVersion"] - elif "Linux" == release.get("Platform"): - for artifact in release["Artifacts"]: - if "deb" == artifact["ArtifactName"]: - linux = artifact["Location"] - linux_hash = artifact["Hash"] + for release in data["releases"]: + if "MacOS" == release.get("platform"): + for artifact in release["artifacts"]: + if "pkg" == artifact["artifactname"]: + mac = artifact["location"] + mac_hash = artifact["hash"] + mac_version = release["productversion"] + elif "Linux" == release.get("platform"): + for artifact in release["artifacts"]: + if "deb" == artifact["artifactname"]: + linux = artifact["location"] + linux_hash = artifact["hash"] if mac and mac_hash: content += """ diff --git a/third_party/js/wgxpath/BUILD.bazel b/third_party/js/wgxpath/BUILD.bazel index 87f861c6accb5..be227bcc8c0da 100644 --- a/third_party/js/wgxpath/BUILD.bazel +++ b/third_party/js/wgxpath/BUILD.bazel @@ -15,5 +15,11 @@ closure_js_library( "JSC_USE_OF_GOOG_PROVIDE", ], visibility = ["//visibility:public"], - deps = ["@io_bazel_rules_closure//closure/library"], + deps = [ + "@io_bazel_rules_closure//closure/library/array", + "@io_bazel_rules_closure//closure/library/dom", + "@io_bazel_rules_closure//closure/library/dom:nodetype", + "@io_bazel_rules_closure//closure/library/string", + "@io_bazel_rules_closure//closure/library/useragent", + ], )