fix(api): make all event listeners accept one parameter (#225)

This commit is contained in:
Yury Semikhatsky 2021-01-22 12:49:27 -08:00 committed by GitHub
parent d1f1287e77
commit 808f666399
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 49 additions and 75 deletions

View File

@ -18,6 +18,7 @@ package com.microsoft.playwright;
import java.nio.file.Path;
import java.util.*;
import java.util.function.Consumer;
/**
* - extends: [EventEmitter]
@ -44,8 +45,8 @@ public interface Browser {
}
void onDisconnected(Runnable handler);
void offDisconnected(Runnable handler);
void onDisconnected(Consumer<Browser> handler);
void offDisconnected(Consumer<Browser> handler);
class NewContextOptions {

View File

@ -95,8 +95,8 @@ public interface BrowserContext {
}
void onClose(Runnable handler);
void offClose(Runnable handler);
void onClose(Consumer<BrowserContext> handler);
void offClose(Consumer<BrowserContext> handler);
void onPage(Consumer<Page> handler);
void offPage(Consumer<Page> handler);

View File

@ -75,20 +75,20 @@ public interface Page {
}
void onClose(Runnable handler);
void offClose(Runnable handler);
void onClose(Consumer<Page> handler);
void offClose(Consumer<Page> handler);
void onConsole(Consumer<ConsoleMessage> handler);
void offConsole(Consumer<ConsoleMessage> handler);
void onCrash(Runnable handler);
void offCrash(Runnable handler);
void onCrash(Consumer<Page> handler);
void offCrash(Consumer<Page> handler);
void onDialog(Consumer<Dialog> handler);
void offDialog(Consumer<Dialog> handler);
void onDomContentLoaded(Runnable handler);
void offDomContentLoaded(Runnable handler);
void onDOMContentLoaded(Consumer<Page> handler);
void offDOMContentLoaded(Consumer<Page> handler);
void onDownload(Consumer<Download> handler);
void offDownload(Consumer<Download> handler);
@ -105,8 +105,8 @@ public interface Page {
void onFrameNavigated(Consumer<Frame> handler);
void offFrameNavigated(Consumer<Frame> handler);
void onLoad(Runnable handler);
void offLoad(Runnable handler);
void onLoad(Consumer<Page> handler);
void offLoad(Consumer<Page> handler);
void onPageError(Consumer<Error> handler);
void offPageError(Consumer<Error> handler);

View File

@ -30,8 +30,8 @@ public interface WebSocket {
}
void onClose(Runnable handler);
void offClose(Runnable handler);
void onClose(Consumer<WebSocket> handler);
void offClose(Consumer<WebSocket> handler);
void onFrameReceived(Consumer<FrameData> handler);
void offFrameReceived(Consumer<FrameData> handler);

View File

@ -60,12 +60,12 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
}
@Override
public void onClose(Runnable handler) {
public void onClose(Consumer<BrowserContext> handler) {
listeners.add(EventType.CLOSE, handler);
}
@Override
public void offClose(Runnable handler) {
public void offClose(Consumer<BrowserContext> handler) {
listeners.remove(EventType.CLOSE, handler);
}
@ -416,7 +416,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
if (browser != null) {
browser.contexts.remove(this);
}
listeners.notify(EventType.CLOSE, null);
listeners.notify(EventType.CLOSE, this);
}
}
}

View File

@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import static com.microsoft.playwright.impl.Serialization.gson;
import static com.microsoft.playwright.impl.Utils.convertViaJson;
@ -46,12 +47,12 @@ class BrowserImpl extends ChannelOwner implements Browser {
}
@Override
public void onDisconnected(Runnable handler) {
public void onDisconnected(Consumer<Browser> handler) {
listeners.add(EventType.DISCONNECTED, handler);
}
@Override
public void offDisconnected(Runnable handler) {
public void offDisconnected(Consumer<Browser> handler) {
listeners.remove(EventType.DISCONNECTED, handler);
}
@ -136,7 +137,7 @@ class BrowserImpl extends ChannelOwner implements Browser {
void handleEvent(String event, JsonObject parameters) {
if ("close".equals(event)) {
isConnected = false;
listeners.notify(EventType.DISCONNECTED, null);
listeners.notify(EventType.DISCONNECTED, this);
}
}
}

View File

@ -47,32 +47,6 @@ class ListenerCollection <EventType> {
}
}
private static class RunnableWrapper<EventType> implements Listener<EventType> {
final Runnable callback;
private RunnableWrapper(Runnable callback) {
this.callback = callback;
}
@Override
public void handle(Event<EventType> event) {
callback.run();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RunnableWrapper<?> that = (RunnableWrapper<?>) o;
return Objects.equals(callback, that.callback);
}
@Override
public int hashCode() {
return Objects.hash(callback);
}
}
private static class ConsumerWrapper<EventType> implements Listener<EventType> {
final Consumer<?> callback;
@ -98,13 +72,6 @@ class ListenerCollection <EventType> {
}
}
void add(EventType type, Runnable listener) {
add(type, new RunnableWrapper<>(listener));
}
void remove(EventType type, Runnable listener) {
remove(type, new RunnableWrapper<>(listener));
}
void add(EventType type, Consumer listener) {
add(type, new ConsumerWrapper<>(listener));
}

View File

@ -155,9 +155,9 @@ public class PageImpl extends ChannelOwner implements Page {
}
}
} else if ("load".equals(event)) {
listeners.notify(EventType.LOAD, null);
listeners.notify(EventType.LOAD, this);
} else if ("domcontentloaded".equals(event)) {
listeners.notify(EventType.DOMCONTENTLOADED, null);
listeners.notify(EventType.DOMCONTENTLOADED, this);
} else if ("request".equals(event)) {
String guid = params.getAsJsonObject("request").get("guid").getAsString();
Request request = connection.getExistingObject(guid);
@ -210,11 +210,11 @@ public class PageImpl extends ChannelOwner implements Page {
SerializedError error = gson().fromJson(params.getAsJsonObject("error"), SerializedError.class);
listeners.notify(EventType.PAGEERROR, new ErrorImpl(error));
} else if ("crash".equals(event)) {
listeners.notify(EventType.CRASH, null);
listeners.notify(EventType.CRASH, this);
} else if ("close".equals(event)) {
isClosed = true;
browserContext.pages.remove(this);
listeners.notify(EventType.CLOSE, null);
listeners.notify(EventType.CLOSE, this);
}
}
@ -237,12 +237,12 @@ public class PageImpl extends ChannelOwner implements Page {
}
@Override
public void onClose(Runnable handler) {
public void onClose(Consumer<Page> handler) {
listeners.add(EventType.CLOSE, handler);
}
@Override
public void offClose(Runnable handler) {
public void offClose(Consumer<Page> handler) {
listeners.remove(EventType.CLOSE, handler);
}
@ -257,12 +257,12 @@ public class PageImpl extends ChannelOwner implements Page {
}
@Override
public void onCrash(Runnable handler) {
public void onCrash(Consumer<Page> handler) {
listeners.add(EventType.CRASH, handler);
}
@Override
public void offCrash(Runnable handler) {
public void offCrash(Consumer<Page> handler) {
listeners.remove(EventType.CRASH, handler);
}
@ -277,12 +277,12 @@ public class PageImpl extends ChannelOwner implements Page {
}
@Override
public void onDomContentLoaded(Runnable handler) {
public void onDOMContentLoaded(Consumer<Page> handler) {
listeners.add(EventType.DOMCONTENTLOADED, handler);
}
@Override
public void offDomContentLoaded(Runnable handler) {
public void offDOMContentLoaded(Consumer<Page> handler) {
listeners.remove(EventType.DOMCONTENTLOADED, handler);
}
@ -337,12 +337,12 @@ public class PageImpl extends ChannelOwner implements Page {
}
@Override
public void onLoad(Runnable handler) {
public void onLoad(Consumer<Page> handler) {
listeners.add(EventType.LOAD, handler);
}
@Override
public void offLoad(Runnable handler) {
public void offLoad(Consumer<Page> handler) {
listeners.remove(EventType.LOAD, handler);
}

View File

@ -44,12 +44,12 @@ class WebSocketImpl extends ChannelOwner implements WebSocket {
}
@Override
public void onClose(Runnable handler) {
public void onClose(Consumer<WebSocket> handler) {
listeners.add(EventType.CLOSE, handler);
}
@Override
public void offClose(Runnable handler) {
public void offClose(Consumer<WebSocket> handler) {
listeners.remove(EventType.CLOSE, handler);
}
@ -212,7 +212,7 @@ class WebSocketImpl extends ChannelOwner implements WebSocket {
}
case "close": {
isClosed = true;
listeners.notify(EventType.CLOSE, null);
listeners.notify(EventType.CLOSE, this);
break;
}
default: {

View File

@ -223,7 +223,7 @@ public class TestDefaultBrowserContext2 extends TestBase {
void shouldFireCloseEventForAPersistentContext() {
launchPersistent();
boolean[] closed = {false};
persistentContext.onClose(() -> closed[0] = true);
persistentContext.onClose(context -> closed[0] = true);
closePersistentContext();
assertTrue(closed[0]);
}

View File

@ -101,7 +101,7 @@ public class TestWebSocket extends TestBase {
page.onWebSocket(ws -> {
log.add("open<" + ws.url() + ">");
webSocket[0] = ws;
ws.onClose(() -> {
ws.onClose(ws1 -> {
log.add("close");
socketClosed[0] = true;
});
@ -123,7 +123,7 @@ public class TestWebSocket extends TestBase {
log.add("open");
ws.onFrameSent(frameData -> log.add("sent<" + frameData.text() + ">"));
ws.onFrameReceived(frameData -> log.add("received<" + frameData.text() + ">"));
ws.onClose(() -> { log.add("close"); socketClosed[0] = true; });
ws.onClose(ws1 -> { log.add("close"); socketClosed[0] = true; });
});
page.evaluate("port => {\n" +
" const ws = new WebSocket('ws://localhost:' + port + '/ws');\n" +
@ -146,7 +146,7 @@ public class TestWebSocket extends TestBase {
boolean[] socketClosed = {false};
List<com.microsoft.playwright.WebSocket.FrameData> sent = new ArrayList<>();
page.onWebSocket(ws -> {
ws.onClose(() -> { socketClosed[0] = true; });
ws.onClose(ws1 -> socketClosed[0] = true);
ws.onFrameSent(frameData -> sent.add(frameData));
});
page.evaluate("port => {\n" +

View File

@ -375,7 +375,7 @@ class Event extends Element {
eventNames.put("Page.console", "Console");
eventNames.put("Page.crash", "Crash");
eventNames.put("Page.dialog", "Dialog");
eventNames.put("Page.domcontentloaded", "DomContentLoaded");
eventNames.put("Page.domcontentloaded", "DOMContentLoaded");
eventNames.put("Page.download", "Download");
eventNames.put("Page.filechooser", "FileChooser");
eventNames.put("Page.frameattached", "FrameAttached");
@ -438,7 +438,12 @@ class Event extends Element {
throw new RuntimeException("Unknown event: " + jsonPath);
}
String name = eventNames.get(jsonPath);
String listenerType = "void".equals(type.toJava()) ? "Runnable" : "Consumer<" + type.toJava() + ">";
String paramType = type.toJava();
// TODO: remove once fixed upstream
if (paramType.equals("void")) {
paramType = parent.jsonName;
}
String listenerType = "Consumer<" + paramType + ">";
output.add(offset + "void on" + name + "(" + listenerType + " handler);");
output.add(offset + "void off" + name + "(" + listenerType + " handler);");
}
@ -1050,7 +1055,7 @@ class Interface extends TypeDefinition {
output.add("import java.nio.file.Path;");
}
output.add("import java.util.*;");
if (asList("Page", "BrowserContext", "WebSocket", "Worker").contains(jsonName)) {
if (asList("Page", "Browser", "BrowserContext", "WebSocket", "Worker").contains(jsonName)) {
output.add("import java.util.function.Consumer;");
}
if (asList("Page", "Frame", "BrowserContext", "WebSocket").contains(jsonName)) {