From d24eba79dc30b4a44ab3b4cd13f35a59c4e03120 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Thu, 6 May 2021 07:04:52 +0000 Subject: [PATCH] fix: avoid private field/class access from Gson (#427) --- .../playwright/impl/BrowserContextImpl.java | 22 ++++++++++------ .../playwright/impl/Serialization.java | 5 ++-- .../com/microsoft/playwright/impl/Utils.java | 25 +++++++++++++------ 3 files changed, 36 insertions(+), 16 deletions(-) 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 b6252b27..5669df00 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/BrowserContextImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/BrowserContextImpl.java @@ -19,13 +19,22 @@ package com.microsoft.playwright.impl; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.microsoft.playwright.*; -import com.microsoft.playwright.options.*; +import com.microsoft.playwright.BrowserContext; +import com.microsoft.playwright.Page; +import com.microsoft.playwright.PlaywrightException; +import com.microsoft.playwright.Route; +import com.microsoft.playwright.options.BindingCallback; +import com.microsoft.playwright.options.Cookie; +import com.microsoft.playwright.options.FunctionCallback; +import com.microsoft.playwright.options.Geolocation; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -35,7 +44,6 @@ import static com.microsoft.playwright.impl.Utils.isSafeCloseError; import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.file.Files.readAllBytes; import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; class BrowserContextImpl extends ChannelOwner implements BrowserContext { private final BrowserImpl browser; @@ -109,7 +117,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext { @Override public List cookies(String url) { - return cookies(url == null ? emptyList() : asList(url)); + return cookies(url == null ? new ArrayList<>() : asList(url)); } private void closeImpl() { @@ -181,7 +189,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext { private List cookiesImpl(List urls) { JsonObject params = new JsonObject(); if (urls == null) { - urls = emptyList(); + urls = new ArrayList<>(); } params.add("urls", gson().toJsonTree(urls)); JsonObject json = sendMessage("cookies", params).getAsJsonObject(); @@ -229,7 +237,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext { options = new GrantPermissionsOptions(); } if (permissions == null) { - permissions = emptyList(); + permissions = new ArrayList<>(); } JsonObject params = gson().toJsonTree(options).getAsJsonObject(); params.add("permissions", gson().toJsonTree(permissions)); diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/Serialization.java b/playwright/src/main/java/com/microsoft/playwright/impl/Serialization.java index 8c7a1832..1c3a77bd 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/Serialization.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/Serialization.java @@ -20,8 +20,9 @@ import com.google.gson.*; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import com.microsoft.playwright.ElementHandle; +import com.microsoft.playwright.PlaywrightException; import com.microsoft.playwright.options.*; -import com.microsoft.playwright.*; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -51,7 +52,7 @@ class Serialization { .registerTypeHierarchyAdapter(JSHandleImpl.class, new HandleSerializer()) .registerTypeAdapter((new TypeToken>(){}).getType(), new StringMapSerializer()) .registerTypeAdapter((new TypeToken>(){}).getType(), new FirefoxUserPrefsSerializer()) - .registerTypeAdapter(Path.class, new PathSerializer()).create(); + .registerTypeHierarchyAdapter(Path.class, new PathSerializer()).create(); } return gson; } diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/Utils.java b/playwright/src/main/java/com/microsoft/playwright/impl/Utils.java index 7588d633..0a3b8a88 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/Utils.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/Utils.java @@ -16,30 +16,41 @@ package com.microsoft.playwright.impl; -import com.google.gson.Gson; +import com.google.gson.*; import com.microsoft.playwright.PlaywrightException; import com.microsoft.playwright.options.FilePayload; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Type; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.*; class Utils { // TODO: generate converter. static T convertViaJson(F f, Class t) { - Gson gson = new Gson(); + Gson gson = new GsonBuilder() + // Necessary to avoid access to private fields/classes, + // see https://github.com/microsoft/playwright-java/issues/423 + .registerTypeAdapter(Optional.class, new OptionalSerializer()) + .create(); String json = gson.toJson(f); + System.err.println("json = " + json); return gson.fromJson(json, t); } - static boolean isFunctionBody(String expression) { - expression = expression.trim(); - return expression.startsWith("function") || - expression.startsWith("async ") || - expression.contains("=>"); + private static class OptionalSerializer implements JsonSerializer { + @Override + public JsonElement serialize(Optional src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject result = new JsonObject(); + if (src.isPresent()) { + result.add("value", context.serialize(src.get())); + } + return result; + } } static Set escapeGlobChars = new HashSet<>(Arrays.asList('/', '$', '^', '+', '.', '(', ')', '=', '!', '|'));