diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/BindingCall.java b/playwright/src/main/java/com/microsoft/playwright/impl/BindingCall.java index bf0683288..b000a5085 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/BindingCall.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/BindingCall.java @@ -62,27 +62,30 @@ String name() { } void call(BindingCallback binding) { + String method; + JsonObject params = new JsonObject(); try { - Frame frame = connection.getExistingObject(initializer.getAsJsonObject("frame").get("guid").getAsString()); - BindingCallback.Source source = new SourceImpl(frame); - List args = new ArrayList<>(); - if (initializer.has("handle")) { - JSHandle handle = connection.getExistingObject(initializer.getAsJsonObject("handle").get("guid").getAsString()); - args.add(handle); - } else { - for (JsonElement arg : initializer.getAsJsonArray("args")) { - args.add(deserialize(gson().fromJson(arg, SerializedValue.class))); - } - } - Object result = binding.call(source, args.toArray()); - - JsonObject params = new JsonObject(); - params.add("result", gson().toJsonTree(serializeArgument(result))); - sendMessage("resolve", params, NO_TIMEOUT); + params.add("result", gson().toJsonTree(serializeArgument(invoke(binding)))); + method = "resolve"; } catch (RuntimeException exception) { - JsonObject params = new JsonObject(); params.add("error", gson().toJsonTree(serializeError(exception))); - sendMessage("reject", params, NO_TIMEOUT); + method = "reject"; + } + sendMessage(method, params, NO_TIMEOUT); + } + + private Object invoke(BindingCallback binding) { + Frame frame = connection.getExistingObject(initializer.getAsJsonObject("frame").get("guid").getAsString()); + BindingCallback.Source source = new SourceImpl(frame); + List args = new ArrayList<>(); + if (initializer.has("handle")) { + JSHandle handle = connection.getExistingObject(initializer.getAsJsonObject("handle").get("guid").getAsString()); + args.add(handle); + } else { + for (JsonElement arg : initializer.getAsJsonArray("args")) { + args.add(deserialize(gson().fromJson(arg, SerializedValue.class))); + } } + return binding.call(source, args.toArray()); } } diff --git a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextExposeFunction.java b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextExposeFunction.java index b8a7f7f76..e9c0c6385 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextExposeFunction.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextExposeFunction.java @@ -41,6 +41,14 @@ void exposeBindingShouldWork() { assertEquals(page, bindingSource[0].page()); assertEquals(page.mainFrame(), bindingSource[0].frame()); assertEquals(11, result); + + // https://github.com/microsoft/playwright-java/issues/2009 + page.onConsoleMessage(message -> { + throw new IllegalStateException("failure in console listener"); + }); + IllegalStateException e = assertThrows(IllegalStateException.class, + () -> page.evaluate("() => { add(1, 2); console.log('after add'); }")); + assertEquals("failure in console listener", e.getMessage()); } @Test