chore: use Path instead of File in public API (#56)

This commit is contained in:
Yury Semikhatsky 2020-10-29 17:58:02 -07:00 committed by GitHub
parent 4a65757957
commit 3da0ac6e85
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 301 additions and 272 deletions

View File

@ -285,30 +285,30 @@ class Method extends Element {
"void addCookies(List<AddCookie> cookies);" "void addCookies(List<AddCookie> cookies);"
}); });
customSignature.put("FileChooser.setFiles", new String[]{ customSignature.put("FileChooser.setFiles", new String[]{
"default void setFiles(File file) { setFiles(file, null); }", "default void setFiles(Path file) { setFiles(file, null); }",
"default void setFiles(File file, SetFilesOptions options) { setFiles(new File[]{ file }, options); }", "default void setFiles(Path file, SetFilesOptions options) { setFiles(new Path[]{ file }, options); }",
"default void setFiles(File[] files) { setFiles(files, null); }", "default void setFiles(Path[] files) { setFiles(files, null); }",
"void setFiles(File[] files, SetFilesOptions options);", "void setFiles(Path[] files, SetFilesOptions options);",
"default void setFiles(FileChooser.FilePayload file) { setFiles(file, null); }", "default void setFiles(FileChooser.FilePayload file) { setFiles(file, null); }",
"default void setFiles(FileChooser.FilePayload file, SetFilesOptions options) { setFiles(new FileChooser.FilePayload[]{ file }, options); }", "default void setFiles(FileChooser.FilePayload file, SetFilesOptions options) { setFiles(new FileChooser.FilePayload[]{ file }, options); }",
"default void setFiles(FileChooser.FilePayload[] files) { setFiles(files, null); }", "default void setFiles(FileChooser.FilePayload[] files) { setFiles(files, null); }",
"void setFiles(FileChooser.FilePayload[] files, SetFilesOptions options);", "void setFiles(FileChooser.FilePayload[] files, SetFilesOptions options);",
}); });
customSignature.put("ElementHandle.setInputFiles", new String[]{ customSignature.put("ElementHandle.setInputFiles", new String[]{
"default void setInputFiles(File file) { setInputFiles(file, null); }", "default void setInputFiles(Path file) { setInputFiles(file, null); }",
"default void setInputFiles(File file, SetInputFilesOptions options) { setInputFiles(new File[]{ file }, options); }", "default void setInputFiles(Path file, SetInputFilesOptions options) { setInputFiles(new Path[]{ file }, options); }",
"default void setInputFiles(File[] files) { setInputFiles(files, null); }", "default void setInputFiles(Path[] files) { setInputFiles(files, null); }",
"void setInputFiles(File[] files, SetInputFilesOptions options);", "void setInputFiles(Path[] files, SetInputFilesOptions options);",
"default void setInputFiles(FileChooser.FilePayload file) { setInputFiles(file, null); }", "default void setInputFiles(FileChooser.FilePayload file) { setInputFiles(file, null); }",
"default void setInputFiles(FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(new FileChooser.FilePayload[]{ file }, options); }", "default void setInputFiles(FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(new FileChooser.FilePayload[]{ file }, options); }",
"default void setInputFiles(FileChooser.FilePayload[] files) { setInputFiles(files, null); }", "default void setInputFiles(FileChooser.FilePayload[] files) { setInputFiles(files, null); }",
"void setInputFiles(FileChooser.FilePayload[] files, SetInputFilesOptions options);", "void setInputFiles(FileChooser.FilePayload[] files, SetInputFilesOptions options);",
}); });
String[] setInputFilesWithSelector = { String[] setInputFilesWithSelector = {
"default void setInputFiles(String selector, File file) { setInputFiles(selector, file, null); }", "default void setInputFiles(String selector, Path file) { setInputFiles(selector, file, null); }",
"default void setInputFiles(String selector, File file, SetInputFilesOptions options) { setInputFiles(selector, new File[]{ file }, options); }", "default void setInputFiles(String selector, Path file, SetInputFilesOptions options) { setInputFiles(selector, new Path[]{ file }, options); }",
"default void setInputFiles(String selector, File[] files) { setInputFiles(selector, files, null); }", "default void setInputFiles(String selector, Path[] files) { setInputFiles(selector, files, null); }",
"void setInputFiles(String selector, File[] files, SetInputFilesOptions options);", "void setInputFiles(String selector, Path[] files, SetInputFilesOptions options);",
"default void setInputFiles(String selector, FileChooser.FilePayload file) { setInputFiles(selector, file, null); }", "default void setInputFiles(String selector, FileChooser.FilePayload file) { setInputFiles(selector, file, null); }",
"default void setInputFiles(String selector, FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(selector, new FileChooser.FilePayload[]{ file }, options); }", "default void setInputFiles(String selector, FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(selector, new FileChooser.FilePayload[]{ file }, options); }",
"default void setInputFiles(String selector, FileChooser.FilePayload[] files) { setInputFiles(selector, files, null); }", "default void setInputFiles(String selector, FileChooser.FilePayload[] files) { setInputFiles(selector, files, null); }",
@ -643,13 +643,10 @@ class Interface extends TypeDefinition {
if (jsonName.equals("Route")) { if (jsonName.equals("Route")) {
output.add("import java.nio.charset.StandardCharsets;"); output.add("import java.nio.charset.StandardCharsets;");
} }
if (asList("Page", "Frame", "ElementHandle", "FileChooser", "ChromiumBrowser").contains(jsonName)) {
output.add("import java.io.File;");
}
if ("Download".equals(jsonName)) { if ("Download".equals(jsonName)) {
output.add("import java.io.InputStream;"); output.add("import java.io.InputStream;");
} }
if (asList("Download", "Route").contains(jsonName)) { if (asList("Page", "Frame", "ElementHandle", "FileChooser", "ChromiumBrowser", "Download", "Route").contains(jsonName)) {
output.add("import java.nio.file.Path;"); output.add("import java.nio.file.Path;");
} }
output.add("import java.util.*;"); output.add("import java.util.*;");

View File

@ -95,16 +95,16 @@ class Types {
add("BrowserType.launchPersistentContext.options.colorScheme", "\"dark\"|\"light\"|\"no-preference\"", "ColorScheme"); add("BrowserType.launchPersistentContext.options.colorScheme", "\"dark\"|\"light\"|\"no-preference\"", "ColorScheme");
// File // File
add("Page.addScriptTag.options.path", "string", "File"); add("Page.addScriptTag.options.path", "string", "Path");
add("Page.addStyleTag.options.path", "string", "File"); add("Page.addStyleTag.options.path", "string", "Path");
add("Page.pdf.options.path", "string", "File"); add("Page.pdf.options.path", "string", "Path");
add("Page.screenshot.options.path", "string", "File"); add("Page.screenshot.options.path", "string", "Path");
add("Frame.addScriptTag.options.path", "string", "File"); add("Frame.addScriptTag.options.path", "string", "Path");
add("Frame.addStyleTag.options.path", "string", "File"); add("Frame.addStyleTag.options.path", "string", "Path");
add("ElementHandle.screenshot.options.path", "string", "File"); add("ElementHandle.screenshot.options.path", "string", "Path");
add("Route.fulfill.response.path", "string", "Path"); add("Route.fulfill.response.path", "string", "Path");
add("Route.fulfill.response.status", "number", "int"); add("Route.fulfill.response.status", "number", "int");
add("ChromiumBrowser.startTracing.options.path", "string", "File"); add("ChromiumBrowser.startTracing.options.path", "string", "Path");
// Route // Route
add("BrowserContext.route.handler", "function(Route, Request)", "BiConsumer<Route, Request>"); add("BrowserContext.route.handler", "function(Route, Request)", "BiConsumer<Route, Request>");

View File

@ -16,16 +16,16 @@
package com.microsoft.playwright; package com.microsoft.playwright;
import java.io.File; import java.nio.file.Path;
import java.util.*; import java.util.*;
public interface ChromiumBrowser extends Browser { public interface ChromiumBrowser extends Browser {
class StartTracingOptions { class StartTracingOptions {
public File path; public Path path;
public Boolean screenshots; public Boolean screenshots;
public List<String> categories; public List<String> categories;
public StartTracingOptions withPath(File path) { public StartTracingOptions withPath(Path path) {
this.path = path; this.path = path;
return this; return this;
} }

View File

@ -16,7 +16,7 @@
package com.microsoft.playwright; package com.microsoft.playwright;
import java.io.File; import java.nio.file.Path;
import java.util.*; import java.util.*;
public interface ElementHandle extends JSHandle { public interface ElementHandle extends JSHandle {
@ -211,13 +211,13 @@ public interface ElementHandle extends JSHandle {
} }
class ScreenshotOptions { class ScreenshotOptions {
public enum Type { JPEG, PNG } public enum Type { JPEG, PNG }
public File path; public Path path;
public Type type; public Type type;
public Integer quality; public Integer quality;
public Boolean omitBackground; public Boolean omitBackground;
public Integer timeout; public Integer timeout;
public ScreenshotOptions withPath(File path) { public ScreenshotOptions withPath(Path path) {
this.path = path; this.path = path;
return this; return this;
} }
@ -434,10 +434,10 @@ public interface ElementHandle extends JSHandle {
selectText(null); selectText(null);
} }
void selectText(SelectTextOptions options); void selectText(SelectTextOptions options);
default void setInputFiles(File file) { setInputFiles(file, null); } default void setInputFiles(Path file) { setInputFiles(file, null); }
default void setInputFiles(File file, SetInputFilesOptions options) { setInputFiles(new File[]{ file }, options); } default void setInputFiles(Path file, SetInputFilesOptions options) { setInputFiles(new Path[]{ file }, options); }
default void setInputFiles(File[] files) { setInputFiles(files, null); } default void setInputFiles(Path[] files) { setInputFiles(files, null); }
void setInputFiles(File[] files, SetInputFilesOptions options); void setInputFiles(Path[] files, SetInputFilesOptions options);
default void setInputFiles(FileChooser.FilePayload file) { setInputFiles(file, null); } default void setInputFiles(FileChooser.FilePayload file) { setInputFiles(file, null); }
default void setInputFiles(FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(new FileChooser.FilePayload[]{ file }, options); } default void setInputFiles(FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(new FileChooser.FilePayload[]{ file }, options); }
default void setInputFiles(FileChooser.FilePayload[] files) { setInputFiles(files, null); } default void setInputFiles(FileChooser.FilePayload[] files) { setInputFiles(files, null); }

View File

@ -16,7 +16,7 @@
package com.microsoft.playwright; package com.microsoft.playwright;
import java.io.File; import java.nio.file.Path;
import java.util.*; import java.util.*;
public interface FileChooser { public interface FileChooser {
@ -48,10 +48,10 @@ public interface FileChooser {
ElementHandle element(); ElementHandle element();
boolean isMultiple(); boolean isMultiple();
Page page(); Page page();
default void setFiles(File file) { setFiles(file, null); } default void setFiles(Path file) { setFiles(file, null); }
default void setFiles(File file, SetFilesOptions options) { setFiles(new File[]{ file }, options); } default void setFiles(Path file, SetFilesOptions options) { setFiles(new Path[]{ file }, options); }
default void setFiles(File[] files) { setFiles(files, null); } default void setFiles(Path[] files) { setFiles(files, null); }
void setFiles(File[] files, SetFilesOptions options); void setFiles(Path[] files, SetFilesOptions options);
default void setFiles(FileChooser.FilePayload file) { setFiles(file, null); } default void setFiles(FileChooser.FilePayload file) { setFiles(file, null); }
default void setFiles(FileChooser.FilePayload file, SetFilesOptions options) { setFiles(new FileChooser.FilePayload[]{ file }, options); } default void setFiles(FileChooser.FilePayload file, SetFilesOptions options) { setFiles(new FileChooser.FilePayload[]{ file }, options); }
default void setFiles(FileChooser.FilePayload[] files) { setFiles(files, null); } default void setFiles(FileChooser.FilePayload[] files) { setFiles(files, null); }

View File

@ -16,7 +16,7 @@
package com.microsoft.playwright; package com.microsoft.playwright;
import java.io.File; import java.nio.file.Path;
import java.util.*; import java.util.*;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -25,7 +25,7 @@ public interface Frame {
enum LoadState { DOMCONTENTLOADED, LOAD, NETWORKIDLE } enum LoadState { DOMCONTENTLOADED, LOAD, NETWORKIDLE }
class AddScriptTagOptions { class AddScriptTagOptions {
public String url; public String url;
public File path; public Path path;
public String content; public String content;
public String type; public String type;
@ -33,7 +33,7 @@ public interface Frame {
this.url = url; this.url = url;
return this; return this;
} }
public AddScriptTagOptions withPath(File path) { public AddScriptTagOptions withPath(Path path) {
this.path = path; this.path = path;
return this; return this;
} }
@ -48,14 +48,14 @@ public interface Frame {
} }
class AddStyleTagOptions { class AddStyleTagOptions {
public String url; public String url;
public File path; public Path path;
public String content; public String content;
public AddStyleTagOptions withUrl(String url) { public AddStyleTagOptions withUrl(String url) {
this.url = url; this.url = url;
return this; return this;
} }
public AddStyleTagOptions withPath(File path) { public AddStyleTagOptions withPath(Path path) {
this.path = path; this.path = path;
return this; return this;
} }
@ -555,10 +555,10 @@ public interface Frame {
setContent(html, null); setContent(html, null);
} }
void setContent(String html, SetContentOptions options); void setContent(String html, SetContentOptions options);
default void setInputFiles(String selector, File file) { setInputFiles(selector, file, null); } default void setInputFiles(String selector, Path file) { setInputFiles(selector, file, null); }
default void setInputFiles(String selector, File file, SetInputFilesOptions options) { setInputFiles(selector, new File[]{ file }, options); } default void setInputFiles(String selector, Path file, SetInputFilesOptions options) { setInputFiles(selector, new Path[]{ file }, options); }
default void setInputFiles(String selector, File[] files) { setInputFiles(selector, files, null); } default void setInputFiles(String selector, Path[] files) { setInputFiles(selector, files, null); }
void setInputFiles(String selector, File[] files, SetInputFilesOptions options); void setInputFiles(String selector, Path[] files, SetInputFilesOptions options);
default void setInputFiles(String selector, FileChooser.FilePayload file) { setInputFiles(selector, file, null); } default void setInputFiles(String selector, FileChooser.FilePayload file) { setInputFiles(selector, file, null); }
default void setInputFiles(String selector, FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(selector, new FileChooser.FilePayload[]{ file }, options); } default void setInputFiles(String selector, FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(selector, new FileChooser.FilePayload[]{ file }, options); }
default void setInputFiles(String selector, FileChooser.FilePayload[] files) { setInputFiles(selector, files, null); } default void setInputFiles(String selector, FileChooser.FilePayload[] files) { setInputFiles(selector, files, null); }

View File

@ -16,7 +16,7 @@
package com.microsoft.playwright; package com.microsoft.playwright;
import java.io.File; import java.nio.file.Path;
import java.util.*; import java.util.*;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Predicate; import java.util.function.Predicate;
@ -108,7 +108,7 @@ public interface Page {
} }
class AddScriptTagOptions { class AddScriptTagOptions {
public String url; public String url;
public File path; public Path path;
public String content; public String content;
public String type; public String type;
@ -116,7 +116,7 @@ public interface Page {
this.url = url; this.url = url;
return this; return this;
} }
public AddScriptTagOptions withPath(File path) { public AddScriptTagOptions withPath(Path path) {
this.path = path; this.path = path;
return this; return this;
} }
@ -131,14 +131,14 @@ public interface Page {
} }
class AddStyleTagOptions { class AddStyleTagOptions {
public String url; public String url;
public File path; public Path path;
public String content; public String content;
public AddStyleTagOptions withUrl(String url) { public AddStyleTagOptions withUrl(String url) {
this.url = url; this.url = url;
return this; return this;
} }
public AddStyleTagOptions withPath(File path) { public AddStyleTagOptions withPath(Path path) {
this.path = path; this.path = path;
return this; return this;
} }
@ -428,7 +428,7 @@ public interface Page {
return this; return this;
} }
} }
public File path; public Path path;
public Integer scale; public Integer scale;
public Boolean displayHeaderFooter; public Boolean displayHeaderFooter;
public String headerTemplate; public String headerTemplate;
@ -442,7 +442,7 @@ public interface Page {
public Margin margin; public Margin margin;
public Boolean preferCSSPageSize; public Boolean preferCSSPageSize;
public PdfOptions withPath(File path) { public PdfOptions withPath(Path path) {
this.path = path; this.path = path;
return this; return this;
} }
@ -557,7 +557,7 @@ public interface Page {
return this; return this;
} }
} }
public File path; public Path path;
public Type type; public Type type;
public Integer quality; public Integer quality;
public Boolean fullPage; public Boolean fullPage;
@ -565,7 +565,7 @@ public interface Page {
public Boolean omitBackground; public Boolean omitBackground;
public Integer timeout; public Integer timeout;
public ScreenshotOptions withPath(File path) { public ScreenshotOptions withPath(Path path) {
this.path = path; this.path = path;
return this; return this;
} }
@ -929,10 +929,10 @@ public interface Page {
void setDefaultNavigationTimeout(int timeout); void setDefaultNavigationTimeout(int timeout);
void setDefaultTimeout(int timeout); void setDefaultTimeout(int timeout);
void setExtraHTTPHeaders(Map<String, String> headers); void setExtraHTTPHeaders(Map<String, String> headers);
default void setInputFiles(String selector, File file) { setInputFiles(selector, file, null); } default void setInputFiles(String selector, Path file) { setInputFiles(selector, file, null); }
default void setInputFiles(String selector, File file, SetInputFilesOptions options) { setInputFiles(selector, new File[]{ file }, options); } default void setInputFiles(String selector, Path file, SetInputFilesOptions options) { setInputFiles(selector, new Path[]{ file }, options); }
default void setInputFiles(String selector, File[] files) { setInputFiles(selector, files, null); } default void setInputFiles(String selector, Path[] files) { setInputFiles(selector, files, null); }
void setInputFiles(String selector, File[] files, SetInputFilesOptions options); void setInputFiles(String selector, Path[] files, SetInputFilesOptions options);
default void setInputFiles(String selector, FileChooser.FilePayload file) { setInputFiles(selector, file, null); } default void setInputFiles(String selector, FileChooser.FilePayload file) { setInputFiles(selector, file, null); }
default void setInputFiles(String selector, FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(selector, new FileChooser.FilePayload[]{ file }, options); } default void setInputFiles(String selector, FileChooser.FilePayload file, SetInputFilesOptions options) { setInputFiles(selector, new FileChooser.FilePayload[]{ file }, options); }
default void setInputFiles(String selector, FileChooser.FilePayload[] files) { setInputFiles(selector, files, null); } default void setInputFiles(String selector, FileChooser.FilePayload[] files) { setInputFiles(selector, files, null); }

View File

@ -18,6 +18,7 @@ package com.microsoft.playwright.example;
import com.microsoft.playwright.*; import com.microsoft.playwright.*;
import java.io.File; import java.io.File;
import java.nio.file.Paths;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
@ -28,7 +29,7 @@ public class Main {
Page page = context.newPage(); Page page = context.newPage();
page.navigate("https://webkit.org"); page.navigate("https://webkit.org");
page.click("text=check feature status"); page.click("text=check feature status");
page.screenshot(new Page.ScreenshotOptions().withPath(new File("s.png"))); page.screenshot(new Page.ScreenshotOptions().withPath(Paths.get("s.png")));
browser.close(); browser.close();
} }
} }

View File

@ -16,7 +16,6 @@
package com.microsoft.playwright.impl; package com.microsoft.playwright.impl;
import com.google.gson.Gson;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.microsoft.playwright.BrowserContext; import com.microsoft.playwright.BrowserContext;
@ -71,17 +70,17 @@ class BindingCall extends ChannelOwner {
args.add(handle); args.add(handle);
} else { } else {
for (JsonElement arg : initializer.getAsJsonArray("args")) { for (JsonElement arg : initializer.getAsJsonArray("args")) {
args.add(deserialize(new Gson().fromJson(arg, SerializedValue.class))); args.add(deserialize(gson().fromJson(arg, SerializedValue.class)));
} }
} }
Object result = binding.call(source, args.toArray()); Object result = binding.call(source, args.toArray());
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
params.add("result", new Gson().toJsonTree(serializeArgument(result))); params.add("result", gson().toJsonTree(serializeArgument(result)));
sendMessage("resolve", params); sendMessage("resolve", params);
} catch (RuntimeException exception) { } catch (RuntimeException exception) {
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
params.add("error", new Gson().toJsonTree(serializeError(exception))); params.add("error", gson().toJsonTree(serializeError(exception)));
sendMessage("reject", params); sendMessage("reject", params);
} }
} }

View File

@ -27,6 +27,7 @@ import java.util.function.BiConsumer;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static com.microsoft.playwright.impl.Serialization.gson;
import static com.microsoft.playwright.impl.Utils.isFunctionBody; import static com.microsoft.playwright.impl.Utils.isFunctionBody;
import static com.microsoft.playwright.impl.Utils.isSafeCloseError; import static com.microsoft.playwright.impl.Utils.isSafeCloseError;
@ -77,7 +78,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
@Override @Override
public void addCookies(List<AddCookie> cookies) { public void addCookies(List<AddCookie> cookies) {
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
params.add("cookies", new Gson().toJsonTree(cookies)); params.add("cookies", gson().toJsonTree(cookies));
sendMessage("addCookies", params); sendMessage("addCookies", params);
} }
@ -107,43 +108,15 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
sendMessage("clearPermissions"); sendMessage("clearPermissions");
} }
private static class SameSiteAdapter extends TypeAdapter<SameSite> {
@Override
public void write(JsonWriter out, SameSite value) throws IOException {
String stringValue;
switch (value) {
case STRICT:
stringValue = "Strict";
break;
case LAX:
stringValue = "Lax";
break;
case NONE:
stringValue = "None";
break;
default:
throw new PlaywrightException("Unexpected value: " + value);
}
out.value(stringValue);
}
@Override
public SameSite read(JsonReader in) throws IOException {
String value = in.nextString();
return SameSite.valueOf(value.toUpperCase());
}
}
@Override @Override
public List<Cookie> cookies(List<String> urls) { public List<Cookie> cookies(List<String> urls) {
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
if (urls == null) { if (urls == null) {
urls = Collections.emptyList(); urls = Collections.emptyList();
} }
params.add("urls", new Gson().toJsonTree(urls)); params.add("urls", gson().toJsonTree(urls));
JsonObject json = sendMessage("cookies", params).getAsJsonObject(); JsonObject json = sendMessage("cookies", params).getAsJsonObject();
Gson gson = new GsonBuilder().registerTypeAdapter(SameSite.class, new SameSiteAdapter().nullSafe()).create(); Cookie[] cookies = gson().fromJson(json.getAsJsonArray("cookies"), Cookie[].class);
Cookie[] cookies = gson.fromJson(json.getAsJsonArray("cookies"), Cookie[].class);
return Arrays.asList(cookies); return Arrays.asList(cookies);
} }
@ -180,8 +153,8 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
if (permissions == null) { if (permissions == null) {
permissions = Collections.emptyList(); permissions = Collections.emptyList();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.add("permissions", new Gson().toJsonTree(permissions)); params.add("permissions", gson().toJsonTree(permissions));
sendMessage("grantPermissions", params); sendMessage("grantPermissions", params);
} }
@ -257,7 +230,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
public void setGeolocation(Geolocation geolocation) { public void setGeolocation(Geolocation geolocation) {
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
if (geolocation != null) { if (geolocation != null) {
params.add("geolocation", new Gson().toJsonTree(geolocation)); params.add("geolocation", gson().toJsonTree(geolocation));
} }
sendMessage("setGeolocation", params); sendMessage("setGeolocation", params);
} }

View File

@ -16,7 +16,6 @@
package com.microsoft.playwright.impl; package com.microsoft.playwright.impl;
import com.google.gson.Gson;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.microsoft.playwright.*; import com.microsoft.playwright.*;
@ -26,6 +25,7 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static com.microsoft.playwright.impl.Serialization.gson;
import static com.microsoft.playwright.impl.Utils.convertViaJson; import static com.microsoft.playwright.impl.Utils.convertViaJson;
import static com.microsoft.playwright.impl.Utils.isSafeCloseError; import static com.microsoft.playwright.impl.Utils.isSafeCloseError;
@ -74,7 +74,7 @@ class BrowserImpl extends ChannelOwner implements Browser {
if (options == null) { if (options == null) {
options = new NewContextOptions(); options = new NewContextOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
if (options.extraHTTPHeaders != null) { if (options.extraHTTPHeaders != null) {
params.remove("extraHTTPHeaders"); params.remove("extraHTTPHeaders");
params.add("extraHTTPHeaders", Serialization.toProtocol(options.extraHTTPHeaders)); params.add("extraHTTPHeaders", Serialization.toProtocol(options.extraHTTPHeaders));

View File

@ -16,15 +16,12 @@
package com.microsoft.playwright.impl; package com.microsoft.playwright.impl;
import com.google.gson.*; import com.google.gson.JsonElement;
import com.google.gson.stream.JsonReader; import com.google.gson.JsonObject;
import com.google.gson.stream.JsonWriter;
import com.microsoft.playwright.BrowserContext; import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType; import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.PlaywrightException;
import java.io.IOException; import static com.microsoft.playwright.impl.Serialization.gson;
import java.util.Map;
class BrowserTypeImpl extends ChannelOwner implements BrowserType { class BrowserTypeImpl extends ChannelOwner implements BrowserType {
BrowserTypeImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) { BrowserTypeImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
@ -36,7 +33,7 @@ class BrowserTypeImpl extends ChannelOwner implements BrowserType {
if (options == null) { if (options == null) {
options = new LaunchOptions(); options = new LaunchOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
JsonElement result = sendMessage("launch", params); JsonElement result = sendMessage("launch", params);
return connection.getExistingObject(result.getAsJsonObject().getAsJsonObject("browser").get("guid").getAsString()); return connection.getExistingObject(result.getAsJsonObject().getAsJsonObject("browser").get("guid").getAsString());
} }
@ -46,45 +43,12 @@ class BrowserTypeImpl extends ChannelOwner implements BrowserType {
} }
private static class ColorSchemeAdapter extends TypeAdapter<LaunchPersistentContextOptions.ColorScheme> {
@Override
public void write(JsonWriter out, LaunchPersistentContextOptions.ColorScheme value) throws IOException {
String stringValue;
switch (value) {
case DARK:
stringValue = "dark";
break;
case LIGHT:
stringValue = "light";
break;
case NO_PREFERENCE:
stringValue = "no-preference";
break;
default:
throw new PlaywrightException("Unexpected value: " + value);
}
out.value(stringValue);
}
@Override
public LaunchPersistentContextOptions.ColorScheme read(JsonReader in) throws IOException {
String value = in.nextString();
switch (value) {
case "dark": return LaunchPersistentContextOptions.ColorScheme.DARK;
case "light": return LaunchPersistentContextOptions.ColorScheme.LIGHT;
case "no-preference": return LaunchPersistentContextOptions.ColorScheme.NO_PREFERENCE;
default: throw new PlaywrightException("Unexpected value: " + value);
}
}
}
@Override @Override
public BrowserContext launchPersistentContext(String userDataDir, LaunchPersistentContextOptions options) { public BrowserContext launchPersistentContext(String userDataDir, LaunchPersistentContextOptions options) {
if (options == null) { if (options == null) {
options = new LaunchPersistentContextOptions(); options = new LaunchPersistentContextOptions();
} }
Gson gson = new GsonBuilder().registerTypeAdapter(LaunchPersistentContextOptions.ColorScheme.class, new ColorSchemeAdapter().nullSafe()).create(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
JsonObject params = gson.toJsonTree(options).getAsJsonObject();
if (options.extraHTTPHeaders != null) { if (options.extraHTTPHeaders != null) {
params.remove("extraHTTPHeaders"); params.remove("extraHTTPHeaders");
params.add("extraHTTPHeaders", Serialization.toProtocol(options.extraHTTPHeaders)); params.add("extraHTTPHeaders", Serialization.toProtocol(options.extraHTTPHeaders));

View File

@ -26,6 +26,8 @@ import java.time.Duration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static com.microsoft.playwright.impl.Serialization.gson;
class Message { class Message {
int id; int id;
String guid; String guid;
@ -87,7 +89,7 @@ public class Connection {
message.addProperty("guid", guid); message.addProperty("guid", guid);
message.addProperty("method", method); message.addProperty("method", method);
message.add("params", params); message.add("params", params);
transport.send(new Gson().toJson(message)); transport.send(gson().toJson(message));
return result; return result;
} }
@ -119,7 +121,7 @@ public class Connection {
if (messageString == null) { if (messageString == null) {
return; return;
} }
Gson gson = new Gson(); Gson gson = gson();
Message message = gson.fromJson(messageString, Message.class); Message message = gson.fromJson(messageString, Message.class);
dispatch(message); dispatch(message);
} }

View File

@ -16,7 +16,6 @@
package com.microsoft.playwright.impl; package com.microsoft.playwright.impl;
import com.google.gson.Gson;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.microsoft.playwright.ConsoleMessage; import com.microsoft.playwright.ConsoleMessage;
@ -25,6 +24,8 @@ import com.microsoft.playwright.JSHandle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static com.microsoft.playwright.impl.Serialization.gson;
public class ConsoleMessageImpl extends ChannelOwner implements ConsoleMessage { public class ConsoleMessageImpl extends ChannelOwner implements ConsoleMessage {
public ConsoleMessageImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) { public ConsoleMessageImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
super(parent, type, guid, initializer); super(parent, type, guid, initializer);
@ -48,6 +49,6 @@ public class ConsoleMessageImpl extends ChannelOwner implements ConsoleMessage {
} }
public Location location() { public Location location() {
return new Gson().fromJson(initializer.get("location"), Location.class); return gson().fromJson(initializer.get("location"), Location.class);
} }
} }

View File

@ -26,6 +26,7 @@ import com.microsoft.playwright.FileChooser;
import com.microsoft.playwright.Frame; import com.microsoft.playwright.Frame;
import java.io.File; import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
@ -77,9 +78,9 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evalOnSelector", params); JsonElement json = sendMessage("evalOnSelector", params);
SerializedValue value = new Gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class); SerializedValue value = gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class);
return deserialize(value); return deserialize(value);
} }
@ -89,9 +90,9 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evalOnSelectorAll", params); JsonElement json = sendMessage("evalOnSelectorAll", params);
SerializedValue value = new Gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class); SerializedValue value = gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class);
return deserialize(value); return deserialize(value);
} }
@ -101,7 +102,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (!json.has("value")) { if (!json.has("value")) {
return null; return null;
} }
return new Gson().fromJson(json.get("value"), BoundingBox.class); return gson().fromJson(json.get("value"), BoundingBox.class);
} }
@Override @Override
@ -109,7 +110,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new CheckOptions(); options = new CheckOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
sendMessage("check", params); sendMessage("check", params);
} }
@ -118,7 +119,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new ClickOptions(); options = new ClickOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("button"); params.remove("button");
if (options.button != null) { if (options.button != null) {
params.addProperty("button", Serialization.toProtocol(options.button)); params.addProperty("button", Serialization.toProtocol(options.button));
@ -146,7 +147,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new DblclickOptions(); options = new DblclickOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("button"); params.remove("button");
if (options.button != null) { if (options.button != null) {
params.addProperty("button", Serialization.toProtocol(options.button)); params.addProperty("button", Serialization.toProtocol(options.button));
@ -164,7 +165,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
public void dispatchEvent(String type, Object eventInit) { public void dispatchEvent(String type, Object eventInit) {
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
params.addProperty("type", type); params.addProperty("type", type);
params.add("eventInit", new Gson().toJsonTree(serializeArgument(eventInit))); params.add("eventInit", gson().toJsonTree(serializeArgument(eventInit)));
sendMessage("dispatchEvent", params); sendMessage("dispatchEvent", params);
} }
@ -173,7 +174,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new FillOptions(); options = new FillOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("value", value); params.addProperty("value", value);
sendMessage("fill", params); sendMessage("fill", params);
} }
@ -193,7 +194,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
@Override @Override
public void hover(HoverOptions options) { public void hover(HoverOptions options) {
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("modifiers"); params.remove("modifiers");
if (options.modifiers != null) { if (options.modifiers != null) {
params.add("modifiers", Serialization.toProtocol(options.modifiers)); params.add("modifiers", Serialization.toProtocol(options.modifiers));
@ -227,7 +228,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new PressOptions(); options = new PressOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("key", key); params.addProperty("key", key);
sendMessage("press", params); sendMessage("press", params);
} }
@ -244,16 +245,17 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options.type == null) { if (options.type == null) {
options.type = ScreenshotOptions.Type.PNG; options.type = ScreenshotOptions.Type.PNG;
if (options.path != null) { if (options.path != null) {
int extStart = options.path.getName().lastIndexOf('.'); String fileName = options.path.getFileName().toString();
int extStart = fileName.lastIndexOf('.');
if (extStart != -1) { if (extStart != -1) {
String extension = options.path.getName().substring(extStart).toLowerCase(); String extension = fileName.substring(extStart).toLowerCase();
if (".jpeg".equals(extension) || ".jpg".equals(extension)) { if (".jpeg".equals(extension) || ".jpg".equals(extension)) {
options.type = ScreenshotOptions.Type.JPEG; options.type = ScreenshotOptions.Type.JPEG;
} }
} }
} }
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("type"); params.remove("type");
params.addProperty("type", toProtocol(options.type)); params.addProperty("type", toProtocol(options.type));
params.remove("path"); params.remove("path");
@ -271,7 +273,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new ScrollIntoViewIfNeededOptions(); options = new ScrollIntoViewIfNeededOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
sendMessage("scrollIntoViewIfNeeded", params); sendMessage("scrollIntoViewIfNeeded", params);
} }
@ -280,9 +282,9 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new SelectOptionOptions(); options = new SelectOptionOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
if (values != null) { if (values != null) {
params.add("options", new Gson().toJsonTree(values)); params.add("options", gson().toJsonTree(values));
} }
return selectOption(params); return selectOption(params);
} }
@ -292,7 +294,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new SelectOptionOptions(); options = new SelectOptionOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
if (values != null) { if (values != null) {
params.add("elements", Serialization.toProtocol(values)); params.add("elements", Serialization.toProtocol(values));
} }
@ -309,12 +311,12 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new SelectTextOptions(); options = new SelectTextOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
sendMessage("selectText", params); sendMessage("selectText", params);
} }
@Override @Override
public void setInputFiles(File[] files, SetInputFilesOptions options) { public void setInputFiles(Path[] files, SetInputFilesOptions options) {
setInputFiles(Utils.toFilePayloads(files), options); setInputFiles(Utils.toFilePayloads(files), options);
} }
@ -323,7 +325,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new SetInputFilesOptions(); options = new SetInputFilesOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.add("files", Serialization.toJsonArray(files)); params.add("files", Serialization.toJsonArray(files));
sendMessage("setInputFiles", params); sendMessage("setInputFiles", params);
} }
@ -339,7 +341,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new TypeOptions(); options = new TypeOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("text", text); params.addProperty("text", text);
sendMessage("type", params); sendMessage("type", params);
} }
@ -349,7 +351,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new UncheckOptions(); options = new UncheckOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
sendMessage("uncheck", params); sendMessage("uncheck", params);
} }
@ -358,7 +360,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new WaitForElementStateOptions(); options = new WaitForElementStateOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("state", toProtocol(state)); params.addProperty("state", toProtocol(state));
return toDeferred(sendMessageAsync("waitForElementState", params).apply(json -> null)); return toDeferred(sendMessageAsync("waitForElementState", params).apply(json -> null));
} }
@ -375,7 +377,7 @@ class ElementHandleImpl extends JSHandleImpl implements ElementHandle {
if (options == null) { if (options == null) {
options = new WaitForSelectorOptions(); options = new WaitForSelectorOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("state"); params.remove("state");
params.addProperty("state", toProtocol(options.state)); params.addProperty("state", toProtocol(options.state));
params.addProperty("selector", selector); params.addProperty("selector", selector);

View File

@ -23,6 +23,7 @@ import com.microsoft.playwright.FileChooser;
import com.microsoft.playwright.Page; import com.microsoft.playwright.Page;
import java.io.File; import java.io.File;
import java.nio.file.Path;
import static com.microsoft.playwright.impl.Utils.convertViaJson; import static com.microsoft.playwright.impl.Utils.convertViaJson;
@ -53,7 +54,7 @@ class FileChooserImpl implements FileChooser {
} }
@Override @Override
public void setFiles(File[] files, SetFilesOptions options) { public void setFiles(Path[] files, SetFilesOptions options) {
setFiles(Utils.toFilePayloads(files), options); setFiles(Utils.toFilePayloads(files), options);
} }

View File

@ -26,6 +26,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*; import java.util.*;
import static com.microsoft.playwright.Frame.LoadState.*; import static com.microsoft.playwright.Frame.LoadState.*;
@ -100,9 +101,9 @@ public class FrameImpl extends ChannelOwner implements Frame {
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evalOnSelector", params); JsonElement json = sendMessage("evalOnSelector", params);
SerializedValue value = new Gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class); SerializedValue value = gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class);
return deserialize(value); return deserialize(value);
} }
@ -112,9 +113,9 @@ public class FrameImpl extends ChannelOwner implements Frame {
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evalOnSelectorAll", params); JsonElement json = sendMessage("evalOnSelectorAll", params);
SerializedValue value = new Gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class); SerializedValue value = gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class);
return deserialize(value); return deserialize(value);
} }
@ -123,17 +124,17 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new AddScriptTagOptions(); options = new AddScriptTagOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
if (options.path != null) { if (options.path != null) {
params.remove("path"); params.remove("path");
byte[] encoded; byte[] encoded;
try { try {
encoded = Files.readAllBytes(options.path.toPath()); encoded = Files.readAllBytes(options.path);
} catch (IOException e) { } catch (IOException e) {
throw new PlaywrightException("Failed to read from file", e); throw new PlaywrightException("Failed to read from file", e);
} }
String content = new String(encoded, StandardCharsets.UTF_8); String content = new String(encoded, StandardCharsets.UTF_8);
content += "//# sourceURL=" + options.path.getPath().replace("\n", ""); content += "//# sourceURL=" + options.path.toString().replace("\n", "");
params.addProperty("content", content); params.addProperty("content", content);
} }
JsonElement json = sendMessage("addScriptTag", params); JsonElement json = sendMessage("addScriptTag", params);
@ -145,17 +146,17 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new AddStyleTagOptions(); options = new AddStyleTagOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
if (options.path != null) { if (options.path != null) {
params.remove("path"); params.remove("path");
byte[] encoded; byte[] encoded;
try { try {
encoded = Files.readAllBytes(options.path.toPath()); encoded = Files.readAllBytes(options.path);
} catch (IOException e) { } catch (IOException e) {
throw new PlaywrightException("Failed to read from file", e); throw new PlaywrightException("Failed to read from file", e);
} }
String content = new String(encoded, StandardCharsets.UTF_8); String content = new String(encoded, StandardCharsets.UTF_8);
content += "/*# sourceURL=" + options.path.getPath().replace("\n", "") + "*/"; content += "/*# sourceURL=" + options.path.toString().replace("\n", "") + "*/";
params.addProperty("content", content); params.addProperty("content", content);
} }
JsonElement json = sendMessage("addStyleTag", params); JsonElement json = sendMessage("addStyleTag", params);
@ -167,7 +168,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new CheckOptions(); options = new CheckOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
sendMessage("check", params); sendMessage("check", params);
} }
@ -182,7 +183,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new ClickOptions(); options = new ClickOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.remove("button"); params.remove("button");
@ -208,7 +209,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new DblclickOptions(); options = new DblclickOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.remove("button"); params.remove("button");
@ -229,10 +230,10 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new DispatchEventOptions(); options = new DispatchEventOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("type", type); params.addProperty("type", type);
params.add("eventInit", new Gson().toJsonTree(serializeArgument(eventInit))); params.add("eventInit", gson().toJsonTree(serializeArgument(eventInit)));
sendMessage("dispatchEvent", params); sendMessage("dispatchEvent", params);
} }
@ -242,9 +243,9 @@ public class FrameImpl extends ChannelOwner implements Frame {
params.addProperty("expression", expression); params.addProperty("expression", expression);
params.addProperty("world", "main"); params.addProperty("world", "main");
params.addProperty("isFunction", isFunctionBody(expression)); params.addProperty("isFunction", isFunctionBody(expression));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evaluateExpression", params); JsonElement json = sendMessage("evaluateExpression", params);
SerializedValue value = new Gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class); SerializedValue value = gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class);
return deserialize(value); return deserialize(value);
} }
@ -254,7 +255,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("world", "main"); params.addProperty("world", "main");
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evaluateExpressionHandle", params); JsonElement json = sendMessage("evaluateExpressionHandle", params);
return connection.getExistingObject(json.getAsJsonObject().getAsJsonObject("handle").get("guid").getAsString()); return connection.getExistingObject(json.getAsJsonObject().getAsJsonObject("handle").get("guid").getAsString());
} }
@ -264,7 +265,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new FillOptions(); options = new FillOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("value", value); params.addProperty("value", value);
sendMessage("fill", params); sendMessage("fill", params);
@ -275,7 +276,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new FocusOptions(); options = new FocusOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
sendMessage("focus", params); sendMessage("focus", params);
} }
@ -291,7 +292,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new GetAttributeOptions(); options = new GetAttributeOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("name", name); params.addProperty("name", name);
JsonObject json = sendMessage("getAttribute", params).getAsJsonObject(); JsonObject json = sendMessage("getAttribute", params).getAsJsonObject();
@ -306,7 +307,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new NavigateOptions(); options = new NavigateOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("url", url); params.addProperty("url", url);
if (options.waitUntil != null) { if (options.waitUntil != null) {
params.remove("waitUntil"); params.remove("waitUntil");
@ -325,7 +326,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new HoverOptions(); options = new HoverOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
sendMessage("hover", params); sendMessage("hover", params);
} }
@ -335,7 +336,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new InnerHTMLOptions(); options = new InnerHTMLOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
JsonObject json = sendMessage("innerHTML", params).getAsJsonObject(); JsonObject json = sendMessage("innerHTML", params).getAsJsonObject();
return json.get("value").getAsString(); return json.get("value").getAsString();
@ -346,7 +347,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new InnerTextOptions(); options = new InnerTextOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
JsonObject json = sendMessage("innerText", params).getAsJsonObject(); JsonObject json = sendMessage("innerText", params).getAsJsonObject();
return json.get("value").getAsString(); return json.get("value").getAsString();
@ -377,7 +378,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new PressOptions(); options = new PressOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("key", key); params.addProperty("key", key);
sendMessage("press", params); sendMessage("press", params);
@ -388,10 +389,10 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new SelectOptionOptions(); options = new SelectOptionOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
if (values != null) { if (values != null) {
params.add("options", new Gson().toJsonTree(values)); params.add("options", gson().toJsonTree(values));
} }
return selectOption(params); return selectOption(params);
} }
@ -401,7 +402,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new SelectOptionOptions(); options = new SelectOptionOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
if (values != null) { if (values != null) {
params.add("elements", Serialization.toProtocol(values)); params.add("elements", Serialization.toProtocol(values));
@ -431,7 +432,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new SetContentOptions(); options = new SetContentOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("html", html); params.addProperty("html", html);
params.remove("waitUntil"); params.remove("waitUntil");
params.addProperty("waitUntil", toProtocol(options.waitUntil)); params.addProperty("waitUntil", toProtocol(options.waitUntil));
@ -439,7 +440,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
} }
@Override @Override
public void setInputFiles(String selector, File[] files, SetInputFilesOptions options) { public void setInputFiles(String selector, Path[] files, SetInputFilesOptions options) {
setInputFiles(selector, Utils.toFilePayloads(files), options); setInputFiles(selector, Utils.toFilePayloads(files), options);
} }
@ -448,7 +449,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new SetInputFilesOptions(); options = new SetInputFilesOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.add("files", toJsonArray(files)); params.add("files", toJsonArray(files));
sendMessage("setInputFiles", params); sendMessage("setInputFiles", params);
@ -459,7 +460,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new TextContentOptions(); options = new TextContentOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
return sendMessage("textContent", params).getAsJsonObject().get("value").getAsString(); return sendMessage("textContent", params).getAsJsonObject().get("value").getAsString();
} }
@ -475,7 +476,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new TypeOptions(); options = new TypeOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
params.addProperty("text", text); params.addProperty("text", text);
sendMessage("type", params); sendMessage("type", params);
@ -486,7 +487,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new UncheckOptions(); options = new UncheckOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
sendMessage("uncheck", params); sendMessage("uncheck", params);
} }
@ -501,10 +502,10 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new WaitForFunctionOptions(); options = new WaitForFunctionOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
Waitable<JSHandle> handle = sendMessageAsync("waitForFunction", params).apply(json -> { Waitable<JSHandle> handle = sendMessageAsync("waitForFunction", params).apply(json -> {
JsonObject element = json.getAsJsonObject().getAsJsonObject("handle"); JsonObject element = json.getAsJsonObject().getAsJsonObject("handle");
return connection.getExistingObject(element.get("guid").getAsString()); return connection.getExistingObject(element.get("guid").getAsString());
@ -657,7 +658,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (options == null) { if (options == null) {
options = new WaitForSelectorOptions(); options = new WaitForSelectorOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("selector", selector); params.addProperty("selector", selector);
if (options.state != null) { if (options.state != null) {
params.remove("state"); params.remove("state");

View File

@ -25,8 +25,7 @@ import com.microsoft.playwright.JSHandle;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static com.microsoft.playwright.impl.Serialization.deserialize; import static com.microsoft.playwright.impl.Serialization.*;
import static com.microsoft.playwright.impl.Serialization.serializeArgument;
import static com.microsoft.playwright.impl.Utils.isFunctionBody; import static com.microsoft.playwright.impl.Utils.isFunctionBody;
public class JSHandleImpl extends ChannelOwner implements JSHandle { public class JSHandleImpl extends ChannelOwner implements JSHandle {
@ -45,9 +44,9 @@ public class JSHandleImpl extends ChannelOwner implements JSHandle {
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("world", "main"); params.addProperty("world", "main");
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evaluateExpression", params); JsonElement json = sendMessage("evaluateExpression", params);
SerializedValue value = new Gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class); SerializedValue value = gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class);
return deserialize(value); return deserialize(value);
} }
@ -57,7 +56,7 @@ public class JSHandleImpl extends ChannelOwner implements JSHandle {
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("world", "main"); params.addProperty("world", "main");
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evaluateExpressionHandle", params); JsonElement json = sendMessage("evaluateExpressionHandle", params);
return connection.getExistingObject(json.getAsJsonObject().getAsJsonObject("handle").get("guid").getAsString()); return connection.getExistingObject(json.getAsJsonObject().getAsJsonObject("handle").get("guid").getAsString());
} }
@ -85,7 +84,7 @@ public class JSHandleImpl extends ChannelOwner implements JSHandle {
@Override @Override
public Object jsonValue() { public Object jsonValue() {
JsonObject json = sendMessage("jsonValue").getAsJsonObject(); JsonObject json = sendMessage("jsonValue").getAsJsonObject();
SerializedValue value = new Gson().fromJson(json.get("value"), SerializedValue.class); SerializedValue value = gson().fromJson(json.get("value"), SerializedValue.class);
return deserialize(value); return deserialize(value);
} }
} }

View File

@ -20,6 +20,7 @@ import com.google.gson.Gson;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.microsoft.playwright.Mouse; import com.microsoft.playwright.Mouse;
import static com.microsoft.playwright.impl.Serialization.gson;
import static com.microsoft.playwright.impl.Serialization.toProtocol; import static com.microsoft.playwright.impl.Serialization.toProtocol;
import static com.microsoft.playwright.impl.Utils.convertViaJson; import static com.microsoft.playwright.impl.Utils.convertViaJson;
@ -35,7 +36,7 @@ class MouseImpl implements Mouse {
if (options == null) { if (options == null) {
options = new ClickOptions(); options = new ClickOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("x", x); params.addProperty("x", x);
params.addProperty("y", y); params.addProperty("y", y);
if (options.button != null) { if (options.button != null) {
@ -62,7 +63,7 @@ class MouseImpl implements Mouse {
if (options == null) { if (options == null) {
options = new DownOptions(); options = new DownOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
page.sendMessage("mouseDown", params); page.sendMessage("mouseDown", params);
} }
@ -71,7 +72,7 @@ class MouseImpl implements Mouse {
if (options == null) { if (options == null) {
options = new MoveOptions(); options = new MoveOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.addProperty("x", x); params.addProperty("x", x);
params.addProperty("y", y); params.addProperty("y", y);
page.sendMessage("mouseMove", params); page.sendMessage("mouseMove", params);
@ -82,7 +83,7 @@ class MouseImpl implements Mouse {
if (options == null) { if (options == null) {
options = new UpOptions(); options = new UpOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
page.sendMessage("mouseUp", params); page.sendMessage("mouseUp", params);
} }
} }

View File

@ -23,11 +23,13 @@ import com.microsoft.playwright.*;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.util.*; import java.util.*;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static com.microsoft.playwright.impl.Serialization.gson;
import static com.microsoft.playwright.impl.Utils.convertViaJson; import static com.microsoft.playwright.impl.Utils.convertViaJson;
@ -156,7 +158,7 @@ public class PageImpl extends ChannelOwner implements Page {
route.continue_(); route.continue_();
} }
} else if ("pageError".equals(event)) { } else if ("pageError".equals(event)) {
SerializedError error = new Gson().fromJson(params.getAsJsonObject("error"), SerializedError.class); SerializedError error = gson().fromJson(params.getAsJsonObject("error"), SerializedError.class);
listeners.notify(EventType.PAGEERROR, new ErrorImpl(error)); listeners.notify(EventType.PAGEERROR, new ErrorImpl(error));
} else if ("crash".equals(event)) { } else if ("crash".equals(event)) {
listeners.notify(EventType.CRASH, null); listeners.notify(EventType.CRASH, null);
@ -203,7 +205,7 @@ public class PageImpl extends ChannelOwner implements Page {
@Override @Override
public void close(CloseOptions options) { public void close(CloseOptions options) {
JsonObject params = options == null ? new JsonObject() : new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = options == null ? new JsonObject() : gson().toJsonTree(options).getAsJsonObject();
sendMessage("close", params); sendMessage("close", params);
if (ownedContext != null) { if (ownedContext != null) {
ownedContext.close(); ownedContext.close();
@ -416,7 +418,7 @@ public class PageImpl extends ChannelOwner implements Page {
if (options == null) { if (options == null) {
options = new GoBackOptions(); options = new GoBackOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("waitUntil"); params.remove("waitUntil");
params.addProperty("waitUntil", FrameImpl.toProtocol(options.waitUntil)); params.addProperty("waitUntil", FrameImpl.toProtocol(options.waitUntil));
JsonObject json = sendMessage("goBack", params).getAsJsonObject(); JsonObject json = sendMessage("goBack", params).getAsJsonObject();
@ -431,7 +433,7 @@ public class PageImpl extends ChannelOwner implements Page {
if (options == null) { if (options == null) {
options = new GoForwardOptions(); options = new GoForwardOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("waitUntil"); params.remove("waitUntil");
params.addProperty("waitUntil", FrameImpl.toProtocol(options.waitUntil)); params.addProperty("waitUntil", FrameImpl.toProtocol(options.waitUntil));
JsonObject json = sendMessage("goForward", params).getAsJsonObject(); JsonObject json = sendMessage("goForward", params).getAsJsonObject();
@ -498,7 +500,7 @@ public class PageImpl extends ChannelOwner implements Page {
if (options == null) { if (options == null) {
options = new PdfOptions(); options = new PdfOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("path"); params.remove("path");
JsonObject json = sendMessage("pdf", params).getAsJsonObject(); JsonObject json = sendMessage("pdf", params).getAsJsonObject();
byte[] buffer = Base64.getDecoder().decode(json.get("pdf").getAsString()); byte[] buffer = Base64.getDecoder().decode(json.get("pdf").getAsString());
@ -518,7 +520,7 @@ public class PageImpl extends ChannelOwner implements Page {
if (options == null) { if (options == null) {
options = new ReloadOptions(); options = new ReloadOptions();
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("waitUntil"); params.remove("waitUntil");
params.addProperty("waitUntil", FrameImpl.toProtocol(options.waitUntil)); params.addProperty("waitUntil", FrameImpl.toProtocol(options.waitUntil));
JsonObject json = sendMessage("reload", params).getAsJsonObject(); JsonObject json = sendMessage("reload", params).getAsJsonObject();
@ -564,16 +566,17 @@ public class PageImpl extends ChannelOwner implements Page {
if (options.type == null) { if (options.type == null) {
options.type = ScreenshotOptions.Type.PNG; options.type = ScreenshotOptions.Type.PNG;
if (options.path != null) { if (options.path != null) {
int extStart = options.path.getName().lastIndexOf('.'); String fileName = options.path.getFileName().toString();
int extStart = fileName.lastIndexOf('.');
if (extStart != -1) { if (extStart != -1) {
String extension = options.path.getName().substring(extStart).toLowerCase(); String extension = fileName.substring(extStart).toLowerCase();
if (".jpeg".equals(extension) || ".jpg".equals(extension)) { if (".jpeg".equals(extension) || ".jpg".equals(extension)) {
options.type = ScreenshotOptions.Type.JPEG; options.type = ScreenshotOptions.Type.JPEG;
} }
} }
} }
} }
JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); JsonObject params = gson().toJsonTree(options).getAsJsonObject();
params.remove("type"); params.remove("type");
params.addProperty("type", toProtocol(options.type)); params.addProperty("type", toProtocol(options.type));
params.remove("path"); params.remove("path");
@ -632,7 +635,7 @@ public class PageImpl extends ChannelOwner implements Page {
} }
@Override @Override
public void setInputFiles(String selector, File[] files, SetInputFilesOptions options) { public void setInputFiles(String selector, Path[] files, SetInputFilesOptions options) {
mainFrame.setInputFiles(selector, files, convertViaJson(options, Frame.SetInputFilesOptions.class)); mainFrame.setInputFiles(selector, files, convertViaJson(options, Frame.SetInputFilesOptions.class));
} }
@ -645,7 +648,7 @@ public class PageImpl extends ChannelOwner implements Page {
public void setViewportSize(int width, int height) { public void setViewportSize(int width, int height) {
viewport = new Viewport(width, height); viewport = new Viewport(width, height);
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
params.add("viewportSize", new Gson().toJsonTree(viewport)); params.add("viewportSize", gson().toJsonTree(viewport));
sendMessage("setViewportSize", params); sendMessage("setViewportSize", params);
} }

View File

@ -59,7 +59,7 @@ public class PlaywrightImpl extends ChannelOwner implements Playwright {
firefox = parent.connection.getExistingObject(initializer.getAsJsonObject("firefox").get("guid").getAsString()); firefox = parent.connection.getExistingObject(initializer.getAsJsonObject("firefox").get("guid").getAsString());
webkit = parent.connection.getExistingObject(initializer.getAsJsonObject("webkit").get("guid").getAsString()); webkit = parent.connection.getExistingObject(initializer.getAsJsonObject("webkit").get("guid").getAsString());
Gson gson = new Gson(); Gson gson = Serialization.gson();
for (JsonElement item : initializer.getAsJsonArray("deviceDescriptors")) { for (JsonElement item : initializer.getAsJsonArray("deviceDescriptors")) {
JsonObject o = item.getAsJsonObject(); JsonObject o = item.getAsJsonObject();
String name = o.get("name").getAsString(); String name = o.get("name").getAsString();

View File

@ -16,21 +16,32 @@
package com.microsoft.playwright.impl; package com.microsoft.playwright.impl;
import com.google.gson.Gson; import com.google.gson.*;
import com.google.gson.JsonArray; import com.google.gson.stream.JsonReader;
import com.google.gson.JsonElement; import com.google.gson.stream.JsonWriter;
import com.google.gson.JsonObject;
import com.microsoft.playwright.*; import com.microsoft.playwright.*;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
import java.lang.reflect.Array; import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
class Serialization { class Serialization {
private static Gson gson;
static Gson gson() {
if (gson == null) {
gson = new GsonBuilder()
.registerTypeAdapter(BrowserContext.SameSite.class, new SameSiteAdapter().nullSafe())
.registerTypeAdapter(BrowserType.LaunchPersistentContextOptions.ColorScheme.class, new ColorSchemeAdapter().nullSafe())
.registerTypeAdapter(Path.class, new PathSerializer()).create();
}
return gson;
}
static SerializedError serializeError(Throwable e) { static SerializedError serializeError(Throwable e) {
SerializedError result = new SerializedError(); SerializedError result = new SerializedError();
result.error = new SerializedError.Error(); result.error = new SerializedError.Error();
@ -56,7 +67,7 @@ class Serialization {
if (value == null) { if (value == null) {
result.v = "undefined"; result.v = "undefined";
} else if (value instanceof Double) { } else if (value instanceof Double) {
double d = ((Double) value).doubleValue(); double d = ((Double) value);
if (d == Double.POSITIVE_INFINITY) { if (d == Double.POSITIVE_INFINITY) {
result.v = "Infinity"; result.v = "Infinity";
} else if (d == Double.NEGATIVE_INFINITY) { } else if (d == Double.NEGATIVE_INFINITY) {
@ -160,15 +171,19 @@ class Serialization {
} }
return (T) map; return (T) map;
} }
throw new PlaywrightException("Unexpected result: " + new Gson().toJson(value)); throw new PlaywrightException("Unexpected result: " + gson().toJson(value));
} }
static String toProtocol(Mouse.Button button) { static String toProtocol(Mouse.Button button) {
switch (button) { switch (button) {
case LEFT: return "left"; case LEFT:
case RIGHT: return "right"; return "left";
case MIDDLE: return "middle"; case RIGHT:
default: throw new PlaywrightException("Unexpected value: " + button); return "right";
case MIDDLE:
return "middle";
default:
throw new PlaywrightException("Unexpected value: " + button);
} }
} }
@ -229,4 +244,71 @@ class Serialization {
} }
return result; return result;
} }
private static class PathSerializer implements JsonSerializer<Path> {
@Override
public JsonElement serialize(Path src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
} }
}
private static class SameSiteAdapter extends TypeAdapter<BrowserContext.SameSite> {
@Override
public void write(JsonWriter out, BrowserContext.SameSite value) throws IOException {
String stringValue;
switch (value) {
case STRICT:
stringValue = "Strict";
break;
case LAX:
stringValue = "Lax";
break;
case NONE:
stringValue = "None";
break;
default:
throw new PlaywrightException("Unexpected value: " + value);
}
out.value(stringValue);
}
@Override
public BrowserContext.SameSite read(JsonReader in) throws IOException {
String value = in.nextString();
return BrowserContext.SameSite.valueOf(value.toUpperCase());
}
}
private static class ColorSchemeAdapter extends TypeAdapter<BrowserType.LaunchPersistentContextOptions.ColorScheme> {
@Override
public void write(JsonWriter out, BrowserType.LaunchPersistentContextOptions.ColorScheme value) throws IOException {
String stringValue;
switch (value) {
case DARK:
stringValue = "dark";
break;
case LIGHT:
stringValue = "light";
break;
case NO_PREFERENCE:
stringValue = "no-preference";
break;
default:
throw new PlaywrightException("Unexpected value: " + value);
}
out.value(stringValue);
}
@Override
public BrowserType.LaunchPersistentContextOptions.ColorScheme read(JsonReader in) throws IOException {
String value = in.nextString();
switch (value) {
case "dark": return BrowserType.LaunchPersistentContextOptions.ColorScheme.DARK;
case "light": return BrowserType.LaunchPersistentContextOptions.ColorScheme.LIGHT;
case "no-preference": return BrowserType.LaunchPersistentContextOptions.ColorScheme.NO_PREFERENCE;
default: throw new PlaywrightException("Unexpected value: " + value);
}
}
}
}

View File

@ -32,8 +32,9 @@ import java.util.*;
class Utils { class Utils {
// TODO: generate converter. // TODO: generate converter.
static <F, T> T convertViaJson(F f, Class<T> t) { static <F, T> T convertViaJson(F f, Class<T> t) {
String json = new Gson().toJson(f); Gson gson = new Gson();
return new Gson().fromJson(json, t); String json = gson.toJson(f);
return gson.fromJson(json, t);
} }
static boolean isFunctionBody(String expression) { static boolean isFunctionBody(String expression) {
@ -113,30 +114,32 @@ class Utils {
return mimeType; return mimeType;
} }
static FileChooser.FilePayload[] toFilePayloads(File[] files) { static FileChooser.FilePayload[] toFilePayloads(Path[] files) {
List<FileChooser.FilePayload> payloads = new ArrayList<>(); List<FileChooser.FilePayload> payloads = new ArrayList<>();
for (File file : files) { for (Path file : files) {
byte[] buffer; byte[] buffer;
try { try {
buffer = Files.readAllBytes(file.toPath()); buffer = Files.readAllBytes(file);
} catch (IOException e) { } catch (IOException e) {
throw new PlaywrightException("Failed to read from file", e); throw new PlaywrightException("Failed to read from file", e);
} }
payloads.add(new FileChooser.FilePayload(file.getName(), mimeType(file.toPath()), buffer)); payloads.add(new FileChooser.FilePayload(file.getFileName().toString(), mimeType(file), buffer));
} }
return payloads.toArray(new FileChooser.FilePayload[0]); return payloads.toArray(new FileChooser.FilePayload[0]);
} }
static void writeToFile(byte[] buffer, File path) { static void writeToFile(byte[] buffer, Path path) {
File dir = path.getParentFile(); Path dir = path.getParent();
if (dir != null) { if (dir != null) {
if (!dir.exists()) { if (!Files.exists(dir)) {
if (!dir.mkdirs()) { try {
throw new PlaywrightException("Failed to create parent directory: " + dir.getPath()); Files.createDirectories(dir);
} catch (IOException e) {
throw new PlaywrightException("Failed to create parent directory: " + dir.toString(), e);
} }
} }
} }
try (DataOutputStream out = new DataOutputStream(new FileOutputStream(path));) { try (DataOutputStream out = new DataOutputStream(new FileOutputStream(path.toFile()));) {
out.write(buffer); out.write(buffer);
} catch (IOException e) { } catch (IOException e) {
throw new PlaywrightException("Failed to write to file", e); throw new PlaywrightException("Failed to write to file", e);

View File

@ -21,8 +21,7 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.microsoft.playwright.*; import com.microsoft.playwright.*;
import static com.microsoft.playwright.impl.Serialization.deserialize; import static com.microsoft.playwright.impl.Serialization.*;
import static com.microsoft.playwright.impl.Serialization.serializeArgument;
import static com.microsoft.playwright.impl.Utils.isFunctionBody; import static com.microsoft.playwright.impl.Utils.isFunctionBody;
class WorkerImpl extends ChannelOwner implements Worker { class WorkerImpl extends ChannelOwner implements Worker {
@ -48,9 +47,9 @@ class WorkerImpl extends ChannelOwner implements Worker {
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evaluateExpression", params); JsonElement json = sendMessage("evaluateExpression", params);
SerializedValue value = new Gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class); SerializedValue value = gson().fromJson(json.getAsJsonObject().get("value"), SerializedValue.class);
return deserialize(value); return deserialize(value);
} }
@ -59,7 +58,7 @@ class WorkerImpl extends ChannelOwner implements Worker {
JsonObject params = new JsonObject(); JsonObject params = new JsonObject();
params.addProperty("expression", pageFunction); params.addProperty("expression", pageFunction);
params.addProperty("isFunction", isFunctionBody(pageFunction)); params.addProperty("isFunction", isFunctionBody(pageFunction));
params.add("arg", new Gson().toJsonTree(serializeArgument(arg))); params.add("arg", gson().toJsonTree(serializeArgument(arg)));
JsonElement json = sendMessage("evaluateExpressionHandle", params); JsonElement json = sendMessage("evaluateExpressionHandle", params);
return connection.getExistingObject(json.getAsJsonObject().getAsJsonObject("handle").get("guid").getAsString()); return connection.getExistingObject(json.getAsJsonObject().getAsJsonObject("handle").get("guid").getAsString());
} }

View File

@ -19,6 +19,8 @@ package com.microsoft.playwright;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.io.File; import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
@ -30,7 +32,7 @@ import static org.junit.jupiter.api.Assertions.*;
public class TestPageSetInputFiles extends TestBase { public class TestPageSetInputFiles extends TestBase {
static File FILE_TO_UPLOAD = new File("src/test/resources/file-to-upload.txt"); static Path FILE_TO_UPLOAD = Paths.get("src/test/resources/file-to-upload.txt");
@Test @Test
void shouldUploadTheFile() { void shouldUploadTheFile() {
@ -238,7 +240,7 @@ public class TestPageSetInputFiles extends TestBase {
@Override @Override
public void handle(Event<Page.EventType> event) { public void handle(Event<Page.EventType> event) {
FileChooser fileChooser = (FileChooser) event.data(); FileChooser fileChooser = (FileChooser) event.data();
fileChooser.setFiles(new File[0]); fileChooser.setFiles(new Path[0]);
page.removeListener(Page.EventType.FILECHOOSER, this); page.removeListener(Page.EventType.FILECHOOSER, this);
} }
}); });
@ -257,7 +259,7 @@ public class TestPageSetInputFiles extends TestBase {
page.click("input"); page.click("input");
FileChooser fileChooser = (FileChooser) event.get().data(); FileChooser fileChooser = (FileChooser) event.get().data();
try { try {
fileChooser.setFiles(new File[]{FILE_TO_UPLOAD, new File("src/test/resources/pptr.png")}); fileChooser.setFiles(new Path[]{FILE_TO_UPLOAD, Paths.get("src/test/resources/pptr.png")});
fail("did not throw"); fail("did not throw");
} catch (PlaywrightException e) { } catch (PlaywrightException e) {
assertTrue(e.getMessage().contains("Non-multiple file input can only accept single file")); assertTrue(e.getMessage().contains("Non-multiple file input can only accept single file"));

View File

@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@ -28,12 +29,10 @@ public class TestPdf extends TestBase {
@Test @Test
void shouldBeAbleToSaveFile() throws IOException { void shouldBeAbleToSaveFile() throws IOException {
// TODO: test.skip(headful || browserName !== "chromium", "Printing to pdf is currently only supported in headless chromium."); // TODO: test.skip(headful || browserName !== "chromium", "Printing to pdf is currently only supported in headless chromium.");
File path = File.createTempFile("output", ".pdf"); Path path = File.createTempFile("output", ".pdf").toPath();
page.pdf(new Page.PdfOptions().withPath(path)); page.pdf(new Page.PdfOptions().withPath(path));
long size = Files.size(path.toPath()); long size = Files.size(path);
assertTrue(size > 0); assertTrue(size > 0);
Browser b = playwright.webkit().launch();
System.out.println(b.version());
} }
@Test @Test