Skip to content

Commit c37f056

Browse files
authoredNov 19, 2024··
chore: get rid of Frame::UrlMatches (#3058)
1 parent 0679b8e commit c37f056

File tree

5 files changed

+32
-50
lines changed

5 files changed

+32
-50
lines changed
 

‎src/Playwright/Core/BrowserContext.cs

+6-7
Original file line numberDiff line numberDiff line change
@@ -721,13 +721,12 @@ internal async Task OnWebSocketRouteAsync(WebSocketRoute webSocketRoute)
721721
}
722722
}
723723

724-
internal bool UrlMatches(string url, string glob)
725-
=> new Regex(CombineUrlWithBase(glob).GlobToRegex()).Match(url).Success;
726-
727-
internal string CombineUrlWithBase(string url)
728-
{
729-
return URLMatch.JoinWithBaseURL(Options?.BaseURL, url);
730-
}
724+
internal bool UrlMatches(string url, string globMatch)
725+
=> new URLMatch()
726+
{
727+
glob = globMatch,
728+
baseURL = Options.BaseURL,
729+
}.Match(url);
731730

732731
private Task RouteAsync(string globMatch, Regex reMatch, Func<string, bool> funcMatch, Delegate handler, BrowserContextRouteOptions options)
733732
=> RouteAsync(new()

‎src/Playwright/Core/Frame.cs

+22-40
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public Task<IResponse> WaitForNavigationAsync(FrameWaitForNavigationOptions opti
263263
public async Task<IResponse> RunAndWaitForNavigationAsync(Func<Task> action, FrameRunAndWaitForNavigationOptions options = default)
264264
{
265265
using var waiter = SetupNavigationWaiter("frame.WaitForNavigationAsync", options?.Timeout);
266-
var result = WaitForNavigationInternalAsync(waiter, options?.Url, options?.UrlFunc, options?.UrlRegex, options?.UrlString, options?.WaitUntil);
266+
var result = WaitForNavigationInternalAsync(waiter, options?.Url ?? options?.UrlString, options?.UrlFunc, options?.UrlRegex, options?.WaitUntil);
267267

268268
if (action != null)
269269
{
@@ -276,17 +276,15 @@ await WrapApiBoundaryAsync(() => waiter.CancelWaitOnExceptionAsync(result, actio
276276

277277
private async Task<IResponse> WaitForNavigationInternalAsync(
278278
Waiter waiter,
279-
string url,
279+
string urlString,
280280
Func<string, bool> urlFunc,
281281
Regex urlRegex,
282-
string urlString,
283282
WaitUntilState? waitUntil)
284283
{
285-
WaitUntilState waitUntilNormalized = waitUntil ?? WaitUntilState.Load;
286-
string urlStringNormalized = !string.IsNullOrEmpty(url) ? url! : urlString!;
284+
waitUntil ??= WaitUntilState.Load;
287285
string toUrl = !string.IsNullOrEmpty(urlString) ? $" to \"{urlString}\"" : string.Empty;
288286

289-
waiter.Log($"waiting for navigation{toUrl} until \"{waitUntilNormalized}\"");
287+
waiter.Log($"waiting for navigation{toUrl} until \"{waitUntil}\"");
290288

291289
var navigatedEventTask = waiter.WaitForEventAsync<FrameNavigatedEventArgs>(
292290
this,
@@ -300,7 +298,13 @@ private async Task<IResponse> WaitForNavigationInternalAsync(
300298
}
301299

302300
waiter.Log($" navigated to \"{e.Url}\"");
303-
return UrlMatches(e.Url, urlStringNormalized, urlRegex, urlFunc);
301+
return new URLMatch()
302+
{
303+
glob = urlString,
304+
re = urlRegex,
305+
func = urlFunc,
306+
baseURL = (Page as Page).Context.Options.BaseURL,
307+
}.Match(e.Url);
304308
});
305309

306310
var navigatedEvent = await navigatedEventTask.ConfigureAwait(false);
@@ -311,24 +315,23 @@ private async Task<IResponse> WaitForNavigationInternalAsync(
311315
await waiter.WaitForPromiseAsync(Task.FromException<object>(ex)).ConfigureAwait(false);
312316
}
313317

314-
if (!_loadStates.Select(s => s.ToValueString()).Contains(waitUntilNormalized.ToValueString()))
318+
if (!_loadStates.Select(s => s.ToValueString()).Contains(waitUntil.Value.ToValueString()))
315319
{
316320
await waiter.WaitForEventAsync<WaitUntilState>(
317321
this,
318322
"LoadState",
319323
e =>
320324
{
321325
waiter.Log($" \"{e}\" event fired");
322-
return e.ToValueString() == waitUntilNormalized.ToValueString();
326+
return e.ToValueString() == waitUntil.Value.ToValueString();
323327
}).ConfigureAwait(false);
324328
}
325329

326330
var request = navigatedEvent.NewDocument?.Request;
327-
var response = request != null
331+
332+
return request != null
328333
? await waiter.WaitForPromiseAsync(request.FinalRequest.ResponseAsync()).ConfigureAwait(false)
329334
: null;
330-
331-
return response;
332335
}
333336

334337
[MethodImpl(MethodImplOptions.NoInlining)]
@@ -906,7 +909,13 @@ internal async Task<FrameExpectResult> ExpectAsync(string selector, string expre
906909

907910
private Task WaitForURLAsync(string urlString, Regex urlRegex, Func<string, bool> urlFunc, FrameWaitForURLOptions options = default)
908911
{
909-
if (UrlMatches(Url, urlString, urlRegex, urlFunc))
912+
if (new URLMatch()
913+
{
914+
glob = urlString,
915+
re = urlRegex,
916+
func = urlFunc,
917+
baseURL = (Page as Page).Context.Options.BaseURL,
918+
}.Match(Url))
910919
{
911920
return WaitForLoadStateAsync(ToLoadState(options?.WaitUntil), new() { Timeout = options?.Timeout });
912921
}
@@ -958,33 +967,6 @@ private Waiter SetupNavigationWaiter(string @event, float? timeout)
958967
return waiter;
959968
}
960969

961-
private bool UrlMatches(string url, string matchUrl, Regex regex, Func<string, bool> match)
962-
{
963-
matchUrl = (Page.Context as BrowserContext)?.CombineUrlWithBase(matchUrl);
964-
965-
if (matchUrl == null && regex == null && match == null)
966-
{
967-
return true;
968-
}
969-
970-
if (!string.IsNullOrEmpty(matchUrl))
971-
{
972-
regex = new(matchUrl.GlobToRegex());
973-
}
974-
975-
if (matchUrl != null && url == matchUrl)
976-
{
977-
return true;
978-
}
979-
980-
if (regex != null)
981-
{
982-
return regex.IsMatch(url);
983-
}
984-
985-
return match(url);
986-
}
987-
988970
internal Task HighlightAsync(string selector)
989971
=> SendMessageToServerAsync("highlight", new Dictionary<string, object>
990972
{

‎src/Playwright/Core/Page.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ public IFrame Frame(string name)
279279
=> Frames.FirstOrDefault(f => f.Name == name);
280280

281281
[MethodImpl(MethodImplOptions.NoInlining)]
282-
public IFrame FrameByUrl(string urlString) => Frames.FirstOrDefault(f => Context.UrlMatches(urlString, f.Url));
282+
public IFrame FrameByUrl(string urlString) => Frames.FirstOrDefault(f => Context.UrlMatches(f.Url, urlString));
283283

284284
[MethodImpl(MethodImplOptions.NoInlining)]
285285
public IFrame FrameByUrl(Regex urlRegex) => Frames.FirstOrDefault(f => urlRegex.IsMatch(f.Url));

‎src/Playwright/Core/PageAssertions.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
using System;
2626
using System.Text.RegularExpressions;
2727
using System.Threading.Tasks;
28+
using Microsoft.Playwright.Helpers;
2829
using Microsoft.Playwright.Transport.Protocol;
2930

3031
namespace Microsoft.Playwright.Core;
@@ -57,7 +58,7 @@ public Task ToHaveTitleAsync(Regex titleOrRegExp, PageAssertionsToHaveTitleOptio
5758
ExpectImplAsync("to.have.title", ExpectedRegex(titleOrRegExp, new() { NormalizeWhiteSpace = true }), titleOrRegExp, "Page title expected to be", ConvertToFrameExpectOptions(options));
5859

5960
public Task ToHaveURLAsync(string urlOrRegExp, PageAssertionsToHaveURLOptions options = null) =>
60-
ExpectImplAsync("to.have.url", new ExpectedTextValue() { String = _page.Context.CombineUrlWithBase(urlOrRegExp), IgnoreCase = options?.IgnoreCase }, urlOrRegExp, "Page URL expected to be", ConvertToFrameExpectOptions(options));
61+
ExpectImplAsync("to.have.url", new ExpectedTextValue() { String = URLMatch.JoinWithBaseURL(_page.Context.Options.BaseURL, urlOrRegExp), IgnoreCase = options?.IgnoreCase }, urlOrRegExp, "Page URL expected to be", ConvertToFrameExpectOptions(options));
6162

6263
public Task ToHaveURLAsync(Regex urlOrRegExp, PageAssertionsToHaveURLOptions options = null) =>
6364
ExpectImplAsync("to.have.url", ExpectedRegex(urlOrRegExp, new() { IgnoreCase = options?.IgnoreCase }), urlOrRegExp, "Page URL expected to match regex", ConvertToFrameExpectOptions(options));

‎src/Playwright/Helpers/URLMatch.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public bool Match(string url)
5959
}
6060
return new Regex(globWithBaseURL.GlobToRegex()).IsMatch(url);
6161
}
62-
return false;
62+
return true;
6363
}
6464

6565
internal static string JoinWithBaseURL(string baseUrl, string url)

0 commit comments

Comments
 (0)
Please sign in to comment.