Skip to content

Commit 2d9609b

Browse files
committed
Only ignore extension caps with object/array values
1 parent 05bce9b commit 2d9609b

File tree

4 files changed

+44
-71
lines changed

4 files changed

+44
-71
lines changed

java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java

Lines changed: 31 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
package org.openqa.selenium.grid.data;
1919

2020
import java.io.Serializable;
21-
import java.util.Arrays;
22-
import java.util.List;
2321
import java.util.Objects;
2422
import org.openqa.selenium.Capabilities;
2523

@@ -44,13 +42,6 @@
4442
*/
4543
public class DefaultSlotMatcher implements SlotMatcher, Serializable {
4644

47-
/*
48-
List of prefixed extension capabilities we never should try to match, they should be
49-
matched in the Node or in the browser driver.
50-
*/
51-
private static final List<String> EXTENSION_CAPABILITIES_PREFIXES =
52-
Arrays.asList("goog:", "moz:", "ms:", "se:");
53-
5445
@Override
5546
public boolean matches(Capabilities stereotype, Capabilities capabilities) {
5647

@@ -93,25 +84,21 @@ public boolean matches(Capabilities stereotype, Capabilities capabilities) {
9384

9485
private Boolean initialMatch(Capabilities stereotype, Capabilities capabilities) {
9586
return stereotype.getCapabilityNames().stream()
96-
// Matching of extension capabilities is implementation independent. Skip them
97-
.filter(name -> !name.contains(":"))
98-
// Platform matching is special, we do it later
99-
.filter(name -> !"platformName".equalsIgnoreCase(name))
100-
.map(
101-
name -> {
102-
if (capabilities.getCapability(name) instanceof String) {
103-
return stereotype
104-
.getCapability(name)
105-
.toString()
106-
.equalsIgnoreCase(capabilities.getCapability(name).toString());
107-
} else {
108-
return capabilities.getCapability(name) == null
109-
|| Objects.equals(
110-
stereotype.getCapability(name), capabilities.getCapability(name));
111-
}
112-
})
113-
.reduce(Boolean::logicalAnd)
114-
.orElse(true);
87+
// Matching of extension capabilities is implementation independent. Skip them
88+
.filter(name -> !name.contains(":"))
89+
// Platform matching is special, we do it later
90+
.filter(name -> !"platformName".equalsIgnoreCase(name))
91+
.filter(name -> capabilities.getCapability(name) != null)
92+
.map(name -> {
93+
if (stereotype.getCapability(name) instanceof String &&
94+
capabilities.getCapability(name) instanceof String) {
95+
return ((String) stereotype.getCapability(name))
96+
.equalsIgnoreCase((String) capabilities.getCapability(name));
97+
}
98+
return Objects.equals(stereotype.getCapability(name), capabilities.getCapability(name));
99+
})
100+
.reduce(Boolean::logicalAnd)
101+
.orElse(true);
115102
}
116103

117104
private Boolean managedDownloadsEnabled(Capabilities stereotype, Capabilities capabilities) {
@@ -145,29 +132,22 @@ private Boolean platformVersionMatch(Capabilities stereotype, Capabilities capab
145132
}
146133

147134
private Boolean extensionCapabilitiesMatch(Capabilities stereotype, Capabilities capabilities) {
148-
/*
149-
We match extension capabilities when they are not prefixed with any of the
150-
EXTENSION_CAPABILITIES_PREFIXES items. Also, we match them only when the capabilities
151-
of the new session request contains that specific extension capability.
152-
*/
153135
return stereotype.getCapabilityNames().stream()
154-
.filter(name -> name.contains(":"))
155-
.filter(name -> capabilities.asMap().containsKey(name))
156-
.filter(name -> EXTENSION_CAPABILITIES_PREFIXES.stream().noneMatch(name::contains))
157-
.map(
158-
name -> {
159-
if (capabilities.getCapability(name) instanceof String) {
160-
return stereotype
161-
.getCapability(name)
162-
.toString()
163-
.equalsIgnoreCase(capabilities.getCapability(name).toString());
164-
} else {
165-
return capabilities.getCapability(name) == null
166-
|| Objects.equals(
167-
stereotype.getCapability(name), capabilities.getCapability(name));
168-
}
169-
})
170-
.reduce(Boolean::logicalAnd)
171-
.orElse(true);
136+
.filter(name -> name.contains(":"))
137+
.filter(name -> capabilities.getCapability(name) != null)
138+
.map(name -> {
139+
if (stereotype.getCapability(name) instanceof String &&
140+
capabilities.getCapability(name) instanceof String) {
141+
return ((String) stereotype.getCapability(name))
142+
.equalsIgnoreCase((String) capabilities.getCapability(name));
143+
}
144+
if (capabilities.getCapability(name) instanceof Number ||
145+
capabilities.getCapability(name) instanceof Boolean) {
146+
return Objects.equals(stereotype.getCapability(name), capabilities.getCapability(name));
147+
}
148+
return true;
149+
})
150+
.reduce(Boolean::logicalAnd)
151+
.orElse(true);
172152
}
173153
}

java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import java.util.logging.Logger;
4141
import org.openqa.selenium.Capabilities;
4242
import org.openqa.selenium.ImmutableCapabilities;
43-
import org.openqa.selenium.MutableCapabilities;
4443
import org.openqa.selenium.SessionNotCreatedException;
4544
import org.openqa.selenium.WebDriverException;
4645
import org.openqa.selenium.grid.data.CreateSessionRequest;
@@ -50,7 +49,6 @@
5049
import org.openqa.selenium.internal.Debug;
5150
import org.openqa.selenium.internal.Either;
5251
import org.openqa.selenium.internal.Require;
53-
import org.openqa.selenium.remote.CapabilityType;
5452
import org.openqa.selenium.remote.Command;
5553
import org.openqa.selenium.remote.Dialect;
5654
import org.openqa.selenium.remote.DriverCommand;
@@ -149,15 +147,6 @@ public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sess
149147
"New session request capabilities do not " + "match the stereotype."));
150148
}
151149

152-
// remove browserName capability if 'appium:app' is present as it breaks appium tests when app
153-
// is provided
154-
// they are mutually exclusive
155-
MutableCapabilities filteredStereotype = new MutableCapabilities(stereotype);
156-
if (capabilities.getCapability("appium:app") != null) {
157-
filteredStereotype.setCapability(CapabilityType.BROWSER_NAME, (String) null);
158-
}
159-
160-
capabilities = capabilities.merge(filteredStereotype);
161150
LOG.info("Starting session for " + capabilities);
162151

163152
try (Span span = tracer.getCurrentContext().createSpan("relay_session_factory.apply")) {

java/test/org/openqa/selenium/grid/data/DefaultSlotMatcherTest.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import org.openqa.selenium.Platform;
2626
import org.openqa.selenium.remote.CapabilityType;
2727

28+
import java.util.List;
29+
import java.util.Map;
30+
2831
class DefaultSlotMatcherTest {
2932

3033
private final DefaultSlotMatcher slotMatcher = new DefaultSlotMatcher();
@@ -433,10 +436,10 @@ void vendorExtensionPrefixedCapabilitiesAreIgnoredForMatching() {
433436
"84",
434437
CapabilityType.PLATFORM_NAME,
435438
Platform.WINDOWS,
436-
"goog:cheese",
437-
"amsterdam",
438-
"ms:fruit",
439-
"mango");
439+
"food:dairy",
440+
Map.of("cheese", "amsterdam"),
441+
"food:fruit",
442+
List.of("mango"));
440443

441444
Capabilities capabilities =
442445
new ImmutableCapabilities(
@@ -446,10 +449,10 @@ void vendorExtensionPrefixedCapabilitiesAreIgnoredForMatching() {
446449
"84",
447450
CapabilityType.PLATFORM_NAME,
448451
Platform.WINDOWS,
449-
"goog:cheese",
450-
"gouda",
451-
"ms:fruit",
452-
"orange");
452+
"food:dairy",
453+
Map.of("cheese", "gouda"),
454+
"food:fruit",
455+
List.of("orange"));
453456
assertThat(slotMatcher.matches(stereotype, capabilities)).isTrue();
454457
}
455458

java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.openqa.selenium.internal.Either;
6464
import org.openqa.selenium.json.Json;
6565
import org.openqa.selenium.net.NetworkUtils;
66+
import org.openqa.selenium.remote.Browser;
6667
import org.openqa.selenium.safari.SafariDriverInfo;
6768

6869
@SuppressWarnings("DuplicatedCode")
@@ -148,7 +149,7 @@ boolean isDownloadEnabled(WebDriverInfo driver, String customMsg) {
148149
reported.add(caps);
149150
return Collections.singleton(HelperFactory.create(config, caps));
150151
});
151-
String expected = driver.getDisplayName();
152+
String expected = "Edge".equals(driver.getDisplayName()) ? Browser.EDGE.browserName() : driver.getDisplayName();
152153

153154
Capabilities found =
154155
reported.stream()

0 commit comments

Comments
 (0)