From 454b155bbc13a6efcf341c24138f15b65a2a7a07 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Fri, 22 Jan 2021 13:35:11 -0800 Subject: [PATCH] chore: delete Listener interface from implementation (#226) --- .../playwright/impl/BrowserContextImpl.java | 31 ++------- .../microsoft/playwright/impl/FrameImpl.java | 14 ++-- .../microsoft/playwright/impl/Listener.java | 23 ------- .../playwright/impl/ListenerCollection.java | 69 ++++--------------- .../microsoft/playwright/impl/PageImpl.java | 65 ++++++----------- .../playwright/impl/WaitableEvent.java | 22 +++--- .../playwright/impl/WaitableRace.java | 1 - .../playwright/impl/WebSocketImpl.java | 51 +++++--------- .../microsoft/playwright/impl/WorkerImpl.java | 3 +- 9 files changed, 73 insertions(+), 206 deletions(-) delete mode 100644 playwright/src/main/java/com/microsoft/playwright/impl/Listener.java 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 ab2e18eb..3fa402d9 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/BrowserContextImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/BrowserContextImpl.java @@ -81,8 +81,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext { private T waitForEventWithTimeout(EventType eventType, Runnable code, Double timeout) { List> waitables = new ArrayList<>(); - waitables.add(new WaitableEvent<>(listeners, eventType) - .apply(event -> (T) event.data())); + waitables.add(new WaitableEvent<>(listeners, eventType)); waitables.add(new WaitableContextClose<>()); waitables.add(timeoutSettings.createWaitable(timeout)); return runUntil(code, new WaitableRace<>(waitables)); @@ -349,36 +348,14 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext { unroute(new UrlMatcher(url), handler); } - private class WaitableContextClose implements Waitable, Listener { - private String errorMessage; - + private class WaitableContextClose extends WaitableEvent { WaitableContextClose() { - listeners.add(EventType.CLOSE, this); - } - - @Override - public void handle(Event event) { - if (EventType.CLOSE == event.type()) { - errorMessage = "Context closed"; - } else { - return; - } - dispose(); - } - - @Override - public boolean isDone() { - return errorMessage != null; + super(BrowserContextImpl.this.listeners, EventType.CLOSE); } @Override public R get() { - throw new PlaywrightException(errorMessage); - } - - @Override - public void dispose() { - listeners.remove(EventType.CLOSE, this); + throw new PlaywrightException("Context closed"); } } 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 850b87c2..ba1cefc2 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java @@ -26,6 +26,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; +import java.util.function.Consumer; import static com.microsoft.playwright.Frame.LoadState.*; import static com.microsoft.playwright.impl.Serialization.*; @@ -766,7 +767,7 @@ public class FrameImpl extends ChannelOwner implements Frame { runUntil(() -> {}, new WaitableRace<>(waitables)); } - private class WaitForLoadStateHelper implements Waitable, Listener { + private class WaitForLoadStateHelper implements Waitable, Consumer { private final LoadState expectedState; private boolean isDone; @@ -779,9 +780,8 @@ public class FrameImpl extends ChannelOwner implements Frame { } @Override - public void handle(Event event) { - assert event.type() == InternalEventType.LOADSTATE; - if (expectedState.equals(event.data())) { + public void accept(LoadState state) { + if (expectedState.equals(state)) { isDone = true; dispose(); } @@ -801,7 +801,7 @@ public class FrameImpl extends ChannelOwner implements Frame { } } - private class WaitForNavigationHelper implements Waitable, Listener { + private class WaitForNavigationHelper implements Waitable, Consumer { private final UrlMatcher matcher; private final LoadState expectedLoadState; private WaitForLoadStateHelper loadStateHelper; @@ -816,9 +816,7 @@ public class FrameImpl extends ChannelOwner implements Frame { } @Override - public void handle(Event event) { - assert InternalEventType.NAVIGATED == event.type(); - JsonObject params = (JsonObject) event.data(); + public void accept(JsonObject params) { if (!matcher.test(params.get("url").getAsString())) { return; } diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/Listener.java b/playwright/src/main/java/com/microsoft/playwright/impl/Listener.java deleted file mode 100644 index b83c137c..00000000 --- a/playwright/src/main/java/com/microsoft/playwright/impl/Listener.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.microsoft.playwright.Event; - -public interface Listener { - void handle(Event event); -} diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/ListenerCollection.java b/playwright/src/main/java/com/microsoft/playwright/impl/ListenerCollection.java index 4bfc8d60..7b954a2b 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/ListenerCollection.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/ListenerCollection.java @@ -16,71 +16,28 @@ package com.microsoft.playwright.impl; -import com.microsoft.playwright.Event; - -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.function.Consumer; class ListenerCollection { - private final HashMap>> listeners = new HashMap<>(); + private final HashMap>> listeners = new HashMap<>(); - void notify(EventType eventType, Object param) { - List> list = listeners.get(eventType); + void notify(EventType eventType, T param) { + List> list = listeners.get(eventType); if (list == null) { return; } - Event event = new Event() { - @Override - public EventType type() { - return eventType; - } - - @Override - public Object data() { - return param; - } - }; - - for (Listener listener: new ArrayList<>(list)) { - listener.handle(event); + for (Consumer listener: new ArrayList<>(list)) { + ((Consumer) listener).accept(param); } } - private static class ConsumerWrapper implements Listener { - final Consumer callback; - - private ConsumerWrapper(Consumer callback) { - this.callback = callback; - } - - @Override - public void handle(Event event) { - ((Consumer) callback).accept(event.data()); - } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ConsumerWrapper that = (ConsumerWrapper) o; - return Objects.equals(callback, that.callback); - } - - @Override - public int hashCode() { - return Objects.hash(callback); - } - } - - void add(EventType type, Consumer listener) { - add(type, new ConsumerWrapper<>(listener)); - } - void remove(EventType type, Consumer listener) { - remove(type, new ConsumerWrapper<>(listener)); - } - - void add(EventType type, Listener listener) { - List> list = listeners.get(type); + void add(EventType type, Consumer listener) { + List> list = listeners.get(type); if (list == null) { list = new ArrayList<>(); listeners.put(type, list); @@ -88,8 +45,8 @@ class ListenerCollection { list.add(listener); } - void remove(EventType type, Listener listener) { - List> list = listeners.get(type); + void remove(EventType type, Consumer listener) { + List> list = listeners.get(type); if (list == null) { return; } 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 0277d3c3..5a46b6c8 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java @@ -29,6 +29,7 @@ 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.isSafeCloseError; +import static java.util.Arrays.asList; public class PageImpl extends ChannelOwner implements Page { @@ -43,7 +44,7 @@ public class PageImpl extends ChannelOwner implements Page { private final Set frames = new LinkedHashSet<>(); private final ListenerCollection listeners = new ListenerCollection() { @Override - void add(EventType eventType, Listener listener) { + void add(EventType eventType, Consumer listener) { if (eventType == EventType.FILECHOOSER) { willAddFileChooserListener(); } @@ -51,7 +52,7 @@ public class PageImpl extends ChannelOwner implements Page { } @Override - void remove(EventType eventType, Listener listener) { + void remove(EventType eventType, Consumer listener) { super.remove(eventType, listener); if (eventType == EventType.FILECHOOSER) { didRemoveFileChooserListener(); @@ -444,8 +445,7 @@ public class PageImpl extends ChannelOwner implements Page { private T waitForEventWithTimeout(EventType eventType, Runnable code, Double timeout) { List> waitables = new ArrayList<>(); - waitables.add(new WaitableEvent<>(listeners, eventType) - .apply(event -> (T) event.data())); + waitables.add(new WaitableEvent<>(listeners, eventType)); waitables.add(createWaitForCloseHelper()); waitables.add(createWaitableTimeout(timeout)); return runUntil(code, new WaitableRace<>(waitables)); @@ -1219,13 +1219,13 @@ public class PageImpl extends ChannelOwner implements Page { } } - private class WaitableFrameDetach extends WaitableEvent { + private class WaitableFrameDetach extends WaitableEvent { WaitableFrameDetach(Frame frameArg) { - super(PageImpl.this.listeners, EventType.FRAMEDETACHED, event -> frameArg.equals(event.data())); + super(PageImpl.this.listeners, EventType.FRAMEDETACHED, detachedFrame -> frameArg.equals(detachedFrame)); } @Override - public Event get() { + public Frame get() { throw new PlaywrightException("Navigating frame was detached"); } } @@ -1237,47 +1237,28 @@ public class PageImpl extends ChannelOwner implements Page { } Waitable createWaitForCloseHelper() { - return new WaitablePageClose(); + return new WaitableRace(asList(new WaitablePageClose(), new WaitablePageCrash())); } - private class WaitablePageClose implements Waitable, Listener { - private final List subscribedEvents; - private String errorMessage; - + private class WaitablePageClose extends WaitableEvent { WaitablePageClose() { - subscribedEvents = Arrays.asList(EventType.CLOSE, EventType.CRASH); - for (EventType e : subscribedEvents) { - listeners.add(e, this); - } + super(PageImpl.this.listeners, EventType.CLOSE); } @Override - public void handle(Event event) { - if (EventType.CLOSE == event.type()) { - errorMessage = "Page closed"; - } else if (EventType.CRASH == event.type()) { - errorMessage = "Page crashed"; - } else { - return; - } - dispose(); + public T get() { + throw new PlaywrightException("Page closed"); + } + } + + private class WaitablePageCrash extends WaitableEvent { + WaitablePageCrash() { + super(PageImpl.this.listeners, EventType.CRASH); } @Override - public boolean isDone() { - return errorMessage != null; - } - - @Override - public R get() { - throw new PlaywrightException(errorMessage); - } - - @Override - public void dispose() { - for (EventType e : subscribedEvents) { - listeners.remove(e, this); - } + public T get() { + throw new PlaywrightException("Page crashed"); } } @@ -1306,8 +1287,7 @@ public class PageImpl extends ChannelOwner implements Page { } List> waitables = new ArrayList<>(); waitables.add(new WaitableEvent<>(listeners, EventType.REQUEST, - e -> predicate == null || predicate.test(((Request) e.data()))) - .apply(event -> (Request) event.data())); + request -> predicate == null || predicate.test(request))); waitables.add(createWaitForCloseHelper()); waitables.add(createWaitableTimeout(options.timeout)); return runUntil(code, new WaitableRace<>(waitables)); @@ -1338,8 +1318,7 @@ public class PageImpl extends ChannelOwner implements Page { } List> waitables = new ArrayList<>(); waitables.add(new WaitableEvent<>(listeners, EventType.RESPONSE, - e -> predicate == null || predicate.test(((Response) e.data()))) - .apply(event -> (Response) event.data())); + response -> predicate == null || predicate.test(response))); waitables.add(createWaitForCloseHelper()); waitables.add(createWaitableTimeout(options.timeout)); return runUntil(code, new WaitableRace<>(waitables)); diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/WaitableEvent.java b/playwright/src/main/java/com/microsoft/playwright/impl/WaitableEvent.java index ca2077eb..217167a5 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/WaitableEvent.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/WaitableEvent.java @@ -18,19 +18,20 @@ package com.microsoft.playwright.impl; import com.microsoft.playwright.Event; +import java.util.function.Consumer; import java.util.function.Predicate; -class WaitableEvent implements Waitable>, Listener { +class WaitableEvent implements Waitable, Consumer { final ListenerCollection listeners; private final EventType type; - private final Predicate> predicate; - private Event event; + private final Predicate predicate; + private T eventArg; WaitableEvent(ListenerCollection listeners, EventType type) { this(listeners, type, null); } - WaitableEvent(ListenerCollection listeners, EventType type, Predicate> predicate) { + WaitableEvent(ListenerCollection listeners, EventType type, Predicate predicate) { this.listeners = listeners; this.type = type; this.predicate = predicate; @@ -38,19 +39,18 @@ class WaitableEvent implements Waitable>, Listener event) { - assert type.equals(event.type()); - if (predicate != null && !predicate.test(event)) { + public void accept(T eventArg) { + if (predicate != null && !predicate.test(eventArg)) { return; } - this.event = event; + this.eventArg = eventArg; dispose(); } @Override public boolean isDone() { - return event != null; + return eventArg != null; } @Override @@ -59,7 +59,7 @@ class WaitableEvent implements Waitable>, Listener get() { - return event; + public T get() { + return eventArg; } } diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/WaitableRace.java b/playwright/src/main/java/com/microsoft/playwright/impl/WaitableRace.java index 8319fa2c..ed3b7660 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/WaitableRace.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/WaitableRace.java @@ -16,7 +16,6 @@ package com.microsoft.playwright.impl; -import java.util.Arrays; import java.util.Collection; class WaitableRace implements Waitable { diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/WebSocketImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/WebSocketImpl.java index d2a1bf24..db6e45b8 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/WebSocketImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/WebSocketImpl.java @@ -117,51 +117,32 @@ class WebSocketImpl extends ChannelOwner implements WebSocket { return initializer.get("url").getAsString(); } - private class WaitableWebSocketError implements Waitable, Listener { - private final List subscribedEvents; - private String errorMessage; + private class WaitableWebSocketClose extends WaitableEvent { + WaitableWebSocketClose() { + super(WebSocketImpl.this.listeners, EventType.CLOSE); + } + @Override + public T get() { + throw new PlaywrightException("Socket closed"); + } + } + + private class WaitableWebSocketError extends WaitableEvent { WaitableWebSocketError() { - subscribedEvents = Arrays.asList(EventType.CLOSE, EventType.SOCKETERROR); - for (EventType e : subscribedEvents) { - listeners.add(e, this); - } + super(WebSocketImpl.this.listeners, EventType.SOCKETERROR); } @Override - public void handle(Event event) { - if (EventType.SOCKETERROR == event.type()) { - errorMessage = "Socket error"; - } else if (EventType.CLOSE == event.type()) { - errorMessage = "Socket closed"; - } else { - return; - } - dispose(); - } - - @Override - public boolean isDone() { - return errorMessage != null; - } - - @Override - public R get() { - throw new PlaywrightException(errorMessage); - } - - @Override - public void dispose() { - for (EventType e : subscribedEvents) { - listeners.remove(e, this); - } + public T get() { + throw new PlaywrightException("Socket error"); } } private T waitForEventWithTimeout(EventType eventType, Runnable code, Double timeout) { List> waitables = new ArrayList<>(); - waitables.add(new WaitableEvent<>(listeners, eventType) - .apply(event -> (T) event.data())); + waitables.add(new WaitableEvent<>(listeners, eventType)); + waitables.add(new WaitableWebSocketClose<>()); waitables.add(new WaitableWebSocketError<>()); waitables.add(page.createWaitForCloseHelper()); waitables.add(page.createWaitableTimeout(timeout)); diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/WorkerImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/WorkerImpl.java index a526d609..c175217e 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/WorkerImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/WorkerImpl.java @@ -52,8 +52,7 @@ class WorkerImpl extends ChannelOwner implements Worker { private T waitForEventWithTimeout(EventType eventType, Runnable code, Double timeout) { List> waitables = new ArrayList<>(); - waitables.add(new WaitableEvent<>(listeners, eventType) - .apply(event -> (T) event.data())); + waitables.add(new WaitableEvent<>(listeners, eventType)); waitables.add(page.createWaitForCloseHelper()); waitables.add(page.createWaitableTimeout(timeout)); return runUntil(code, new WaitableRace<>(waitables));