Skip to content

Commit 9dee7b3

Browse files
authored
fix(connection): handle canceled tasks correctly (microsoft#624)
1 parent 74b9a8f commit 9dee7b3

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

playwright/_impl/_connection.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@ def _dispatch(self, msg: ParsedMessagePayload) -> None:
220220
id = msg.get("id")
221221
if id:
222222
callback = self._callbacks.pop(id)
223+
if callback.future.cancelled():
224+
return
223225
error = msg.get("error")
224226
if error:
225227
parsed_error = parse_error(error["error"]) # type: ignore

tests/async/test_issues.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
from asyncio import FIRST_COMPLETED, CancelledError, create_task, wait
16+
1517
import pytest
1618

19+
from playwright.async_api import Page
20+
1721

1822
@pytest.mark.only_browser("chromium")
1923
async def test_issue_189(browser_type, launch_arguments):
@@ -30,3 +34,21 @@ async def test_issue_195(playwright, browser):
3034
iphone_11 = playwright.devices["iPhone 11"]
3135
context = await browser.new_context(**iphone_11)
3236
await context.close()
37+
38+
39+
async def test_connection_task_cancel(page: Page):
40+
await page.set_content("<input />")
41+
done, pending = await wait(
42+
{
43+
create_task(page.wait_for_selector("input")),
44+
create_task(page.wait_for_selector("#will-never-resolve")),
45+
},
46+
return_when=FIRST_COMPLETED,
47+
)
48+
assert len(done) == 1
49+
assert len(pending) == 1
50+
for task in pending:
51+
task.cancel()
52+
with pytest.raises(CancelledError):
53+
await task
54+
assert list(pending)[0].cancelled()

0 commit comments

Comments
 (0)