mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 03:47:34 +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:
parent
eb1d7e8076
commit
90829fe880
6 changed files with 36 additions and 0 deletions
|
@ -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)
|
||||
{
|
||||
m_redirects_count = 0;
|
||||
|
|
|
@ -16,6 +16,8 @@ class ImageLoader : public ImageResourceClient {
|
|||
public:
|
||||
ImageLoader(DOM::Element& owner_element);
|
||||
|
||||
void adopt_object_resource(Badge<HTML::HTMLObjectElement>, Resource&);
|
||||
|
||||
void load(const AK::URL&);
|
||||
|
||||
const Gfx::Bitmap* bitmap(size_t index) const;
|
||||
|
|
|
@ -10,11 +10,21 @@
|
|||
|
||||
namespace Web {
|
||||
|
||||
NonnullRefPtr<ImageResource> ImageResource::convert_from_resource(Resource& resource)
|
||||
{
|
||||
return adopt_ref(*new ImageResource(resource));
|
||||
}
|
||||
|
||||
ImageResource::ImageResource(const LoadRequest& request)
|
||||
: Resource(Type::Image, request)
|
||||
{
|
||||
}
|
||||
|
||||
ImageResource::ImageResource(Resource& resource)
|
||||
: Resource(Type::Image, resource)
|
||||
{
|
||||
}
|
||||
|
||||
ImageResource::~ImageResource() = default;
|
||||
|
||||
int ImageResource::frame_duration(size_t frame_index) const
|
||||
|
|
|
@ -14,6 +14,8 @@ class ImageResource final : public Resource {
|
|||
friend class Resource;
|
||||
|
||||
public:
|
||||
static NonnullRefPtr<ImageResource> convert_from_resource(Resource&);
|
||||
|
||||
virtual ~ImageResource() override;
|
||||
|
||||
struct Frame {
|
||||
|
@ -43,6 +45,7 @@ public:
|
|||
|
||||
private:
|
||||
explicit ImageResource(const LoadRequest&);
|
||||
explicit ImageResource(Resource&);
|
||||
|
||||
void decode_if_needed() const;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
void Resource::for_each_client(Function<void(ResourceClient&)> callback)
|
||||
|
|
|
@ -65,6 +65,7 @@ public:
|
|||
|
||||
protected:
|
||||
explicit Resource(Type, const LoadRequest&);
|
||||
Resource(Type, Resource&);
|
||||
|
||||
private:
|
||||
LoadRequest m_request;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue