mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-02 09:18:52 +00:00
This change also removes as much direct use of JS::Promise in LibWeb as possible. When specs refer to `Promise<T>` they should be assumed to be referring to the WebIDL Promise type, not the JS::Promise type. The one exception is the HostPromiseRejectionTracker hook on the JS VM. This facility and its associated sets and events are intended to expose the exact opaque object handles that were rejected to author code. This is not possible with the WebIDL Promise type, so we have to use JS::Promise or JS::Object to hold onto the promises. It also exposes which specs need some updates in the area of promises. WebDriver stands out in this regard. WebAudio could use some more cross-references to WebIDL as well to clarify things.
118 lines
4.2 KiB
C++
118 lines
4.2 KiB
C++
/*
|
|
* Copyright (c) 2024, Andrew Kaster <akaster@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibGfx/Font/Typeface.h>
|
|
#include <LibURL/URL.h>
|
|
#include <LibWeb/Bindings/FontFacePrototype.h>
|
|
#include <LibWeb/Bindings/PlatformObject.h>
|
|
#include <LibWeb/CSS/ParsedFontFace.h>
|
|
|
|
namespace Web::CSS {
|
|
|
|
struct FontFaceDescriptors {
|
|
String style = "normal"_string;
|
|
String weight = "normal"_string;
|
|
String stretch = "normal"_string;
|
|
String unicode_range = "U+0-10FFFF"_string;
|
|
String feature_settings = "normal"_string;
|
|
String variation_settings = "normal"_string;
|
|
String display = "auto"_string;
|
|
String ascent_override = "normal"_string;
|
|
String descent_override = "normal"_string;
|
|
String line_gap_override = "normal"_string;
|
|
};
|
|
|
|
class FontFace final : public Bindings::PlatformObject {
|
|
WEB_PLATFORM_OBJECT(FontFace, Bindings::PlatformObject);
|
|
JS_DECLARE_ALLOCATOR(FontFace);
|
|
|
|
public:
|
|
using FontFaceSource = Variant<String, JS::Handle<WebIDL::BufferSource>>;
|
|
|
|
[[nodiscard]] static JS::NonnullGCPtr<FontFace> construct_impl(JS::Realm&, String family, FontFaceSource source, FontFaceDescriptors const& descriptors);
|
|
virtual ~FontFace() override;
|
|
|
|
String family() const { return m_family; }
|
|
WebIDL::ExceptionOr<void> set_family(String const&);
|
|
|
|
String style() const { return m_style; }
|
|
WebIDL::ExceptionOr<void> set_style(String const&);
|
|
|
|
String weight() const { return m_weight; }
|
|
WebIDL::ExceptionOr<void> set_weight(String const&);
|
|
|
|
String stretch() const { return m_stretch; }
|
|
WebIDL::ExceptionOr<void> set_stretch(String const&);
|
|
|
|
String unicode_range() const { return m_unicode_range; }
|
|
WebIDL::ExceptionOr<void> set_unicode_range(String const&);
|
|
|
|
String feature_settings() const { return m_feature_settings; }
|
|
WebIDL::ExceptionOr<void> set_feature_settings(String const&);
|
|
|
|
String variation_settings() const { return m_variation_settings; }
|
|
WebIDL::ExceptionOr<void> set_variation_settings(String const&);
|
|
|
|
String display() const { return m_display; }
|
|
WebIDL::ExceptionOr<void> set_display(String const&);
|
|
|
|
String ascent_override() const { return m_ascent_override; }
|
|
WebIDL::ExceptionOr<void> set_ascent_override(String const&);
|
|
|
|
String descent_override() const { return m_descent_override; }
|
|
WebIDL::ExceptionOr<void> set_descent_override(String const&);
|
|
|
|
String line_gap_override() const { return m_line_gap_override; }
|
|
WebIDL::ExceptionOr<void> set_line_gap_override(String const&);
|
|
|
|
bool is_css_connected() const { return m_is_css_connected; }
|
|
|
|
Bindings::FontFaceLoadStatus status() const { return m_status; }
|
|
|
|
JS::NonnullGCPtr<WebIDL::Promise> load();
|
|
JS::NonnullGCPtr<WebIDL::Promise> loaded() const;
|
|
|
|
void load_font_source();
|
|
|
|
JS::NonnullGCPtr<WebIDL::Promise> font_status_promise() { return m_font_status_promise; }
|
|
|
|
private:
|
|
FontFace(JS::Realm&, JS::NonnullGCPtr<WebIDL::Promise> font_status_promise, Vector<ParsedFontFace::Source> urls, ByteBuffer data, String family, FontFaceDescriptors const& descriptors);
|
|
|
|
virtual void initialize(JS::Realm&) override;
|
|
virtual void visit_edges(Visitor&) override;
|
|
|
|
// FIXME: Should we be storing StyleValues instead?
|
|
String m_family;
|
|
String m_style;
|
|
String m_weight;
|
|
String m_stretch;
|
|
String m_unicode_range;
|
|
Vector<Gfx::UnicodeRange> m_unicode_ranges;
|
|
String m_feature_settings;
|
|
String m_variation_settings;
|
|
String m_display;
|
|
String m_ascent_override;
|
|
String m_descent_override;
|
|
String m_line_gap_override;
|
|
|
|
// https://drafts.csswg.org/css-font-loading/#dom-fontface-status
|
|
Bindings::FontFaceLoadStatus m_status { Bindings::FontFaceLoadStatus::Unloaded };
|
|
|
|
JS::NonnullGCPtr<WebIDL::Promise> m_font_status_promise; // [[FontStatusPromise]]
|
|
Vector<ParsedFontFace::Source> m_urls; // [[Urls]]
|
|
ByteBuffer m_binary_data; // [[Data]]
|
|
|
|
RefPtr<Gfx::Typeface> m_parsed_font;
|
|
RefPtr<Core::Promise<NonnullRefPtr<Gfx::Typeface>>> m_font_load_promise;
|
|
|
|
// https://drafts.csswg.org/css-font-loading/#css-connected
|
|
bool m_is_css_connected { false };
|
|
};
|
|
|
|
}
|