2021-03-22 17:41:47 +01:00
/*
2021-04-28 22:46:44 +02:00
* Copyright ( c ) 2020 - 2021 , the SerenityOS developers .
2023-03-06 17:17:08 +00:00
* Copyright ( c ) 2021 - 2023 , Sam Atkins < atkinssj @ serenityos . org >
2021-03-22 17:41:47 +01:00
*
2021-04-22 01:24:48 -07:00
* SPDX - License - Identifier : BSD - 2 - Clause
2021-03-22 17:41:47 +01:00
*/
# pragma once
2022-04-27 11:04:16 +01:00
# include <AK/Error.h>
2021-07-12 17:30:40 +01:00
# include <AK/RefPtr.h>
2021-03-22 17:41:47 +01:00
# include <AK/Vector.h>
2021-10-08 15:54:16 +01:00
# include <LibWeb/CSS/CSSStyleDeclaration.h>
2022-03-31 21:18:54 +01:00
# include <LibWeb/CSS/FontFace.h>
2021-11-22 17:27:09 +00:00
# include <LibWeb/CSS/GeneralEnclosed.h>
2021-09-29 12:56:37 +01:00
# include <LibWeb/CSS/MediaQuery.h>
2022-04-12 14:08:26 +01:00
# include <LibWeb/CSS/Parser/Block.h>
2022-03-31 11:43:07 +01:00
# include <LibWeb/CSS/Parser/ComponentValue.h>
2022-03-31 14:36:12 +01:00
# include <LibWeb/CSS/Parser/Declaration.h>
2021-03-22 17:41:47 +01:00
# include <LibWeb/CSS/Parser/DeclarationOrAtRule.h>
2022-04-12 13:35:55 +01:00
# include <LibWeb/CSS/Parser/Function.h>
2022-04-12 19:05:13 +01:00
# include <LibWeb/CSS/Parser/Rule.h>
2022-09-27 16:05:57 +01:00
# include <LibWeb/CSS/Parser/TokenStream.h>
2021-03-22 17:41:47 +01:00
# include <LibWeb/CSS/Parser/Tokenizer.h>
2023-03-30 14:37:00 +01:00
# include <LibWeb/CSS/Position.h>
2023-03-25 14:11:11 +00:00
# include <LibWeb/CSS/PropertyID.h>
2022-03-06 13:48:32 +00:00
# include <LibWeb/CSS/Ratio.h>
2021-03-22 17:41:47 +01:00
# include <LibWeb/CSS/Selector.h>
2021-07-18 17:12:23 +01:00
# include <LibWeb/CSS/StyleValue.h>
2023-03-24 16:42:50 +00:00
# include <LibWeb/CSS/StyleValues/AbstractImageStyleValue.h>
2023-03-30 17:34:14 +01:00
# include <LibWeb/CSS/StyleValues/CalculatedStyleValue.h>
2021-10-08 15:54:16 +01:00
# include <LibWeb/CSS/Supports.h>
LibWeb: Parse `<urange>` as CSS::UnicodeRange
Like, An+B, this is an old construct that does not fit well with modern
CSS syntax, so things get a bit hairy! We have to determine which
tokens match the grammar for `<urange>`, then turn those back into a
string, and then parse the string differently from normal. Thankfully
the spec describes in detail how to do that. :^)
This is not 100% correct, since we are not using the original source
text (referred to in the spec as the "representation") of the tokens,
but just converting them to strings in a manual, ad-hoc way.
Re-engineering the Tokenizer to keep that original text was too much of
a tangent for today. In any case, we do parse `U+4???`, `U+0-100`,
`U+1234`, and similar, so good enough for now!
2022-04-07 17:41:54 +01:00
# include <LibWeb/CSS/UnicodeRange.h>
2022-04-12 11:32:18 +01:00
# include <LibWeb/Forward.h>
2021-03-22 17:41:47 +01:00
2022-04-12 12:00:07 +01:00
namespace Web : : CSS : : Parser {
2021-03-22 17:41:47 +01:00
2021-07-02 20:25:13 +01:00
class ParsingContext {
public :
2022-09-24 16:34:04 -06:00
explicit ParsingContext ( JS : : Realm & ) ;
2021-10-22 20:59:45 +01:00
explicit ParsingContext ( DOM : : Document const & ) ;
2022-04-25 16:17:21 +01:00
explicit ParsingContext ( DOM : : Document const & , AK : : URL ) ;
2021-07-22 13:00:29 +01:00
explicit ParsingContext ( DOM : : ParentNode & ) ;
2021-07-02 20:25:13 +01:00
bool in_quirks_mode ( ) const ;
2021-10-22 20:59:45 +01:00
DOM : : Document const * document ( ) const { return m_document ; }
2023-02-13 17:42:27 +00:00
AK : : URL complete_url ( StringView ) const ;
2021-07-02 20:25:13 +01:00
2021-09-11 20:39:44 +01:00
PropertyID current_property_id ( ) const { return m_current_property_id ; }
void set_current_property_id ( PropertyID property_id ) { m_current_property_id = property_id ; }
2022-09-24 16:34:04 -06:00
JS : : Realm & realm ( ) const { return m_realm ; }
2022-08-07 13:14:54 +02:00
2021-07-02 20:25:13 +01:00
private :
2023-02-26 16:09:02 -07:00
JS : : NonnullGCPtr < JS : : Realm > m_realm ;
JS : : GCPtr < DOM : : Document const > m_document ;
2021-09-11 20:39:44 +01:00
PropertyID m_current_property_id { PropertyID : : Invalid } ;
2022-04-25 16:17:21 +01:00
AK : : URL m_url ;
2021-07-02 20:25:13 +01:00
} ;
2021-03-22 17:41:47 +01:00
class Parser {
public :
2023-03-06 17:17:08 +00:00
static ErrorOr < Parser > create ( ParsingContext const & , StringView input , StringView encoding = " utf-8 " sv ) ;
Parser ( Parser & & ) ;
2021-03-22 17:41:47 +01:00
2022-08-07 13:14:54 +02:00
CSSStyleSheet * parse_as_css_stylesheet ( Optional < AK : : URL > location ) ;
2022-08-07 16:21:26 +02:00
ElementInlineCSSStyleDeclaration * parse_as_style_attribute ( DOM : : Element & ) ;
2022-08-07 15:46:44 +02:00
CSSRule * parse_as_css_rule ( ) ;
2022-03-30 12:05:16 +01:00
Optional < StyleProperty > parse_as_supports_condition ( ) ;
2022-03-28 16:37:54 +01:00
2022-03-17 15:14:01 +00:00
enum class SelectorParsingMode {
Standard ,
// `<forgiving-selector-list>` and `<forgiving-relative-selector-list>`
// are handled with this parameter, not as separate functions.
// https://drafts.csswg.org/selectors/#forgiving-selector
Forgiving
} ;
2021-07-03 12:34:25 +01:00
// Contrary to the name, these parse a comma-separated list of selectors, according to the spec.
2022-03-17 15:14:01 +00:00
Optional < SelectorList > parse_as_selector ( SelectorParsingMode = SelectorParsingMode : : Standard ) ;
Optional < SelectorList > parse_as_relative_selector ( SelectorParsingMode = SelectorParsingMode : : Standard ) ;
2021-07-30 17:06:48 +01:00
2023-03-06 14:17:01 +01:00
Vector < NonnullRefPtr < MediaQuery > > parse_as_media_query_list ( ) ;
2021-09-29 12:56:37 +01:00
RefPtr < MediaQuery > parse_as_media_query ( ) ;
2021-10-08 15:54:16 +01:00
RefPtr < Supports > parse_as_supports ( ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_as_css_value ( PropertyID ) ;
2021-07-30 17:48:23 +01:00
2023-05-02 13:03:51 +01:00
static ErrorOr < RefPtr < StyleValue > > parse_css_value ( Badge < StyleComputer > , ParsingContext const & , PropertyID , Vector < ComponentValue > const & ) ;
static ErrorOr < RefPtr < CalculatedStyleValue > > parse_calculated_value ( Badge < StyleComputer > , ParsingContext const & , Vector < ComponentValue > const & ) ;
2021-12-03 12:32:12 +00:00
2023-05-11 16:56:01 +02:00
CSS : : Length parse_as_sizes_attribute ( ) ;
2021-07-30 17:06:48 +01:00
private :
2023-03-06 17:17:08 +00:00
Parser ( ParsingContext const & , Vector < Token > ) ;
2022-04-27 11:04:16 +01:00
enum class ParseError {
2021-09-12 17:47:58 +01:00
IncludesIgnoredVendorPrefix ,
2023-05-02 13:03:51 +01:00
InternalError ,
2021-09-12 17:42:11 +01:00
SyntaxError ,
} ;
2022-04-27 11:04:16 +01:00
template < typename T >
using ParseErrorOr = ErrorOr < T , ParseError > ;
2021-09-12 17:42:11 +01:00
2022-03-29 14:13:39 +01:00
// "Parse a stylesheet" is intended to be the normal parser entry point, for parsing stylesheets.
struct ParsedStyleSheet {
Optional < AK : : URL > location ;
2023-03-06 14:17:01 +01:00
Vector < NonnullRefPtr < Rule > > rules ;
2022-03-29 14:13:39 +01:00
} ;
2021-07-30 17:06:48 +01:00
template < typename T >
2022-03-29 14:13:39 +01:00
ParsedStyleSheet parse_a_stylesheet ( TokenStream < T > & , Optional < AK : : URL > location ) ;
2022-03-30 11:36:38 +01:00
// "Parse a list of rules" is intended for the content of at-rules such as @media. It differs from "Parse a stylesheet" in the handling of <CDO-token> and <CDC-token>.
2021-07-30 17:06:48 +01:00
template < typename T >
2023-03-06 14:17:01 +01:00
Vector < NonnullRefPtr < Rule > > parse_a_list_of_rules ( TokenStream < T > & ) ;
2022-03-30 11:48:54 +01:00
// "Parse a rule" is intended for use by the CSSStyleSheet#insertRule method, and similar functions which might exist, which parse text into a single rule.
2021-07-30 17:06:48 +01:00
template < typename T >
2022-04-12 19:05:13 +01:00
RefPtr < Rule > parse_a_rule ( TokenStream < T > & ) ;
2022-03-30 11:48:54 +01:00
2022-03-30 12:05:16 +01:00
// "Parse a declaration" is used in @supports conditions. [CSS3-CONDITIONAL]
2021-07-30 17:06:48 +01:00
template < typename T >
2022-03-31 14:36:12 +01:00
Optional < Declaration > parse_a_declaration ( TokenStream < T > & ) ;
2022-03-30 12:23:07 +01:00
2022-03-30 16:44:13 +01:00
template < typename T >
Vector < DeclarationOrAtRule > parse_a_style_blocks_contents ( TokenStream < T > & ) ;
2022-03-30 12:23:07 +01:00
// "Parse a list of declarations" is for the contents of a style attribute, which parses text into the contents of a single style rule.
2021-07-30 17:06:48 +01:00
template < typename T >
2022-03-28 16:37:54 +01:00
Vector < DeclarationOrAtRule > parse_a_list_of_declarations ( TokenStream < T > & ) ;
2022-03-30 12:32:42 +01:00
// "Parse a component value" is for things that need to consume a single value, like the parsing rules for attr().
2021-07-30 17:06:48 +01:00
template < typename T >
2022-03-31 11:43:07 +01:00
Optional < ComponentValue > parse_a_component_value ( TokenStream < T > & ) ;
2022-03-30 12:39:36 +01:00
// "Parse a list of component values" is for the contents of presentational attributes, which parse text into a single declaration’ s value, or for parsing a stand-alone selector [SELECT] or list of Media Queries [MEDIAQ], as in Selectors API or the media HTML attribute.
2021-07-30 17:06:48 +01:00
template < typename T >
2022-03-31 11:43:07 +01:00
Vector < ComponentValue > parse_a_list_of_component_values ( TokenStream < T > & ) ;
2022-03-30 12:39:36 +01:00
2021-07-30 17:06:48 +01:00
template < typename T >
2022-03-31 11:43:07 +01:00
Vector < Vector < ComponentValue > > parse_a_comma_separated_list_of_component_values ( TokenStream < T > & ) ;
2022-03-17 19:29:40 +00:00
enum class SelectorType {
Standalone ,
Relative
} ;
2021-07-03 15:40:06 +01:00
template < typename T >
2022-04-27 11:04:16 +01:00
ParseErrorOr < SelectorList > parse_a_selector_list ( TokenStream < T > & , SelectorType , SelectorParsingMode = SelectorParsingMode : : Standard ) ;
2022-03-17 19:29:40 +00:00
2021-09-29 12:56:37 +01:00
template < typename T >
2023-03-06 14:17:01 +01:00
Vector < NonnullRefPtr < MediaQuery > > parse_a_media_query_list ( TokenStream < T > & ) ;
2021-10-08 15:54:16 +01:00
template < typename T >
RefPtr < Supports > parse_a_supports ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
2022-04-27 12:03:42 +01:00
Optional < Selector : : SimpleSelector : : ANPlusBPattern > parse_a_n_plus_b_pattern ( TokenStream < ComponentValue > & ) ;
2021-03-22 17:41:47 +01:00
2022-03-29 13:46:16 +01:00
enum class TopLevel {
No ,
Yes
} ;
2021-07-03 15:40:06 +01:00
template < typename T >
2023-03-06 14:17:01 +01:00
[ [ nodiscard ] ] Vector < NonnullRefPtr < Rule > > consume_a_list_of_rules ( TokenStream < T > & , TopLevel ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2022-04-12 19:05:13 +01:00
[ [ nodiscard ] ] NonnullRefPtr < Rule > consume_an_at_rule ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2022-04-12 19:05:13 +01:00
RefPtr < Rule > consume_a_qualified_rule ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2022-03-30 16:44:13 +01:00
[ [ nodiscard ] ] Vector < DeclarationOrAtRule > consume_a_style_blocks_contents ( TokenStream < T > & ) ;
template < typename T >
2021-07-03 15:40:06 +01:00
[ [ nodiscard ] ] Vector < DeclarationOrAtRule > consume_a_list_of_declarations ( TokenStream < T > & ) ;
template < typename T >
2022-03-31 14:36:12 +01:00
Optional < Declaration > consume_a_declaration ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2022-03-31 11:43:07 +01:00
[ [ nodiscard ] ] ComponentValue consume_a_component_value ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2022-04-12 14:08:26 +01:00
NonnullRefPtr < Block > consume_a_simple_block ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2022-04-12 13:35:55 +01:00
NonnullRefPtr < Function > consume_a_function ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
2022-03-31 11:43:07 +01:00
Optional < GeneralEnclosed > parse_general_enclosed ( TokenStream < ComponentValue > & ) ;
2021-10-08 15:54:16 +01:00
2022-08-07 15:46:44 +02:00
CSSRule * parse_font_face_rule ( TokenStream < ComponentValue > & ) ;
2022-03-31 21:18:54 +01:00
Vector < FontFace : : Source > parse_font_face_src ( TokenStream < ComponentValue > & ) ;
2022-03-28 20:32:28 +01:00
2022-08-07 15:46:44 +02:00
CSSRule * convert_to_rule ( NonnullRefPtr < Rule > ) ;
2022-09-10 12:51:22 +01:00
PropertyOwningCSSStyleDeclaration * convert_to_style_declaration ( Vector < DeclarationOrAtRule > const & declarations ) ;
2022-03-31 14:36:12 +01:00
Optional < StyleProperty > convert_to_style_property ( Declaration const & ) ;
2021-07-09 16:34:29 +01:00
2022-01-14 17:09:02 +00:00
class Dimension {
public :
2022-02-22 12:48:59 +00:00
Dimension ( Angle & & value )
: m_value ( move ( value ) )
{
}
Dimension ( Frequency & & value )
: m_value ( move ( value ) )
{
}
2022-01-14 17:09:02 +00:00
Dimension ( Length & & value )
: m_value ( move ( value ) )
{
}
Dimension ( Percentage & & value )
: m_value ( move ( value ) )
{
}
2022-02-22 12:48:59 +00:00
Dimension ( Resolution & & value )
: m_value ( move ( value ) )
{
}
Dimension ( Time & & value )
: m_value ( move ( value ) )
{
}
bool is_angle ( ) const ;
Angle angle ( ) const ;
bool is_angle_percentage ( ) const ;
AnglePercentage angle_percentage ( ) const ;
bool is_frequency ( ) const ;
Frequency frequency ( ) const ;
bool is_frequency_percentage ( ) const ;
FrequencyPercentage frequency_percentage ( ) const ;
2022-01-14 17:09:02 +00:00
bool is_length ( ) const ;
Length length ( ) const ;
2022-02-22 12:48:59 +00:00
bool is_length_percentage ( ) const ;
LengthPercentage length_percentage ( ) const ;
2022-01-14 17:09:02 +00:00
bool is_percentage ( ) const ;
Percentage percentage ( ) const ;
2022-02-22 12:48:59 +00:00
bool is_resolution ( ) const ;
Resolution resolution ( ) const ;
bool is_time ( ) const ;
Time time ( ) const ;
bool is_time_percentage ( ) const ;
TimePercentage time_percentage ( ) const ;
2022-01-14 17:09:02 +00:00
private :
2022-02-22 12:48:59 +00:00
Variant < Angle , Frequency , Length , Percentage , Resolution , Time > m_value ;
2022-01-14 17:09:02 +00:00
} ;
2022-03-31 11:43:07 +01:00
Optional < Dimension > parse_dimension ( ComponentValue const & ) ;
2022-06-09 19:08:57 +02:00
Optional < Color > parse_rgb_or_hsl_color ( StringView function_name , Vector < ComponentValue > const & ) ;
2022-03-31 11:43:07 +01:00
Optional < Color > parse_color ( ComponentValue const & ) ;
Optional < Length > parse_length ( ComponentValue const & ) ;
Optional < Ratio > parse_ratio ( TokenStream < ComponentValue > & ) ;
LibWeb: Parse `<urange>` as CSS::UnicodeRange
Like, An+B, this is an old construct that does not fit well with modern
CSS syntax, so things get a bit hairy! We have to determine which
tokens match the grammar for `<urange>`, then turn those back into a
string, and then parse the string differently from normal. Thankfully
the spec describes in detail how to do that. :^)
This is not 100% correct, since we are not using the original source
text (referred to in the spec as the "representation") of the tokens,
but just converting them to strings in a manual, ad-hoc way.
Re-engineering the Tokenizer to keep that original text was too much of
a tangent for today. In any case, we do parse `U+4???`, `U+0-100`,
`U+1234`, and similar, so good enough for now!
2022-04-07 17:41:54 +01:00
Optional < UnicodeRange > parse_unicode_range ( TokenStream < ComponentValue > & ) ;
2022-04-27 19:56:05 +01:00
Optional < UnicodeRange > parse_unicode_range ( StringView ) ;
2022-10-30 13:27:57 +01:00
Optional < GridSize > parse_grid_size ( ComponentValue const & ) ;
Optional < GridMinMax > parse_min_max ( Vector < ComponentValue > const & ) ;
Optional < GridRepeat > parse_repeat ( Vector < ComponentValue > const & ) ;
Optional < ExplicitGridTrack > parse_track_sizing_function ( ComponentValue const & ) ;
2022-11-08 20:50:00 +01:00
Optional < PositionValue > parse_position ( TokenStream < ComponentValue > & , PositionValue initial_value = PositionValue : : center ( ) ) ;
2021-10-29 08:38:50 -04:00
enum class AllowedDataUrlType {
None ,
Image ,
2022-09-14 21:14:16 +02:00
Font ,
2021-10-29 08:38:50 -04:00
} ;
2022-03-31 11:43:07 +01:00
Optional < AK : : URL > parse_url_function ( ComponentValue const & , AllowedDataUrlType = AllowedDataUrlType : : None ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_url_value ( ComponentValue const & , AllowedDataUrlType = AllowedDataUrlType : : None ) ;
2022-03-31 11:43:07 +01:00
2022-11-08 21:33:00 +01:00
Optional < Vector < LinearColorStopListElement > > parse_linear_color_stop_list ( TokenStream < ComponentValue > & ) ;
Optional < Vector < AngularColorStopListElement > > parse_angular_color_stop_list ( TokenStream < ComponentValue > & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_linear_gradient_function ( ComponentValue const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_conic_gradient_function ( ComponentValue const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_radial_gradient_function ( ComponentValue const & ) ;
2022-07-12 00:15:05 +01:00
2022-04-27 11:04:16 +01:00
ParseErrorOr < NonnullRefPtr < StyleValue > > parse_css_value ( PropertyID , TokenStream < ComponentValue > & ) ;
2023-05-17 17:23:42 +01:00
ErrorOr < RefPtr < StyleValue > > parse_css_value_for_property ( PropertyID , TokenStream < ComponentValue > & ) ;
struct PropertyAndValue {
PropertyID property ;
RefPtr < StyleValue > style_value ;
} ;
ErrorOr < PropertyAndValue > parse_css_value_for_properties ( ReadonlySpan < PropertyID > , TokenStream < ComponentValue > & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_builtin_value ( ComponentValue const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_dynamic_value ( ComponentValue const & ) ;
ErrorOr < RefPtr < CalculatedStyleValue > > parse_calculated_value ( Vector < ComponentValue > const & ) ;
2023-05-30 20:56:09 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_a_calc_function_node ( Function const & ) ;
2023-05-26 11:21:49 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_min_function ( Function const & ) ;
2023-05-26 15:00:22 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_max_function ( Function const & ) ;
2023-05-26 15:40:39 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_clamp_function ( Function const & ) ;
2023-05-27 22:56:41 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_abs_function ( Function const & ) ;
2023-05-27 23:02:39 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_sign_function ( Function const & ) ;
2023-05-27 23:50:33 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_sin_function ( Function const & ) ;
2023-05-27 23:57:01 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_cos_function ( Function const & ) ;
2023-05-28 00:02:43 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_tan_function ( Function const & ) ;
2023-05-28 10:55:52 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_asin_function ( Function const & ) ;
2023-05-28 11:00:35 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_acos_function ( Function const & ) ;
2023-05-28 11:04:57 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_atan_function ( Function const & ) ;
2023-05-28 11:19:10 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_atan2_function ( Function const & ) ;
2023-05-28 11:26:42 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_pow_function ( Function const & ) ;
2023-05-28 11:31:50 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_sqrt_function ( Function const & ) ;
2023-05-28 11:43:04 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_hypot_function ( Function const & ) ;
2023-05-28 11:53:57 +02:00
ErrorOr < OwnPtr < CalculationNode > > parse_log_function ( Function const & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_dimension_value ( ComponentValue const & ) ;
2023-06-01 17:01:09 +01:00
ErrorOr < RefPtr < StyleValue > > parse_integer_value ( TokenStream < ComponentValue > & ) ;
ErrorOr < RefPtr < StyleValue > > parse_number_value ( TokenStream < ComponentValue > & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_identifier_value ( ComponentValue const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_color_value ( ComponentValue const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_rect_value ( ComponentValue const & ) ;
2023-06-06 15:42:43 +01:00
ErrorOr < RefPtr < StyleValue > > parse_ratio_value ( TokenStream < ComponentValue > & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_string_value ( ComponentValue const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_image_value ( ComponentValue const & ) ;
2023-06-15 16:37:36 +01:00
ErrorOr < RefPtr < StyleValue > > parse_paint_value ( TokenStream < ComponentValue > & ) ;
2021-11-08 17:19:55 +00:00
template < typename ParseFunction >
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_comma_separated_value_list ( Vector < ComponentValue > const & , ParseFunction ) ;
2023-05-17 17:31:07 +01:00
ErrorOr < RefPtr < StyleValue > > parse_simple_comma_separated_value_list ( PropertyID , Vector < ComponentValue > const & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_filter_value_list_value ( Vector < ComponentValue > const & ) ;
2023-06-08 15:25:16 +01:00
ErrorOr < RefPtr < StyleValue > > parse_aspect_ratio_value ( Vector < ComponentValue > const & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_background_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_single_background_position_value ( TokenStream < ComponentValue > & ) ;
ErrorOr < RefPtr < StyleValue > > parse_single_background_position_x_or_y_value ( TokenStream < ComponentValue > & , PropertyID ) ;
ErrorOr < RefPtr < StyleValue > > parse_single_background_repeat_value ( TokenStream < ComponentValue > & ) ;
ErrorOr < RefPtr < StyleValue > > parse_single_background_size_value ( TokenStream < ComponentValue > & ) ;
ErrorOr < RefPtr < StyleValue > > parse_border_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_border_radius_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_border_radius_shorthand_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_content_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_display_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_flex_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_flex_flow_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_font_value ( Vector < ComponentValue > const & ) ;
2023-05-24 16:09:38 +01:00
ErrorOr < RefPtr < StyleValue > > parse_font_family_value ( TokenStream < ComponentValue > & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_list_style_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_overflow_value ( Vector < ComponentValue > const & ) ;
2023-05-29 16:34:53 -04:00
ErrorOr < RefPtr < StyleValue > > parse_place_content_value ( Vector < ComponentValue > const & ) ;
2022-03-23 16:59:44 +00:00
enum class AllowInsetKeyword {
No ,
Yes ,
} ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_shadow_value ( Vector < ComponentValue > const & , AllowInsetKeyword ) ;
ErrorOr < RefPtr < StyleValue > > parse_single_shadow_value ( TokenStream < ComponentValue > & , AllowInsetKeyword ) ;
ErrorOr < RefPtr < StyleValue > > parse_text_decoration_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_text_decoration_line_value ( TokenStream < ComponentValue > & ) ;
ErrorOr < RefPtr < StyleValue > > parse_transform_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_transform_origin_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_grid_track_size_list ( Vector < ComponentValue > const & , bool allow_separate_line_name_blocks = false ) ;
2023-05-21 18:08:41 +03:00
ErrorOr < RefPtr < StyleValue > > parse_grid_auto_track_sizes ( Vector < ComponentValue > const & ) ;
2023-05-02 13:03:51 +01:00
ErrorOr < RefPtr < StyleValue > > parse_grid_track_size_list_shorthand_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_grid_track_placement ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_grid_track_placement_shorthand_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_grid_template_areas_value ( Vector < ComponentValue > const & ) ;
ErrorOr < RefPtr < StyleValue > > parse_grid_area_shorthand_value ( Vector < ComponentValue > const & ) ;
2023-05-27 02:58:19 +03:00
ErrorOr < RefPtr < StyleValue > > parse_grid_shorthand_value ( Vector < ComponentValue > const & ) ;
2021-07-14 16:20:06 +01:00
2023-04-11 15:48:06 +01:00
ErrorOr < OwnPtr < CalculationNode > > parse_a_calculation ( Vector < ComponentValue > const & ) ;
2022-03-31 11:43:07 +01:00
2022-04-27 11:04:16 +01:00
ParseErrorOr < NonnullRefPtr < Selector > > parse_complex_selector ( TokenStream < ComponentValue > & , SelectorType ) ;
ParseErrorOr < Optional < Selector : : CompoundSelector > > parse_compound_selector ( TokenStream < ComponentValue > & ) ;
2022-03-31 11:43:07 +01:00
Optional < Selector : : Combinator > parse_selector_combinator ( TokenStream < ComponentValue > & ) ;
2022-04-27 11:04:16 +01:00
ParseErrorOr < Selector : : SimpleSelector > parse_attribute_simple_selector ( ComponentValue const & ) ;
ParseErrorOr < Selector : : SimpleSelector > parse_pseudo_simple_selector ( TokenStream < ComponentValue > & ) ;
ParseErrorOr < Optional < Selector : : SimpleSelector > > parse_simple_selector ( TokenStream < ComponentValue > & ) ;
2022-03-31 11:43:07 +01:00
NonnullRefPtr < MediaQuery > parse_media_query ( TokenStream < ComponentValue > & ) ;
OwnPtr < MediaCondition > parse_media_condition ( TokenStream < ComponentValue > & , MediaCondition : : AllowOr allow_or ) ;
Optional < MediaFeature > parse_media_feature ( TokenStream < ComponentValue > & ) ;
Optional < MediaQuery : : MediaType > parse_media_type ( TokenStream < ComponentValue > & ) ;
OwnPtr < MediaCondition > parse_media_in_parens ( TokenStream < ComponentValue > & ) ;
Optional < MediaFeatureValue > parse_media_feature_value ( MediaFeatureID , TokenStream < ComponentValue > & ) ;
OwnPtr < Supports : : Condition > parse_supports_condition ( TokenStream < ComponentValue > & ) ;
Optional < Supports : : InParens > parse_supports_in_parens ( TokenStream < ComponentValue > & ) ;
Optional < Supports : : Feature > parse_supports_feature ( TokenStream < ComponentValue > & ) ;
2021-10-08 15:54:16 +01:00
2021-11-11 00:55:02 +01:00
static bool has_ignored_vendor_prefix ( StringView ) ;
2022-03-28 20:32:28 +01:00
static bool is_builtin ( StringView ) ;
2021-09-12 16:49:09 +01:00
2022-03-29 16:01:38 +02:00
struct PropertiesAndCustomProperties {
Vector < StyleProperty > properties ;
2022-12-04 18:02:33 +00:00
HashMap < DeprecatedString , StyleProperty > custom_properties ;
2022-03-29 16:01:38 +02:00
} ;
PropertiesAndCustomProperties extract_properties ( Vector < DeclarationOrAtRule > const & ) ;
2021-07-02 20:25:13 +01:00
ParsingContext m_context ;
2021-03-22 17:41:47 +01:00
Vector < Token > m_tokens ;
2021-07-03 14:00:41 +01:00
TokenStream < Token > m_token_stream ;
2021-03-22 17:41:47 +01:00
} ;
}
2021-07-30 17:48:23 +01:00
namespace Web {
2022-08-07 13:14:54 +02:00
CSS : : CSSStyleSheet * parse_css_stylesheet ( CSS : : Parser : : ParsingContext const & , StringView , Optional < AK : : URL > location = { } ) ;
2022-08-07 16:21:26 +02:00
CSS : : ElementInlineCSSStyleDeclaration * parse_css_style_attribute ( CSS : : Parser : : ParsingContext const & , StringView , DOM : : Element & ) ;
2023-05-02 15:09:46 +01:00
ErrorOr < RefPtr < CSS : : StyleValue > > parse_css_value ( CSS : : Parser : : ParsingContext const & , StringView , CSS : : PropertyID property_id = CSS : : PropertyID : : Invalid ) ;
2022-04-12 12:00:07 +01:00
Optional < CSS : : SelectorList > parse_selector ( CSS : : Parser : : ParsingContext const & , StringView ) ;
2022-08-07 15:46:44 +02:00
CSS : : CSSRule * parse_css_rule ( CSS : : Parser : : ParsingContext const & , StringView ) ;
2022-04-12 12:00:07 +01:00
RefPtr < CSS : : MediaQuery > parse_media_query ( CSS : : Parser : : ParsingContext const & , StringView ) ;
2023-03-06 14:17:01 +01:00
Vector < NonnullRefPtr < CSS : : MediaQuery > > parse_media_query_list ( CSS : : Parser : : ParsingContext const & , StringView ) ;
2022-04-12 12:00:07 +01:00
RefPtr < CSS : : Supports > parse_css_supports ( CSS : : Parser : : ParsingContext const & , StringView ) ;
2023-03-06 14:46:21 +00:00
Optional < CSS : : StyleProperty > parse_css_supports_condition ( CSS : : Parser : : ParsingContext const & , StringView ) ;
2021-07-30 17:48:23 +01:00
}