Selaa lähdekoodia

LibWeb: Fix Canvas.toDataURL and Canvas.toBlob signatures

Fix the function signatures of Canvas.toDataURL() and Canvas.toBlob()
and make both functions accept non-numbers as the quality parameter, in
which case it will just use the default quality instead of raising an
exception.
This makes toDataURL.arguments.1.html, toDataURL.arguments.2.html and
toDataURL.jpeg.quality.notnumber.html in
wpt/html/semantics/embedded-content/the-canvas-element pass :^)
justus2510 9 kuukautta sitten
vanhempi
commit
a6e9f107eb

+ 6 - 7
Libraries/LibWeb/HTML/HTMLCanvasElement.cpp

@@ -238,19 +238,18 @@ struct SerializeBitmapResult {
 };
 };
 
 
 // https://html.spec.whatwg.org/multipage/canvas.html#a-serialisation-of-the-bitmap-as-a-file
 // https://html.spec.whatwg.org/multipage/canvas.html#a-serialisation-of-the-bitmap-as-a-file
-static ErrorOr<SerializeBitmapResult> serialize_bitmap(Gfx::Bitmap const& bitmap, StringView type, Optional<double> quality)
+static ErrorOr<SerializeBitmapResult> serialize_bitmap(Gfx::Bitmap const& bitmap, StringView type, JS::Value quality)
 {
 {
     // If type is an image format that supports variable quality (such as "image/jpeg"), quality is given, and type is not "image/png", then,
     // If type is an image format that supports variable quality (such as "image/jpeg"), quality is given, and type is not "image/png", then,
     // if quality is a Number in the range 0.0 to 1.0 inclusive, the user agent must treat quality as the desired quality level.
     // if quality is a Number in the range 0.0 to 1.0 inclusive, the user agent must treat quality as the desired quality level.
     // Otherwise, the user agent must use its default quality value, as if the quality argument had not been given.
     // Otherwise, the user agent must use its default quality value, as if the quality argument had not been given.
-    if (quality.has_value() && !(*quality >= 0.0 && *quality <= 1.0))
-        quality = OptionalNone {};
+    bool valid_quality = quality.is_number() && quality.as_double() >= 0.0 && quality.as_double() <= 1.0;
 
 
     if (type.equals_ignoring_ascii_case("image/jpeg"sv)) {
     if (type.equals_ignoring_ascii_case("image/jpeg"sv)) {
         AllocatingMemoryStream file;
         AllocatingMemoryStream file;
         Gfx::JPEGWriter::Options jpeg_options;
         Gfx::JPEGWriter::Options jpeg_options;
-        if (quality.has_value())
-            jpeg_options.quality = static_cast<int>(quality.value() * 100);
+        if (valid_quality)
+            jpeg_options.quality = static_cast<int>(quality.as_double() * 100);
         TRY(Gfx::JPEGWriter::encode(file, bitmap, jpeg_options));
         TRY(Gfx::JPEGWriter::encode(file, bitmap, jpeg_options));
         return SerializeBitmapResult { TRY(file.read_until_eof()), "image/jpeg"sv };
         return SerializeBitmapResult { TRY(file.read_until_eof()), "image/jpeg"sv };
     }
     }
@@ -261,7 +260,7 @@ static ErrorOr<SerializeBitmapResult> serialize_bitmap(Gfx::Bitmap const& bitmap
 }
 }
 
 
 // https://html.spec.whatwg.org/multipage/canvas.html#dom-canvas-todataurl
 // https://html.spec.whatwg.org/multipage/canvas.html#dom-canvas-todataurl
-String HTMLCanvasElement::to_data_url(StringView type, Optional<double> quality)
+String HTMLCanvasElement::to_data_url(StringView type, JS::Value quality)
 {
 {
     // It is possible the the canvas doesn't have a associated bitmap so create one
     // It is possible the the canvas doesn't have a associated bitmap so create one
     if (!m_surface) {
     if (!m_surface) {
@@ -296,7 +295,7 @@ String HTMLCanvasElement::to_data_url(StringView type, Optional<double> quality)
 }
 }
 
 
 // https://html.spec.whatwg.org/multipage/canvas.html#dom-canvas-toblob
 // https://html.spec.whatwg.org/multipage/canvas.html#dom-canvas-toblob
-WebIDL::ExceptionOr<void> HTMLCanvasElement::to_blob(JS::NonnullGCPtr<WebIDL::CallbackType> callback, StringView type, Optional<double> quality)
+WebIDL::ExceptionOr<void> HTMLCanvasElement::to_blob(JS::NonnullGCPtr<WebIDL::CallbackType> callback, StringView type, JS::Value quality)
 {
 {
     // It is possible the the canvas doesn't have a associated bitmap so create one
     // It is possible the the canvas doesn't have a associated bitmap so create one
     if (!m_surface) {
     if (!m_surface) {

+ 2 - 2
Libraries/LibWeb/HTML/HTMLCanvasElement.h

@@ -35,8 +35,8 @@ public:
     WebIDL::ExceptionOr<void> set_width(unsigned);
     WebIDL::ExceptionOr<void> set_width(unsigned);
     WebIDL::ExceptionOr<void> set_height(unsigned);
     WebIDL::ExceptionOr<void> set_height(unsigned);
 
 
-    String to_data_url(StringView type, Optional<double> quality);
-    WebIDL::ExceptionOr<void> to_blob(JS::NonnullGCPtr<WebIDL::CallbackType> callback, StringView type, Optional<double> quality);
+    String to_data_url(StringView type, JS::Value quality);
+    WebIDL::ExceptionOr<void> to_blob(JS::NonnullGCPtr<WebIDL::CallbackType> callback, StringView type, JS::Value quality);
 
 
     void present();
     void present();
 
 

+ 2 - 2
Libraries/LibWeb/HTML/HTMLCanvasElement.idl

@@ -16,8 +16,8 @@ interface HTMLCanvasElement : HTMLElement {
 
 
     RenderingContext? getContext(DOMString contextId, optional any options = null);
     RenderingContext? getContext(DOMString contextId, optional any options = null);
 
 
-    USVString toDataURL(optional DOMString type = "image/png", optional double quality);
-    undefined toBlob(BlobCallback _callback, optional DOMString type = "image/png", optional double quality);
+    USVString toDataURL(optional DOMString type = "image/png", optional any quality);
+    undefined toBlob(BlobCallback _callback, optional DOMString type = "image/png", optional any quality);
 
 
 };
 };
 
 

+ 1 - 1
Libraries/LibWeb/WebDriver/Screenshot.cpp

@@ -72,7 +72,7 @@ Response encode_canvas_element(HTML::HTMLCanvasElement& canvas)
 
 
     // 3. Let file be a serialization of the canvas element’s bitmap as a file, using "image/png" as an argument.
     // 3. Let file be a serialization of the canvas element’s bitmap as a file, using "image/png" as an argument.
     // 4. Let data url be a data: URL representing file. [RFC2397]
     // 4. Let data url be a data: URL representing file. [RFC2397]
-    auto data_url = canvas.to_data_url("image/png"sv, {});
+    auto data_url = canvas.to_data_url("image/png"sv, JS::js_undefined());
 
 
     // 5. Let index be the index of "," in data url.
     // 5. Let index be the index of "," in data url.
     auto index = data_url.find_byte_offset(',');
     auto index = data_url.find_byte_offset(',');