Skip to content

Commit 9fc1777

Browse files
authored
fix: fix impl to api name memory leak (#1604)
1 parent a54664a commit 9fc1777

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

playwright/_impl/_impl_to_api_mapping.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,12 @@ def register(self, impl_class: type, api_class: type) -> None:
3838
self._mapping[impl_class] = api_class
3939

4040
def from_maybe_impl(
41-
self, obj: Any, visited: Map[Any, Union[List, Dict]] = Map()
41+
self, obj: Any, visited: Optional[Map[Any, Union[List, Dict]]] = None
4242
) -> Any:
43+
# Python does share default arguments between calls, so we need to
44+
# create a new map if it is not provided.
45+
if not visited:
46+
visited = Map()
4347
if not obj:
4448
return obj
4549
if isinstance(obj, dict):

tests/test_reference_count_async.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import gc
1616
from collections import defaultdict
17+
from typing import Any
1718

1819
import objgraph
1920
import pytest
@@ -33,7 +34,20 @@ async def test_memory_objects(server: Server, browser_name: str) -> None:
3334
for _ in range(100):
3435
await page.evaluate("""async () => alert()""")
3536

36-
await page.route("**/", lambda route, _: route.fulfill(body="OK"))
37+
await page.route("**/*", lambda route, _: route.fulfill(body="OK"))
38+
39+
def handle_network_response_received(event: Any) -> None:
40+
event["__pw__is_last_network_response_received_event"] = True
41+
42+
if browser_name == "chromium":
43+
# https://github.com/microsoft/playwright-python/issues/1602
44+
client = await page.context.new_cdp_session(page)
45+
await client.send("Network.enable")
46+
47+
client.on(
48+
"Network.responseReceived",
49+
handle_network_response_received,
50+
)
3751

3852
for _ in range(100):
3953
response = await page.evaluate("""async () => (await fetch("/")).text()""")
@@ -46,6 +60,9 @@ async def test_memory_objects(server: Server, browser_name: str) -> None:
4660
pw_objects: defaultdict = defaultdict(int)
4761
for o in objgraph.by_type("dict"):
4862
name = o.get("_type")
63+
# https://github.com/microsoft/playwright-python/issues/1602
64+
if o.get("__pw__is_last_network_response_received_event", False):
65+
assert False
4966
if not name:
5067
continue
5168
pw_objects[name] += 1

0 commit comments

Comments
 (0)