From 288a887b1236ce23ea779369f5104e8f4fba77a8 Mon Sep 17 00:00:00 2001 From: abhiraz7 Date: Wed, 30 Sep 2026 01:12:19 +0530 Subject: [PATCH] fix: correctly detect negative zero when serializing floats to JS 0.0 == float('-0') is True in Python (float equality doesn'tdistinguish signed zero), so every 0.0 passed to evaluate() wasbeing tagged as -0 in the JS handshake. Use math.copysign to testthe actual sign bit instead.Fixes #3186 --- playwright/_impl/_js_handle.py | 2 +- tests/async/test_page_evaluate.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/playwright/_impl/_js_handle.py b/playwright/_impl/_js_handle.py index 84ef40d18..d1e8d4fd9 100644 --- a/playwright/_impl/_js_handle.py +++ b/playwright/_impl/_js_handle.py @@ -145,7 +145,7 @@ def serialize_value( return dict(v="Infinity") if value == float("-inf"): return dict(v="-Infinity") - if value == float("-0"): + if value == 0 and math.copysign(1.0, value) == -1.0: return dict(v="-0") if math.isnan(value): return dict(v="NaN") diff --git a/tests/async/test_page_evaluate.py b/tests/async/test_page_evaluate.py index 058263b18..146be6ff7 100644 --- a/tests/async/test_page_evaluate.py +++ b/tests/async/test_page_evaluate.py @@ -40,6 +40,11 @@ async def test_evaluate_transfer_neg_zero(page: Page) -> None: assert result == float("-0") +async def test_evaluate_transfer_positive_zero_stays_positive(page: Page) -> None: + result = await page.evaluate("a => Object.is(a, -0)", 0.0) + assert result is False + + async def test_evaluate_transfer_infinity(page: Page) -> None: result = await page.evaluate("a => a", float("Infinity")) assert result == float("Infinity")