fix: rename Route.continue_ to Route.resume (#253)

This commit is contained in:
Yury Semikhatsky 2021-02-03 14:14:35 -08:00 committed by GitHub
parent ee4f8698da
commit 6dbebaed5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 77 additions and 95 deletions

View File

@ -34,19 +34,6 @@ import java.util.*;
* request is issued to a redirected url.
*/
public interface Request {
class RequestFailure {
/**
* Human-readable error message, e.g. {@code 'net::ERR_FAILED'}.
*/
private String errorText;
public RequestFailure(String errorText) {
this.errorText = errorText;
}
public String errorText() {
return this.errorText;
}
}
class RequestTiming {
/**
* Request start time in milliseconds elapsed since January 1, 1970 00:00:00 UTC
@ -126,7 +113,7 @@ public interface Request {
*
* <p> Example of logging of all the failed requests:
*/
RequestFailure failure();
String failure();
/**
* Returns the {@code Frame} that initiated this request.
*/

View File

@ -25,7 +25,7 @@ import java.util.*;
* allows to handle the route.
*/
public interface Route {
class ContinueOptions {
class ResumeOptions {
/**
* If set changes the request HTTP headers. Header values will be converted to a string.
*/
@ -43,23 +43,23 @@ public interface Route {
*/
public String url;
public ContinueOptions withHeaders(Map<String, String> headers) {
public ResumeOptions withHeaders(Map<String, String> headers) {
this.headers = headers;
return this;
}
public ContinueOptions withMethod(String method) {
public ResumeOptions withMethod(String method) {
this.method = method;
return this;
}
public ContinueOptions withPostData(String postData) {
public ResumeOptions withPostData(String postData) {
this.postData = postData.getBytes(StandardCharsets.UTF_8);
return this;
}
public ContinueOptions withPostData(byte[] postData) {
public ResumeOptions withPostData(byte[] postData) {
this.postData = postData;
return this;
}
public ContinueOptions withUrl(String url) {
public ResumeOptions withUrl(String url) {
this.url = url;
return this;
}
@ -138,13 +138,13 @@ public interface Route {
* - {@code 'failed'} - A generic failure occurred.
*/
void abort(String errorCode);
default void continue_() {
continue_(null);
default void resume() {
resume(null);
}
/**
* Continues route's request with optional overrides.
*/
void continue_(ContinueOptions options);
void resume(ResumeOptions options);
default void fulfill() {
fulfill(null);
}

View File

@ -367,7 +367,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
Route route = connection.getExistingObject(params.getAsJsonObject("route").get("guid").getAsString());
boolean handled = routes.handle(route);
if (!handled) {
route.continue_();
route.resume();
}
} else if ("page".equals(event)) {
PageImpl page = connection.getExistingObject(params.getAsJsonObject("page").get("guid").getAsString());

View File

@ -168,7 +168,7 @@ public class PageImpl extends ChannelOwner implements Page {
String guid = params.getAsJsonObject("request").get("guid").getAsString();
RequestImpl request = connection.getExistingObject(guid);
if (params.has("failureText")) {
request.failure = new Request.RequestFailure(params.get("failureText").getAsString());
request.failure = params.get("failureText").getAsString();
}
listeners.notify(EventType.REQUESTFAILED, request);
} else if ("requestFinished".equals(event)) {
@ -204,7 +204,7 @@ public class PageImpl extends ChannelOwner implements Page {
handled = browserContext.routes.handle(route);
}
if (!handled) {
route.continue_();
route.resume();
}
} else if ("video".equals(event)) {
video().setRelativePath(params.get("relativePath").getAsString());

View File

@ -32,7 +32,7 @@ public class RequestImpl extends ChannelOwner implements Request {
private RequestImpl redirectedFrom;
private RequestImpl redirectedTo;
final Map<String, String> headers = new HashMap<>();
RequestFailure failure;
String failure;
RequestTiming timing;
RequestImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
@ -54,7 +54,7 @@ public class RequestImpl extends ChannelOwner implements Request {
}
@Override
public RequestFailure failure() {
public String failure() {
return failure;
}

View File

@ -16,7 +16,6 @@
package com.microsoft.playwright.impl;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.microsoft.playwright.PlaywrightException;
import com.microsoft.playwright.Request;
@ -25,7 +24,6 @@ import com.microsoft.playwright.Route;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Base64;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@ -44,13 +42,13 @@ public class RouteImpl extends ChannelOwner implements Route {
}
@Override
public void continue_(ContinueOptions options) {
withLogging("Route.continue", () -> continueImpl(options));
public void resume(ResumeOptions options) {
withLogging("Route.resume", () -> resumeImpl(options));
}
private void continueImpl(ContinueOptions options) {
private void resumeImpl(ResumeOptions options) {
if (options == null) {
options = new ContinueOptions();
options = new ResumeOptions();
}
JsonObject params = new JsonObject();
if (options.url != null) {

View File

@ -43,7 +43,7 @@ public class TestBrowserContextRoute extends TestBase {
assertEquals("document", request.resourceType());
assertEquals(page.mainFrame(), request.frame());
assertEquals("about:blank", request.frame().url());
route.continue_();
route.resume();
});
Response response = page.navigate(server.EMPTY_PAGE);
assertTrue(response.ok());
@ -59,20 +59,20 @@ public class TestBrowserContextRoute extends TestBase {
List<Integer> intercepted = new ArrayList<>();
Consumer<Route> handler1 = route -> {
intercepted.add(1);
route.continue_();
route.resume();
};
context.route("**/empty.html", handler1);
context.route("**/empty.html", route -> {
intercepted.add(2);
route.continue_();
route.resume();
});
context.route("**/empty.html", route -> {
intercepted.add(3);
route.continue_();
route.resume();
});
context.route("**/*", route -> {
intercepted.add(4);
route.continue_();
route.resume();
});
page.navigate(server.EMPTY_PAGE);
assertEquals(asList(1), intercepted);

View File

@ -81,7 +81,7 @@ public class TestNetworkRequest extends TestBase {
List<Request> requests = new ArrayList<>();
page.route("**", route -> {
requests.add(route.request());
route.continue_();
route.resume();
});
page.navigate(server.PREFIX + "/foo.html");
@ -185,7 +185,7 @@ public class TestNetworkRequest extends TestBase {
});
Request[] request = {null};
page.onRequest(r -> request[0] = r);
page.route("/post", route -> route.continue_());
page.route("/post", route -> route.resume());
page.evaluate("async () => {\n" +
" await fetch('./post', { method: 'POST', body: new Uint8Array(Array.from(Array(256).keys())) });\n" +
"}");

View File

@ -62,16 +62,16 @@ public class TestPageEventNetwork extends TestBase {
assertNull(failedRequests.get(0).response());
assertEquals("stylesheet", failedRequests.get(0).resourceType());
if (isChromium()) {
assertEquals("net::ERR_EMPTY_RESPONSE", failedRequests.get(0).failure().errorText());
assertEquals("net::ERR_EMPTY_RESPONSE", failedRequests.get(0).failure());
} else if (isWebKit()) {
if (isMac)
assertEquals("The network connection was lost.", failedRequests.get(0).failure().errorText());
assertEquals("The network connection was lost.", failedRequests.get(0).failure());
else if (isWindows)
assertEquals("Server returned nothing (no headers, no data)", failedRequests.get(0).failure().errorText());
assertEquals("Server returned nothing (no headers, no data)", failedRequests.get(0).failure());
else
assertEquals("Message Corrupt", failedRequests.get(0).failure().errorText());
assertEquals("Message Corrupt", failedRequests.get(0).failure());
} else {
assertEquals("NS_ERROR_NET_RESET", failedRequests.get(0).failure().errorText());
assertEquals("NS_ERROR_NET_RESET", failedRequests.get(0).failure());
}
assertNotNull(failedRequests.get(0).frame());
}

View File

@ -50,7 +50,7 @@ public class TestPageRoute extends TestBase {
assertEquals("document", request.resourceType());
assertTrue(request.frame() == page.mainFrame());
assertEquals("about:blank", request.frame().url());
route.continue_();
route.resume();
intercepted[0] = true;
});
Response response = page.navigate(server.EMPTY_PAGE);
@ -64,20 +64,20 @@ public class TestPageRoute extends TestBase {
List<Integer> intercepted = new ArrayList<>();
Consumer<Route> handler1 = route -> {
intercepted.add(1);
route.continue_();
route.resume();
};
page.route("**/empty.html", handler1);
page.route("**/empty.html", route -> {
intercepted.add(2);
route.continue_();
route.resume();
});
page.route("**/empty.html", route -> {
intercepted.add(3);
route.continue_();
route.resume();
});
page.route("**/*", route -> {
intercepted.add(4);
route.continue_();
route.resume();
});
page.navigate(server.EMPTY_PAGE);
assertEquals(asList(1), intercepted);
@ -97,7 +97,7 @@ public class TestPageRoute extends TestBase {
void shouldWorkWhenPOSTIsRedirectedWith302() {
server.setRedirect("/rredirect", "/empty.html");
page.navigate(server.EMPTY_PAGE);
page.route("**/*", route -> route.continue_());
page.route("**/*", route -> route.resume());
page.setContent("<form action='/rredirect' method='post'>\n" +
" <input type='hidden' id='foo' name='foo' value='FOOBAR'>\n" +
"</form>");
@ -111,7 +111,7 @@ public class TestPageRoute extends TestBase {
page.route("**/*", route -> {
Map<String, String> headers = new HashMap<>(route.request().headers());
headers.put("foo", "bar");
route.continue_(new Route.ContinueOptions().withHeaders(headers));
route.resume(new Route.ResumeOptions().withHeaders(headers));
});
page.navigate(server.PREFIX + "/rrredirect");
}
@ -123,7 +123,7 @@ public class TestPageRoute extends TestBase {
page.route("**/*", route -> {
Map<String, String> headers = new HashMap<>(route.request().headers());
headers.remove("foo");
route.continue_(new Route.ContinueOptions().withHeaders(headers));
route.resume(new Route.ResumeOptions().withHeaders(headers));
});
Future<Server.Request> serverRequest = server.futureRequest("/title.html");
@ -136,7 +136,7 @@ public class TestPageRoute extends TestBase {
List<Request> requests = new ArrayList<>();
page.route("**/*", route -> {
requests.add(route.request());
route.continue_();
route.resume();
});
page.navigate(server.PREFIX + "/one-style.html");
assertTrue(requests.get(1).url().contains("/one-style.css"));
@ -151,7 +151,7 @@ public class TestPageRoute extends TestBase {
context.addCookies(asList(new BrowserContext.AddCookie()
.withUrl(server.EMPTY_PAGE).withName("foo").withValue("bar")));
// Setup request interception.
page.route("**/*", route -> route.continue_());
page.route("**/*", route -> route.resume());
Response response = page.reload();
assertEquals(200, response.status());
}
@ -161,7 +161,7 @@ public class TestPageRoute extends TestBase {
page.setExtraHTTPHeaders(mapOf("foo", "bar"));
page.route("**/*", route -> {
assertEquals("bar", route.request().headers().get("foo"));
route.continue_();
route.resume();
});
Response response = page.navigate(server.EMPTY_PAGE);
assertTrue(response.ok());
@ -173,7 +173,7 @@ public class TestPageRoute extends TestBase {
void shouldWorkWithRedirectInsideSyncXHR() {
page.navigate(server.EMPTY_PAGE);
server.setRedirect("/logo.png", "/pptr.png");
page.route("**/*", route -> route.continue_());
page.route("**/*", route -> route.resume());
Object status = page.evaluate("async () => {\n" +
" const request = new XMLHttpRequest();\n" +
" request.open('GET', '/logo.png', false); // `false` makes the request synchronous\n" +
@ -188,7 +188,7 @@ public class TestPageRoute extends TestBase {
page.setExtraHTTPHeaders(mapOf("referer", server.EMPTY_PAGE));
page.route("**/*", route -> {
assertEquals(server.EMPTY_PAGE, route.request().headers().get("referer"));
route.continue_();
route.resume();
});
Response response = page.navigate(server.EMPTY_PAGE);
assertTrue(response.ok());
@ -219,17 +219,17 @@ public class TestPageRoute extends TestBase {
});
assertNotNull(failedRequest);
if (isWebKit())
assertEquals("Request intercepted", failedRequest.failure().errorText());
assertEquals("Request intercepted", failedRequest.failure());
else if (isFirefox())
assertEquals("NS_ERROR_OFFLINE", failedRequest.failure().errorText());
assertEquals("NS_ERROR_OFFLINE", failedRequest.failure());
else
assertEquals("net::ERR_INTERNET_DISCONNECTED", failedRequest.failure().errorText());
assertEquals("net::ERR_INTERNET_DISCONNECTED", failedRequest.failure());
}
@Test
void shouldSendReferer() throws ExecutionException, InterruptedException {
page.setExtraHTTPHeaders(mapOf("referer", "http://google.com/"));
page.route("**/*", route -> route.continue_());
page.route("**/*", route -> route.resume());
Future<Server.Request> request = server.futureRequest("/grid.html");
page.navigate(server.PREFIX + "/grid.html");
assertEquals(asList("http://google.com/"), request.get().headers.get("referer"));
@ -256,7 +256,7 @@ public class TestPageRoute extends TestBase {
void shouldNotWorkWithRedirects() {
List<Request> intercepted = new ArrayList<>();
page.route("**/*", route -> {
route.continue_();
route.resume();
intercepted.add(route.request());
});
server.setRedirect("/non-existing-page.html", "/non-existing-page-2.html");
@ -293,7 +293,7 @@ public class TestPageRoute extends TestBase {
void shouldWorkWithRedirectsForSubresources() {
List<Request> intercepted = new ArrayList<>();
page.route("**/*", route -> {
route.continue_();
route.resume();
intercepted.add(route.request());
});
server.setRedirect("/one-style.css", "/two-style.css");
@ -339,7 +339,7 @@ public class TestPageRoute extends TestBase {
if (spinner[0]) {
route.abort();
} else {
route.continue_();
route.resume();
}
spinner[0] = !spinner[0];
});
@ -355,7 +355,7 @@ public class TestPageRoute extends TestBase {
List<Request> requests = new ArrayList<>();
page.route("**/*", route -> {
requests.add(route.request());
route.continue_();
route.resume();
});
String dataURL = "data:text/html,<div>yo</div>";
Response response = page.navigate(dataURL);
@ -369,7 +369,7 @@ public class TestPageRoute extends TestBase {
List<Request> requests = new ArrayList<>();
page.route("**/*", route -> {
requests.add(route.request());
route.continue_();
route.resume();
});
String dataURL = "data:text/html,<div>yo</div>";
Object text = page.evaluate("url => fetch(url).then(r => r.text())", dataURL);
@ -382,7 +382,7 @@ public class TestPageRoute extends TestBase {
List<Request> requests = new ArrayList<>();
page.route("**/*", route -> {
requests.add(route.request());
route.continue_();
route.resume();
});
Response response = page.navigate(server.EMPTY_PAGE + "#hash");
assertEquals(200, response.status());
@ -395,7 +395,7 @@ public class TestPageRoute extends TestBase {
void shouldWorkWithEncodedServer() throws InterruptedException {
// The requestWillBeSent will report encoded URL, whereas interception will
// report URL as-is. @see crbug.com/759388
page.route("**/*", route -> route.continue_());
page.route("**/*", route -> route.resume());
Response response = page.navigate(server.PREFIX + "/some nonexisting page");
assertEquals(404, response.status());
}
@ -406,7 +406,7 @@ public class TestPageRoute extends TestBase {
exchange.sendResponseHeaders(200, 0);
exchange.getResponseBody().close();
});
page.route("**/*", route -> route.continue_());
page.route("**/*", route -> route.resume());
Response response = page.navigate(server.PREFIX + "/malformed?rnd=%911");
assertEquals(200, response.status());
}
@ -417,7 +417,7 @@ public class TestPageRoute extends TestBase {
// report encoded URL for stylesheet. @see crbug.com/759388
List<Request> requests = new ArrayList<>();
page.route("**/*", route -> {
route.continue_();
route.resume();
requests.add(route.request());
});
Response response = page.navigate("data:text/html,<link rel='stylesheet' href='" + server.PREFIX + "/fonts?helvetica|arial'/>");
@ -437,7 +437,7 @@ public class TestPageRoute extends TestBase {
// Delete frame to cause request to be canceled.
page.evalOnSelector("iframe", "frame => frame.remove()");
try {
route[0].continue_();
route[0].resume();
} catch (PlaywrightException e) {
fail("Should not throw");
}
@ -449,7 +449,7 @@ public class TestPageRoute extends TestBase {
boolean[] intercepted = {false};
page.route(server.CROSS_PROCESS_PREFIX + "/empty.html", route -> {
intercepted[0] = true;
route.continue_();
route.resume();
});
Response response = page.navigate(server.CROSS_PROCESS_PREFIX + "/empty.html");
assertTrue(response.ok());
@ -468,7 +468,7 @@ public class TestPageRoute extends TestBase {
});
page.route("**/*", route -> {
if (!route.request().url().equals(server.PREFIX + "/redirect_this")) {
route.continue_();
route.resume();
return;
}
route.fulfill(new Route.FulfillOptions()

View File

@ -54,7 +54,7 @@ public class TestPopup extends TestBase {
page.setContent("<a target=_blank rel=noopener href='empty.html'>link</a>");
boolean[] intercepted = {false};
context.route("**/empty.html", route -> {
route.continue_();
route.resume();
intercepted[0] = true;
});
context.waitForPage(() -> page.click("a"));
@ -162,7 +162,7 @@ public class TestPopup extends TestBase {
page.navigate(server.EMPTY_PAGE);
boolean[] intercepted = {false};
context.route("**/empty.html", route -> {
route.continue_();
route.resume();
intercepted[0] = true;
});
page.waitForPopup(() -> {

View File

@ -31,7 +31,7 @@ public class TestRequestContinue extends TestBase {
@Test
void shouldWork() {
page.route("**/*", route -> route.continue_());
page.route("**/*", route -> route.resume());
page.navigate(server.EMPTY_PAGE);
}
@ -40,7 +40,7 @@ public class TestRequestContinue extends TestBase {
page.route("**/*", route -> {
Map<String, String> headers = new HashMap<>(route.request().headers());
headers.put("FOO", "bar");
route.continue_(new Route.ContinueOptions().withHeaders(headers));
route.resume(new Route.ResumeOptions().withHeaders(headers));
});
page.navigate(server.EMPTY_PAGE);
Future<Server.Request> request = server.futureRequest("/sleep.zzz");
@ -52,7 +52,7 @@ public class TestRequestContinue extends TestBase {
void shouldAmendMethod() throws ExecutionException, InterruptedException {
Future<Server.Request> sRequest = server.futureRequest("/sleep.zzz");
page.navigate(server.EMPTY_PAGE);
page.route("**/*", route -> route.continue_(new Route.ContinueOptions().withMethod("POST")));
page.route("**/*", route -> route.resume(new Route.ResumeOptions().withMethod("POST")));
Future<Server.Request> request = server.futureRequest("/sleep.zzz");
page.evaluate("() => fetch('/sleep.zzz')");
assertEquals("POST", request.get().method);
@ -63,7 +63,7 @@ public class TestRequestContinue extends TestBase {
void shouldOverrideRequestUrl() throws ExecutionException, InterruptedException {
Future<Server.Request> serverRequest = server.futureRequest("/global-var.html");
page.route("**/foo", route -> {
route.continue_(new Route.ContinueOptions().withUrl(server.PREFIX + "/global-var.html"));
route.resume(new Route.ResumeOptions().withUrl(server.PREFIX + "/global-var.html"));
});
Response response = page.navigate(server.PREFIX + "/foo");
assertEquals(server.PREFIX + "/foo", response.url());
@ -76,10 +76,10 @@ public class TestRequestContinue extends TestBase {
PlaywrightException[] error = {null};
page.route("**/*", route -> {
try {
route.continue_(new Route.ContinueOptions().withUrl("file:///tmp/foo"));
route.resume(new Route.ResumeOptions().withUrl("file:///tmp/foo"));
} catch (PlaywrightException e) {
error[0] = e;
route.continue_();
route.resume();
}
});
page.navigate(server.EMPTY_PAGE);
@ -91,7 +91,7 @@ public class TestRequestContinue extends TestBase {
void shouldOverrideMethodAlongWithUrl() throws ExecutionException, InterruptedException {
Future<Server.Request> serverRequest = server.futureRequest("/empty.html");
page.route("**/foo", route -> {
route.continue_(new Route.ContinueOptions().withUrl(server.EMPTY_PAGE).withMethod("POST"));
route.resume(new Route.ResumeOptions().withUrl(server.EMPTY_PAGE).withMethod("POST"));
});
page.navigate(server.PREFIX + "/foo");
assertEquals("POST", serverRequest.get().method);
@ -100,7 +100,7 @@ public class TestRequestContinue extends TestBase {
@Test
void shouldAmendMethodOnMainRequest() throws ExecutionException, InterruptedException {
Future<Server.Request> request = server.futureRequest("/empty.html");
page.route("**/*", route -> route.continue_(new Route.ContinueOptions().withMethod("POST")));
page.route("**/*", route -> route.resume(new Route.ResumeOptions().withMethod("POST")));
page.navigate(server.EMPTY_PAGE);
assertEquals("POST", request.get().method);
}
@ -109,7 +109,7 @@ public class TestRequestContinue extends TestBase {
void shouldAmendPostData() throws ExecutionException, InterruptedException {
page.navigate(server.EMPTY_PAGE);
page.route("**/*", route -> {
route.continue_(new Route.ContinueOptions().withPostData("doggo"));
route.resume(new Route.ResumeOptions().withPostData("doggo"));
});
Future<Server.Request> serverRequest = server.futureRequest("/sleep.zzz");
page.evaluate("() => fetch('/sleep.zzz', { method: 'POST', body: 'birdy' })");
@ -120,7 +120,7 @@ public class TestRequestContinue extends TestBase {
void shouldAmendUtf8PostData() throws ExecutionException, InterruptedException {
page.navigate(server.EMPTY_PAGE);
page.route("**/*", route -> {
route.continue_(new Route.ContinueOptions().withPostData("пушкин"));
route.resume(new Route.ResumeOptions().withPostData("пушкин"));
});
Future<Server.Request> serverRequest = server.futureRequest("/sleep.zzz");
page.evaluate("() => fetch('/sleep.zzz', { method: 'POST', body: 'birdy' })");
@ -132,7 +132,7 @@ public class TestRequestContinue extends TestBase {
void shouldAmendLongerPostData() throws ExecutionException, InterruptedException {
page.navigate(server.EMPTY_PAGE);
page.route("**/*", route -> {
route.continue_(new Route.ContinueOptions().withPostData("doggo-is-longer-than-birdy"));
route.resume(new Route.ResumeOptions().withPostData("doggo-is-longer-than-birdy"));
});
Future<Server.Request> serverRequest = server.futureRequest("/sleep.zzz");
page.evaluate("() => fetch('/sleep.zzz', { method: 'POST', body: 'birdy' })");
@ -148,7 +148,7 @@ public class TestRequestContinue extends TestBase {
arr[i] = (byte) i;
}
page.route("**/*", route -> {
route.continue_(new Route.ContinueOptions().withPostData(arr));
route.resume(new Route.ResumeOptions().withPostData(arr));
});
Future<Server.Request> serverRequest = server.futureRequest("/sleep.zzz");
page.evaluate("() => fetch('/sleep.zzz', { method: 'POST', body: 'birdy' })");

View File

@ -1 +1 @@
1.9.0-next-1612383782000
1.9.0-next-1612388458000

View File

@ -888,7 +888,7 @@ class Field extends Element {
output.add(offset + "}");
return;
}
if ("Route.continue_.options.postData".equals(jsonPath)) {
if ("Route.resume.options.postData".equals(jsonPath)) {
output.add(offset + "public " + parentClass + " withPostData(String postData) {");
output.add(offset + " this.postData = postData.getBytes(StandardCharsets.UTF_8);");
output.add(offset + " return this;");

View File

@ -190,7 +190,7 @@ class Types {
add("ElementHandle.selectOption.values", "Array<ElementHandle>|Array<Object>|Array<string>|ElementHandle|Object|null|string", "String");
add("ElementHandle.setInputFiles.files", "Array<Object>|Array<path>|Object|path", "String");
add("FileChooser.setFiles.files", "Array<Object>|Array<path>|Object|path", "String");
add("Route.continue_.options.postData", "Buffer|string", "byte[]", new Empty());
add("Route.resume.options.postData", "Buffer|string", "byte[]", new Empty());
add("Route.fulfill.options.body", "Buffer|string", "String");
add("Logger.log.message", "string|Error", "String");
@ -199,9 +199,6 @@ class Types {
add("Browser.newPage.options.geolocation", "Object", "Geolocation", new Empty());
add("BrowserType.launchPersistentContext.options.geolocation", "Object", "Geolocation", new Empty());
// node.js types
add("Route.continue_.options", "Object", "ContinueOptions");
// TODO: fix upstream types!
add("Playwright.devices", "Object", "Map<String, DeviceDescriptor>", new Empty());
}