diff --git a/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.cpp
index fed960276e..b1e505f25b 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.cpp
@@ -24,8 +24,10 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include
#include
#include
+#include
#include
#include
#include
@@ -102,4 +104,14 @@ bool HTMLCanvasElement::create_bitmap()
return m_bitmap;
}
+String HTMLCanvasElement::to_data_url(const String& type, [[maybe_unused]] Optional quality) const
+{
+ if (!m_bitmap)
+ return {};
+ if (type != "image/png")
+ return {};
+ auto encoded_bitmap = Gfx::PNGWriter::encode(*m_bitmap);
+ return URL::create_with_data(type, encode_base64(encoded_bitmap), true).to_string();
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.h b/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.h
index 43df33f710..257500220f 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.h
@@ -48,6 +48,8 @@ public:
unsigned width() const;
unsigned height() const;
+ String to_data_url(const String& type, Optional quality) const;
+
private:
virtual RefPtr create_layout_node() override;
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.idl
index 5a04895fb4..6fc0a0ba4a 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.idl
+++ b/Userland/Libraries/LibWeb/HTML/HTMLCanvasElement.idl
@@ -4,4 +4,6 @@ interface HTMLCanvasElement : HTMLElement {
readonly attribute unsigned long width;
readonly attribute unsigned long height;
+ USVString toDataURL(optional DOMString type = "image/png", optional double quality);
+
};