diff --git a/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java b/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java index 2f70663b..817756ef 100644 --- a/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java +++ b/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java @@ -629,6 +629,12 @@ class Interface extends TypeDefinition { output.add(offset + " Object call(Source source, Object... args);"); output.add(offset + "}"); output.add(""); + output.add(offset + "interface Error {"); + output.add(offset + " String message();"); + output.add(offset + " String name();"); + output.add(offset + " String stack();"); + output.add(offset + "}"); + output.add(""); break; } case "BrowserContext": { diff --git a/playwright/src/main/java/com/microsoft/playwright/Page.java b/playwright/src/main/java/com/microsoft/playwright/Page.java index 80562cde..bc331fc4 100644 --- a/playwright/src/main/java/com/microsoft/playwright/Page.java +++ b/playwright/src/main/java/com/microsoft/playwright/Page.java @@ -54,6 +54,12 @@ public interface Page { Object call(Source source, Object... args); } + interface Error { + String message(); + String name(); + String stack(); + } + enum EventType { CLOSE, diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java b/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java index 2a2ee1d7..ffe8abf9 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java @@ -212,6 +212,9 @@ public class Connection { case "Frame": result = new FrameImpl(parent, type, guid, initializer); break; + case "FileChooser": + result = new FileChooserImpl(parent, type, guid, initializer); + break; case "JSHandle": result = new JSHandleImpl(parent, type, guid, initializer); break; diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/DownloadImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/DownloadImpl.java index 4d78b099..194046df 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/DownloadImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/DownloadImpl.java @@ -18,23 +18,50 @@ package com.microsoft.playwright.impl; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.microsoft.playwright.Download; -public class DownloadImpl extends ChannelOwner { +public class DownloadImpl extends ChannelOwner implements Download { public DownloadImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) { super(parent, type, guid, initializer); } + @Override public String url() { return initializer.get("url").getAsString(); } + @Override public String suggestedFilename() { return initializer.get("suggestedFilename").getAsString(); } + @Override + public Readable createReadStream() { + return null; + } + + @Override + public void delete() { + sendMessage("delete", new JsonObject()); + } + + @Override + public String failure() { + JsonObject result = sendMessage("failure", new JsonObject()).getAsJsonObject(); + if (result.has("error")) { + return result.get("error").getAsString(); + } + return null; + } + + @Override public String path() { JsonObject params = new JsonObject(); JsonElement result = sendMessage("path", params); return result.getAsJsonObject().get("path").getAsString(); } + + @Override + public void saveAs(String path) { + } } diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/FileChooserImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/FileChooserImpl.java new file mode 100644 index 00000000..c6169b28 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/impl/FileChooserImpl.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.impl; + +import com.google.gson.JsonObject; +import com.microsoft.playwright.ElementHandle; +import com.microsoft.playwright.FileChooser; +import com.microsoft.playwright.Page; + +class FileChooserImpl extends ChannelOwner implements FileChooser { + FileChooserImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) { + super(parent, type, guid, initializer); + } + + @Override + public ElementHandle element() { + return null; + } + + @Override + public boolean isMultiple() { + return false; + } + + @Override + public Page page() { + return null; + } + + @Override + public void setFiles(String files, SetFilesOptions options) { + + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java index b12a8bac..c73f1454 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java @@ -556,6 +556,10 @@ public class FrameImpl extends ChannelOwner implements Frame { } else if ("navigated".equals(event)) { url = params.get("url").getAsString(); name = params.get("name").getAsString(); +// liste + if (!params.has("error") && page != null) { + page.frameNavigated(this); + } } for (WaitForNavigationHelper h : new ArrayList<>(eventHelpers)) { h.handleEvent(event, params); diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java index c822635d..7c2035ca 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java @@ -76,10 +76,45 @@ public class PageImpl extends ChannelOwner implements Page { String guid = params.getAsJsonObject("page").get("guid").getAsString(); PageImpl popup = connection.getExistingObject(guid); listeners.notify(EventType.POPUP, popup); + } else if ("worker".equals(event)) { + String guid = params.getAsJsonObject("worker").get("guid").getAsString(); + Worker worker = connection.getExistingObject(guid); + listeners.notify(EventType.WORKER, worker); } else if ("console".equals(event)) { String guid = params.getAsJsonObject("message").get("guid").getAsString(); ConsoleMessageImpl message = connection.getExistingObject(guid); listeners.notify(EventType.CONSOLE, message); + } else if ("download".equals(event)) { + String guid = params.getAsJsonObject("download").get("guid").getAsString(); + DownloadImpl download = connection.getExistingObject(guid); + listeners.notify(EventType.DOWNLOAD, download); + } else if ("fileChooser".equals(event)) { + String guid = params.getAsJsonObject("element").get("guid").getAsString(); + FileChooser fileChooser = connection.getExistingObject(guid); + listeners.notify(EventType.FILECHOOSER, fileChooser); + } else if ("load".equals(event)) { + listeners.notify(EventType.LOAD, null); + } else if ("domcontentloaded".equals(event)) { + listeners.notify(EventType.DOMCONTENTLOADED, null); + } else if ("request".equals(event)) { + String guid = params.getAsJsonObject("request").get("guid").getAsString(); + Request request = connection.getExistingObject(guid); + listeners.notify(EventType.REQUEST, request); + } else if ("requestFailed".equals(event)) { + String guid = params.getAsJsonObject("request").get("guid").getAsString(); + RequestImpl request = connection.getExistingObject(guid); + if (params.has("failureText")) { + request.failureText = new Gson().fromJson(params, Request.RequestFailure.class); + } + listeners.notify(EventType.REQUESTFAILED, request); + } else if ("requestFinished".equals(event)) { + String guid = params.getAsJsonObject("request").get("guid").getAsString(); + Request request = connection.getExistingObject(guid); + listeners.notify(EventType.REQUESTFINISHED, request); + } else if ("response".equals(event)) { + String guid = params.getAsJsonObject("response").get("guid").getAsString(); + Response response = connection.getExistingObject(guid); + listeners.notify(EventType.RESPONSE, response); } else if ("frameAttached".equals(event)) { String guid = params.getAsJsonObject("frame").get("guid").getAsString(); FrameImpl frame = connection.getExistingObject(guid); @@ -108,10 +143,15 @@ public class PageImpl extends ChannelOwner implements Page { if (!handled) { route.continue_(); } + } else if ("pageError".equals(event)) { + SerializedError error = new Gson().fromJson(params.getAsJsonObject("error"), SerializedError.class); + listeners.notify(EventType.PAGEERROR, new ErrorImpl(error)); + } else if ("crash".equals(event)) { + listeners.notify(EventType.CRASH, null); } else if ("close".equals(event)) { isClosed = true; browserContext.pages.remove(this); - listeners.notify(EventType.CLOSE, this); + listeners.notify(EventType.CLOSE, null); } for (WaitEventHelper h : new ArrayList<>(eventHelpers)) { h.handleEvent(event, params); @@ -524,6 +564,33 @@ public class PageImpl extends ChannelOwner implements Page { return mainFrame.waitForNavigation(convertViaJson(options, Frame.WaitForNavigationOptions.class)); } + void frameNavigated(FrameImpl frame) { + listeners.notify(EventType.FRAMENAVIGATED, frame); + } + + private static class ErrorImpl implements Error { + private final SerializedError error; + + ErrorImpl(SerializedError error) { + this.error = error; + } + + @Override + public String message() { + return error.error.message; + } + + @Override + public String name() { + return error.error.name; + } + + @Override + public String stack() { + return error.error.stack; + } + } + private class WaitEventHelper implements Deferred { private final CompletableFuture result = new CompletableFuture<>(); private final String event; diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/RequestImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/RequestImpl.java index 061d0c57..dd4afcdd 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/RequestImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/RequestImpl.java @@ -30,6 +30,8 @@ public class RequestImpl extends ChannelOwner implements Request { private RequestImpl redirectedFrom; private RequestImpl redirectedTo; private final Map headers = new HashMap<>(); + RequestFailure failureText; + RequestImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) { super(parent, type, guid, initializer); diff --git a/playwright/src/test/java/com/microsoft/playwright/TestEvalOnSelectorAll.java b/playwright/src/test/java/com/microsoft/playwright/TestEvalOnSelectorAll.java index ec2efca1..55863073 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestEvalOnSelectorAll.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestEvalOnSelectorAll.java @@ -20,9 +20,8 @@ import org.junit.jupiter.api.*; import java.io.IOException; import java.util.Arrays; -import java.util.Collections; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestEvalOnSelectorAll { private static Playwright playwright;