1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 03:37:43 +00:00

LibWeb: Allow HTMLObjectElement to convert a Resource to ImageResource

HTMLObjectElement, when implemented according to the spec, does not know
the resource type specified by the 'data' attribute until after it has
actually loaded (i.e. it may be an image, XML document, etc.). Currently
we always use ImageLoader within HTMLObjectElement to load the object,
but will need to use ResourceLoader instead to generically load data.

However, ImageLoader / ImageResource have image-specific functionality
that HTMLObjectElement still needs if the resource turns out to be an
image. This patch will allow (only) HTMLObjectElement to convert the
generic Resource to an ImageResource as needed.
This commit is contained in:
Timothy Flynn 2022-03-23 08:20:41 -04:00 committed by Andreas Kling
parent eb1d7e8076
commit 90829fe880
6 changed files with 36 additions and 0 deletions

View file

@ -20,6 +20,12 @@ ImageLoader::ImageLoader(DOM::Element& owner_element)
{ {
} }
void ImageLoader::adopt_object_resource(Badge<HTML::HTMLObjectElement>, Resource& resource)
{
auto image_resource = ImageResource::convert_from_resource(resource);
set_resource(image_resource);
}
void ImageLoader::load(const AK::URL& url) void ImageLoader::load(const AK::URL& url)
{ {
m_redirects_count = 0; m_redirects_count = 0;

View file

@ -16,6 +16,8 @@ class ImageLoader : public ImageResourceClient {
public: public:
ImageLoader(DOM::Element& owner_element); ImageLoader(DOM::Element& owner_element);
void adopt_object_resource(Badge<HTML::HTMLObjectElement>, Resource&);
void load(const AK::URL&); void load(const AK::URL&);
const Gfx::Bitmap* bitmap(size_t index) const; const Gfx::Bitmap* bitmap(size_t index) const;

View file

@ -10,11 +10,21 @@
namespace Web { namespace Web {
NonnullRefPtr<ImageResource> ImageResource::convert_from_resource(Resource& resource)
{
return adopt_ref(*new ImageResource(resource));
}
ImageResource::ImageResource(const LoadRequest& request) ImageResource::ImageResource(const LoadRequest& request)
: Resource(Type::Image, request) : Resource(Type::Image, request)
{ {
} }
ImageResource::ImageResource(Resource& resource)
: Resource(Type::Image, resource)
{
}
ImageResource::~ImageResource() = default; ImageResource::~ImageResource() = default;
int ImageResource::frame_duration(size_t frame_index) const int ImageResource::frame_duration(size_t frame_index) const

View file

@ -14,6 +14,8 @@ class ImageResource final : public Resource {
friend class Resource; friend class Resource;
public: public:
static NonnullRefPtr<ImageResource> convert_from_resource(Resource&);
virtual ~ImageResource() override; virtual ~ImageResource() override;
struct Frame { struct Frame {
@ -43,6 +45,7 @@ public:
private: private:
explicit ImageResource(const LoadRequest&); explicit ImageResource(const LoadRequest&);
explicit ImageResource(Resource&);
void decode_if_needed() const; void decode_if_needed() const;

View file

@ -27,6 +27,20 @@ Resource::Resource(Type type, const LoadRequest& request)
{ {
} }
Resource::Resource(Type type, Resource& resource)
: m_request(resource.m_request)
, m_encoded_data(move(resource.m_encoded_data))
, m_type(type)
, m_loaded(resource.m_loaded)
, m_failed(resource.m_failed)
, m_error(move(resource.m_error))
, m_encoding(move(resource.m_encoding))
, m_mime_type(move(resource.m_mime_type))
, m_response_headers(move(resource.m_response_headers))
, m_status_code(move(resource.m_status_code))
{
}
Resource::~Resource() = default; Resource::~Resource() = default;
void Resource::for_each_client(Function<void(ResourceClient&)> callback) void Resource::for_each_client(Function<void(ResourceClient&)> callback)

View file

@ -65,6 +65,7 @@ public:
protected: protected:
explicit Resource(Type, const LoadRequest&); explicit Resource(Type, const LoadRequest&);
Resource(Type, Resource&);
private: private:
LoadRequest m_request; LoadRequest m_request;