Skip to content

Commit 6b621ce

Browse files
authored
chore: refactor UrlMatcher (#1720)
1 parent 42d0203 commit 6b621ce

File tree

3 files changed

+67
-36
lines changed

3 files changed

+67
-36
lines changed

playwright/src/main/java/com/microsoft/playwright/impl/UrlMatcher.java

Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
import java.net.MalformedURLException;
2424
import java.net.URL;
25+
import java.util.ArrayList;
26+
import java.util.List;
2527
import java.util.Objects;
2628
import java.util.function.Predicate;
2729
import java.util.regex.Pattern;
@@ -30,20 +32,14 @@
3032
import static com.microsoft.playwright.impl.Utils.toJsRegexFlags;
3133

3234
class UrlMatcher {
33-
final Object rawSource;
34-
private final Predicate<String> predicate;
35-
36-
private static Predicate<String> toPredicate(Pattern pattern) {
37-
return s -> pattern.matcher(s).find();
38-
}
39-
40-
static UrlMatcher any() {
41-
return new UrlMatcher((Object) null, null);
42-
}
35+
private final URL baseURL;
36+
public final String glob;
37+
public final Pattern pattern;
38+
public final Predicate<String> predicate;
4339

4440
static UrlMatcher forOneOf(URL baseUrl, Object object) {
4541
if (object == null) {
46-
return UrlMatcher.any();
42+
return new UrlMatcher(null, null, null, null);
4743
}
4844
if (object instanceof String) {
4945
return new UrlMatcher(baseUrl, (String) object);
@@ -68,50 +64,75 @@ static String resolveUrl(URL baseUrl, String spec) {
6864
}
6965
}
7066

71-
UrlMatcher(URL base, String url) {
72-
this(url, toPredicate(Pattern.compile(globToRegex(resolveUrl(base, url)))).or(s -> url == null || url.equals(s)));
67+
UrlMatcher(URL baseURL, String glob) {
68+
this(baseURL, glob, null, null);
7369
}
7470

7571
UrlMatcher(Pattern pattern) {
76-
this(pattern, toPredicate(pattern));
72+
this(null, null, pattern, null);
7773
}
74+
7875
UrlMatcher(Predicate<String> predicate) {
79-
this(predicate, predicate);
76+
this(null, null, null, predicate);
8077
}
8178

82-
private UrlMatcher(Object rawSource, Predicate<String> predicate) {
83-
this.rawSource = rawSource;
79+
private UrlMatcher(URL baseURL, String glob, Pattern pattern, Predicate<String> predicate) {
80+
this.baseURL = baseURL;
81+
this.glob = glob;
82+
this.pattern = pattern;
8483
this.predicate = predicate;
8584
}
8685

8786
boolean test(String value) {
88-
return predicate == null || predicate.test(value);
87+
if (pattern != null) {
88+
return pattern.matcher(value).find();
89+
}
90+
if (predicate != null) {
91+
return predicate.test(value);
92+
}
93+
if (glob != null) {
94+
return Pattern.compile(globToRegex(resolveUrl(baseURL, glob))).matcher(value).find();
95+
}
96+
return true;
8997
}
9098

9199
@Override
92100
public boolean equals(Object o) {
93101
if (this == o) return true;
94102
if (o == null || getClass() != o.getClass()) return false;
95103
UrlMatcher that = (UrlMatcher) o;
96-
if (rawSource instanceof Pattern && that.rawSource instanceof Pattern) {
97-
Pattern a = (Pattern) rawSource;
98-
Pattern b = (Pattern) that.rawSource;
99-
return a.pattern().equals(b.pattern()) && a.flags() == b.flags();
104+
if (pattern != null) {
105+
return that.pattern != null && pattern.pattern().equals(that.pattern.pattern()) && pattern.flags() == that.pattern.flags();
106+
}
107+
if (predicate != null) {
108+
return predicate.equals(that.predicate);
109+
}
110+
if (glob != null) {
111+
return glob.equals(that.glob);
100112
}
101-
return Objects.equals(rawSource, that.rawSource);
113+
return that.pattern == null && that.predicate == null && that.glob == null;
102114
}
103115

104116
@Override
105117
public int hashCode() {
106-
return Objects.hash(rawSource);
118+
if (pattern != null) {
119+
return pattern.hashCode();
120+
}
121+
if (predicate != null) {
122+
return predicate.hashCode();
123+
}
124+
if (glob != null) {
125+
return glob.hashCode();
126+
}
127+
return 0;
107128
}
108129

109130
@Override
110131
public String toString() {
111-
if (rawSource == null)
112-
return "<any>";
113-
if (rawSource instanceof Predicate)
114-
return "matching predicate";
115-
return rawSource.toString();
132+
if (pattern != null)
133+
return String.format("<regex pattern=\"%s\" flags=\"%s\">", pattern.pattern(), toJsRegexFlags(pattern));
134+
if (this.predicate != null)
135+
return "<predicate>";
136+
return String.format("<glob pattern=\"%s\">", glob);
116137
}
117138
}

playwright/src/main/java/com/microsoft/playwright/impl/Utils.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -462,13 +462,11 @@ static JsonObject interceptionPatterns(List<UrlMatcher> matchers) {
462462
JsonArray jsonPatterns = new JsonArray();
463463
for (UrlMatcher matcher: matchers) {
464464
JsonObject jsonPattern = new JsonObject();
465-
Object urlFilter = matcher.rawSource;
466-
if (urlFilter instanceof String) {
467-
jsonPattern.addProperty("glob", (String) urlFilter);
468-
} else if (urlFilter instanceof Pattern) {
469-
Pattern pattern = (Pattern) urlFilter;
470-
jsonPattern.addProperty("regexSource", pattern.pattern());
471-
jsonPattern.addProperty("regexFlags", toJsRegexFlags(pattern));
465+
if (matcher.glob != null) {
466+
jsonPattern.addProperty("glob", matcher.glob);
467+
} else if (matcher.pattern != null) {
468+
jsonPattern.addProperty("regexSource", matcher.pattern.pattern());
469+
jsonPattern.addProperty("regexFlags", toJsRegexFlags(matcher.pattern));
472470
} else {
473471
// Match all requests.
474472
jsonPattern.addProperty("glob", "**/*");

playwright/src/test/java/com/microsoft/playwright/TestPageRoute.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,18 @@ void shouldUnroute() {
9797
assertEquals(asList(1), intercepted);
9898
}
9999

100+
@Test
101+
void shouldUnrouteNonExistentPatternHandler() {
102+
List<Integer> intercepted = new ArrayList<>();
103+
page.route(Pattern.compile("empty.html"), route -> {
104+
intercepted.add(1);
105+
route.fallback();
106+
});
107+
page.unroute("**/*");
108+
page.navigate(server.EMPTY_PAGE);
109+
assertEquals(asList( 1), intercepted);
110+
}
111+
100112
@Test
101113
void shouldSupportQuestionMarkInGlobPattern() {
102114
server.setRoute("/index", exchange -> {

0 commit comments

Comments
 (0)