2023-05-10 19:36:43 +02:00
/*
2024-10-04 13:19:50 +02:00
* Copyright ( c ) 2023 , Andreas Kling < andreas @ ladybird . org >
2023-05-10 19:36:43 +02:00
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
2023-06-11 14:46:54 +02:00
# include <AK/HashTable.h>
2023-05-10 19:36:43 +02:00
# include <LibGfx/Bitmap.h>
2025-08-08 09:55:38 -04:00
# include <LibWeb/DOMURL/DOMURL.h>
2023-06-11 14:46:54 +02:00
# include <LibWeb/Fetch/Fetching/Fetching.h>
# include <LibWeb/Fetch/Infrastructure/FetchAlgorithms.h>
2023-05-10 19:36:43 +02:00
# include <LibWeb/Fetch/Infrastructure/FetchController.h>
2023-06-11 14:46:54 +02:00
# include <LibWeb/Fetch/Infrastructure/HTTP/Responses.h>
# include <LibWeb/HTML/AnimatedBitmapDecodedImageData.h>
2023-05-10 19:36:43 +02:00
# include <LibWeb/HTML/DecodedImageData.h>
# include <LibWeb/HTML/ImageRequest.h>
2023-06-11 14:46:54 +02:00
# include <LibWeb/HTML/ListOfAvailableImages.h>
2024-08-03 15:27:08 +12:00
# include <LibWeb/HTML/SharedResourceRequest.h>
2023-12-03 15:29:11 +13:00
# include <LibWeb/Page/Page.h>
2023-06-11 14:46:54 +02:00
# include <LibWeb/Platform/ImageCodecPlugin.h>
# include <LibWeb/SVG/SVGDecodedImageData.h>
2023-05-10 19:36:43 +02:00
namespace Web : : HTML {
2024-11-15 04:01:23 +13:00
GC_DEFINE_ALLOCATOR ( ImageRequest ) ;
2023-11-19 19:47:52 +01:00
2024-11-15 04:01:23 +13:00
GC : : Ref < ImageRequest > ImageRequest : : create ( JS : : Realm & realm , GC : : Ref < Page > page )
2023-06-11 14:46:54 +02:00
{
2024-11-14 05:50:17 +13:00
return realm . create < ImageRequest > ( page ) ;
2023-06-11 14:46:54 +02:00
}
2023-05-10 19:36:43 +02:00
2024-11-15 04:01:23 +13:00
ImageRequest : : ImageRequest ( GC : : Ref < Page > page )
2023-06-11 14:46:54 +02:00
: m_page ( page )
{
}
ImageRequest : : ~ ImageRequest ( )
{
}
2023-05-10 19:36:43 +02:00
2023-08-18 14:11:55 +02:00
void ImageRequest : : visit_edges ( JS : : Cell : : Visitor & visitor )
{
Base : : visit_edges ( visitor ) ;
2024-08-03 15:27:08 +12:00
visitor . visit ( m_shared_resource_request ) ;
2023-12-03 15:29:11 +13:00
visitor . visit ( m_page ) ;
2023-12-12 20:07:19 +01:00
visitor . visit ( m_image_data ) ;
2023-08-18 14:11:55 +02:00
}
2023-05-10 19:36:43 +02:00
// https://html.spec.whatwg.org/multipage/images.html#img-available
bool ImageRequest : : is_available ( ) const
{
// When an image request's state is either partially available or completely available, the image request is said to be available.
return m_state = = State : : PartiallyAvailable | | m_state = = State : : CompletelyAvailable ;
}
2023-06-14 12:45:56 +02:00
bool ImageRequest : : is_fetching ( ) const
{
2024-08-03 15:27:08 +12:00
return m_shared_resource_request & & m_shared_resource_request - > is_fetching ( ) ;
2023-06-14 12:45:56 +02:00
}
2023-05-10 19:36:43 +02:00
ImageRequest : : State ImageRequest : : state ( ) const
{
return m_state ;
}
void ImageRequest : : set_state ( State state )
{
m_state = state ;
}
2025-02-22 20:16:45 +13:00
void ImageRequest : : set_current_url ( JS : : Realm & realm , String url )
2023-05-10 19:36:43 +02:00
{
m_current_url = move ( url ) ;
2025-08-08 09:55:38 -04:00
if ( auto parsed_url = DOMURL : : parse ( m_current_url ) ; parsed_url . has_value ( ) )
m_shared_resource_request = SharedResourceRequest : : get_or_create ( realm , m_page , parsed_url . release_value ( ) ) ;
2023-05-10 19:36:43 +02:00
}
// https://html.spec.whatwg.org/multipage/images.html#abort-the-image-request
2023-06-14 12:45:56 +02:00
void abort_the_image_request ( JS : : Realm & , ImageRequest * image_request )
2023-05-10 19:36:43 +02:00
{
2023-06-11 06:53:40 +02:00
// 1. If image request is null, then return.
if ( ! image_request )
return ;
2023-05-10 19:36:43 +02:00
2023-06-11 06:53:40 +02:00
// 2. Forget image request's image data, if any.
image_request - > set_image_data ( nullptr ) ;
// 3. Abort any instance of the fetching algorithm for image request,
2023-05-10 19:36:43 +02:00
// discarding any pending tasks generated by that algorithm.
2024-08-03 15:27:08 +12:00
// AD-HOC: We simply don't do this, since our SharedResourceRequest may be used by someone else.
2023-05-10 19:36:43 +02:00
}
2024-11-15 04:01:23 +13:00
GC : : Ptr < DecodedImageData > ImageRequest : : image_data ( ) const
2023-05-10 19:36:43 +02:00
{
return m_image_data ;
}
2024-11-15 04:01:23 +13:00
void ImageRequest : : set_image_data ( GC : : Ptr < DecodedImageData > data )
2023-05-10 19:36:43 +02:00
{
2023-12-12 20:07:19 +01:00
m_image_data = data ;
2023-05-10 19:36:43 +02:00
}
// https://html.spec.whatwg.org/multipage/images.html#prepare-an-image-for-presentation
void ImageRequest : : prepare_for_presentation ( HTMLImageElement & )
{
// FIXME: 1. Let exifTagMap be the EXIF tags obtained from req's image data, as defined by the relevant codec. [EXIF]
// FIXME: 2. Let physicalWidth and physicalHeight be the width and height obtained from req's image data, as defined by the relevant codec.
// FIXME: 3. Let dimX be the value of exifTagMap's tag 0xA002 (PixelXDimension).
// FIXME: 4. Let dimY be the value of exifTagMap's tag 0xA003 (PixelYDimension).
// FIXME: 5. Let resX be the value of exifTagMap's tag 0x011A (XResolution).
// FIXME: 6. Let resY be the value of exifTagMap's tag 0x011B (YResolution).
// FIXME: 7. Let resUnit be the value of exifTagMap's tag 0x0128 (ResolutionUnit).
// FIXME: 8. If either dimX or dimY is not a positive integer, then return.
// FIXME: 9. If either resX or resY is not a positive floating-point number, then return.
// FIXME: 10. If resUnit is not equal to 2 (Inch), then return.
// FIXME: 11. Let widthFromDensity be the value of physicalWidth, multiplied by 72 and divided by resX.
// FIXME: 12. Let heightFromDensity be the value of physicalHeight, multiplied by 72 and divided by resY.
// FIXME: 13. If widthFromDensity is not equal to dimX or heightFromDensity is not equal to dimY, then return.
// FIXME: 14. If req's image data is CORS-cross-origin, then set img's intrinsic dimensions to dimX and dimY, scale img's pixel data accordingly, and return.
// FIXME: 15. Set req's preferred density-corrected dimensions to a struct with its width set to dimX and its height set to dimY.
// FIXME: 16. Update req's img element's presentation appropriately.
}
2024-11-15 04:01:23 +13:00
void ImageRequest : : fetch_image ( JS : : Realm & realm , GC : : Ref < Fetch : : Infrastructure : : Request > request )
2023-06-11 14:46:54 +02:00
{
2024-08-03 15:27:08 +12:00
VERIFY ( m_shared_resource_request ) ;
m_shared_resource_request - > fetch_resource ( realm , request ) ;
2023-06-11 14:46:54 +02:00
}
2023-09-25 14:27:11 +02:00
void ImageRequest : : add_callbacks ( Function < void ( ) > on_finish , Function < void ( ) > on_fail )
2023-06-11 14:46:54 +02:00
{
2024-08-03 15:27:08 +12:00
VERIFY ( m_shared_resource_request ) ;
m_shared_resource_request - > add_callbacks ( move ( on_finish ) , move ( on_fail ) ) ;
2023-06-11 14:46:54 +02:00
}
2023-05-10 19:36:43 +02:00
}