summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/HTML
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2023-05-11 06:12:45 +0200
committerAndreas Kling <kling@serenityos.org>2023-05-13 09:08:42 +0200
commit9281bf7a0108bf1f29f122e0a6314c25d14c1255 (patch)
tree9e433de1fd665e6e7a99ef9ecb2903390757cd6d /Userland/Libraries/LibWeb/HTML
parent596eabe9e6f95ae43e1cbb42263105b1c3df1e9d (diff)
downloadserenity-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.cpp66
-rw-r--r--Userland/Libraries/LibWeb/HTML/ListOfAvailableImages.h71
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;
+ }
+};
+
+}