Skip to content

Commit c384c88

Browse files
committed
[grid] Flag to disable CDP if needed.
Fixes #10661
1 parent 269ec3e commit c384c88

5 files changed

Lines changed: 42 additions & 1 deletion

File tree

java/src/org/openqa/selenium/devtools/DevToolsProvider.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.openqa.selenium.devtools;
1919

2020
import com.google.auto.service.AutoService;
21+
2122
import org.openqa.selenium.Capabilities;
2223
import org.openqa.selenium.devtools.noop.NoOpCdpInfo;
2324
import org.openqa.selenium.remote.AugmenterProvider;
@@ -52,6 +53,11 @@ public HasDevTools getImplementation(Capabilities caps, ExecuteMethod executeMet
5253
}
5354

5455
private String getCdpUrl(Capabilities caps) {
56+
Object cdpEnabled = caps.getCapability("se:cdpEnabled");
57+
if (cdpEnabled != null && !Boolean.parseBoolean(cdpEnabled.toString())) {
58+
return null;
59+
}
60+
5561
Object cdp = caps.getCapability("se:cdp");
5662
if (cdp instanceof String) {
5763
return (String) cdp;

java/src/org/openqa/selenium/grid/node/config/NodeFlags.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import static org.openqa.selenium.grid.config.StandardGridRoles.NODE_ROLE;
3535
import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_DETECT_DRIVERS;
3636
import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_DRAIN_AFTER_SESSION_COUNT;
37+
import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_ENABLE_CDP;
3738
import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_HEARTBEAT_PERIOD;
3839
import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_MAX_SESSIONS;
3940
import static org.openqa.selenium.grid.node.config.NodeOptions.DEFAULT_NODE_IMPLEMENTATION;
@@ -195,6 +196,14 @@ public class NodeFlags implements HasRoles {
195196
@ConfigValue(section = NODE_SECTION, name = "drain-after-session-count", example = "1")
196197
public int drainAfterSessionCount = DEFAULT_DRAIN_AFTER_SESSION_COUNT;
197198

199+
@Parameter(
200+
names = {"--enable-cdp"},
201+
arity = 1,
202+
description = "Enable CDP proxying in Grid. A Grid admin can disable CDP if the network does "
203+
+ "not allow websockets. True by default")
204+
@ConfigValue(section = NODE_SECTION, name = "enable-cdp", example = "true")
205+
public Boolean enableCdp = DEFAULT_ENABLE_CDP;
206+
198207
@Parameter(
199208
names = {"--node-implementation"},
200209
description = "Full classname of non-default Node implementation. This is used to manage "

java/src/org/openqa/selenium/grid/node/config/NodeOptions.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public class NodeOptions {
7070
public static final int DEFAULT_HEARTBEAT_PERIOD = 60;
7171
public static final int DEFAULT_SESSION_TIMEOUT = 300;
7272
public static final int DEFAULT_DRAIN_AFTER_SESSION_COUNT = 0;
73+
public static final boolean DEFAULT_ENABLE_CDP = true;
7374
static final String NODE_SECTION = "node";
7475
static final boolean DEFAULT_DETECT_DRIVERS = true;
7576
static final boolean OVERRIDE_MAX_SESSIONS = false;
@@ -233,6 +234,10 @@ public Duration getSessionTimeout() {
233234
return Duration.ofSeconds(seconds);
234235
}
235236

237+
public boolean isCdpEnabled() {
238+
return config.getBool(NODE_SECTION, "enable-cdp").orElse(DEFAULT_ENABLE_CDP);
239+
}
240+
236241
public int getDrainAfterSessionCount() {
237242
return Math.max(
238243
config.getInt(NODE_SECTION, "drain-after-session-count")

java/src/org/openqa/selenium/grid/node/local/LocalNode.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import org.openqa.selenium.Capabilities;
2929
import org.openqa.selenium.ImmutableCapabilities;
30+
import org.openqa.selenium.MutableCapabilities;
3031
import org.openqa.selenium.NoSuchSessionException;
3132
import org.openqa.selenium.PersistentCapabilities;
3233
import org.openqa.selenium.RetrySessionRequestException;
@@ -118,6 +119,7 @@ public class LocalNode extends Node {
118119
private final HealthCheck healthCheck;
119120
private final int maxSessionCount;
120121
private final int configuredSessionCount;
122+
private final boolean cdpEnabled;
121123
private final AtomicBoolean drainAfterSessions = new AtomicBoolean();
122124
private final List<SessionSlot> factories;
123125
private final Cache<SessionId, SessionSlot> currentSessions;
@@ -133,6 +135,7 @@ private LocalNode(
133135
HealthCheck healthCheck,
134136
int maxSessionCount,
135137
int drainAfterSessionCount,
138+
boolean cdpEnabled,
136139
Ticker ticker,
137140
Duration sessionTimeout,
138141
Duration heartbeatPeriod,
@@ -152,6 +155,7 @@ private LocalNode(
152155
this.configuredSessionCount = drainAfterSessionCount;
153156
this.drainAfterSessions.set(this.configuredSessionCount > 0);
154157
this.sessionCount.set(drainAfterSessionCount);
158+
this.cdpEnabled = cdpEnabled;
155159

156160
this.healthCheck = healthCheck == null ?
157161
() -> {
@@ -512,9 +516,18 @@ private Session createExternalSession(ActiveSession other, URI externalUri,
512516
.copyOf(requestCapabilities.merge(other.getCapabilities()));
513517

514518
// Add se:cdp if necessary to send the cdp url back
515-
if (isSupportingCdp || toUse.getCapability("se:cdp") != null) {
519+
if ((isSupportingCdp || toUse.getCapability("se:cdp") != null) && cdpEnabled) {
516520
String cdpPath = String.format("/session/%s/se/cdp", other.getId());
517521
toUse = new PersistentCapabilities(toUse).setCapability("se:cdp", rewrite(cdpPath));
522+
} else {
523+
// Remove any se:cdp* from the response, CDP is not supported nor enabled
524+
MutableCapabilities cdpFiltered = new MutableCapabilities();
525+
toUse.asMap().forEach((key, value) -> {
526+
if (!key.startsWith("se:cdp")) {
527+
cdpFiltered.setCapability(key, value);
528+
}
529+
});
530+
toUse = new PersistentCapabilities(cdpFiltered).setCapability("se:cdpEnabled", false);
518531
}
519532

520533
// If enabled, set the VNC endpoint for live view
@@ -644,6 +657,7 @@ public static class Builder {
644657
private final ImmutableList.Builder<SessionSlot> factories;
645658
private int maxSessions = NodeOptions.DEFAULT_MAX_SESSIONS;
646659
private int drainAfterSessionCount = NodeOptions.DEFAULT_DRAIN_AFTER_SESSION_COUNT;
660+
private boolean cdpEnabled = NodeOptions.DEFAULT_ENABLE_CDP;
647661
private Ticker ticker = Ticker.systemTicker();
648662
private Duration sessionTimeout = Duration.ofSeconds(NodeOptions.DEFAULT_SESSION_TIMEOUT);
649663
private HealthCheck healthCheck;
@@ -682,6 +696,11 @@ public Builder drainAfterSessionCount(int sessionCount) {
682696
return this;
683697
}
684698

699+
public Builder enableCdp(boolean cdpEnabled) {
700+
this.cdpEnabled = cdpEnabled;
701+
return this;
702+
}
703+
685704
public Builder sessionTimeout(Duration timeout) {
686705
sessionTimeout = timeout;
687706
return this;
@@ -701,6 +720,7 @@ public LocalNode build() {
701720
healthCheck,
702721
maxSessions,
703722
drainAfterSessionCount,
723+
cdpEnabled,
704724
ticker,
705725
sessionTimeout,
706726
heartbeatPeriod,

java/src/org/openqa/selenium/grid/node/local/LocalNodeFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public static Node create(Config config) {
6969
.maximumConcurrentSessions(nodeOptions.getMaxSessions())
7070
.sessionTimeout(sessionTimeout)
7171
.drainAfterSessionCount(nodeOptions.getDrainAfterSessionCount())
72+
.enableCdp(nodeOptions.isCdpEnabled())
7273
.heartbeatPeriod(nodeOptions.getHeartbeatPeriod());
7374

7475
List<DriverService.Builder<?, ?>> builders = new ArrayList<>();

0 commit comments

Comments
 (0)