From ea34deeb2b4d930a118b71db378699887f4e7ce7 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 10 Feb 2021 15:42:03 -0800 Subject: [PATCH] fix: generate return and param types from api.json (#276) --- .../microsoft/playwright/BrowserContext.java | 105 +------------ .../microsoft/playwright/ConsoleMessage.java | 29 +--- .../microsoft/playwright/ElementHandle.java | 7 - .../java/com/microsoft/playwright/Page.java | 15 -- .../com/microsoft/playwright/Request.java | 77 +-------- .../playwright/impl/BrowserContextImpl.java | 2 +- .../playwright/impl/ConsoleMessageImpl.java | 8 +- .../playwright/impl/ElementHandleImpl.java | 5 +- .../playwright/impl/RequestImpl.java | 7 +- .../playwright/impl/ResponseImpl.java | 3 +- .../playwright/options/BoundingBox.java | 37 +++++ .../microsoft/playwright/options/Cookie.java | 83 ++++++++++ .../playwright/options/Geolocation.java | 28 ++-- .../microsoft/playwright/options/Timing.java | 65 ++++++++ .../TestBrowserContextAddCookies.java | 93 +++++------ .../TestBrowserContextClearCookies.java | 7 +- .../playwright/TestBrowserContextCookies.java | 47 +++--- .../TestElementHandleBoundingBox.java | 13 +- .../microsoft/playwright/TestGeolocation.java | 2 +- .../microsoft/playwright/TestPageRoute.java | 3 +- scripts/CLI_VERSION | 2 +- .../playwright/tools/ApiGenerator.java | 146 +++++------------- .../com/microsoft/playwright/tools/Types.java | 13 +- 23 files changed, 345 insertions(+), 452 deletions(-) create mode 100644 playwright/src/main/java/com/microsoft/playwright/options/BoundingBox.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/options/Cookie.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/options/Timing.java diff --git a/playwright/src/main/java/com/microsoft/playwright/BrowserContext.java b/playwright/src/main/java/com/microsoft/playwright/BrowserContext.java index f55fd057..3d001291 100644 --- a/playwright/src/main/java/com/microsoft/playwright/BrowserContext.java +++ b/playwright/src/main/java/com/microsoft/playwright/BrowserContext.java @@ -42,109 +42,6 @@ public interface BrowserContext extends AutoCloseable { void onPage(Consumer handler); void offPage(Consumer handler); - class AddCookie { - public String name; - public String value; - /** - * either url or domain / path are required. Optional. - */ - public String url; - /** - * either url or domain / path are required Optional. - */ - public String domain; - /** - * either url or domain / path are required Optional. - */ - public String path; - /** - * Unix time in seconds. Optional. - */ - public Double expires; - /** - * Optional. - */ - public Boolean httpOnly; - /** - * Optional. - */ - public Boolean secure; - /** - * Optional. - */ - public SameSiteAttribute sameSite; - - public AddCookie(String name, String value) { - this.name = name; - this.value = value; - } - public AddCookie withUrl(String url) { - this.url = url; - return this; - } - public AddCookie withDomain(String domain) { - this.domain = domain; - return this; - } - public AddCookie withPath(String path) { - this.path = path; - return this; - } - public AddCookie withExpires(double expires) { - this.expires = expires; - return this; - } - public AddCookie withHttpOnly(boolean httpOnly) { - this.httpOnly = httpOnly; - return this; - } - public AddCookie withSecure(boolean secure) { - this.secure = secure; - return this; - } - public AddCookie withSameSite(SameSiteAttribute sameSite) { - this.sameSite = sameSite; - return this; - } - } - class Cookie { - private String name; - private String value; - private String domain; - private String path; - /** - * Unix time in seconds. - */ - private double expires; - private boolean httpOnly; - private boolean secure; - private SameSiteAttribute sameSite; - - public String name() { - return this.name; - } - public String value() { - return this.value; - } - public String domain() { - return this.domain; - } - public String path() { - return this.path; - } - public double expires() { - return this.expires; - } - public boolean httpOnly() { - return this.httpOnly; - } - public boolean secure() { - return this.secure; - } - public SameSiteAttribute sameSite() { - return this.sameSite; - } - } class ExposeBindingOptions { /** * Whether to pass the argument as a handle, instead of passing by value. When passing a handle, only one argument is @@ -204,7 +101,7 @@ public interface BrowserContext extends AutoCloseable { * Adds cookies into this browser context. All pages within this context will have these cookies installed. Cookies can be * obtained via [{@code method: BrowserContext.cookies}]. */ - void addCookies(List cookies); + void addCookies(List cookies); /** * Adds a script which would be evaluated in one of the following scenarios: * - Whenever a page is created in the browser context or is navigated. diff --git a/playwright/src/main/java/com/microsoft/playwright/ConsoleMessage.java b/playwright/src/main/java/com/microsoft/playwright/ConsoleMessage.java index 03bf13a6..52b0d17f 100644 --- a/playwright/src/main/java/com/microsoft/playwright/ConsoleMessage.java +++ b/playwright/src/main/java/com/microsoft/playwright/ConsoleMessage.java @@ -22,32 +22,11 @@ import java.util.*; * {@code ConsoleMessage} objects are dispatched by page via the [{@code event: Page.console}] event. */ public interface ConsoleMessage { - class Location { - /** - * URL of the resource. - */ - private String url; - /** - * 0-based line number in the resource. - */ - private int lineNumber; - /** - * 0-based column number in the resource. - */ - private int columnNumber; - - public String url() { - return this.url; - } - public int lineNumber() { - return this.lineNumber; - } - public int columnNumber() { - return this.columnNumber; - } - } List args(); - Location location(); + /** + * URL of the resource followed by 0-based line and column numbers in the resource formatted as {@code URL:line:column}. + */ + String location(); String text(); /** * One of the following values: {@code 'log'}, {@code 'debug'}, {@code 'info'}, {@code 'error'}, {@code 'warning'}, {@code 'dir'}, {@code 'dirxml'}, {@code 'table'}, diff --git a/playwright/src/main/java/com/microsoft/playwright/ElementHandle.java b/playwright/src/main/java/com/microsoft/playwright/ElementHandle.java index caf359a8..141125ef 100644 --- a/playwright/src/main/java/com/microsoft/playwright/ElementHandle.java +++ b/playwright/src/main/java/com/microsoft/playwright/ElementHandle.java @@ -33,13 +33,6 @@ import java.util.*; * methods. */ public interface ElementHandle extends JSHandle { - class BoundingBox { - public double x; - public double y; - public double width; - public double height; - } - class SelectOption { public String value; public String label; diff --git a/playwright/src/main/java/com/microsoft/playwright/Page.java b/playwright/src/main/java/com/microsoft/playwright/Page.java index c2c2f8df..8e881df7 100644 --- a/playwright/src/main/java/com/microsoft/playwright/Page.java +++ b/playwright/src/main/java/com/microsoft/playwright/Page.java @@ -979,21 +979,6 @@ public interface Page extends AutoCloseable { return this; } } - class SetViewportSizeViewportSize { - /** - * page width in pixels. - */ - public int width; - /** - * page height in pixels. - */ - public int height; - - public SetViewportSizeViewportSize(int width, int height) { - this.width = width; - this.height = height; - } - } class TapOptions { /** * Whether to bypass the [actionability](./actionability.md) checks. Defaults to {@code false}. diff --git a/playwright/src/main/java/com/microsoft/playwright/Request.java b/playwright/src/main/java/com/microsoft/playwright/Request.java index ea59ad74..bb140993 100644 --- a/playwright/src/main/java/com/microsoft/playwright/Request.java +++ b/playwright/src/main/java/com/microsoft/playwright/Request.java @@ -16,6 +16,7 @@ package com.microsoft.playwright; +import com.microsoft.playwright.options.*; import java.util.*; /** @@ -34,80 +35,6 @@ import java.util.*; * request is issued to a redirected url. */ public interface Request { - class RequestTiming { - /** - * Request start time in milliseconds elapsed since January 1, 1970 00:00:00 UTC - */ - private double startTime; - /** - * Time immediately before the browser starts the domain name lookup for the resource. The value is given in milliseconds - * relative to {@code startTime}, -1 if not available. - */ - private double domainLookupStart; - /** - * Time immediately after the browser starts the domain name lookup for the resource. The value is given in milliseconds - * relative to {@code startTime}, -1 if not available. - */ - private double domainLookupEnd; - /** - * Time immediately before the user agent starts establishing the connection to the server to retrieve the resource. The - * value is given in milliseconds relative to {@code startTime}, -1 if not available. - */ - private double connectStart; - /** - * Time immediately before the browser starts the handshake process to secure the current connection. The value is given in - * milliseconds relative to {@code startTime}, -1 if not available. - */ - private double secureConnectionStart; - /** - * Time immediately before the user agent starts establishing the connection to the server to retrieve the resource. The - * value is given in milliseconds relative to {@code startTime}, -1 if not available. - */ - private double connectEnd; - /** - * Time immediately before the browser starts requesting the resource from the server, cache, or local resource. The value - * is given in milliseconds relative to {@code startTime}, -1 if not available. - */ - private double requestStart; - /** - * Time immediately after the browser starts requesting the resource from the server, cache, or local resource. The value - * is given in milliseconds relative to {@code startTime}, -1 if not available. - */ - private double responseStart; - /** - * Time immediately after the browser receives the last byte of the resource or immediately before the transport connection - * is closed, whichever comes first. The value is given in milliseconds relative to {@code startTime}, -1 if not available. - */ - private double responseEnd; - - public double startTime() { - return this.startTime; - } - public double domainLookupStart() { - return this.domainLookupStart; - } - public double domainLookupEnd() { - return this.domainLookupEnd; - } - public double connectStart() { - return this.connectStart; - } - public double secureConnectionStart() { - return this.secureConnectionStart; - } - public double connectEnd() { - return this.connectEnd; - } - public double requestStart() { - return this.requestStart; - } - public double responseStart() { - return this.responseStart; - } - public double responseEnd() { - return this.responseEnd; - } - } /** * The method returns {@code null} unless this request has failed, as reported by {@code requestfailed} event. * @@ -171,7 +98,7 @@ public interface Request { * {@code responseEnd} becomes available when request finishes. Find more information at * [Resource Timing API](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming). */ - RequestTiming timing(); + Timing timing(); /** * URL of the request. */ diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/BrowserContextImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/BrowserContextImpl.java index 5dcfd93d..3ee6c365 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/BrowserContextImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/BrowserContextImpl.java @@ -113,7 +113,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext { } @Override - public void addCookies(List cookies) { + public void addCookies(List cookies) { withLogging("BrowserContext.addCookies", () -> { JsonObject params = new JsonObject(); params.add("cookies", gson().toJsonTree(cookies)); diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/ConsoleMessageImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/ConsoleMessageImpl.java index 3f97fee6..575c39ff 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/ConsoleMessageImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/ConsoleMessageImpl.java @@ -48,7 +48,11 @@ public class ConsoleMessageImpl extends ChannelOwner implements ConsoleMessage { return result; } - public Location location() { - return gson().fromJson(initializer.get("location"), Location.class); + @Override + public String location() { + JsonObject location = initializer.getAsJsonObject("location"); + return location.get("url").getAsString() + ":" + + location.get("lineNumber").getAsNumber() + ":" + + location.get("columnNumber").getAsNumber(); } } diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/ElementHandleImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/ElementHandleImpl.java index b9a4fd2c..fcd1d599 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/ElementHandleImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/ElementHandleImpl.java @@ -20,18 +20,19 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.microsoft.playwright.ElementHandle; -import com.microsoft.playwright.options.ElementState; import com.microsoft.playwright.FileChooser; import com.microsoft.playwright.Frame; +import com.microsoft.playwright.options.BoundingBox; +import com.microsoft.playwright.options.ElementState; import java.nio.file.Path; import java.util.ArrayList; import java.util.Base64; import java.util.List; +import static com.microsoft.playwright.impl.Serialization.*; import static com.microsoft.playwright.options.ScreenshotType.JPEG; import static com.microsoft.playwright.options.ScreenshotType.PNG; -import static com.microsoft.playwright.impl.Serialization.*; public class ElementHandleImpl extends JSHandleImpl implements ElementHandle { ElementHandleImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) { diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/RequestImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/RequestImpl.java index 51efcf65..86022f57 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/RequestImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/RequestImpl.java @@ -21,6 +21,7 @@ import com.google.gson.JsonObject; import com.microsoft.playwright.Frame; import com.microsoft.playwright.Request; import com.microsoft.playwright.Response; +import com.microsoft.playwright.options.Timing; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -33,7 +34,7 @@ public class RequestImpl extends ChannelOwner implements Request { private RequestImpl redirectedTo; final Map headers = new HashMap<>(); String failure; - RequestTiming timing; + Timing timing; RequestImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) { super(parent, type, guid, initializer); @@ -118,8 +119,8 @@ public class RequestImpl extends ChannelOwner implements Request { } @Override - public RequestTiming timing() { - return null; + public Timing timing() { + return timing; } @Override diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/ResponseImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/ResponseImpl.java index ae334493..fb79eb5b 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/ResponseImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/ResponseImpl.java @@ -21,6 +21,7 @@ import com.google.gson.JsonObject; import com.microsoft.playwright.Frame; import com.microsoft.playwright.Request; import com.microsoft.playwright.Response; +import com.microsoft.playwright.options.Timing; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -45,7 +46,7 @@ public class ResponseImpl extends ChannelOwner implements Response { JsonObject item = e.getAsJsonObject(); request.headers.put(item.get("name").getAsString().toLowerCase(), item.get("value").getAsString()); } - request.timing = Serialization.gson().fromJson(initializer.get("timing"), Request.RequestTiming.class); + request.timing = Serialization.gson().fromJson(initializer.get("timing"), Timing.class); } @Override diff --git a/playwright/src/main/java/com/microsoft/playwright/options/BoundingBox.java b/playwright/src/main/java/com/microsoft/playwright/options/BoundingBox.java new file mode 100644 index 00000000..d3322730 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/options/BoundingBox.java @@ -0,0 +1,37 @@ +/* + * 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.options; + +public class BoundingBox { + /** + * the x coordinate of the element in pixels. + */ + public double x; + /** + * the y coordinate of the element in pixels. + */ + public double y; + /** + * the width of the element in pixels. + */ + public double width; + /** + * the height of the element in pixels. + */ + public double height; + +} \ No newline at end of file diff --git a/playwright/src/main/java/com/microsoft/playwright/options/Cookie.java b/playwright/src/main/java/com/microsoft/playwright/options/Cookie.java new file mode 100644 index 00000000..72ec8678 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/options/Cookie.java @@ -0,0 +1,83 @@ +/* + * 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.options; + +public class Cookie { + public String name; + public String value; + /** + * either url or domain / path are required. Optional. + */ + public String url; + /** + * either url or domain / path are required Optional. + */ + public String domain; + /** + * either url or domain / path are required Optional. + */ + public String path; + /** + * Unix time in seconds. Optional. + */ + public Double expires; + /** + * Optional. + */ + public Boolean httpOnly; + /** + * Optional. + */ + public Boolean secure; + /** + * Optional. + */ + public SameSiteAttribute sameSite; + + public Cookie(String name, String value) { + this.name = name; + this.value = value; + } + public Cookie withUrl(String url) { + this.url = url; + return this; + } + public Cookie withDomain(String domain) { + this.domain = domain; + return this; + } + public Cookie withPath(String path) { + this.path = path; + return this; + } + public Cookie withExpires(double expires) { + this.expires = expires; + return this; + } + public Cookie withHttpOnly(boolean httpOnly) { + this.httpOnly = httpOnly; + return this; + } + public Cookie withSecure(boolean secure) { + this.secure = secure; + return this; + } + public Cookie withSameSite(SameSiteAttribute sameSite) { + this.sameSite = sameSite; + return this; + } +} \ No newline at end of file diff --git a/playwright/src/main/java/com/microsoft/playwright/options/Geolocation.java b/playwright/src/main/java/com/microsoft/playwright/options/Geolocation.java index 75cc3784..356df847 100644 --- a/playwright/src/main/java/com/microsoft/playwright/options/Geolocation.java +++ b/playwright/src/main/java/com/microsoft/playwright/options/Geolocation.java @@ -17,33 +17,25 @@ package com.microsoft.playwright.options; public class Geolocation { + /** + * Latitude between -90 and 90. + */ public double latitude; + /** + * Longitude between -180 and 180. + */ public double longitude; + /** + * Non-negative accuracy value. Defaults to {@code 0}. + */ public Double accuracy; - public Geolocation() { - } - public Geolocation(double latitude, double longitude) { - this(latitude, longitude, null); - } - - public Geolocation(double latitude, double longitude, Double accuracy) { this.latitude = latitude; this.longitude = longitude; - this.accuracy = accuracy; - } - - public Geolocation withLatitude(double latitude) { - this.latitude = latitude; - return this; - } - public Geolocation withLongitude(double longitude) { - this.longitude = longitude; - return this; } public Geolocation withAccuracy(double accuracy) { this.accuracy = accuracy; return this; } -} +} \ No newline at end of file diff --git a/playwright/src/main/java/com/microsoft/playwright/options/Timing.java b/playwright/src/main/java/com/microsoft/playwright/options/Timing.java new file mode 100644 index 00000000..ff975b3f --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/options/Timing.java @@ -0,0 +1,65 @@ +/* + * 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.options; + +public class Timing { + /** + * Request start time in milliseconds elapsed since January 1, 1970 00:00:00 UTC + */ + public double startTime; + /** + * Time immediately before the browser starts the domain name lookup for the resource. The value is given in milliseconds + * relative to {@code startTime}, -1 if not available. + */ + public double domainLookupStart; + /** + * Time immediately after the browser starts the domain name lookup for the resource. The value is given in milliseconds + * relative to {@code startTime}, -1 if not available. + */ + public double domainLookupEnd; + /** + * Time immediately before the user agent starts establishing the connection to the server to retrieve the resource. The + * value is given in milliseconds relative to {@code startTime}, -1 if not available. + */ + public double connectStart; + /** + * Time immediately before the browser starts the handshake process to secure the current connection. The value is given in + * milliseconds relative to {@code startTime}, -1 if not available. + */ + public double secureConnectionStart; + /** + * Time immediately before the user agent starts establishing the connection to the server to retrieve the resource. The + * value is given in milliseconds relative to {@code startTime}, -1 if not available. + */ + public double connectEnd; + /** + * Time immediately before the browser starts requesting the resource from the server, cache, or local resource. The value + * is given in milliseconds relative to {@code startTime}, -1 if not available. + */ + public double requestStart; + /** + * Time immediately after the browser starts requesting the resource from the server, cache, or local resource. The value + * is given in milliseconds relative to {@code startTime}, -1 if not available. + */ + public double responseStart; + /** + * Time immediately after the browser receives the last byte of the resource or immediately before the transport connection + * is closed, whichever comes first. The value is given in milliseconds relative to {@code startTime}, -1 if not available. + */ + public double responseEnd; + +} \ No newline at end of file diff --git a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextAddCookies.java b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextAddCookies.java index 22fdc3a2..3f91230b 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextAddCookies.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextAddCookies.java @@ -17,6 +17,7 @@ package com.microsoft.playwright; import com.google.gson.Gson; +import com.microsoft.playwright.options.Cookie; import org.junit.jupiter.api.Test; import java.time.Instant; @@ -35,7 +36,7 @@ public class TestBrowserContextAddCookies extends TestBase { void shouldWork() { page.navigate(server.EMPTY_PAGE); context.addCookies(asList( - new BrowserContext.AddCookie("password", "123456").withUrl(server.EMPTY_PAGE))); + new Cookie("password", "123456").withUrl(server.EMPTY_PAGE))); assertEquals("password=123456", page.evaluate("document.cookie")); } @@ -49,13 +50,13 @@ public class TestBrowserContextAddCookies extends TestBase { " return document.cookie;\n" + "}"); assertEquals("username=John Doe", documentCookie); - List cookies = context.cookies(); + List cookies = context.cookies(); context.clearCookies(); assertEquals(emptyList(), context.cookies()); - context.addCookies(asList(new BrowserContext.AddCookie(cookies.get(0).name(), cookies.get(0).value()) - .withDomain(cookies.get(0).domain()) - .withPath(cookies.get(0).path()) - .withExpires(cookies.get(0).expires()) + context.addCookies(asList(new Cookie(cookies.get(0).name, cookies.get(0).value) + .withDomain(cookies.get(0).domain) + .withPath(cookies.get(0).path) + .withExpires(cookies.get(0).expires) )); assertJsonEquals(new Gson().toJson(cookies), context.cookies()); } @@ -64,7 +65,7 @@ public class TestBrowserContextAddCookies extends TestBase { void shouldSendCookieHeader() throws ExecutionException, InterruptedException { Future request = server.futureRequest("/empty.html"); context.addCookies(asList( - new BrowserContext.AddCookie("cookie", "value").withUrl(server.EMPTY_PAGE))); + new Cookie("cookie", "value").withUrl(server.EMPTY_PAGE))); Page page = context.newPage(); page.navigate(server.EMPTY_PAGE); List cookies = request.get().headers.get("cookie"); @@ -75,17 +76,17 @@ public class TestBrowserContextAddCookies extends TestBase { void shouldIsolateCookiesInBrowserContexts() { BrowserContext anotherContext = browser.newContext(); context.addCookies(asList( - new BrowserContext.AddCookie("isolatecookie", "page1value").withUrl(server.EMPTY_PAGE))); + new Cookie("isolatecookie", "page1value").withUrl(server.EMPTY_PAGE))); anotherContext.addCookies(asList( - new BrowserContext.AddCookie("isolatecookie", "page2value").withUrl(server.EMPTY_PAGE))); - List cookies1 = context.cookies(); - List cookies2 = anotherContext.cookies(); + new Cookie("isolatecookie", "page2value").withUrl(server.EMPTY_PAGE))); + List cookies1 = context.cookies(); + List cookies2 = anotherContext.cookies(); assertEquals(1, cookies1.size()); assertEquals(1, cookies2.size()); - assertEquals("isolatecookie", cookies1.get(0).name()); - assertEquals("page1value", cookies1.get(0).value()); - assertEquals("isolatecookie", cookies2.get(0).name()); - assertEquals("page2value", cookies2.get(0).value()); + assertEquals("isolatecookie", cookies1.get(0).name); + assertEquals("page1value", cookies1.get(0).value); + assertEquals("isolatecookie", cookies2.get(0).name); + assertEquals("page2value", cookies2.get(0).value); anotherContext.close(); } @@ -103,15 +104,15 @@ public class TestBrowserContextAddCookies extends TestBase { { Page page = context.newPage(); page.navigate(server.EMPTY_PAGE); - List cookies = context.cookies(); + List cookies = context.cookies(); assertEquals(1, cookies.size()); - assertEquals("value", cookies.get(0).value()); + assertEquals("value", cookies.get(0).value); } { BrowserContext context2 = browser.newContext(); Page page = context2.newPage(); page.navigate(server.EMPTY_PAGE); - List cookies = context2.cookies(); + List cookies = context2.cookies(); assertEquals(0, cookies.size()); context2.close(); } @@ -133,11 +134,11 @@ public class TestBrowserContextAddCookies extends TestBase { Page page2 = context2.newPage(); page1.navigate(server.EMPTY_PAGE); page2.navigate(server.EMPTY_PAGE); - List cookies1 = context1.cookies(); - List cookies2 = context2.cookies(); + List cookies1 = context1.cookies(); + List cookies2 = context2.cookies(); assertEquals(1, cookies1.size()); - assertEquals("persistent", cookies1.get(0).name()); - assertEquals("persistent-value", cookies1.get(0).value()); + assertEquals("persistent", cookies1.get(0).name); + assertEquals("persistent-value", cookies1.get(0).value); assertEquals(0, cookies2.size()); context2.close(); } @@ -145,7 +146,7 @@ public class TestBrowserContextAddCookies extends TestBase { @Test void shouldIsolateSendCookieHeader() throws ExecutionException, InterruptedException { context.addCookies(asList( - new BrowserContext.AddCookie("sendcookie", "value").withUrl(server.EMPTY_PAGE))); + new Cookie("sendcookie", "value").withUrl(server.EMPTY_PAGE))); { Page page = context.newPage(); Future request = server.futureRequest("/empty.html"); @@ -169,7 +170,7 @@ public class TestBrowserContextAddCookies extends TestBase { // TODO: const browser1 = browserType.launch(browserOptions); Browser browser1 = browserType.launch(); BrowserContext context1 = browser1.newContext(); - context1.addCookies(asList(new BrowserContext.AddCookie("cookie-in-context-1", "value") + context1.addCookies(asList(new Cookie("cookie-in-context-1", "value") .withUrl(server.EMPTY_PAGE) .withExpires(Instant.now().getEpochSecond() + + 10000))); browser1.close(); @@ -177,7 +178,7 @@ public class TestBrowserContextAddCookies extends TestBase { // const browser2 = browserType.launch(browserOptions); Browser browser2 = browserType.launch(); BrowserContext context2 = browser2.newContext(); - List cookies = context2.cookies(); + List cookies = context2.cookies(); assertEquals(0, cookies.size()); browser2.close(); } @@ -186,8 +187,8 @@ public class TestBrowserContextAddCookies extends TestBase { void shouldSetMultipleCookies() { page.navigate(server.EMPTY_PAGE); context.addCookies(asList( - new BrowserContext.AddCookie("multiple-1", "123456").withUrl(server.EMPTY_PAGE), - new BrowserContext.AddCookie("multiple-2", "bar").withUrl(server.EMPTY_PAGE) + new Cookie("multiple-1", "123456").withUrl(server.EMPTY_PAGE), + new Cookie("multiple-2", "bar").withUrl(server.EMPTY_PAGE) )); assertEquals(asList("multiple-1=123456", "multiple-2=bar"), page.evaluate("() => {\n" + " const cookies = document.cookie.split(';');\n" + @@ -198,16 +199,16 @@ public class TestBrowserContextAddCookies extends TestBase { @Test void shouldHaveExpiresSetTo1ForSessionCookies() { context.addCookies(asList( - new BrowserContext.AddCookie("expires", "123456").withUrl(server.EMPTY_PAGE))); - List cookies = context.cookies(); - assertEquals(-1, cookies.get(0).expires()); + new Cookie("expires", "123456").withUrl(server.EMPTY_PAGE))); + List cookies = context.cookies(); + assertEquals(-1, cookies.get(0).expires); } @Test void shouldSetCookieWithReasonableDefaults() { context.addCookies(asList( - new BrowserContext.AddCookie("defaults", "123456").withUrl(server.EMPTY_PAGE))); - List cookies = context.cookies(); + new Cookie("defaults", "123456").withUrl(server.EMPTY_PAGE))); + List cookies = context.cookies(); assertJsonEquals("[{\n" + " name: 'defaults',\n" + " value: '123456',\n" + @@ -223,10 +224,10 @@ public class TestBrowserContextAddCookies extends TestBase { @Test void shouldSetACookieWithAPath() { page.navigate(server.PREFIX + "/grid.html"); - context.addCookies(asList(new BrowserContext.AddCookie("gridcookie", "GRID") + context.addCookies(asList(new Cookie("gridcookie", "GRID") .withDomain("localhost") .withPath("/grid.html"))); - List cookies = context.cookies(); + List cookies = context.cookies(); assertJsonEquals("[{\n" + " name: 'gridcookie',\n" + " value: 'GRID',\n" + @@ -248,8 +249,8 @@ public class TestBrowserContextAddCookies extends TestBase { void shouldNotSetACookieWithBlankPageURL() { try { context.addCookies(asList( - new BrowserContext.AddCookie("example-cookie", "best").withUrl(server.EMPTY_PAGE), - new BrowserContext.AddCookie("example-cookie-blank", "best").withUrl("about:blank") + new Cookie("example-cookie", "best").withUrl(server.EMPTY_PAGE), + new Cookie("example-cookie-blank", "best").withUrl("about:blank") )); fail("did not throw"); } catch (PlaywrightException e) { @@ -261,7 +262,7 @@ public class TestBrowserContextAddCookies extends TestBase { void shouldNotSetACookieOnADataURLPage() { try { context.addCookies(asList( - new BrowserContext.AddCookie("example-cookie", "best").withUrl("data:,Hello%2C%20World!") + new Cookie("example-cookie", "best").withUrl("data:,Hello%2C%20World!") )); fail("did not throw"); } catch (PlaywrightException e) { @@ -274,11 +275,11 @@ public class TestBrowserContextAddCookies extends TestBase { page.navigate(server.EMPTY_PAGE); String SECURE_URL = "https://example.com"; context.addCookies(asList( - new BrowserContext.AddCookie("foo", "bar").withUrl(SECURE_URL) + new Cookie("foo", "bar").withUrl(SECURE_URL) )); - List cookies = context.cookies(SECURE_URL); + List cookies = context.cookies(SECURE_URL); assertEquals(1, cookies.size()); - assertTrue(cookies.get(0).secure()); + assertTrue(cookies.get(0).secure); } @Test @@ -286,18 +287,18 @@ public class TestBrowserContextAddCookies extends TestBase { page.navigate(server.EMPTY_PAGE); String HTTP_URL = "http://example.com"; context.addCookies(asList( - new BrowserContext.AddCookie("foo", "bar").withUrl(HTTP_URL) + new Cookie("foo", "bar").withUrl(HTTP_URL) )); - List cookies = context.cookies(HTTP_URL); + List cookies = context.cookies(HTTP_URL); assertEquals(1, cookies.size()); - assertFalse(cookies.get(0).secure()); + assertFalse(cookies.get(0).secure); } @Test void shouldSetACookieOnADifferentDomain() { page.navigate(server.EMPTY_PAGE); context.addCookies(asList( - new BrowserContext.AddCookie("example-cookie", "best").withUrl("https://www.example.com") + new Cookie("example-cookie", "best").withUrl("https://www.example.com") )); assertEquals("", page.evaluate("document.cookie")); assertJsonEquals("[{\n" + @@ -316,7 +317,7 @@ public class TestBrowserContextAddCookies extends TestBase { void shouldSetCookiesForAFrame() { page.navigate(server.EMPTY_PAGE); context.addCookies(asList( - new BrowserContext.AddCookie("frame-cookie", "value").withUrl(server.PREFIX) + new Cookie("frame-cookie", "value").withUrl(server.PREFIX) )); page.evaluate("src => {\n" + " let fulfill;\n" + @@ -345,7 +346,7 @@ public class TestBrowserContextAddCookies extends TestBase { page.frames().get(1).evaluate("document.cookie = 'username=John Doe'"); page.waitForTimeout(2000); boolean allowsThirdParty = isChromium() || isFirefox(); - List cookies = context.cookies(server.CROSS_PROCESS_PREFIX + "/grid.html"); + List cookies = context.cookies(server.CROSS_PROCESS_PREFIX + "/grid.html"); if (allowsThirdParty) { assertJsonEquals("[{\n" + " 'domain': '127.0.0.1',\n" + diff --git a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextClearCookies.java b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextClearCookies.java index d015fb85..01928c8a 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextClearCookies.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextClearCookies.java @@ -16,6 +16,7 @@ package com.microsoft.playwright; +import com.microsoft.playwright.options.Cookie; import org.junit.jupiter.api.Test; import static java.util.Arrays.asList; @@ -27,7 +28,7 @@ public class TestBrowserContextClearCookies extends TestBase { void shouldClearCookies() { page.navigate(server.EMPTY_PAGE); context.addCookies(asList( - new BrowserContext.AddCookie("cookie1", "1").withUrl(server.EMPTY_PAGE))); + new Cookie("cookie1", "1").withUrl(server.EMPTY_PAGE))); assertEquals("cookie1=1", page.evaluate("document.cookie")); context.clearCookies(); assertEquals(emptyList(), context.cookies()); @@ -39,9 +40,9 @@ public class TestBrowserContextClearCookies extends TestBase { void shouldIsolateCookiesWhenClearing() { BrowserContext anotherContext = browser.newContext(); context.addCookies(asList( - new BrowserContext.AddCookie("page1cookie", "page1value").withUrl(server.EMPTY_PAGE))); + new Cookie("page1cookie", "page1value").withUrl(server.EMPTY_PAGE))); anotherContext.addCookies(asList( - new BrowserContext.AddCookie("page2cookie", "page2value").withUrl(server.EMPTY_PAGE))); + new Cookie("page2cookie", "page2value").withUrl(server.EMPTY_PAGE))); assertEquals(1, (context.cookies()).size()); assertEquals(1, (anotherContext.cookies()).size()); diff --git a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextCookies.java b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextCookies.java index 9c9b0fa3..052214d9 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextCookies.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextCookies.java @@ -16,6 +16,7 @@ package com.microsoft.playwright; +import com.microsoft.playwright.options.Cookie; import com.microsoft.playwright.options.SameSiteAttribute; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIf; @@ -38,7 +39,7 @@ public class TestBrowserContextCookies extends TestBase { " return document.cookie;\n" + "}"); assertEquals("username=John Doe", documentCookie); - List cookies = context.cookies(); + List cookies = context.cookies(); assertJsonEquals("[{\n" + " name: 'username',\n" + " value: 'John Doe',\n" + @@ -63,15 +64,15 @@ public class TestBrowserContextCookies extends TestBase { " }"); assertEquals("username=John Doe", documentCookie); int timestamp = (Integer) page.evaluate("+(new Date('1/1/2038'))/1000"); - BrowserContext.Cookie cookie = context.cookies().get(0); - assertEquals("username", cookie.name()); - assertEquals("John Doe", cookie.value()); - assertEquals("localhost", cookie.domain()); - assertEquals("/", cookie.path()); - assertEquals(timestamp, cookie.expires()); - assertEquals(false, cookie.httpOnly()); - assertEquals(false, cookie.secure()); - assertEquals(SameSiteAttribute.NONE, cookie.sameSite()); + Cookie cookie = context.cookies().get(0); + assertEquals("username", cookie.name); + assertEquals("John Doe", cookie.value); + assertEquals("localhost", cookie.domain); + assertEquals("/", cookie.path); + assertEquals(timestamp, cookie.expires); + assertEquals(false, cookie.httpOnly); + assertEquals(false, cookie.secure); + assertEquals(SameSiteAttribute.NONE, cookie.sameSite); } @Test @@ -82,9 +83,9 @@ public class TestBrowserContextCookies extends TestBase { exchange.getResponseBody().close(); }); page.navigate(server.EMPTY_PAGE); - List cookies = context.cookies(); + List cookies = context.cookies(); assertEquals(1, cookies.size()); - assertTrue(cookies.get(0).httpOnly()); + assertTrue(cookies.get(0).httpOnly); } static boolean isWebKitWindows() { @@ -100,9 +101,9 @@ public class TestBrowserContextCookies extends TestBase { exchange.getResponseBody().close(); }); page.navigate(server.EMPTY_PAGE); - List cookies = context.cookies(); + List cookies = context.cookies(); assertEquals(1, cookies.size()); - assertEquals(SameSiteAttribute.STRICT, cookies.get(0).sameSite()); + assertEquals(SameSiteAttribute.STRICT, cookies.get(0).sameSite); } @Test @@ -114,9 +115,9 @@ public class TestBrowserContextCookies extends TestBase { exchange.getResponseBody().close(); }); page.navigate(server.EMPTY_PAGE); - List cookies = context.cookies(); + List cookies = context.cookies(); assertEquals(1, cookies.size()); - assertEquals(SameSiteAttribute.LAX, cookies.get(0).sameSite()); + assertEquals(SameSiteAttribute.LAX, cookies.get(0).sameSite); } @Test @@ -127,8 +128,8 @@ public class TestBrowserContextCookies extends TestBase { " document.cookie = 'password=1234';\n" + " return document.cookie.split('; ').sort().join('; ');\n" + "}"); - List cookies = context.cookies(); - cookies.sort(Comparator.comparing(BrowserContext.Cookie::name)); + List cookies = context.cookies(); + cookies.sort(Comparator.comparing(c -> c.name)); assertEquals("password=1234; username=John Doe", documentCookie); assertJsonEquals("[\n" + " {\n" + @@ -157,11 +158,11 @@ public class TestBrowserContextCookies extends TestBase { @Test void shouldGetCookiesFromMultipleUrls() { context.addCookies(asList( - new BrowserContext.AddCookie("doggo", "woofs").withUrl("https://foo.com"), - new BrowserContext.AddCookie("catto", "purrs").withUrl("https://bar.com"), - new BrowserContext.AddCookie("birdo", "tweets").withUrl("https://baz.com"))); - List cookies = context.cookies(asList("https://foo.com", "https://baz.com")); - cookies.sort(Comparator.comparing(BrowserContext.Cookie::name)); + new Cookie("doggo", "woofs").withUrl("https://foo.com"), + new Cookie("catto", "purrs").withUrl("https://bar.com"), + new Cookie("birdo", "tweets").withUrl("https://baz.com"))); + List cookies = context.cookies(asList("https://foo.com", "https://baz.com")); + cookies.sort(Comparator.comparing(c -> c.name)); assertJsonEquals("[{\n" + " name: 'birdo',\n" + " value: 'tweets',\n" + diff --git a/playwright/src/test/java/com/microsoft/playwright/TestElementHandleBoundingBox.java b/playwright/src/test/java/com/microsoft/playwright/TestElementHandleBoundingBox.java index 6642f8a5..885823da 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestElementHandleBoundingBox.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestElementHandleBoundingBox.java @@ -16,6 +16,7 @@ package com.microsoft.playwright; +import com.microsoft.playwright.options.BoundingBox; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIf; @@ -35,7 +36,7 @@ public class TestElementHandleBoundingBox extends TestBase { page.setViewportSize(500, 500); page.navigate(server.PREFIX + "/grid.html"); ElementHandle elementHandle = page.querySelector(".box:nth-of-type(13)"); - ElementHandle.BoundingBox box = elementHandle.boundingBox(); + BoundingBox box = elementHandle.boundingBox(); assertEquals(100, box.x); assertEquals(50, box.y); assertEquals(50, box.width); @@ -49,7 +50,7 @@ public class TestElementHandleBoundingBox extends TestBase { Frame nestedFrame = page.frameByName("dos"); assertNotNull(nestedFrame); ElementHandle elementHandle = nestedFrame.querySelector("div"); - ElementHandle.BoundingBox box = elementHandle.boundingBox(); + BoundingBox box = elementHandle.boundingBox(); assertEquals(24, box.x); assertEquals(224, box.y); assertEquals(268, box.width); @@ -69,7 +70,7 @@ public class TestElementHandleBoundingBox extends TestBase { page.setContent("
hello
"); ElementHandle elementHandle = page.querySelector("div"); page.evaluate("element => element.style.height = '200px'", elementHandle); - ElementHandle.BoundingBox box = elementHandle.boundingBox(); + BoundingBox box = elementHandle.boundingBox(); assertEquals(box.x, 8); assertEquals(box.y, 8); assertEquals(box.width, 100); @@ -82,7 +83,7 @@ public class TestElementHandleBoundingBox extends TestBase { "\n" + ""); ElementHandle element = page.querySelector("#therect"); - ElementHandle.BoundingBox pwBoundingBox = element.boundingBox(); + BoundingBox pwBoundingBox = element.boundingBox(); @SuppressWarnings("unchecked") Map webBoundingBox = (Map) page.evaluate("e => {\n" + " const rect = e.getBoundingClientRect();\n" + @@ -110,7 +111,7 @@ public class TestElementHandleBoundingBox extends TestBase { " button.style.marginLeft = '17px';\n" + " button.style.marginTop = '23px';\n" + "}"); - ElementHandle.BoundingBox box = button.boundingBox(); + BoundingBox box = button.boundingBox(); assertEquals(17 * 100, round(box.x * 100)); assertEquals(23 * 100, round(box.y * 100)); assertEquals(200 * 100, round(box.width * 100)); @@ -139,7 +140,7 @@ public class TestElementHandleBoundingBox extends TestBase { "\n" + "woofdoggo"); ElementHandle handle = page.querySelector("span"); - ElementHandle.BoundingBox pwBoundingBox = handle.boundingBox(); + BoundingBox pwBoundingBox = handle.boundingBox(); @SuppressWarnings("unchecked") Map webBoundingBox = (Map) handle.evaluate("e => {\n" + " const rect = e.getBoundingClientRect();\n" + diff --git a/playwright/src/test/java/com/microsoft/playwright/TestGeolocation.java b/playwright/src/test/java/com/microsoft/playwright/TestGeolocation.java index 2b39b1d2..c15de764 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestGeolocation.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestGeolocation.java @@ -111,7 +111,7 @@ public class TestGeolocation extends TestBase { page.navigate(server.EMPTY_PAGE); List messages = new ArrayList<>(); page.onConsole(message -> messages.add(message.text())); - context.setGeolocation(new Geolocation()); + context.setGeolocation(new Geolocation(0, 0)); page.evaluate("() => {\n" + " navigator.geolocation.watchPosition(pos => {\n" + " const coords = pos.coords;\n" + diff --git a/playwright/src/test/java/com/microsoft/playwright/TestPageRoute.java b/playwright/src/test/java/com/microsoft/playwright/TestPageRoute.java index 2cdb9ef1..01402fee 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestPageRoute.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestPageRoute.java @@ -16,6 +16,7 @@ package com.microsoft.playwright; +import com.microsoft.playwright.options.Cookie; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIf; @@ -148,7 +149,7 @@ public class TestPageRoute extends TestBase { void shouldProperlyReturnNavigationResponseWhenURLHasCookies() { // Setup cookie. page.navigate(server.EMPTY_PAGE); - context.addCookies(asList(new BrowserContext.AddCookie("foo", "bar") + context.addCookies(asList(new Cookie("foo", "bar") .withUrl(server.EMPTY_PAGE))); // Setup request interception. page.route("**/*", route -> route.resume()); diff --git a/scripts/CLI_VERSION b/scripts/CLI_VERSION index 071e906d..18f1b652 100644 --- a/scripts/CLI_VERSION +++ b/scripts/CLI_VERSION @@ -1 +1 @@ -1.9.0-next-1612986115000 +1.9.0-next-1612996040000 diff --git a/tools/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java b/tools/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java index 44083666..6ce5e0cf 100644 --- a/tools/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java +++ b/tools/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java @@ -24,7 +24,6 @@ import com.google.gson.JsonObject; import java.io.*; import java.nio.file.FileSystems; import java.util.*; -import java.util.stream.Collectors; import static java.util.Arrays.asList; import static java.util.Collections.reverse; @@ -120,48 +119,6 @@ class TypeRef extends Element { createCustomType(); } - enum GeneratedType { ENUM, CLASS, OTHER }; - private static GeneratedType generatedTypeFor(JsonObject jsonType) { - if (jsonType.has("union")) { - if (!jsonType.get("name").getAsString().isEmpty()) { - return GeneratedType.ENUM; - } - for (JsonElement item : jsonType.getAsJsonArray("union")) { - String valueName = item.getAsJsonObject().get("name").getAsString(); - if ("null".equals(valueName)) { - continue; - } - GeneratedType memberType = generatedTypeFor(item.getAsJsonObject()); - if (memberType == GeneratedType.ENUM) { - // Nullable enum. - return GeneratedType.ENUM; - } - // If a value is not null and not a string it is a class name. - return GeneratedType.OTHER; - } - throw new RuntimeException("Unknown union type: " + jsonType); - } - - switch (jsonType.get("name").getAsString()) { - case "Object": { - String expression = typeExpression(jsonType); - if ("Object".equals(expression) || "Object".equals(expression)) { - return GeneratedType.OTHER; - } - return GeneratedType.CLASS; - } - case "Array": - case "Promise": { - for (JsonElement item : jsonType.getAsJsonArray("templates")) { - return generatedTypeFor(item.getAsJsonObject()); - } - return GeneratedType.OTHER; - } - default: - return GeneratedType.OTHER; - } - } - private static String typeExpression(JsonObject jsonType) { String typeName = jsonType.get("name").getAsString(); if (jsonType.has("union")) { @@ -200,52 +157,26 @@ class TypeRef extends Element { } void createCustomType() { - GeneratedType generatedType = generatedTypeFor(stripNullable()); - if (generatedType == GeneratedType.ENUM) { - createEnums(jsonElement.getAsJsonObject()); - return; - } - // Use path to the corresponding method, param of field as the key. String parentPath = parent.jsonPath; Types.Mapping mapping = TypeDefinition.types.findForPath(parentPath); - if (mapping == null) { - if (generatedType != GeneratedType.CLASS) { - return; - } - - if (parent instanceof Field) { - customType = toTitle(parent.jsonName); - } else { - customType = toTitle(parent.parent.jsonName) + toTitle(parent.jsonName); - } - } else { + if (mapping != null) { String typeExpression = typeExpression(jsonElement.getAsJsonObject()); if (!mapping.from.equals(typeExpression)) { throw new RuntimeException("Unexpected source type for: " + parentPath +". Expected: " + mapping.from + "; found: " + typeExpression); } customType = mapping.to; - if (mapping.customMapping != null) { - mapping.customMapping.defineTypesIn(typeScope()); - return; - } - } - if (generatedType == GeneratedType.CLASS) { - if (parent instanceof Field ) { - typeScope().createTopLevelClass(customType, this, jsonElement.getAsJsonObject()); - } else { - typeScope().createNestedClass(customType, this, jsonElement.getAsJsonObject()); - isNestedClass = true; - } + return; } + createClassesAndEnums(jsonElement.getAsJsonObject()); } - private void createEnums(JsonObject jsonObject) { + private void createClassesAndEnums(JsonObject jsonObject) { if (jsonObject.has("union")) { if (jsonObject.get("name").getAsString().isEmpty()) { for (JsonElement item : jsonObject.getAsJsonArray("union")) { if (item.isJsonObject()) { - createEnums(item.getAsJsonObject()); + createClassesAndEnums(item.getAsJsonObject()); } } } else { @@ -256,9 +187,26 @@ class TypeRef extends Element { if (jsonObject.has("templates")) { for (JsonElement item : jsonObject.getAsJsonArray("templates")) { if (item.isJsonObject()) { - createEnums(item.getAsJsonObject()); + createClassesAndEnums(item.getAsJsonObject()); } } + return; + } + if ("Object".equals(jsonObject.get("name").getAsString())) { + if (customType != null) { + throw new RuntimeException("Custom type has already been created: " + customType); + } + if (parent.jsonName.equals("cookies")) { + customType = "Cookie"; + typeScope().createTopLevelClass(customType, this, jsonElement.getAsJsonObject()); + } else if (parent instanceof Method || parent instanceof Field || (parent instanceof Param && !"options".equals(parent.jsonName))) { + customType = toTitle(parent.jsonName); + typeScope().createTopLevelClass(customType, this, jsonElement.getAsJsonObject()); + } else { + customType = toTitle(parent.parent.jsonName) + toTitle(parent.jsonName); + typeScope().createNestedClass(customType, this, jsonElement.getAsJsonObject()); + isNestedClass = true; + } } } @@ -269,18 +217,6 @@ class TypeRef extends Element { if (jsonElement.isJsonNull()) { return "void"; } - // Convert optional fields to boxed types. - if (!parent.jsonElement.getAsJsonObject().get("required").getAsBoolean()) { - if (jsonName.equals("int")) { - return "Integer"; - } - if (jsonName.equals("float")) { - return "Double"; - } - if (jsonName.equals("boolean")) { - return "Boolean"; - } - } return convertBuiltinType(stripNullable()); } @@ -525,7 +461,7 @@ class Method extends Element { "List cookies(List urls);", }); customSignature.put("BrowserContext.addCookies", new String[]{ - "void addCookies(List cookies);" + "void addCookies(List cookies);" }); customSignature.put("FileChooser.setFiles", new String[]{ "default void setFiles(Path file) { setFiles(file, null); }", @@ -771,7 +707,7 @@ class Field extends Element { jsonElement.getAsJsonObject().get("required").getAsBoolean(); } - void writeTo(List output, String offset, String access) { + void writeTo(List output, String offset) { writeJavadoc(output, offset, comment()); if (asList("Frame.waitForNavigation.options.url", "Page.waitForNavigation.options.url").contains(jsonPath)) { @@ -789,7 +725,17 @@ class Field extends Element { if (type.isNullable()) { typeStr = "Optional<" + typeStr + ">"; } - output.add(offset + access + typeStr + " " + name + ";"); + // Convert optional fields to boxed types. + if (!isRequired()) { + if (typeStr.equals("int")) { + typeStr = "Integer"; + } else if (typeStr.equals("double")) { + typeStr = "Double"; + } else if (typeStr.equals("boolean")) { + typeStr = "Boolean"; + } + } + output.add(offset + "public " + typeStr + " " + name + ";"); } void writeGetter(List output, String offset) { @@ -949,7 +895,7 @@ class Interface extends TypeDefinition { if ("Playwright".equals(jsonName)) { output.add("import com.microsoft.playwright.impl.PlaywrightImpl;"); } - if (asList("Page", "Frame", "ElementHandle", "Browser", "BrowserContext", "BrowserType", "Mouse", "Keyboard").contains(jsonName)) { + if (asList("Page", "Request", "Frame", "ElementHandle", "Browser", "BrowserContext", "BrowserType", "Mouse", "Keyboard").contains(jsonName)) { output.add("import com.microsoft.playwright.options.*;"); } if (jsonName.equals("Route")) { @@ -1042,13 +988,6 @@ class Interface extends TypeDefinition { break; } case "ElementHandle": { - output.add(offset + "class BoundingBox {"); - output.add(offset + " public double x;"); - output.add(offset + " public double y;"); - output.add(offset + " public double width;"); - output.add(offset + " public double height;"); - output.add(offset + "}"); - output.add(""); output.add(offset + "class SelectOption {"); output.add(offset + " public String value;"); output.add(offset + " public String label;"); @@ -1131,22 +1070,17 @@ class NestedClass extends TypeDefinition { if (asList("RecordHar", "RecordVideo").contains(name)) { output.add("import java.nio.file.Path;"); } - String access = parent.typeScope() instanceof NestedClass ? "public " : ""; + String access = (parent.typeScope() instanceof NestedClass) || topLevelClasses().containsKey(name) ? "public " : ""; output.add(offset + access + "class " + name + " {"); String bodyOffset = offset + " "; super.writeTo(output, bodyOffset); boolean isReturnType = parent.parent instanceof Method; - String fieldAccess = isReturnType ? "private " : "public "; for (Field f : fields) { - f.writeTo(output, bodyOffset, fieldAccess); + f.writeTo(output, bodyOffset); } output.add(""); - if (isReturnType) { - for (Field f : fields) { - f.writeGetter(output, bodyOffset); - } - } else { + if (!isReturnType) { writeConstructor(output, bodyOffset); writeBuilderMethods(output, bodyOffset); if (asList("Browser.newContext.options", diff --git a/tools/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java b/tools/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java index 41f9b699..4aad6ef2 100644 --- a/tools/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java +++ b/tools/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java @@ -57,18 +57,12 @@ class Types { add("Page.addInitScript.script", "Object|function|string", "String"); add("Selectors.register.script", "Object|function|string", "String"); - // Return structures - add("ConsoleMessage.location", "Object", "Location"); - add("ElementHandle.boundingBox", "Object|null", "BoundingBox", new Empty()); - // The method has custom signatures add("BrowserContext.cookies", "Array", "Cookie"); - add("BrowserContext.cookies.sameSite", "\"Lax\"|\"None\"|\"Strict\"", "SameSite", new Empty()); - add("BrowserContext.addCookies.cookies", "Array", "AddCookie"); - add("BrowserContext.addCookies.cookies.sameSite", "\"Lax\"|\"None\"|\"Strict\"", "SameSite", new Empty()); add("BrowserContext.route.url", "RegExp|function(URL):boolean|string", "String"); add("BrowserContext.unroute.url", "RegExp|function(URL):boolean|string", "String"); add("Page.waitForNavigation.options.url", "RegExp|function(URL):boolean|string", "Custom"); + add("Page.frame.frameSelector", "Object|string", "Custom", new Empty()); add("Page.frame.options", "Object", "FrameOptions", new Empty()); add("Page.route.url", "RegExp|function(URL):boolean|string", "String"); add("Page.selectOption.values", "Array|Array|Array|ElementHandle|Object|null|string", "String"); @@ -84,11 +78,6 @@ class Types { add("FileChooser.setFiles.files", "Array|Array|Object|path", "String"); add("Route.resume.options.postData", "Buffer|string", "byte[]", new Empty()); - add("BrowserContext.setGeolocation.geolocation", "Object|null", "Geolocation", new Empty()); - add("Browser.newContext.options.geolocation", "Object", "Geolocation", new Empty()); - add("Browser.newPage.options.geolocation", "Object", "Geolocation", new Empty()); - add("BrowserType.launchPersistentContext.options.geolocation", "Object", "Geolocation", new Empty()); - // TODO: fix upstream types! add("Playwright.devices", "Object", "Map", new Empty()); }