From 6f3f3ebbb0048f5a0a93bad27237672e7a957d20 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Thu, 1 Oct 2020 13:17:47 -0700 Subject: [PATCH] feat(api): implement Keyboard, Mouse, DeviceDescriptors --- .../playwright/tools/ApiGenerator.java | 47 +++++++-- .../com/microsoft/playwright/tools/Types.java | 49 +++++----- .../com/microsoft/playwright/Browser.java | 4 +- .../com/microsoft/playwright/BrowserType.java | 2 +- .../microsoft/playwright/ChromiumBrowser.java | 4 +- .../playwright/DeviceDescriptor.java | 31 ++++++ .../microsoft/playwright/ElementHandle.java | 31 +++--- .../microsoft/playwright/FirefoxBrowser.java | 4 +- .../java/com/microsoft/playwright/Frame.java | 35 +++---- .../com/microsoft/playwright/Keyboard.java | 24 +---- .../java/com/microsoft/playwright/Logger.java | 2 +- .../java/com/microsoft/playwright/Mouse.java | 6 +- .../java/com/microsoft/playwright/Page.java | 51 +++++----- .../com/microsoft/playwright/Playwright.java | 3 + .../microsoft/playwright/WebKitBrowser.java | 4 +- .../playwright/impl/DeviceDescriptorImpl.java | 78 +++++++++++++++ .../microsoft/playwright/impl/FrameImpl.java | 14 ++- .../playwright/impl/KeyboardImpl.java | 69 +++++++++++++ .../microsoft/playwright/impl/MouseImpl.java | 96 +++++++++++++++++++ .../microsoft/playwright/impl/PageImpl.java | 41 +++++--- .../playwright/impl/PlaywrightImpl.java | 20 ++++ .../com/microsoft/playwright/impl/Utils.java | 27 ++++++ .../com/microsoft/playwright/TestClick.java | 17 ++++ 23 files changed, 510 insertions(+), 149 deletions(-) create mode 100644 lib/src/main/java/com/microsoft/playwright/DeviceDescriptor.java create mode 100644 lib/src/main/java/com/microsoft/playwright/impl/DeviceDescriptorImpl.java create mode 100644 lib/src/main/java/com/microsoft/playwright/impl/KeyboardImpl.java create mode 100644 lib/src/main/java/com/microsoft/playwright/impl/MouseImpl.java create mode 100644 lib/src/main/java/com/microsoft/playwright/impl/Utils.java diff --git a/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java b/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java index 8ffeaeda..783f44f7 100644 --- a/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java +++ b/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java @@ -346,7 +346,7 @@ class Method extends Element { if (argList.length() > 0) { argList.append(", "); } - argList.append("null"); + argList.append("int".equals(params.get(paramCount).type.toJava()) ? "0" : "null"); String returns = returnType.toJava().equals("void") ? "" : "return "; output.add(offset + "default " + returnType.toJava() + " " + name + "(" + paramList + ") {"); output.add(offset + " " + returns + name + "(" + argList + ");"); @@ -357,6 +357,12 @@ class Method extends Element { class Param extends Element { final TypeRef type; + private static Map customName = new HashMap<>(); + static { + customName.put("Keyboard.type.options", "delay"); + customName.put("Keyboard.press.options", "delay"); + } + Param(Method method, JsonObject jsonElement) { super(method, jsonElement); type = new TypeRef(this, jsonElement.get("type").getAsJsonObject()); @@ -366,8 +372,16 @@ class Param extends Element { return !jsonElement.getAsJsonObject().get("required").getAsBoolean(); } + private String name() { + String name = customName.get(jsonPath); + if (name != null) { + return name; + } + return jsonName; + } + String toJava() { - return type.toJava() + " " + jsonName; + return type.toJava() + " " + name(); } } @@ -427,6 +441,10 @@ class Interface extends TypeDefinition { if ("method".equals(kind)) { methods.add(new Method(this, json)); } + // All properties are converted to methods in Java. + if ("property".equals(kind)) { + methods.add(new Method(this, json)); + } if ("event".equals(kind)) { events.add(new Event(this, json)); } @@ -439,16 +457,33 @@ class Interface extends TypeDefinition { output.add("import java.util.function.BiConsumer;"); output.add(""); output.add("public interface " + jsonName + " {"); - super.writeTo(output, offset + " "); + offset = " "; + writeSharedTypes(output, offset); + super.writeTo(output, offset); for (Event e : events) { - e.writeTo(output, offset + " "); + e.writeTo(output, offset); } for (Method m : methods) { - m.writeTo(output, offset + " "); + m.writeTo(output, offset); } output.add("}"); output.add("\n"); } + + void writeSharedTypes(List output, String offset) { + switch (jsonName) { + case "Mouse": { + output.add(offset + "enum Button { LEFT, MIDDLE, RIGHT }"); + break; + } + case "Keyboard": { + output.add(offset + "enum Modifier { ALT, CONTROL, META, SHIFT }"); + break; + } + default: return; + } + output.add(""); + } } class NestedClass extends TypeDefinition { @@ -528,7 +563,7 @@ class Enum extends TypeDefinition { void writeTo(List output, String offset) { String access = parent.typeScope() instanceof NestedClass ? "public " : ""; - output.add(offset + access + "enum " + name + " { " + String.join(", ", enumValues) + "}"); + output.add(offset + access + "enum " + name + " { " + String.join(", ", enumValues) + " }"); } } diff --git a/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java b/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java index 3c504496..74a31943 100644 --- a/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java +++ b/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java @@ -55,43 +55,43 @@ class Types { // Option enums add("Browser.newContext.options.colorScheme", "\"dark\"|\"light\"|\"no-preference\"", "ColorScheme"); add("Browser.newPage.options.colorScheme", "\"dark\"|\"light\"|\"no-preference\"", "ColorScheme"); - add("Page.click.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("Page.click.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); - add("Page.dblclick.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("Page.dblclick.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); + add("Page.click.options.button", "\"left\"|\"middle\"|\"right\"", "Mouse.Button", new Empty()); + add("Page.click.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); + add("Page.dblclick.options.button", "\"left\"|\"middle\"|\"right\"", "Mouse.Button", new Empty()); + add("Page.dblclick.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); add("Page.emulateMedia.options.media", "null|\"print\"|\"screen\"", "Media"); add("Page.emulateMedia.options.colorScheme", "null|\"dark\"|\"light\"|\"no-preference\"", "ColorScheme"); add("Page.goBack.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); add("Page.goForward.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); add("Page.goto.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); - add("Page.hover.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); + add("Page.hover.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); add("Page.reload.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); add("Page.screenshot.options.type", "\"jpeg\"|\"png\"", "Type"); add("Page.setContent.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); add("Page.waitForFunction.options.polling", "number|\"raf\"", "double", new PollingOption()); add("Page.waitForNavigation.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); add("Page.waitForSelector.options.state", "\"attached\"|\"detached\"|\"hidden\"|\"visible\"", "State"); - add("Frame.click.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("Frame.click.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); - add("Frame.dblclick.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("Frame.dblclick.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); + add("Frame.click.options.button", "\"left\"|\"middle\"|\"right\"", "Mouse.Button", new Empty()); + add("Frame.click.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); + add("Frame.dblclick.options.button", "\"left\"|\"middle\"|\"right\"", "Mouse.Button", new Empty()); + add("Frame.dblclick.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); add("Frame.goto.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); - add("Frame.hover.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); + add("Frame.hover.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); add("Frame.setContent.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); add("Frame.waitForFunction.options.polling", "number|\"raf\"", "double", new PollingOption()); add("Frame.waitForNavigation.options.waitUntil", "\"domcontentloaded\"|\"load\"|\"networkidle\"", "WaitUntil"); add("Frame.waitForSelector.options.state", "\"attached\"|\"detached\"|\"hidden\"|\"visible\"", "State"); - add("ElementHandle.click.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("ElementHandle.click.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); - add("ElementHandle.dblclick.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("ElementHandle.dblclick.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); - add("ElementHandle.hover.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new ModifierEnum()); + add("ElementHandle.click.options.button", "\"left\"|\"middle\"|\"right\"", "Mouse.Button", new Empty()); + add("ElementHandle.click.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); + add("ElementHandle.dblclick.options.button", "\"left\"|\"middle\"|\"right\"", "Mouse.Button", new Empty()); + add("ElementHandle.dblclick.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); + add("ElementHandle.hover.options.modifiers", "Array<\"Alt\"|\"Control\"|\"Meta\"|\"Shift\">", "Set", new Empty()); add("ElementHandle.screenshot.options.type", "\"jpeg\"|\"png\"", "Type"); add("ElementHandle.waitForSelector.options.state", "\"attached\"|\"detached\"|\"hidden\"|\"visible\"", "State"); - add("Mouse.click.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("Mouse.dblclick.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("Mouse.down.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); - add("Mouse.up.options.button", "\"left\"|\"middle\"|\"right\"", "Button"); + add("Mouse.click.options.button", "\"left\"|\"middle\"|\"right\"", "Button", new Empty()); + add("Mouse.dblclick.options.button", "\"left\"|\"middle\"|\"right\"", "Button", new Empty()); + add("Mouse.down.options.button", "\"left\"|\"middle\"|\"right\"", "Button", new Empty()); + add("Mouse.up.options.button", "\"left\"|\"middle\"|\"right\"", "Button", new Empty()); add("BrowserType.launchPersistentContext.options.colorScheme", "\"dark\"|\"light\"|\"no-preference\"", "ColorScheme"); add("ChromiumBrowser.newContext.options.colorScheme", "\"dark\"|\"light\"|\"no-preference\"", "ColorScheme"); add("ChromiumBrowser.newPage.options.colorScheme", "\"dark\"|\"light\"|\"no-preference\"", "ColorScheme"); @@ -247,6 +247,10 @@ class Types { add("ChromiumBrowserContext.setHTTPCredentials.httpCredentials", "null|Object", "HTTPCredentials"); add("Page.setViewportSize.viewportSize", "Object", "ViewportSize"); + // Single field options + add("Keyboard.type.options", "Object", "int", new Empty()); + add("Keyboard.press.options", "Object", "int", new Empty()); + // node.js types add("BrowserServer.process", "ChildProcess", "Object"); @@ -291,13 +295,6 @@ class Types { jsonPathToMapping.put(jsonPath, new Mapping(fromType, toType, factory)); } - private static class ModifierEnum implements CustomMapping { - @Override - public void defineTypesIn(TypeDefinition scope) { - scope.addEnum(new Enum(scope, "Modifier", "\"Alt\"|\"Control\"|\"Meta\"|\"Shift\"")); - } - } - private static class PollingOption implements CustomMapping { @Override public void defineTypesIn(TypeDefinition scope) { diff --git a/lib/src/main/java/com/microsoft/playwright/Browser.java b/lib/src/main/java/com/microsoft/playwright/Browser.java index e19adcb7..7e41ca75 100644 --- a/lib/src/main/java/com/microsoft/playwright/Browser.java +++ b/lib/src/main/java/com/microsoft/playwright/Browser.java @@ -21,7 +21,7 @@ import java.util.function.BiConsumer; public interface Browser { class NewContextOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Viewport { public int width; public int height; @@ -216,7 +216,7 @@ public interface Browser { } } class NewPageOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Viewport { public int width; public int height; diff --git a/lib/src/main/java/com/microsoft/playwright/BrowserType.java b/lib/src/main/java/com/microsoft/playwright/BrowserType.java index d8cd7c70..88fa0261 100644 --- a/lib/src/main/java/com/microsoft/playwright/BrowserType.java +++ b/lib/src/main/java/com/microsoft/playwright/BrowserType.java @@ -161,7 +161,7 @@ public interface BrowserType { } } class LaunchPersistentContextOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Proxy { public String server; public String bypass; diff --git a/lib/src/main/java/com/microsoft/playwright/ChromiumBrowser.java b/lib/src/main/java/com/microsoft/playwright/ChromiumBrowser.java index 388517f7..d73ae186 100644 --- a/lib/src/main/java/com/microsoft/playwright/ChromiumBrowser.java +++ b/lib/src/main/java/com/microsoft/playwright/ChromiumBrowser.java @@ -39,7 +39,7 @@ public interface ChromiumBrowser { } } class NewContextOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Viewport { public int width; public int height; @@ -234,7 +234,7 @@ public interface ChromiumBrowser { } } class NewPageOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Viewport { public int width; public int height; diff --git a/lib/src/main/java/com/microsoft/playwright/DeviceDescriptor.java b/lib/src/main/java/com/microsoft/playwright/DeviceDescriptor.java new file mode 100644 index 00000000..0168ef77 --- /dev/null +++ b/lib/src/main/java/com/microsoft/playwright/DeviceDescriptor.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) Microsoft Corporation. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright; + +public interface DeviceDescriptor { + interface Viewport { + int width(); + int height(); + } + Viewport viewport(); + String userAgent(); + int deviceScaleFactor(); + boolean isMobile(); + boolean hasTouch(); + enum BrowserType { CHROMIUM, FIREFOX, WEBKIT} + BrowserType defaultBrowserType(); +} diff --git a/lib/src/main/java/com/microsoft/playwright/ElementHandle.java b/lib/src/main/java/com/microsoft/playwright/ElementHandle.java index 594ef59e..d943ab95 100644 --- a/lib/src/main/java/com/microsoft/playwright/ElementHandle.java +++ b/lib/src/main/java/com/microsoft/playwright/ElementHandle.java @@ -20,7 +20,7 @@ import java.util.*; import java.util.function.BiConsumer; public interface ElementHandle { - enum ElementState { DISABLED, ENABLED, HIDDEN, STABLE, VISIBLE} + enum ElementState { DISABLED, ENABLED, HIDDEN, STABLE, VISIBLE } class CheckOptions { public Boolean force; public Boolean noWaitAfter; @@ -40,8 +40,6 @@ public interface ElementHandle { } } class ClickOptions { - public enum Button { LEFT, MIDDLE, RIGHT} - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -61,16 +59,16 @@ public interface ElementHandle { return this; } } - public Button button; + public Mouse.Button button; public Integer clickCount; public Integer delay; public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Boolean noWaitAfter; public Integer timeout; - public ClickOptions withButton(Button button) { + public ClickOptions withButton(Mouse.Button button) { this.button = button; return this; } @@ -86,7 +84,7 @@ public interface ElementHandle { this.position = new Position(); return this.position; } - public ClickOptions withModifiers(Set modifiers) { + public ClickOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -104,8 +102,6 @@ public interface ElementHandle { } } class DblclickOptions { - public enum Button { LEFT, MIDDLE, RIGHT} - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -125,15 +121,15 @@ public interface ElementHandle { return this; } } - public Button button; + public Mouse.Button button; public Integer delay; public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Boolean noWaitAfter; public Integer timeout; - public DblclickOptions withButton(Button button) { + public DblclickOptions withButton(Mouse.Button button) { this.button = button; return this; } @@ -145,7 +141,7 @@ public interface ElementHandle { this.position = new Position(); return this.position; } - public DblclickOptions withModifiers(Set modifiers) { + public DblclickOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -176,7 +172,6 @@ public interface ElementHandle { } } class HoverOptions { - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -197,7 +192,7 @@ public interface ElementHandle { } } public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Integer timeout; @@ -205,7 +200,7 @@ public interface ElementHandle { this.position = new Position(); return this.position; } - public HoverOptions withModifiers(Set modifiers) { + public HoverOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -237,7 +232,7 @@ public interface ElementHandle { } } class ScreenshotOptions { - public enum Type { JPEG, PNG} + public enum Type { JPEG, PNG } public String path; public Type type; public Integer quality; @@ -352,7 +347,7 @@ public interface ElementHandle { } } class WaitForSelectorOptions { - public enum State { ATTACHED, DETACHED, HIDDEN, VISIBLE} + public enum State { ATTACHED, DETACHED, HIDDEN, VISIBLE } public State state; public Integer timeout; diff --git a/lib/src/main/java/com/microsoft/playwright/FirefoxBrowser.java b/lib/src/main/java/com/microsoft/playwright/FirefoxBrowser.java index aaf5b0cc..2892aa64 100644 --- a/lib/src/main/java/com/microsoft/playwright/FirefoxBrowser.java +++ b/lib/src/main/java/com/microsoft/playwright/FirefoxBrowser.java @@ -21,7 +21,7 @@ import java.util.function.BiConsumer; public interface FirefoxBrowser { class NewContextOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Viewport { public int width; public int height; @@ -216,7 +216,7 @@ public interface FirefoxBrowser { } } class NewPageOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Viewport { public int width; public int height; diff --git a/lib/src/main/java/com/microsoft/playwright/Frame.java b/lib/src/main/java/com/microsoft/playwright/Frame.java index 6beb5c36..5dac1c50 100644 --- a/lib/src/main/java/com/microsoft/playwright/Frame.java +++ b/lib/src/main/java/com/microsoft/playwright/Frame.java @@ -20,7 +20,7 @@ import java.util.*; import java.util.function.BiConsumer; public interface Frame { - enum LoadState { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + enum LoadState { DOMCONTENTLOADED, LOAD, NETWORKIDLE } class AddScriptTagOptions { public String url; public String path; @@ -81,8 +81,6 @@ public interface Frame { } } class ClickOptions { - public enum Button { LEFT, MIDDLE, RIGHT} - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -102,16 +100,16 @@ public interface Frame { return this; } } - public Button button; + public Mouse.Button button; public Integer clickCount; public Integer delay; public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Boolean noWaitAfter; public Integer timeout; - public ClickOptions withButton(Button button) { + public ClickOptions withButton(Mouse.Button button) { this.button = button; return this; } @@ -127,7 +125,7 @@ public interface Frame { this.position = new Position(); return this.position; } - public ClickOptions withModifiers(Set modifiers) { + public ClickOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -145,8 +143,6 @@ public interface Frame { } } class DblclickOptions { - public enum Button { LEFT, MIDDLE, RIGHT} - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -166,15 +162,15 @@ public interface Frame { return this; } } - public Button button; + public Mouse.Button button; public Integer delay; public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Boolean noWaitAfter; public Integer timeout; - public DblclickOptions withButton(Button button) { + public DblclickOptions withButton(Mouse.Button button) { this.button = button; return this; } @@ -186,7 +182,7 @@ public interface Frame { this.position = new Position(); return this.position; } - public DblclickOptions withModifiers(Set modifiers) { + public DblclickOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -241,7 +237,7 @@ public interface Frame { } } class NavigateOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public WaitUntil waitUntil; public String referer; @@ -260,7 +256,6 @@ public interface Frame { } } class HoverOptions { - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -281,7 +276,7 @@ public interface Frame { } } public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Integer timeout; @@ -289,7 +284,7 @@ public interface Frame { this.position = new Position(); return this.position; } - public HoverOptions withModifiers(Set modifiers) { + public HoverOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -350,7 +345,7 @@ public interface Frame { } } class SetContentOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public WaitUntil waitUntil; @@ -442,7 +437,7 @@ public interface Frame { } } class WaitForNavigationOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public String url; public WaitUntil waitUntil; @@ -461,7 +456,7 @@ public interface Frame { } } class WaitForSelectorOptions { - public enum State { ATTACHED, DETACHED, HIDDEN, VISIBLE} + public enum State { ATTACHED, DETACHED, HIDDEN, VISIBLE } public State state; public Integer timeout; diff --git a/lib/src/main/java/com/microsoft/playwright/Keyboard.java b/lib/src/main/java/com/microsoft/playwright/Keyboard.java index df1468d7..32a43d4a 100644 --- a/lib/src/main/java/com/microsoft/playwright/Keyboard.java +++ b/lib/src/main/java/com/microsoft/playwright/Keyboard.java @@ -20,32 +20,18 @@ import java.util.*; import java.util.function.BiConsumer; public interface Keyboard { - class PressOptions { - public Integer delay; + enum Modifier { ALT, CONTROL, META, SHIFT } - public PressOptions withDelay(Integer delay) { - this.delay = delay; - return this; - } - } - class TypeOptions { - public Integer delay; - - public TypeOptions withDelay(Integer delay) { - this.delay = delay; - return this; - } - } void down(String key); void insertText(String text); default void press(String key) { - press(key, null); + press(key, 0); } - void press(String key, PressOptions options); + void press(String key, int delay); default void type(String text) { - type(text, null); + type(text, 0); } - void type(String text, TypeOptions options); + void type(String text, int delay); void up(String key); } diff --git a/lib/src/main/java/com/microsoft/playwright/Logger.java b/lib/src/main/java/com/microsoft/playwright/Logger.java index 532d0035..7827fdf1 100644 --- a/lib/src/main/java/com/microsoft/playwright/Logger.java +++ b/lib/src/main/java/com/microsoft/playwright/Logger.java @@ -20,7 +20,7 @@ import java.util.*; import java.util.function.BiConsumer; public interface Logger { - enum Severity { ERROR, INFO, VERBOSE, WARNING} + enum Severity { ERROR, INFO, VERBOSE, WARNING } class LogHints { public String color; diff --git a/lib/src/main/java/com/microsoft/playwright/Mouse.java b/lib/src/main/java/com/microsoft/playwright/Mouse.java index cbfb07e8..8e5271ab 100644 --- a/lib/src/main/java/com/microsoft/playwright/Mouse.java +++ b/lib/src/main/java/com/microsoft/playwright/Mouse.java @@ -20,8 +20,9 @@ import java.util.*; import java.util.function.BiConsumer; public interface Mouse { + enum Button { LEFT, MIDDLE, RIGHT } + class ClickOptions { - public enum Button { LEFT, MIDDLE, RIGHT} public Button button; public Integer clickCount; public Integer delay; @@ -40,7 +41,6 @@ public interface Mouse { } } class DblclickOptions { - public enum Button { LEFT, MIDDLE, RIGHT} public Button button; public Integer delay; @@ -54,7 +54,6 @@ public interface Mouse { } } class DownOptions { - public enum Button { LEFT, MIDDLE, RIGHT} public Button button; public Integer clickCount; @@ -76,7 +75,6 @@ public interface Mouse { } } class UpOptions { - public enum Button { LEFT, MIDDLE, RIGHT} public Button button; public Integer clickCount; diff --git a/lib/src/main/java/com/microsoft/playwright/Page.java b/lib/src/main/java/com/microsoft/playwright/Page.java index cc55840e..0f677799 100644 --- a/lib/src/main/java/com/microsoft/playwright/Page.java +++ b/lib/src/main/java/com/microsoft/playwright/Page.java @@ -20,7 +20,7 @@ import java.util.*; import java.util.function.BiConsumer; public interface Page { - enum LoadState { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + enum LoadState { DOMCONTENTLOADED, LOAD, NETWORKIDLE } class CloseOptions { public Boolean runBeforeUnload; @@ -89,8 +89,6 @@ public interface Page { } } class ClickOptions { - public enum Button { LEFT, MIDDLE, RIGHT} - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -110,16 +108,16 @@ public interface Page { return this; } } - public Button button; + public Mouse.Button button; public Integer clickCount; public Integer delay; public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Boolean noWaitAfter; public Integer timeout; - public ClickOptions withButton(Button button) { + public ClickOptions withButton(Mouse.Button button) { this.button = button; return this; } @@ -135,7 +133,7 @@ public interface Page { this.position = new Position(); return this.position; } - public ClickOptions withModifiers(Set modifiers) { + public ClickOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -153,8 +151,6 @@ public interface Page { } } class DblclickOptions { - public enum Button { LEFT, MIDDLE, RIGHT} - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -174,15 +170,15 @@ public interface Page { return this; } } - public Button button; + public Mouse.Button button; public Integer delay; public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Boolean noWaitAfter; public Integer timeout; - public DblclickOptions withButton(Button button) { + public DblclickOptions withButton(Mouse.Button button) { this.button = button; return this; } @@ -194,7 +190,7 @@ public interface Page { this.position = new Position(); return this.position; } - public DblclickOptions withModifiers(Set modifiers) { + public DblclickOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -220,8 +216,8 @@ public interface Page { } } class EmulateMediaOptions { - public enum Media { PRINT, SCREEN} - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum Media { PRINT, SCREEN } + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public Media media; public ColorScheme colorScheme; @@ -264,7 +260,7 @@ public interface Page { } } class GoBackOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public WaitUntil waitUntil; @@ -278,7 +274,7 @@ public interface Page { } } class GoForwardOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public WaitUntil waitUntil; @@ -292,7 +288,7 @@ public interface Page { } } class NavigateOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public WaitUntil waitUntil; public String referer; @@ -311,7 +307,6 @@ public interface Page { } } class HoverOptions { - public enum Modifier { ALT, CONTROL, META, SHIFT} public class Position { public int x; public int y; @@ -332,7 +327,7 @@ public interface Page { } } public Position position; - public Set modifiers; + public Set modifiers; public Boolean force; public Integer timeout; @@ -340,7 +335,7 @@ public interface Page { this.position = new Position(); return this.position; } - public HoverOptions withModifiers(Set modifiers) { + public HoverOptions withModifiers(Set modifiers) { this.modifiers = modifiers; return this; } @@ -485,7 +480,7 @@ public interface Page { } } class ReloadOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public WaitUntil waitUntil; @@ -499,7 +494,7 @@ public interface Page { } } class ScreenshotOptions { - public enum Type { JPEG, PNG} + public enum Type { JPEG, PNG } public class Clip { public int x; public int y; @@ -580,7 +575,7 @@ public interface Page { } } class SetContentOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public WaitUntil waitUntil; @@ -696,7 +691,7 @@ public interface Page { } } class WaitForNavigationOptions { - public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE} + public enum WaitUntil { DOMCONTENTLOADED, LOAD, NETWORKIDLE } public Integer timeout; public String url; public WaitUntil waitUntil; @@ -731,7 +726,7 @@ public interface Page { } } class WaitForSelectorOptions { - public enum State { ATTACHED, DETACHED, HIDDEN, VISIBLE} + public enum State { ATTACHED, DETACHED, HIDDEN, VISIBLE } public State state; public Integer timeout; @@ -761,6 +756,7 @@ public interface Page { return evalOnSelectorAll(selector, pageFunction, null); } Object evalOnSelectorAll(String selector, String pageFunction, Object arg); + Accessibility accessibility(); default void addInitScript(String script) { addInitScript(script, null); } @@ -778,6 +774,7 @@ public interface Page { void click(String selector, ClickOptions options); String content(); BrowserContext context(); + ChromiumCoverage coverage(); default void dblclick(String selector) { dblclick(selector, null); } @@ -839,7 +836,9 @@ public interface Page { } String innerText(String selector, InnerTextOptions options); boolean isClosed(); + Keyboard keyboard(); Frame mainFrame(); + Mouse mouse(); Page opener(); default byte[] pdf() { return pdf(null); diff --git a/lib/src/main/java/com/microsoft/playwright/Playwright.java b/lib/src/main/java/com/microsoft/playwright/Playwright.java index af63c94b..6e499815 100644 --- a/lib/src/main/java/com/microsoft/playwright/Playwright.java +++ b/lib/src/main/java/com/microsoft/playwright/Playwright.java @@ -19,6 +19,7 @@ package com.microsoft.playwright; import com.microsoft.playwright.impl.PlaywrightImpl; import java.io.IOException; +import java.util.Map; public interface Playwright { static Playwright create() { @@ -28,4 +29,6 @@ public interface Playwright { BrowserType chromium(); BrowserType firefox(); BrowserType webkit(); + + Map devices(); } diff --git a/lib/src/main/java/com/microsoft/playwright/WebKitBrowser.java b/lib/src/main/java/com/microsoft/playwright/WebKitBrowser.java index 5393de20..959d44d3 100644 --- a/lib/src/main/java/com/microsoft/playwright/WebKitBrowser.java +++ b/lib/src/main/java/com/microsoft/playwright/WebKitBrowser.java @@ -21,7 +21,7 @@ import java.util.function.BiConsumer; public interface WebKitBrowser { class NewContextOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Viewport { public int width; public int height; @@ -216,7 +216,7 @@ public interface WebKitBrowser { } } class NewPageOptions { - public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE} + public enum ColorScheme { DARK, LIGHT, NO_PREFERENCE } public class Viewport { public int width; public int height; diff --git a/lib/src/main/java/com/microsoft/playwright/impl/DeviceDescriptorImpl.java b/lib/src/main/java/com/microsoft/playwright/impl/DeviceDescriptorImpl.java new file mode 100644 index 00000000..879ab318 --- /dev/null +++ b/lib/src/main/java/com/microsoft/playwright/impl/DeviceDescriptorImpl.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.impl; + +import com.microsoft.playwright.DeviceDescriptor; + +class DeviceDescriptorImpl implements DeviceDescriptor { + private static class ViewportImpl implements Viewport{ + private int width; + private int height; + + @Override + public int width() { + return width; + } + + @Override + public int height() { + return height; + } + } + private ViewportImpl viewport; + private String userAgent; + private int deviceScaleFactor; + private boolean isMobile; + private boolean hasTouch; + // 'chromium' | 'firefox' | 'webkit' + private String defaultBrowserType; + + @Override + public Viewport viewport() { + return viewport; + } + + @Override + public String userAgent() { + return userAgent; + } + + @Override + public int deviceScaleFactor() { + return deviceScaleFactor; + } + + @Override + public boolean isMobile() { + return isMobile; + } + + @Override + public boolean hasTouch() { + return hasTouch; + } + + @Override + public BrowserType defaultBrowserType() { + switch (defaultBrowserType) { + case "chromium": return BrowserType.CHROMIUM; + case "firefox": return BrowserType.FIREFOX; + case "webkit": return BrowserType.WEBKIT; + default: throw new RuntimeException("Unknown type: " + defaultBrowserType); + } + } +} diff --git a/lib/src/main/java/com/microsoft/playwright/impl/FrameImpl.java b/lib/src/main/java/com/microsoft/playwright/impl/FrameImpl.java index bcce0bad..d2abadb6 100644 --- a/lib/src/main/java/com/microsoft/playwright/impl/FrameImpl.java +++ b/lib/src/main/java/com/microsoft/playwright/impl/FrameImpl.java @@ -194,7 +194,7 @@ public class FrameImpl extends ChannelOwner implements Frame { } - private static String toProtocol(ClickOptions.Button button) { + private static String toProtocol(Mouse.Button button) { switch (button) { case LEFT: return "left"; case RIGHT: return "right"; @@ -203,18 +203,18 @@ public class FrameImpl extends ChannelOwner implements Frame { } } - private static JsonArray toProtocol(Set modifiers) { + private static JsonArray toProtocol(Set modifiers) { JsonArray result = new JsonArray(); - if (modifiers.contains(ClickOptions.Modifier.ALT)) { + if (modifiers.contains(Keyboard.Modifier.ALT)) { result.add("Alt"); } - if (modifiers.contains(ClickOptions.Modifier.CONTROL)) { + if (modifiers.contains(Keyboard.Modifier.CONTROL)) { result.add("Control"); } - if (modifiers.contains(ClickOptions.Modifier.META)) { + if (modifiers.contains(Keyboard.Modifier.META)) { result.add("Meta"); } - if (modifiers.contains(ClickOptions.Modifier.SHIFT)) { + if (modifiers.contains(Keyboard.Modifier.SHIFT)) { result.add("Shift"); } return result; @@ -238,8 +238,6 @@ public class FrameImpl extends ChannelOwner implements Frame { params.add("modifiers", toProtocol(options.modifiers)); } -// System.err.println(new Gson().toJson(params)); - sendMessage("click", params); } diff --git a/lib/src/main/java/com/microsoft/playwright/impl/KeyboardImpl.java b/lib/src/main/java/com/microsoft/playwright/impl/KeyboardImpl.java new file mode 100644 index 00000000..94c47ec1 --- /dev/null +++ b/lib/src/main/java/com/microsoft/playwright/impl/KeyboardImpl.java @@ -0,0 +1,69 @@ +/** + * Copyright (c) Microsoft Corporation. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.impl; + +import com.google.gson.JsonObject; +import com.microsoft.playwright.Keyboard; + +class KeyboardImpl implements Keyboard { + private final ChannelOwner page; + + KeyboardImpl(ChannelOwner page) { + this.page = page; + } + + @Override + public void down(String key) { + JsonObject params = new JsonObject(); + params.addProperty("key", key); + page.sendMessage("keyboardDown", params); + } + + @Override + public void insertText(String text) { + JsonObject params = new JsonObject(); + params.addProperty("text", text); + page.sendMessage("keyboardInsertText", params); + } + + @Override + public void press(String key, int delay) { + JsonObject params = new JsonObject(); + params.addProperty("key", key); + if (delay != 0) { + params.addProperty("delay", delay); + } + page.sendMessage("keyboardPress", params); + } + + @Override + public void type(String text, int delay) { + JsonObject params = new JsonObject(); + params.addProperty("text", text); + if (delay != 0) { + params.addProperty("delay", delay); + } + page.sendMessage("keyboardType", params); + } + + @Override + public void up(String key) { + JsonObject params = new JsonObject(); + params.addProperty("key", key); + page.sendMessage("keyboardUp", params); + } +} diff --git a/lib/src/main/java/com/microsoft/playwright/impl/MouseImpl.java b/lib/src/main/java/com/microsoft/playwright/impl/MouseImpl.java new file mode 100644 index 00000000..7d4885c8 --- /dev/null +++ b/lib/src/main/java/com/microsoft/playwright/impl/MouseImpl.java @@ -0,0 +1,96 @@ +/** + * Copyright (c) Microsoft Corporation. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.impl; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.microsoft.playwright.Mouse; + +import static com.microsoft.playwright.impl.Utils.convertViaJson; + +class MouseImpl implements Mouse { + private final ChannelOwner page; + + MouseImpl(ChannelOwner page) { + this.page = page; + } + + private static String toProtocol(Mouse.Button button) { + switch (button) { + case LEFT: return "left"; + case RIGHT: return "right"; + case MIDDLE: return "middle"; + default: throw new RuntimeException("Unexpected value: " + button); + } + } + + @Override + public void click(int x, int y, ClickOptions options) { + if (options == null) { + options = new ClickOptions(); + } + JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); + params.addProperty("x", x); + params.addProperty("y", y); + if (options.button != null) { + params.remove("button"); + params.addProperty("button", toProtocol(options.button)); + } + page.sendMessage("mouseClick", params); + } + + @Override + public void dblclick(int x, int y, DblclickOptions options) { + ClickOptions clickOptions; + if (options == null) { + clickOptions = new ClickOptions(); + } else { + clickOptions = convertViaJson(options, ClickOptions.class); + } + clickOptions.clickCount = 2; + click(x, y, clickOptions); + } + + @Override + public void down(DownOptions options) { + if (options == null) { + options = new DownOptions(); + } + JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); + page.sendMessage("mouseDown", params); + } + + @Override + public void move(int x, int y, MoveOptions options) { + if (options == null) { + options = new MoveOptions(); + } + JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); + params.addProperty("x", x); + params.addProperty("y", y); + page.sendMessage("mouseMove", params); + } + + @Override + public void up(UpOptions options) { + if (options == null) { + options = new UpOptions(); + } + JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); + page.sendMessage("mouseUp", params); + } +} diff --git a/lib/src/main/java/com/microsoft/playwright/impl/PageImpl.java b/lib/src/main/java/com/microsoft/playwright/impl/PageImpl.java index 432acfa6..a91d8bf4 100644 --- a/lib/src/main/java/com/microsoft/playwright/impl/PageImpl.java +++ b/lib/src/main/java/com/microsoft/playwright/impl/PageImpl.java @@ -28,9 +28,13 @@ import java.util.concurrent.Future; import java.util.function.BiConsumer; import java.util.function.Supplier; +import static com.microsoft.playwright.impl.Utils.convertViaJson; + public class PageImpl extends ChannelOwner implements Page { private final FrameImpl mainFrame; + private final KeyboardImpl keyboard; + private final MouseImpl mouse; private final List dialogHandlers = new ArrayList<>(); private final List> consoleListeners = new ArrayList<>(); @@ -38,6 +42,8 @@ public class PageImpl extends ChannelOwner implements Page { super(parent, type, guid, initializer); mainFrame = connection.getExistingObject(initializer.getAsJsonObject("mainFrame").get("guid").getAsString()); mainFrame.page = this; + keyboard = new KeyboardImpl(this); + mouse = new MouseImpl(this); } @Override @@ -120,6 +126,11 @@ public class PageImpl extends ChannelOwner implements Page { return mainFrame.evalOnSelectorAll(selector, pageFunction, arg); } + @Override + public Accessibility accessibility() { + return null; + } + @Override public void addInitScript(String script, Object arg) { @@ -160,6 +171,11 @@ public class PageImpl extends ChannelOwner implements Page { return null; } + @Override + public ChromiumCoverage coverage() { + return null; + } + @Override public void dblclick(String selector, DblclickOptions options) { @@ -232,8 +248,7 @@ public class PageImpl extends ChannelOwner implements Page { @Override public ResponseImpl navigate(String url, NavigateOptions options) { - // TODO: convert params - return mainFrame.navigate(url, new Frame.NavigateOptions()); + return mainFrame.navigate(url, convertViaJson(options, Frame.NavigateOptions.class)); } @Override @@ -256,9 +271,19 @@ public class PageImpl extends ChannelOwner implements Page { return false; } + @Override + public Keyboard keyboard() { + return keyboard; + } + @Override public Frame mainFrame() { - return null; + return mainFrame; + } + + @Override + public Mouse mouse() { + return mouse; } @Override @@ -298,10 +323,7 @@ public class PageImpl extends ChannelOwner implements Page { @Override public void setContent(String html, SetContentOptions options) { - // TODO: generate converter. - String json = new Gson().toJson(options); - Frame.SetContentOptions frameOptions = new Gson().fromJson(json, Frame.SetContentOptions.class); - mainFrame.setContent(html, frameOptions); + mainFrame.setContent(html, convertViaJson(options, Frame.SetContentOptions.class)); } @Override @@ -408,9 +430,4 @@ public class PageImpl extends ChannelOwner implements Page { public List workers() { return null; } - - private static T convertViaJson(F f, Class t) { - String json = new Gson().toJson(f); - return new Gson().fromJson(json, t); - } } diff --git a/lib/src/main/java/com/microsoft/playwright/impl/PlaywrightImpl.java b/lib/src/main/java/com/microsoft/playwright/impl/PlaywrightImpl.java index 1d1a77b0..549ab2e9 100644 --- a/lib/src/main/java/com/microsoft/playwright/impl/PlaywrightImpl.java +++ b/lib/src/main/java/com/microsoft/playwright/impl/PlaywrightImpl.java @@ -16,13 +16,19 @@ package com.microsoft.playwright.impl; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.microsoft.playwright.BrowserType; +import com.microsoft.playwright.DeviceDescriptor; import com.microsoft.playwright.Playwright; import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; +import java.util.HashMap; +import java.util.Map; public class PlaywrightImpl extends ChannelOwner implements Playwright { public static PlaywrightImpl create() { @@ -45,12 +51,21 @@ public class PlaywrightImpl extends ChannelOwner implements Playwright { private final BrowserTypeImpl chromium; private final BrowserTypeImpl firefox; private final BrowserTypeImpl webkit; + private final Map devices = new HashMap<>(); public PlaywrightImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) { super(parent, type, guid, initializer); chromium = parent.connection.getExistingObject(initializer.getAsJsonObject("chromium").get("guid").getAsString()); firefox = parent.connection.getExistingObject(initializer.getAsJsonObject("firefox").get("guid").getAsString()); webkit = parent.connection.getExistingObject(initializer.getAsJsonObject("webkit").get("guid").getAsString()); + + Gson gson = new Gson(); + for (JsonElement item : initializer.getAsJsonArray("deviceDescriptors")) { + JsonObject o = item.getAsJsonObject(); + String name = o.get("name").getAsString(); + DeviceDescriptorImpl descriptor = gson.fromJson(o.get("descriptor"), DeviceDescriptorImpl.class); + devices.put(name, descriptor); + } } @Override @@ -67,4 +82,9 @@ public class PlaywrightImpl extends ChannelOwner implements Playwright { public BrowserTypeImpl webkit() { return webkit; } + + @Override + public Map devices() { + return devices; + } } diff --git a/lib/src/main/java/com/microsoft/playwright/impl/Utils.java b/lib/src/main/java/com/microsoft/playwright/impl/Utils.java new file mode 100644 index 00000000..bb28e092 --- /dev/null +++ b/lib/src/main/java/com/microsoft/playwright/impl/Utils.java @@ -0,0 +1,27 @@ +/** + * Copyright (c) Microsoft Corporation. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.impl; + +import com.google.gson.Gson; + +class Utils { + // TODO: generate converter. + static T convertViaJson(F f, Class t) { + String json = new Gson().toJson(f); + return new Gson().fromJson(json, t); + } +} diff --git a/lib/src/test/java/com/microsoft/playwright/TestClick.java b/lib/src/test/java/com/microsoft/playwright/TestClick.java index d842ecea..9a8d7dbd 100644 --- a/lib/src/test/java/com/microsoft/playwright/TestClick.java +++ b/lib/src/test/java/com/microsoft/playwright/TestClick.java @@ -254,4 +254,21 @@ public class TestClick { page.click("label[for='agree']"); assertFalse((Boolean) page.evaluate("() => window['result'].check")); } + + @Test + void should_not_hang_with_touch_enabled_viewports() { + // @see https://github.com/GoogleChrome/puppeteer/issues/161 + DeviceDescriptor descriptor = playwright.devices().get("iPhone 6"); + BrowserContext context = browser.newContext(new Browser.NewContextOptions() + .setViewport() + .withWidth(descriptor.viewport().width()) + .withHeight(descriptor.viewport().height()) + .done() + .withHasTouch(descriptor.hasTouch())); + Page page = context.newPage(); + page.mouse().down(); + page.mouse().move(100, 10); + page.mouse().up(); + context.close(); + } }