LibWeb: Ignore non-finite OffscreenCanvas shadow offset values

This commit is contained in:
Tim Ledbetter 2025-07-01 01:41:11 +01:00 committed by Shannon Booth
commit 844dcd3310
Notes: github-actions[bot] 2025-07-01 01:54:35 +00:00
5 changed files with 147 additions and 6 deletions

View file

@ -232,10 +232,15 @@ float OffscreenCanvasRenderingContext2D::shadow_offset_x() const
return drawing_state().shadow_offset_x; return drawing_state().shadow_offset_x;
} }
void OffscreenCanvasRenderingContext2D::set_shadow_offset_x(float offsetX) // https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowoffsetx
void OffscreenCanvasRenderingContext2D::set_shadow_offset_x(float offset_x)
{ {
// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowoffsetx // On setting, the attribute being set must be set to the new value, except if the value is infinite or NaN,
drawing_state().shadow_offset_x = offsetX; // in which case the new value must be ignored.
if (isinf(offset_x) || isnan(offset_x))
return;
drawing_state().shadow_offset_x = offset_x;
} }
float OffscreenCanvasRenderingContext2D::shadow_offset_y() const float OffscreenCanvasRenderingContext2D::shadow_offset_y() const
@ -243,10 +248,15 @@ float OffscreenCanvasRenderingContext2D::shadow_offset_y() const
return drawing_state().shadow_offset_y; return drawing_state().shadow_offset_y;
} }
void OffscreenCanvasRenderingContext2D::set_shadow_offset_y(float offsetY) // https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowoffsety
void OffscreenCanvasRenderingContext2D::set_shadow_offset_y(float offset_y)
{ {
// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowoffsety // On setting, the attribute being set must be set to the new value, except if the value is infinite or NaN,
drawing_state().shadow_offset_y = offsetY; // in which case the new value must be ignored.
if (isinf(offset_y) || isnan(offset_y))
return;
drawing_state().shadow_offset_y = offset_y;
} }
float OffscreenCanvasRenderingContext2D::shadow_blur() const float OffscreenCanvasRenderingContext2D::shadow_blur() const

View file

@ -0,0 +1,6 @@
Harness status: OK
Found 1 tests
1 Pass
Pass OffscreenCanvas test: 2d.shadow.attributes.shadowOffset.invalid

View file

@ -0,0 +1,6 @@
Harness status: OK
Found 1 tests
1 Pass
Pass OffscreenCanvas test: 2d.shadow.attributes.shadowOffset.valid

View file

@ -0,0 +1,68 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<meta charset="UTF-8">
<title>OffscreenCanvas test: 2d.shadow.attributes.shadowOffset.invalid</title>
<script src="../../../../resources/testharness.js"></script>
<script src="../../../../resources/testharnessreport.js"></script>
<script src="../../../../html/canvas/resources/canvas-tests.js"></script>
<h1>2d.shadow.attributes.shadowOffset.invalid</h1>
<p class="desc"></p>
<script>
var t = async_test("");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
});
t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
ctx.shadowOffsetX = 1;
ctx.shadowOffsetY = 2;
ctx.shadowOffsetX = Infinity;
ctx.shadowOffsetY = Infinity;
_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1");
_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2");
ctx.shadowOffsetX = 1;
ctx.shadowOffsetY = 2;
ctx.shadowOffsetX = -Infinity;
ctx.shadowOffsetY = -Infinity;
_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1");
_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2");
ctx.shadowOffsetX = 1;
ctx.shadowOffsetY = 2;
ctx.shadowOffsetX = NaN;
ctx.shadowOffsetY = NaN;
_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1");
_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2");
ctx.shadowOffsetX = 1;
ctx.shadowOffsetY = 2;
ctx.shadowOffsetX = 'string';
ctx.shadowOffsetY = 'string';
_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1");
_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2");
ctx.shadowOffsetX = 1;
ctx.shadowOffsetY = 2;
ctx.shadowOffsetX = true;
ctx.shadowOffsetY = true;
_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1");
_assertSame(ctx.shadowOffsetY, 1, "ctx.shadowOffsetY", "1");
ctx.shadowOffsetX = 1;
ctx.shadowOffsetY = 2;
ctx.shadowOffsetX = false;
ctx.shadowOffsetY = false;
_assertSame(ctx.shadowOffsetX, 0, "ctx.shadowOffsetX", "0");
_assertSame(ctx.shadowOffsetY, 0, "ctx.shadowOffsetY", "0");
t.done();
});
</script>

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<meta charset="UTF-8">
<title>OffscreenCanvas test: 2d.shadow.attributes.shadowOffset.valid</title>
<script src="../../../../resources/testharness.js"></script>
<script src="../../../../resources/testharnessreport.js"></script>
<script src="../../../../html/canvas/resources/canvas-tests.js"></script>
<h1>2d.shadow.attributes.shadowOffset.valid</h1>
<p class="desc"></p>
<script>
var t = async_test("");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
});
t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
ctx.shadowOffsetX = 1;
ctx.shadowOffsetY = 2;
_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1");
_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2");
ctx.shadowOffsetX = 0.5;
ctx.shadowOffsetY = 0.25;
_assertSame(ctx.shadowOffsetX, 0.5, "ctx.shadowOffsetX", "0.5");
_assertSame(ctx.shadowOffsetY, 0.25, "ctx.shadowOffsetY", "0.25");
ctx.shadowOffsetX = -0.5;
ctx.shadowOffsetY = -0.25;
_assertSame(ctx.shadowOffsetX, -0.5, "ctx.shadowOffsetX", "-0.5");
_assertSame(ctx.shadowOffsetY, -0.25, "ctx.shadowOffsetY", "-0.25");
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
_assertSame(ctx.shadowOffsetX, 0, "ctx.shadowOffsetX", "0");
_assertSame(ctx.shadowOffsetY, 0, "ctx.shadowOffsetY", "0");
ctx.shadowOffsetX = 1e6;
ctx.shadowOffsetY = 1e6;
_assertSame(ctx.shadowOffsetX, 1e6, "ctx.shadowOffsetX", "1e6");
_assertSame(ctx.shadowOffsetY, 1e6, "ctx.shadowOffsetY", "1e6");
t.done();
});
</script>