diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java
index 42e30b093..4380428fd 100644
--- a/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java
+++ b/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java
@@ -12,18 +12,24 @@ class ClockImpl implements Clock {
this.browserContext = browserContext;
}
+ private void sendMessageWithLogging(String method, JsonObject params) {
+ String capitalizedMethod = method.substring(0, 1).toUpperCase() + method.substring(1);
+ browserContext.withLogging("Clock." + method,
+ () -> browserContext.sendMessage("clock" + capitalizedMethod, params));
+ }
+
@Override
public void fastForward(long ticks) {
JsonObject params = new JsonObject();
params.addProperty("ticksNumber", ticks);
- browserContext.sendMessage("clockFastForward", params);
+ sendMessageWithLogging("fastForward", params);
}
@Override
public void fastForward(String ticks) {
JsonObject params = new JsonObject();
params.addProperty("ticksString", ticks);
- browserContext.sendMessage("clockFastForward", params);
+ sendMessageWithLogging("fastForward", params);
}
@Override
@@ -32,89 +38,89 @@ public void install(InstallOptions options) {
if (options != null) {
parseTime(options.time, params);
}
- browserContext.sendMessage("clockInstall", params);
+ sendMessageWithLogging("install", params);
}
@Override
public void runFor(long ticks) {
JsonObject params = new JsonObject();
params.addProperty("ticksNumber", ticks);
- browserContext.sendMessage("clockRunFor", params);
+ sendMessageWithLogging("runFor", params);
}
@Override
public void runFor(String ticks) {
JsonObject params = new JsonObject();
params.addProperty("ticksString", ticks);
- browserContext.sendMessage("clockRunFor", params);
+ sendMessageWithLogging("runFor", params);
}
@Override
public void pauseAt(long time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time);
- browserContext.sendMessage("clockPauseAt", params);
+ sendMessageWithLogging("pauseAt", params);
}
@Override
public void pauseAt(String time) {
JsonObject params = new JsonObject();
params.addProperty("timeString", time);
- browserContext.sendMessage("clockPauseAt", params);
+ sendMessageWithLogging("pauseAt", params);
}
@Override
public void pauseAt(Date time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time.getTime());
- browserContext.sendMessage("clockPauseAt", params);
+ sendMessageWithLogging("pauseAt", params);
}
@Override
public void resume() {
- browserContext.sendMessage("clockResume");
+ sendMessageWithLogging("resume", new JsonObject());
}
@Override
public void setFixedTime(long time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time);
- browserContext.sendMessage("clockSetFixedTime", params);
+ sendMessageWithLogging("setFixedTime", params);
}
@Override
public void setFixedTime(String time) {
JsonObject params = new JsonObject();
params.addProperty("timeString", time);
- browserContext.sendMessage("clockSetFixedTime", params);
+ sendMessageWithLogging("setFixedTime", params);
}
@Override
public void setFixedTime(Date time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time.getTime());
- browserContext.sendMessage("clockSetFixedTime", params);
+ sendMessageWithLogging("setFixedTime", params);
}
@Override
public void setSystemTime(long time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time);
- browserContext.sendMessage("clockSetSystemTime", params);
+ sendMessageWithLogging("setSystemTime", params);
}
@Override
public void setSystemTime(String time) {
JsonObject params = new JsonObject();
params.addProperty("timeString", time);
- browserContext.sendMessage("clockSetSystemTime", params);
+ sendMessageWithLogging("setSystemTime", params);
}
@Override
public void setSystemTime(Date time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time.getTime());
- browserContext.sendMessage("clockSetSystemTime", params);
+ sendMessageWithLogging("setSystemTime", params);
}
private static void parseTime(Object time, JsonObject params) {
diff --git a/playwright/src/test/java/com/microsoft/playwright/TestTracing.java b/playwright/src/test/java/com/microsoft/playwright/TestTracing.java
index 2da398f97..d0fce7426 100644
--- a/playwright/src/test/java/com/microsoft/playwright/TestTracing.java
+++ b/playwright/src/test/java/com/microsoft/playwright/TestTracing.java
@@ -18,7 +18,10 @@
import com.google.gson.Gson;
import com.google.gson.JsonObject;
+import com.microsoft.playwright.options.AriaRole;
import com.microsoft.playwright.options.Location;
+import com.microsoft.playwright.options.MouseButton;
+
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -204,6 +207,68 @@ void traceGroupGroupEnd(@TempDir Path tempDir) throws Exception {
assertEquals(asList("outer group", "Page.navigate", "inner group 1", "Frame.click", "inner group 2", "Page.isVisible"), calls);
}
+ @Test
+ void shouldTraceVariousAPIs(@TempDir Path tempDir) throws Exception {
+ context.tracing().start(new Tracing.StartOptions());
+
+ page.clock().install();
+
+ page.setContent("");
+ page.locator("input").click(new Locator.ClickOptions().setButton(MouseButton.RIGHT));
+ page.getByRole(AriaRole.TEXTBOX).click();
+ page.keyboard().type("Hello world this is a very long string what happens when it overflows?");
+ page.keyboard().press("Control+c");
+ page.keyboard().down("Shift");
+ page.keyboard().insertText("Hello world");
+ page.keyboard().up("Shift");
+ page.mouse().move(0, 0);
+ page.mouse().down();
+ page.mouse().move(100, 200);
+ page.mouse().wheel(5, 7);
+ page.mouse().up();
+ page.clock().fastForward(1000);
+ page.clock().fastForward("30:00");
+ page.clock().pauseAt("2050-02-02");
+ page.clock().runFor(10);
+ page.clock().setFixedTime("2050-02-02");
+ page.clock().setSystemTime("2050-02-02");
+
+ page.clock().resume();
+
+ page.locator("input").click(new Locator.ClickOptions().setButton(MouseButton.RIGHT));
+
+ Path traceFile1 = tempDir.resolve("trace1.zip");
+ context.tracing().stop(new Tracing.StopOptions().setPath(traceFile1));
+
+ List events = parseTraceEvents(traceFile1);
+ List calls = events.stream().filter(e -> e.apiName != null).map(e -> e.apiName)
+ .collect(Collectors.toList());
+ assertEquals(asList(
+ "Clock.install",
+ "Page.setContent",
+ "Frame.click",
+ "Frame.click",
+ "Keyboard.type",
+ "Keyboard.press",
+ "Keyboard.down",
+ "Keyboard.insertText",
+ "Keyboard.up",
+ "Mouse.move",
+ "Mouse.down",
+ "Mouse.move",
+ "Mouse.wheel",
+ "Mouse.up",
+ "Clock.fastForward",
+ "Clock.fastForward",
+ "Clock.pauseAt",
+ "Clock.runFor",
+ "Clock.setFixedTime",
+ "Clock.setSystemTime",
+ "Clock.resume",
+ "Frame.click"),
+ calls);
+ }
+
private static class TraceEvent {
String type;
String name;