diff --git a/Tests/LibWeb/Text/expected/canvas/2d-canvas-create-imagedata.txt b/Tests/LibWeb/Text/expected/canvas/2d-canvas-create-imagedata.txt
new file mode 100644
index 00000000000..7ef22e9a431
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/canvas/2d-canvas-create-imagedata.txt
@@ -0,0 +1 @@
+PASS
diff --git a/Tests/LibWeb/Text/input/canvas/2d-canvas-create-imagedata.html b/Tests/LibWeb/Text/input/canvas/2d-canvas-create-imagedata.html
new file mode 100644
index 00000000000..783456b22ff
--- /dev/null
+++ b/Tests/LibWeb/Text/input/canvas/2d-canvas-create-imagedata.html
@@ -0,0 +1,14 @@
+
+
diff --git a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasImageData.h b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasImageData.h
index d19f904f7d9..e365220e024 100644
--- a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasImageData.h
+++ b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasImageData.h
@@ -16,6 +16,7 @@ public:
virtual ~CanvasImageData() = default;
virtual WebIDL::ExceptionOr> create_image_data(int width, int height, Optional const& settings = {}) const = 0;
+ virtual WebIDL::ExceptionOr> create_image_data(ImageData const&) const = 0;
virtual WebIDL::ExceptionOr> get_image_data(int x, int y, int width, int height, Optional const& settings = {}) const = 0;
virtual void put_image_data(ImageData const&, float x, float y) = 0;
diff --git a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasImageData.idl b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasImageData.idl
index 4709ff43310..d5af08612e4 100644
--- a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasImageData.idl
+++ b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasImageData.idl
@@ -3,7 +3,7 @@
// https://html.spec.whatwg.org/multipage/canvas.html#canvasimagedata
interface mixin CanvasImageData {
ImageData createImageData([EnforceRange] long sw, [EnforceRange] long sh, optional ImageDataSettings settings = {});
- [FIXME] ImageData createImageData(ImageData imagedata);
+ ImageData createImageData(ImageData imagedata);
ImageData getImageData([EnforceRange] long sx, [EnforceRange] long sy, [EnforceRange] long sw, [EnforceRange] long sh, optional ImageDataSettings settings = {});
diff --git a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp
index 31b82b65150..278cdd14fed 100644
--- a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp
+++ b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp
@@ -342,6 +342,18 @@ WebIDL::ExceptionOr> CanvasRenderingContext2D::creat
return image_data;
}
+// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createimagedata-imagedata
+WebIDL::ExceptionOr> CanvasRenderingContext2D::create_image_data(ImageData const& image_data) const
+{
+ // 1. Let newImageData be a new ImageData object.
+ // 2. Initialize newImageData given the value of imagedata's width attribute, the value of imagedata's height attribute, and defaultColorSpace set to the value of imagedata's colorSpace attribute.
+ // FIXME: Set defaultColorSpace to the value of image_data's colorSpace attribute
+ // 3. Initialize the image data of newImageData to transparent black.
+ // NOTE: No-op, already done during creation.
+ // 4. Return newImageData.
+ return TRY(ImageData::create(realm(), image_data.width(), image_data.height()));
+}
+
// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-getimagedata
WebIDL::ExceptionOr> CanvasRenderingContext2D::get_image_data(int x, int y, int width, int height, Optional const& settings) const
{
diff --git a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h
index 2ce3223a274..8ad9732388c 100644
--- a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h
+++ b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h
@@ -75,6 +75,7 @@ public:
virtual void fill(Path2D& path, StringView fill_rule) override;
virtual WebIDL::ExceptionOr> create_image_data(int width, int height, Optional const& settings = {}) const override;
+ virtual WebIDL::ExceptionOr> create_image_data(ImageData const& image_data) const override;
virtual WebIDL::ExceptionOr> get_image_data(int x, int y, int width, int height, Optional const& settings = {}) const override;
virtual void put_image_data(ImageData const&, float x, float y) override;