Skip to content

Commit 3e93134

Browse files
committed
[java][BiDi] implement emulation
1 parent fa3817c commit 3e93134

File tree

9 files changed

+528
-0
lines changed

9 files changed

+528
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
load("//java:defs.bzl", "java_library")
2+
3+
java_library(
4+
name = "emulation",
5+
srcs = glob(
6+
[
7+
"*.java",
8+
],
9+
),
10+
visibility = [
11+
"//java/src/org/openqa/selenium/bidi:__subpackages__",
12+
"//java/src/org/openqa/selenium/remote:__pkg__",
13+
"//java/test/org/openqa/selenium/bidi:__subpackages__",
14+
"//java/test/org/openqa/selenium/grid:__subpackages__",
15+
],
16+
deps = [
17+
"//java/src/org/openqa/selenium:core",
18+
"//java/src/org/openqa/selenium/bidi",
19+
"//java/src/org/openqa/selenium/bidi/browsingcontext",
20+
"//java/src/org/openqa/selenium/json",
21+
"//java/src/org/openqa/selenium/remote/http",
22+
],
23+
)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.openqa.selenium.bidi.emulation;
2+
3+
import java.util.Map;
4+
import org.openqa.selenium.WebDriver;
5+
import org.openqa.selenium.bidi.BiDi;
6+
import org.openqa.selenium.bidi.Command;
7+
import org.openqa.selenium.bidi.HasBiDi;
8+
import org.openqa.selenium.internal.Require;
9+
10+
public class Emulation {
11+
private final BiDi bidi;
12+
13+
public Emulation(WebDriver driver) {
14+
Require.nonNull("WebDriver", driver);
15+
16+
if (!(driver instanceof HasBiDi)) {
17+
throw new IllegalArgumentException("WebDriver must implement BiDi interface");
18+
}
19+
20+
this.bidi = ((HasBiDi) driver).getBiDi();
21+
}
22+
23+
public Map<String, Object> setGeolocationOverride(SetGeolocationOverrideParameters parameters) {
24+
Require.nonNull("SetGeolocationOverride parameters", parameters);
25+
26+
return bidi.send(
27+
new Command<>("emulation.setGeolocationOverride", parameters.toMap(), Map.class));
28+
}
29+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package org.openqa.selenium.bidi.emulation;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class GeolocationCoordinates {
7+
private final double latitude;
8+
private final double longitude;
9+
private final double accuracy;
10+
private final Double altitude;
11+
private final Double altitudeAccuracy;
12+
private final Double heading;
13+
private final Double speed;
14+
15+
// Constructor with default accuracy = 1.0
16+
public GeolocationCoordinates(
17+
double latitude,
18+
double longitude,
19+
Double altitude,
20+
Double altitudeAccuracy,
21+
Double heading,
22+
Double speed) {
23+
this(latitude, longitude, 1.0, altitude, altitudeAccuracy, heading, speed);
24+
}
25+
26+
public GeolocationCoordinates(
27+
double latitude,
28+
double longitude,
29+
double accuracy,
30+
Double altitude,
31+
Double altitudeAccuracy,
32+
Double heading,
33+
Double speed) {
34+
35+
if (latitude < -90.0 || latitude > 90.0) {
36+
throw new IllegalArgumentException("Latitude must be between -90.0 and 90.0");
37+
}
38+
if (longitude < -180.0 || longitude > 180.0) {
39+
throw new IllegalArgumentException("Longitude must be between -180.0 and 180.0");
40+
}
41+
if (accuracy < 0.0) {
42+
throw new IllegalArgumentException("Accuracy must be >= 0.0");
43+
}
44+
if (altitudeAccuracy != null && altitude == null) {
45+
throw new IllegalArgumentException("altitudeAccuracy cannot be set without altitude");
46+
}
47+
if (altitudeAccuracy != null && altitudeAccuracy < 0.0) {
48+
throw new IllegalArgumentException("Altitude accuracy must be >= 0.0");
49+
}
50+
if (heading != null && (heading < 0.0 || heading >= 360.0)) {
51+
throw new IllegalArgumentException("Heading must be between 0.0 and 360.0");
52+
}
53+
if (speed != null && speed < 0.0) {
54+
throw new IllegalArgumentException("Speed must be >= 0.0");
55+
}
56+
57+
this.latitude = latitude;
58+
this.longitude = longitude;
59+
this.accuracy = accuracy;
60+
this.altitude = altitude;
61+
this.altitudeAccuracy = altitudeAccuracy;
62+
this.heading = heading;
63+
this.speed = speed;
64+
}
65+
66+
public double getLatitude() {
67+
return latitude;
68+
}
69+
70+
public double getLongitude() {
71+
return longitude;
72+
}
73+
74+
public double getAccuracy() {
75+
return accuracy;
76+
}
77+
78+
public Double getAltitude() {
79+
return altitude;
80+
}
81+
82+
public Double getAltitudeAccuracy() {
83+
return altitudeAccuracy;
84+
}
85+
86+
public Double getHeading() {
87+
return heading;
88+
}
89+
90+
public Double getSpeed() {
91+
return speed;
92+
}
93+
94+
public Map<String, Object> toMap() {
95+
Map<String, Object> map = new HashMap<>();
96+
map.put("latitude", getLatitude());
97+
map.put("longitude", getLongitude());
98+
map.put("accuracy", getAccuracy());
99+
if (getAltitude() != null) {
100+
map.put("altitude", getAltitude());
101+
}
102+
if (getAltitudeAccuracy() != null) {
103+
map.put("altitudeAccuracy", getAltitudeAccuracy());
104+
}
105+
if (getHeading() != null) {
106+
map.put("heading", getHeading());
107+
}
108+
if (getSpeed() != null) {
109+
map.put("speed", getSpeed());
110+
}
111+
return Map.copyOf(map);
112+
}
113+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.openqa.selenium.bidi.emulation;
2+
3+
import java.util.Map;
4+
5+
public class GeolocationPositionError {
6+
String type = "positionUnavailable";
7+
8+
public Map<String, Object> toMap() {
9+
return Map.of("type", type);
10+
}
11+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.openqa.selenium.bidi.emulation;
2+
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
public class SetGeolocationOverrideParameters {
8+
private final GeolocationCoordinates coordinates;
9+
private final GeolocationPositionError error;
10+
private final List<String> contexts;
11+
private final List<String> userContexts;
12+
13+
SetGeolocationOverrideParameters(
14+
GeolocationCoordinates coordinates,
15+
GeolocationPositionError error,
16+
List<String> contexts,
17+
List<String> userContexts) {
18+
19+
this.coordinates = coordinates;
20+
this.error = error;
21+
this.contexts = contexts;
22+
this.userContexts = userContexts;
23+
24+
if (this.coordinates != null && this.error != null) {
25+
throw new IllegalArgumentException("Cannot specify both coordinates and error");
26+
}
27+
if (this.contexts != null && this.userContexts != null) {
28+
throw new IllegalArgumentException("Cannot specify both contexts and userContexts");
29+
}
30+
31+
if (this.contexts == null && this.userContexts == null) {
32+
throw new IllegalArgumentException("Must specify either contexts or userContexts");
33+
}
34+
}
35+
36+
public Map<String, Object> toMap() {
37+
Map<String, Object> param = new HashMap<>();
38+
39+
if (this.coordinates != null) {
40+
param.put("coordinates", this.coordinates.toMap());
41+
}
42+
43+
if (this.error != null) {
44+
param.put("error", this.error.toMap());
45+
}
46+
47+
if (this.contexts != null) {
48+
param.put("contexts", this.contexts);
49+
} else {
50+
param.put("userContexts", this.userContexts);
51+
}
52+
53+
return Map.copyOf(param);
54+
}
55+
}

java/src/org/openqa/selenium/bidi/module/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ java_library(
2020
"//java/src/org/openqa/selenium/bidi",
2121
"//java/src/org/openqa/selenium/bidi/browser",
2222
"//java/src/org/openqa/selenium/bidi/browsingcontext",
23+
"//java/src/org/openqa/selenium/bidi/emulation",
2324
"//java/src/org/openqa/selenium/bidi/log",
2425
"//java/src/org/openqa/selenium/bidi/network",
2526
"//java/src/org/openqa/selenium/bidi/permissions",

java/src/org/openqa/selenium/remote/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ java_export(
2828
"//java/src/org/openqa/selenium/bidi",
2929
"//java/src/org/openqa/selenium/bidi:augmenter",
3030
"//java/src/org/openqa/selenium/bidi/browsingcontext",
31+
"//java/src/org/openqa/selenium/bidi/emulation",
3132
"//java/src/org/openqa/selenium/bidi/log",
3233
"//java/src/org/openqa/selenium/bidi/module",
3334
"//java/src/org/openqa/selenium/bidi/network",
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
load("@rules_jvm_external//:defs.bzl", "artifact")
2+
load("//java:defs.bzl", "JUNIT5_DEPS", "java_selenium_test_suite")
3+
4+
java_selenium_test_suite(
5+
name = "large-tests",
6+
size = "large",
7+
srcs = glob(["*Test.java"]),
8+
browsers = [
9+
"firefox",
10+
"chrome",
11+
],
12+
tags = [
13+
"selenium-remote",
14+
],
15+
deps = [
16+
"//java/src/org/openqa/selenium/bidi",
17+
"//java/src/org/openqa/selenium/bidi/browsingcontext",
18+
"//java/src/org/openqa/selenium/bidi/emulation",
19+
"//java/src/org/openqa/selenium/bidi/log",
20+
"//java/src/org/openqa/selenium/bidi/module",
21+
"//java/src/org/openqa/selenium/bidi/network",
22+
"//java/src/org/openqa/selenium/bidi/script",
23+
"//java/src/org/openqa/selenium/firefox",
24+
"//java/src/org/openqa/selenium/grid/security",
25+
"//java/src/org/openqa/selenium/json",
26+
"//java/src/org/openqa/selenium/remote",
27+
"//java/src/org/openqa/selenium/support",
28+
"//java/test/org/openqa/selenium/environment",
29+
"//java/test/org/openqa/selenium/testing:annotations",
30+
"//java/test/org/openqa/selenium/testing:test-base",
31+
"//java/test/org/openqa/selenium/testing/drivers",
32+
artifact("com.google.guava:guava"),
33+
artifact("org.junit.jupiter:junit-jupiter-api"),
34+
artifact("org.assertj:assertj-core"),
35+
] + JUNIT5_DEPS,
36+
)

0 commit comments

Comments
 (0)