From 267f096a53f93ba41ef44c0fb4862d1d54e2a450 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 25 Feb 2025 12:33:51 -0800 Subject: [PATCH] fix: do not change glob pattern when converting to url Fixes https://github.com/microsoft/playwright/issues/34915 --- .../src/utils/isomorphic/urlMatch.ts | 16 +++++++++++++++- tests/page/interception.spec.ts | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/playwright-core/src/utils/isomorphic/urlMatch.ts b/packages/playwright-core/src/utils/isomorphic/urlMatch.ts index 1d3bd011dc..fa2c92bbbd 100644 --- a/packages/playwright-core/src/utils/isomorphic/urlMatch.ts +++ b/packages/playwright-core/src/utils/isomorphic/urlMatch.ts @@ -101,7 +101,21 @@ export function urlMatches(baseURL: string | undefined, urlString: string, match // Allow http(s) baseURL to match ws(s) urls. if (baseURL && /^https?:\/\//.test(baseURL) && /^wss?:\/\//.test(urlString)) baseURL = baseURL.replace(/^http/, 'ws'); - match = constructURLBasedOnBaseURL(baseURL, match); + if (baseURL) { + // String starting with a dot are treated as explicit relative URL. + if (match.startsWith('.')) { + match = constructURLBasedOnBaseURL(baseURL, match); + } else { + // We cannot pass `match` as the relative URL as regex symbols would be misinterpreted. + const relativeBase = match.startsWith('/') ? '/' : '.'; + let prefix = constructURLBasedOnBaseURL(baseURL, relativeBase); + if (prefix !== relativeBase) { + if (match.startsWith('/') && prefix.endsWith('/')) + prefix = prefix.substring(0, prefix.length - 1); + match = prefix + match; + } + } + } } if (isString(match)) match = globToRegex(match); diff --git a/tests/page/interception.spec.ts b/tests/page/interception.spec.ts index d3443f9015..891adeaff0 100644 --- a/tests/page/interception.spec.ts +++ b/tests/page/interception.spec.ts @@ -16,7 +16,7 @@ */ import { test as it, expect } from './pageTest'; -import { globToRegex } from '../../packages/playwright-core/lib/utils/isomorphic/urlMatch'; +import { globToRegex, urlMatches } from '../../packages/playwright-core/lib/utils/isomorphic/urlMatch'; import vm from 'vm'; it('should work with navigation @smoke', async ({ page, server }) => { @@ -107,6 +107,20 @@ it('should work with glob', async () => { expect(globToRegex('$^+.\\*()|\\?\\{\\}\\[\\]')).toEqual(/^\$\^\+\.\*\(\)\|\?\{\}\[\]$/); }); +it('should intercept by glob', async function({ page, server, isAndroid }) { + it.skip(isAndroid); + + await page.goto(server.EMPTY_PAGE); + await page.route('http://localhos*?/?oo', async route => { + await route.fulfill({ + status: 200, + body: 'intercepted', + }); + }); + const result = await page.evaluate(url => fetch(url).then(r => r.text()), server.PREFIX + '/foo'); + expect(result).toBe('intercepted'); +}); + it('should intercept network activity from worker', async function({ page, server, isAndroid }) { it.skip(isAndroid);