RFR: 8277572: ImageStorage should correctly handle MIME types for images encoded in data URIs [v4]
Kevin Rushforth
kcr at openjdk.java.net
Fri Jan 7 00:35:12 UTC 2022
On Wed, 24 Nov 2021 03:43:42 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:
>> `com.sun.javafx.iio.ImageStorage` currently ignores the MIME image subtype specified for images encoded in data URIs. This should be improved as follows:
>>
>> 1. If the specified image subtype is not supported, an exception will be thrown.
>> 2. If the specified image subtype is supported, but the data contained in the URI is of a different (but also supported) image format, the image will be loaded and a warning will be logged. For example, if the MIME type is "image/jpeg", but the image data is PNG, the following warning will be generated:
>>
>>
>> Image format 'PNG' does not match MIME type 'image/jpeg' in URI 'data:image/jpeg;base64,iVBORw0KGgoAAA...AAAElFTkSuQmCC'
>>
>>
>> Also, the javadoc of `javafx.scene.image.Image` incorrectly states:
>>
>> 94 * If a URL uses the "data" scheme, the data must be base64-encoded
>> 95 * and the MIME type must either be empty or a subtype of the
>> 96 * {@code image} type.
>>
>> However, omitting the MIME type of a data URI is specified to imply "text/plain" (RFC 2397, section 2). Since the `com.sun.javafx.util.DataURI` class is implemented according to this specification, trying to load an image without MIME type correctly fails with an `ImageStorageException`: "Unexpected MIME type: text".
>>
>> The solution is to fix the documentation:
>>
>> 94 * If a URL uses the "data" scheme, the data must be base64-encoded
>> - 95 * and the MIME type must either be empty or a subtype of the
>> - 96 * {@code image} type.
>> + 95 * and the MIME type must be a subtype of the {@code image} type.
>> + 96 * The MIME type must match the image format of the data contained in
>> + 97 * the URL. In case of a mismatch between MIME type and image format,
>> + 98 * the image will be loaded if the image format can be determined by
>> + 99 * JavaFX, and a warning will be logged.
>
> Michael Strauß has updated the pull request incrementally with one additional commit since the last revision:
>
> Added test for image format without signature
The API doc change looks good to me. Go ahead and finalize the CSR.
The fix and test look good with one question about what looks like an unrelated change.
modules/javafx.graphics/src/main/java/com/sun/javafx/iio/ImageStorage.java line 490:
> 488: if (stream.read(header) <= 0) {
> 489: return null;
> 490: }
What was the reason for this change? The former would work even if the stream returned less data that the size of the header in a single read, whereas the latter would fail.
-------------
PR: https://git.openjdk.java.net/jfx/pull/676
More information about the openjfx-dev
mailing list