diff --git a/java/src/org/openqa/selenium/Capabilities.java b/java/src/org/openqa/selenium/Capabilities.java index 683e5e4e41b7d..053cdd971fc75 100644 --- a/java/src/org/openqa/selenium/Capabilities.java +++ b/java/src/org/openqa/selenium/Capabilities.java @@ -24,15 +24,18 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Stream; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; /** Describes a series of key/value pairs that encapsulate aspects of a browser. */ +@NullMarked public interface Capabilities extends Serializable { default String getBrowserName() { return String.valueOf(Optional.ofNullable(getCapability("browserName")).orElse("")); } - default Platform getPlatformName() { + default @Nullable Platform getPlatformName() { return Stream.of("platformName") .map(this::getCapability) .filter(Objects::nonNull) @@ -67,7 +70,7 @@ default String getBrowserVersion() { * @return The value, or null if not set. * @see org.openqa.selenium.remote.CapabilityType */ - Object getCapability(String capabilityName); + @Nullable Object getCapability(String capabilityName); /** * @param capabilityName The capability to check. diff --git a/java/src/org/openqa/selenium/HasCapabilities.java b/java/src/org/openqa/selenium/HasCapabilities.java index bd8f9ef44a52b..af0cf7213f236 100644 --- a/java/src/org/openqa/selenium/HasCapabilities.java +++ b/java/src/org/openqa/selenium/HasCapabilities.java @@ -17,10 +17,13 @@ package org.openqa.selenium; +import org.jspecify.annotations.NullMarked; + /** * Used by classes to indicate that they can describe the {@link org.openqa.selenium.Capabilities} * they possess. This can be used for run-time detection of features. */ +@NullMarked public interface HasCapabilities { /** * @return The capabilities of the current driver. diff --git a/java/src/org/openqa/selenium/ImmutableCapabilities.java b/java/src/org/openqa/selenium/ImmutableCapabilities.java index ee800049fc345..a617134fca3cb 100644 --- a/java/src/org/openqa/selenium/ImmutableCapabilities.java +++ b/java/src/org/openqa/selenium/ImmutableCapabilities.java @@ -22,8 +22,11 @@ import java.util.Collections; import java.util.Map; import java.util.TreeMap; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.openqa.selenium.internal.Require; +@NullMarked public class ImmutableCapabilities implements Capabilities { private final Map delegate; @@ -145,10 +148,9 @@ public ImmutableCapabilities(Map capabilities) { capabilities.forEach( (key, value) -> { Require.argument("Capability key", key).instanceOf(String.class); - Object v = capabilities.get(key); Require.nonNull("Capability value", value); - setCapability(delegate, (String) key, v); + setCapability(delegate, (String) key, value); }); this.delegate = Collections.unmodifiableMap(delegate); @@ -156,7 +158,7 @@ public ImmutableCapabilities(Map capabilities) { } @Override - public Object getCapability(String capabilityName) { + public @Nullable Object getCapability(String capabilityName) { Require.nonNull("Capability name", capabilityName); return delegate.get(capabilityName); } @@ -172,7 +174,7 @@ public int hashCode() { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (!(o instanceof Capabilities)) { return false; } diff --git a/java/src/org/openqa/selenium/MutableCapabilities.java b/java/src/org/openqa/selenium/MutableCapabilities.java index 16c56b5536d60..143c32680149b 100644 --- a/java/src/org/openqa/selenium/MutableCapabilities.java +++ b/java/src/org/openqa/selenium/MutableCapabilities.java @@ -22,8 +22,11 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.openqa.selenium.internal.Require; +@NullMarked public class MutableCapabilities implements Capabilities { private static final Set OPTION_KEYS; @@ -81,7 +84,7 @@ public void setCapability(String capabilityName, Platform value) { setCapability(capabilityName, (Object) value); } - public void setCapability(String key, Object value) { + public void setCapability(String key, @Nullable Object value) { Require.nonNull("Capability name", key); // We have to special-case some keys and values because of the popular idiom of calling @@ -107,7 +110,7 @@ public Map asMap() { } @Override - public Object getCapability(String capabilityName) { + public @Nullable Object getCapability(String capabilityName) { return caps.get(capabilityName); } @@ -126,7 +129,7 @@ public int hashCode() { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (!(o instanceof Capabilities)) { return false; } diff --git a/java/src/org/openqa/selenium/PersistentCapabilities.java b/java/src/org/openqa/selenium/PersistentCapabilities.java index 8da7482bf6e4b..f5d52cec5f079 100644 --- a/java/src/org/openqa/selenium/PersistentCapabilities.java +++ b/java/src/org/openqa/selenium/PersistentCapabilities.java @@ -22,8 +22,11 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.openqa.selenium.internal.Require; +@NullMarked public class PersistentCapabilities implements Capabilities { private final ImmutableCapabilities caps; @@ -60,7 +63,7 @@ public Map asMap() { } @Override - public Object getCapability(String capabilityName) { + public @Nullable Object getCapability(String capabilityName) { Require.nonNull("Capability name", capabilityName); Object capability = overrides.getCapability(capabilityName); if (capability != null) { @@ -93,7 +96,7 @@ public int hashCode() { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (!(o instanceof Capabilities)) { return false; }