From fb9ae4f37722954606ef04929d6b215bf1781f76 Mon Sep 17 00:00:00 2001 From: Adam Gastineau Date: Wed, 15 Jan 2025 11:47:36 -0800 Subject: [PATCH 1/3] Properly mark clock API calls as non-internal, and thus traceable --- .../microsoft/playwright/impl/ClockImpl.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) 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..7619dc4d5 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,22 @@ class ClockImpl implements Clock { this.browserContext = browserContext; } + private void sendMessageWithLogging(String method, JsonObject params) { + browserContext.withLogging("BrowserContext." + method, () -> browserContext.sendMessage(method, params)); + } + @Override public void fastForward(long ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksNumber", ticks); - browserContext.sendMessage("clockFastForward", params); + sendMessageWithLogging("clockFastForward", params); } @Override public void fastForward(String ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksString", ticks); - browserContext.sendMessage("clockFastForward", params); + sendMessageWithLogging("clockFastForward", params); } @Override @@ -32,89 +36,89 @@ public void install(InstallOptions options) { if (options != null) { parseTime(options.time, params); } - browserContext.sendMessage("clockInstall", params); + sendMessageWithLogging("clockInstall", params); } @Override public void runFor(long ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksNumber", ticks); - browserContext.sendMessage("clockRunFor", params); + sendMessageWithLogging("clockRunFor", params); } @Override public void runFor(String ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksString", ticks); - browserContext.sendMessage("clockRunFor", params); + sendMessageWithLogging("clockRunFor", params); } @Override public void pauseAt(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - browserContext.sendMessage("clockPauseAt", params); + sendMessageWithLogging("clockPauseAt", params); } @Override public void pauseAt(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - browserContext.sendMessage("clockPauseAt", params); + sendMessageWithLogging("clockPauseAt", params); } @Override public void pauseAt(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - browserContext.sendMessage("clockPauseAt", params); + sendMessageWithLogging("clockPauseAt", params); } @Override public void resume() { - browserContext.sendMessage("clockResume"); + sendMessageWithLogging("clockResume", new JsonObject()); } @Override public void setFixedTime(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - browserContext.sendMessage("clockSetFixedTime", params); + sendMessageWithLogging("clockSetFixedTime", params); } @Override public void setFixedTime(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - browserContext.sendMessage("clockSetFixedTime", params); + sendMessageWithLogging("clockSetFixedTime", params); } @Override public void setFixedTime(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - browserContext.sendMessage("clockSetFixedTime", params); + sendMessageWithLogging("clockSetFixedTime", params); } @Override public void setSystemTime(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - browserContext.sendMessage("clockSetSystemTime", params); + sendMessageWithLogging("clockSetSystemTime", params); } @Override public void setSystemTime(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - browserContext.sendMessage("clockSetSystemTime", params); + sendMessageWithLogging("clockSetSystemTime", params); } @Override public void setSystemTime(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - browserContext.sendMessage("clockSetSystemTime", params); + sendMessageWithLogging("clockSetSystemTime", params); } private static void parseTime(Object time, JsonObject params) { From fdf73be6db1850181eddecd5b7314669a9c04861 Mon Sep 17 00:00:00 2001 From: Adam Gastineau Date: Wed, 15 Jan 2025 12:25:35 -0800 Subject: [PATCH 2/3] Rename Clock apiName to match the same style as in JS --- .../microsoft/playwright/impl/ClockImpl.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) 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 7619dc4d5..4380428fd 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java @@ -13,21 +13,23 @@ class ClockImpl implements Clock { } private void sendMessageWithLogging(String method, JsonObject params) { - browserContext.withLogging("BrowserContext." + method, () -> browserContext.sendMessage(method, 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); - sendMessageWithLogging("clockFastForward", params); + sendMessageWithLogging("fastForward", params); } @Override public void fastForward(String ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksString", ticks); - sendMessageWithLogging("clockFastForward", params); + sendMessageWithLogging("fastForward", params); } @Override @@ -36,89 +38,89 @@ public void install(InstallOptions options) { if (options != null) { parseTime(options.time, params); } - sendMessageWithLogging("clockInstall", params); + sendMessageWithLogging("install", params); } @Override public void runFor(long ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksNumber", ticks); - sendMessageWithLogging("clockRunFor", params); + sendMessageWithLogging("runFor", params); } @Override public void runFor(String ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksString", ticks); - sendMessageWithLogging("clockRunFor", params); + sendMessageWithLogging("runFor", params); } @Override public void pauseAt(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - sendMessageWithLogging("clockPauseAt", params); + sendMessageWithLogging("pauseAt", params); } @Override public void pauseAt(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - sendMessageWithLogging("clockPauseAt", params); + sendMessageWithLogging("pauseAt", params); } @Override public void pauseAt(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - sendMessageWithLogging("clockPauseAt", params); + sendMessageWithLogging("pauseAt", params); } @Override public void resume() { - sendMessageWithLogging("clockResume", new JsonObject()); + sendMessageWithLogging("resume", new JsonObject()); } @Override public void setFixedTime(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - sendMessageWithLogging("clockSetFixedTime", params); + sendMessageWithLogging("setFixedTime", params); } @Override public void setFixedTime(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - sendMessageWithLogging("clockSetFixedTime", params); + sendMessageWithLogging("setFixedTime", params); } @Override public void setFixedTime(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - sendMessageWithLogging("clockSetFixedTime", params); + sendMessageWithLogging("setFixedTime", params); } @Override public void setSystemTime(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - sendMessageWithLogging("clockSetSystemTime", params); + sendMessageWithLogging("setSystemTime", params); } @Override public void setSystemTime(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - sendMessageWithLogging("clockSetSystemTime", params); + sendMessageWithLogging("setSystemTime", params); } @Override public void setSystemTime(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - sendMessageWithLogging("clockSetSystemTime", params); + sendMessageWithLogging("setSystemTime", params); } private static void parseTime(Object time, JsonObject params) { From 3a89e00afa5709db0cea1bf183e8a5f28fe368d3 Mon Sep 17 00:00:00 2001 From: Adam Gastineau Date: Wed, 15 Jan 2025 12:26:00 -0800 Subject: [PATCH 3/3] Generic tracing test covering fixed Clock calls --- .../com/microsoft/playwright/TestTracing.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) 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;