diff options
author | Andreas Kling <kling@serenityos.org> | 2023-05-11 06:12:45 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-05-13 09:08:42 +0200 |
commit | 9281bf7a0108bf1f29f122e0a6314c25d14c1255 (patch) | |
tree | 9e433de1fd665e6e7a99ef9ecb2903390757cd6d /Userland/Libraries/LibWeb/HTML | |
parent | 596eabe9e6f95ae43e1cbb42263105b1c3df1e9d (diff) | |
download | serenity-9281bf7a0108bf1f29f122e0a6314c25d14c1255.zip |
LibWeb: Add class to represent "list of available images" from HTML spec
Diffstat (limited to 'Userland/Libraries/LibWeb/HTML')
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.cpp | 66 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.h | 71 |
2 files changed, 137 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.cpp b/Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.cpp new file mode 100644 index 0000000000..0fd0cec290 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2023, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibWeb/HTML/DecodedImageData.h> +#include <LibWeb/HTML/ListOfAvailableImages.h> + +namespace Web::HTML { + +ListOfAvailableImages::ListOfAvailableImages() = default; +ListOfAvailableImages::~ListOfAvailableImages() = default; + +bool ListOfAvailableImages::Key::operator==(Key const& other) const +{ + return url == other.url && mode == other.mode && origin == other.origin; +} + +u32 ListOfAvailableImages::Key::hash() const +{ + if (!cached_hash.has_value()) { + u32 url_hash = Traits<AK::URL>::hash(url); + u32 mode_hash = static_cast<u32>(mode); + u32 origin_hash = 0; + if (origin.has_value()) + origin_hash = Traits<HTML::Origin>::hash(origin.value()); + cached_hash = pair_int_hash(url_hash, pair_int_hash(mode_hash, origin_hash)); + } + return cached_hash.value(); +} + +ErrorOr<NonnullRefPtr<ListOfAvailableImages::Entry>> ListOfAvailableImages::Entry::create(NonnullRefPtr<DecodedImageData> image_data, bool ignore_higher_layer_caching) +{ + return adopt_nonnull_ref_or_enomem(new (nothrow) Entry(move(image_data), ignore_higher_layer_caching)); +} + +ListOfAvailableImages::Entry::Entry(NonnullRefPtr<DecodedImageData> data, bool ignore_higher_layer_caching) + : ignore_higher_layer_caching(ignore_higher_layer_caching) + , image_data(move(data)) +{ +} + +ListOfAvailableImages::Entry::~Entry() = default; + +ErrorOr<void> ListOfAvailableImages::add(Key const& key, NonnullRefPtr<DecodedImageData> image_data, bool ignore_higher_layer_caching) +{ + auto entry = TRY(Entry::create(move(image_data), ignore_higher_layer_caching)); + TRY(m_images.try_set(key, move(entry))); + return {}; +} + +void ListOfAvailableImages::remove(Key const& key) +{ + m_images.remove(key); +} + +RefPtr<ListOfAvailableImages::Entry> ListOfAvailableImages::get(Key const& key) const +{ + auto it = m_images.find(key); + if (it == m_images.end()) + return nullptr; + return it->value; +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.h b/Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.h new file mode 100644 index 0000000000..3591a395b7 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2023, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/HashMap.h> +#include <AK/URL.h> +#include <LibJS/Heap/Cell.h> +#include <LibWeb/Forward.h> +#include <LibWeb/HTML/CORSSettingAttribute.h> +#include <LibWeb/HTML/Origin.h> + +namespace Web::HTML { + +// https://html.spec.whatwg.org/multipage/images.html#list-of-available-images +class ListOfAvailableImages { +public: + struct Key { + AK::URL url; + HTML::CORSSettingAttribute mode; + Optional<HTML::Origin> origin; + + [[nodiscard]] bool operator==(Key const& other) const; + [[nodiscard]] u32 hash() const; + + private: + mutable Optional<u32> cached_hash; + }; + + struct Entry final : public RefCounted<Entry> { + static ErrorOr<NonnullRefPtr<Entry>> create(NonnullRefPtr<DecodedImageData>, bool ignore_higher_layer_caching); + ~Entry(); + + bool ignore_higher_layer_caching { false }; + NonnullRefPtr<DecodedImageData> image_data; + + private: + Entry(NonnullRefPtr<DecodedImageData>, bool ignore_higher_layer_caching); + }; + + ListOfAvailableImages(); + ~ListOfAvailableImages(); + + ErrorOr<void> add(Key const&, NonnullRefPtr<DecodedImageData>, bool ignore_higher_layer_caching); + void remove(Key const&); + [[nodiscard]] RefPtr<Entry> get(Key const&) const; + +private: + HashMap<Key, NonnullRefPtr<Entry>> m_images; +}; + +} + +namespace AK { + +template<> +struct Traits<Web::HTML::ListOfAvailableImages::Key> : public GenericTraits<Web::HTML::ListOfAvailableImages::Key> { + static unsigned hash(Web::HTML::ListOfAvailableImages::Key const& key) + { + return key.hash(); + } + static bool equals(Web::HTML::ListOfAvailableImages::Key const& a, Web::HTML::ListOfAvailableImages::Key const& b) + { + return a == b; + } +}; + +} |