mirror of
https://github.com/RGBCube/serenity
synced 2025-05-15 03:14:58 +00:00

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.
67 lines
1.6 KiB
C++
67 lines
1.6 KiB
C++
/*
|
|
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Function.h>
|
|
#include <LibCore/Timer.h>
|
|
#include <LibWeb/Loader/ImageResource.h>
|
|
|
|
namespace Web {
|
|
|
|
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;
|
|
size_t current_frame_index() const { return m_current_frame_index; }
|
|
|
|
bool has_image() const;
|
|
|
|
bool has_loaded_or_failed() const { return m_loading_state != LoadingState::Loading; }
|
|
|
|
void set_visible_in_viewport(bool) const;
|
|
|
|
unsigned width() const;
|
|
unsigned height() const;
|
|
|
|
Function<void()> on_load;
|
|
Function<void()> on_fail;
|
|
Function<void()> on_animate;
|
|
|
|
private:
|
|
void load_without_resetting_redirect_counter(AK::URL const&);
|
|
|
|
// ^ImageResourceClient
|
|
virtual void resource_did_load() override;
|
|
virtual void resource_did_fail() override;
|
|
virtual bool is_visible_in_viewport() const override { return m_visible_in_viewport; }
|
|
|
|
void animate();
|
|
|
|
enum class LoadingState {
|
|
None,
|
|
Loading,
|
|
Loaded,
|
|
Failed,
|
|
};
|
|
|
|
DOM::Element& m_owner_element;
|
|
|
|
mutable bool m_visible_in_viewport { false };
|
|
|
|
size_t m_current_frame_index { 0 };
|
|
size_t m_loops_completed { 0 };
|
|
LoadingState m_loading_state { LoadingState::Loading };
|
|
NonnullRefPtr<Core::Timer> m_timer;
|
|
size_t m_redirects_count { 0 };
|
|
};
|
|
|
|
}
|