put_image_data(ImageData&, float x, float y, float dirty_x, float dirty_y, float dirty_width, float dirty_height) override;
virtual void reset_to_default_state() override;
diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.negative.txt b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.negative.txt
new file mode 100644
index 00000000000..8db7d9f5e40
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.negative.txt
@@ -0,0 +1,6 @@
+Harness status: OK
+
+Found 1 tests
+
+1 Pass
+Pass putImageData() handles negative-sized dirty rectangles correctly
\ No newline at end of file
diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.outside.txt b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.outside.txt
new file mode 100644
index 00000000000..ccf58dc28d8
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.outside.txt
@@ -0,0 +1,6 @@
+Harness status: OK
+
+Found 1 tests
+
+1 Pass
+Pass putImageData() handles dirty rectangles outside the canvas correctly
\ No newline at end of file
diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect1.txt b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect1.txt
new file mode 100644
index 00000000000..3f9772c9330
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect1.txt
@@ -0,0 +1,6 @@
+Harness status: OK
+
+Found 1 tests
+
+1 Pass
+Pass putImageData() only modifies areas inside the dirty rectangle, using width and height
\ No newline at end of file
diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect2.txt b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect2.txt
new file mode 100644
index 00000000000..1b7606bb748
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect2.txt
@@ -0,0 +1,6 @@
+Harness status: OK
+
+Found 1 tests
+
+1 Pass
+Pass putImageData() only modifies areas inside the dirty rectangle, using x and y
\ No newline at end of file
diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.zero.txt b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.zero.txt
new file mode 100644
index 00000000000..a3fe2f43b5a
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.zero.txt
@@ -0,0 +1,6 @@
+Harness status: OK
+
+Found 1 tests
+
+1 Pass
+Pass putImageData() with zero-sized dirty rectangle puts nothing
\ No newline at end of file
diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.nonfinite.txt b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.nonfinite.txt
new file mode 100644
index 00000000000..42294ec50af
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.nonfinite.txt
@@ -0,0 +1,6 @@
+Harness status: OK
+
+Found 1 tests
+
+1 Pass
+Pass putImageData() throws TypeError if arguments are not finite
\ No newline at end of file
diff --git a/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.negative.html b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.negative.html
new file mode 100644
index 00000000000..f034b28c4f3
--- /dev/null
+++ b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.negative.html
@@ -0,0 +1,44 @@
+
+
+
+Canvas test: 2d.imageData.put.dirty.negative
+
+
+
+
+
+
+2d.imageData.put.dirty.negative
+putImageData() handles negative-sized dirty rectangles correctly
+
+
+Actual output:
+
+Expected output:
+
+
+
diff --git a/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.outside.html b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.outside.html
new file mode 100644
index 00000000000..ba1e007b4e4
--- /dev/null
+++ b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.outside.html
@@ -0,0 +1,46 @@
+
+
+
+Canvas test: 2d.imageData.put.dirty.outside
+
+
+
+
+
+
+2d.imageData.put.dirty.outside
+putImageData() handles dirty rectangles outside the canvas correctly
+
+
+Actual output:
+
+Expected output:
+
+
+
diff --git a/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect1.html b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect1.html
new file mode 100644
index 00000000000..8d1d6d24d54
--- /dev/null
+++ b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect1.html
@@ -0,0 +1,44 @@
+
+
+
+Canvas test: 2d.imageData.put.dirty.rect1
+
+
+
+
+
+
+2d.imageData.put.dirty.rect1
+putImageData() only modifies areas inside the dirty rectangle, using width and height
+
+
+Actual output:
+
+Expected output:
+
+
+
diff --git a/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect2.html b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect2.html
new file mode 100644
index 00000000000..538b9e96e9f
--- /dev/null
+++ b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.rect2.html
@@ -0,0 +1,44 @@
+
+
+
+Canvas test: 2d.imageData.put.dirty.rect2
+
+
+
+
+
+
+2d.imageData.put.dirty.rect2
+putImageData() only modifies areas inside the dirty rectangle, using x and y
+
+
+Actual output:
+
+Expected output:
+
+
+
diff --git a/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.zero.html b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.zero.html
new file mode 100644
index 00000000000..396d1d420c0
--- /dev/null
+++ b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.dirty.zero.html
@@ -0,0 +1,33 @@
+
+
+
+Canvas test: 2d.imageData.put.dirty.zero
+
+
+
+
+
+
+2d.imageData.put.dirty.zero
+putImageData() with zero-sized dirty rectangle puts nothing
+
+
+Actual output:
+
+Expected output:
+
+
+
diff --git a/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.nonfinite.html b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.nonfinite.html
new file mode 100644
index 00000000000..5a737481bb2
--- /dev/null
+++ b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/pixel-manipulation/2d.imageData.put.nonfinite.html
@@ -0,0 +1,109 @@
+
+
+
+Canvas test: 2d.imageData.put.nonfinite
+
+
+
+
+
+
+2d.imageData.put.nonfinite
+putImageData() throws TypeError if arguments are not finite
+
+Defined in "Web IDL" (draft)
+
Actual output:
+
+
+
+
+