Commit graph

1058 commits

Author SHA1 Message Date
Andreas Kling
e7370443f2 LibWeb: Make non-finite CSS lengths resolve to "auto"
When we're performing max-content layout (a separate throwaway layout
pass that only exists to discover the intrinsic max-content size of
a specific box), we act as if the containing block has infinite width.

This allows an infinite length to propagate into the layout system,
which is fine, but at some point it needs to be turned into a finite
number or some loop conditions will not make sense and we can hang
indefinitely (e.g in the flexible lengths resolution algorithm.)

We fix this by making Length::resolved() turn non-finite values into
an "auto" length.
2022-07-06 20:31:19 +02:00
DexesTTP
7ceeb74535 AK: Use an enum instead of a bool for String::replace(all_occurences)
This commit has no behavior changes.

In particular, this does not fix any of the wrong uses of the previous
default parameter (which used to be 'false', meaning "only replace the
first occurence in the string"). It simply replaces the default uses by
String::replace(..., ReplaceMode::FirstOnly), leaving them incorrect.
2022-07-06 11:12:45 +02:00
Andreas Kling
7a7043f821 LibWeb: Simplify some WeakPtr assignments
We can assign a raw pointer directly to a WeakPtr without null-checking
it first.
2022-07-04 22:30:59 +02:00
networkException
48c54e6796 LibWeb: Use lowercase type selectors to match against html elements
Previously we would fail to match a selector like "NAV" against a <nav>
html element.

Note that the strings must be identical in XML Documents.
2022-07-04 12:39:48 +02:00
networkException
baac3ba60c LibWeb: Remove unnecessary return in ResolvedCSSStyleDeclaration 2022-07-04 12:39:48 +02:00
MacDue
a999b82882 LibWeb: Fix background images not showing till scrolling/repaint
Previously, set_needs_display() was passed an empty rectangle in
ImageStyleValue::resource_did_load(). This led to the browser not
doing a repaint when the image loaded.

Fixes #14435
2022-06-30 20:11:40 +01:00
Linus Groh
26fc01eecb LibWeb/CSS: Fix incorrect calc(<percentage> - <value>) computations
When swapping both values to perform the actual calculation, we need to
consider that `A + B == B + A`, but `A - B != B - A`, so turn it into
`-B + A`.

Co-Authored-By: Sam Atkins <atkinssj@serenityos.org>
2022-06-30 12:11:57 +01:00
MacDue
b652546a16 LibWeb: Fix parsing of background-size: contain/cover
The lack of the commit() before returning the x_value here meant,
that in parse_background_value() the token stream would be one token
behind after parsing the background-size. This led to it to returning
null, after it sees the unexpected 'second' contain / cover token.

With this change all of backgrounds.html is working again.
2022-06-26 22:04:20 +01:00
CodeforEvolution
a02ee29af9 LibWeb/CSS: Check for NULL block statement when parsing font-face rule
This prevents font-face rules without a block statement from crashing
LibWeb during CSS parsing.

The issue was discovered by Lubrsi during CSS parser fuzzing. :)
Fixes #14141.
2022-06-23 19:14:24 +01:00
Sam Atkins
c4ef4fcd72 LibWeb: Add deprecated image-rendering values
From the spec:

> This property previously accepted the values optimizeSpeed and
  optimizeQuality. These are now deprecated; a user agent must accept
  them as valid values but must treat them as having the same behavior
  as pixelated and smooth respectively, and authors must not use them.

- https://www.w3.org/TR/css-images-3/#the-image-rendering
2022-06-16 17:36:13 +01:00
Karol Kosek
ab6288fd3d LibWeb: Use SmoothPixels scaling mode as the pixelated rendering
It's probably not in 1:1 as spec says, as it wants us to first upscale
the image to the nearest integer and then downscale it bilinearly.
But this mode still falls into the general description of the value:

> The image is scaled in a way that preserves the pixelated nature of
> the original as much as possible, but allows minor smoothing instead
> of awkward distortion when necessary.

Also, this way we don't have to allocate the memory just for the integer
scale. :^) :^)
2022-06-16 14:26:55 +01:00
Thomas Fach-Pedersen
019e3a342d LibWeb: Parse rgb and hsl functions according to CSS Module Level 4
Implement parsing of rgb(..) and hsl(..) in both the modern level 4
syntax without commas, and the legacy syntax with commas.

The parser accepts non-integer numbers but rounds to integer values
for now.
2022-06-15 19:10:43 +01:00
Thomas Fach-Pedersen
83c79fec1c LibWeb: Fix calculation of degrees from radians 2022-06-15 19:10:43 +01:00
MacDue
28c78b45ca LibWeb: Keep both horizontal and vertical border radii till painting 2022-06-13 09:43:45 +01:00
Luke Wilde
c8fa0c3cd7 LibWeb: Hold a strong ref to old_rule in CSSRuleList::remove_a_css_rule
Using auto& when indexing an NNRPVector doesn't cause it to hold a
strong reference and is instead just a plain old reference.

If m_rules was the only storage holding a strong reference to old_rule,
we would remove it in step 4 and subsequently UAF it in step 5.
2022-06-11 19:27:09 +01:00
Karol Kosek
6291821489 LibWeb: Print correct value types in ComponentValue debug string
Block and Function names were swapped.
2022-06-10 22:32:29 +01:00
Luke Wilde
d06785a8a4 LibWeb/CSS: Add :focus-within serialisation 2022-06-10 15:25:24 +01:00
Luke Wilde
0ff66b6ed8 LibWeb/CSS: Add :nth-of-type and :nth-last-of-type serialisation 2022-06-10 15:25:24 +01:00
Idan Horowitz
34e193afa6 LibWeb: Reject invalid background-repeat values instead of crashing 2022-06-03 19:14:22 +01:00
Karol Kosek
a232395b77 LibWeb: Check recursively if CSS functions contain var() or attr()
Previously, `var()` inside functions like `rgb()` wasn't resolved.

This will set the background color for badges in the New category on
https://ports.serenityos.net. :^)
2022-06-02 22:31:41 +02:00
Sam Atkins
c718ba5947 LibWeb: Implement CSSRule.parentRule and .parentStyleSheet
Both of these are supposed to be set when the CSSRule is created. The
spec is silent on setting it when a CSSRule is added to a parent. So,
this is a bit ad-hoc.

The parent rule gets set whenever a rule is added to a new parent. The
parent stylesheet gets set whenever the rule or one of its ancestors is
added to a different stylesheet. There may be some nuance there that
I'm missing, but I'm sure we'll find out quickly once we have WPT
running!
2022-05-11 20:16:10 +02:00
Sam Atkins
6e6607a92f LibWeb: Allow passing StringView to CSSRuleList::insert_a_css_rule()
The spec is a little bizarre here. One caller of this
(`CSSStyleSheet::insert_rule()`) wants to give it a parsed CSSRule, but
the spec itself wants it to take a string. (As will be used by
`CSSGroupingRule::insert_rule()`) Using a Variant isn't pretty but it's
the best solution I've come to - having two overloads was worse, whether
one called the other or they just duplicated the logic. This seems the
least bad.
2022-05-11 20:16:10 +02:00
Sam Atkins
dfba0cb2d9 LibWeb: Implement @supports serialization 2022-05-11 20:16:10 +02:00
Sam Atkins
1cec8e473f LibWeb: Add CSSSupportsRule wrapper 2022-05-11 20:16:10 +02:00
Sam Atkins
fda71a6d48 LibWeb: Add CSSMediaRule wrapper 2022-05-11 20:16:10 +02:00
Sam Atkins
0cf8986a1e LibWeb: Add CSSImportRule wrapper 2022-05-11 20:16:10 +02:00
Sam Atkins
1951873a5d LibWeb: Add CSSConditionRule wrapper 2022-05-11 20:16:10 +02:00
Sam Atkins
cfe5d63a1e LibWeb: Add CSSGroupingRule wrapper 2022-05-11 20:16:10 +02:00
Sam Atkins
bc4c185aef LibWeb: Add MediaList wrapper
Most of the pieces were already there, I'd just forgotten to actually
wire them up.
2022-05-11 20:16:10 +02:00
stelar7
cd73d5c1d0 LibWeb: Add missing preprocessing step to the css tokenizer 2022-05-08 16:29:46 +02:00
stelar7
4359d4eb5d LibWeb: Note and fix Gfx related quirk in ColorStyleValue::to_string 2022-05-08 16:29:18 +02:00
stelar7
fa05c99b22 LibWeb: Commit transaction after parsing '+'?† n <signed-integer> 2022-05-08 16:29:06 +02:00
stelar7
469380d6bc LibWeb: Dont consider '-n-' a dashndashdigit-ident token 2022-05-08 16:29:06 +02:00
stelar7
2b3c07f4ad LibWeb: Include sign in token debug info, if the type has explicit sign 2022-05-08 16:29:06 +02:00
stelar7
5ca8e2a751 LibWeb: Dont try to fetch another token in an+b parsing
When parsing <ndash-dimension> <signless-integer>, we tried to parse
a new token from the stream instead of using the value we had already
extracted. This caused pages that used the syntax to crash.
2022-05-08 16:29:06 +02:00
stelar7
303b72d516 LibWeb: Make an+b pattern selector serialization spec compliant 2022-05-08 16:29:06 +02:00
DexesTTP
56d018f6b5 LibWeb: Remove unneeded .gitignore
This was changed a while ago so the generated files are placed in the
Build directory. Let's remove the gitignore file so any old version of
the files stop conflicting with the new generated versions.
2022-05-06 14:11:03 +02:00
Sam Atkins
56e8e0daa1 LibWeb: Remove TokenStream::position() and ::rewind_to_position() 2022-04-29 00:07:31 +02:00
Sam Atkins
2b3185955e LibWeb: Use StateTransaction for UnicodeRange parsing
...and change how the two parsing steps fit together.

The two steps were previously quite muddled. Both worked with the
TokenStream directly, and both were responsible for rewinding that
stream if there was an error. This is both confusing and also made it
impossible to replace the rewinding with StateTransactions.

This commit more clearly divides the work between the two functions: One
parses ComponentValues and produces a string, and the other parses that
string to produce the UnicodeRange. It also replaces manual rewinding
in the former with StateTransactions.
2022-04-29 00:07:31 +02:00
Sam Atkins
dc00657c4f LibWeb: Use StateTransaction in more places 2022-04-29 00:07:31 +02:00
Sam Atkins
f1bb3e5ce5 LibWeb: Use StateTransaction for supports-query parsing 2022-04-29 00:07:31 +02:00
Sam Atkins
dd5927edad LibWeb: Use StateTransaction for media-query parsing
This should be a bit easier to follow.

parse_media_query() no longer rewinds if the media query is invalid,
because it then interprets all the tokens as a "not all" query.
2022-04-29 00:07:31 +02:00
Sam Atkins
28278efafb LibWeb: Extract MediaType to/from_string() logic into functions 2022-04-29 00:07:31 +02:00
Sam Atkins
1f114eaebe LibWeb: Allow whitespace inside An+B again and use StateTransactions
I accidentally broke parsing of internal whitespace (eg `-3n + 7`
instead of `-3n+7`) when implementing `:nth-child(An+B of foo)`.
2022-04-29 00:07:31 +02:00
Sam Atkins
a490f24a2d LibWeb: Add StateTransaction RAII to CSS TokenStream
This is modeled after the one in ISO8601Parser. It rolls back the
TokenStream state automatically at the end of scope unless told to
commit the changes. This should be less error-prone than remembering to
manually call `rewind_to_position()` at the correct time.

For convenience, a StateTransaction can have "child" transactions. When
a transaction is committed, it automatically commits its parents too.
This is useful in situations where you have several nested and don't
want to have to remember to manually `commit()` them all.
2022-04-29 00:07:31 +02:00
Sam Atkins
5c8ff96a94 LibWeb: Move variables in parse_a_n_plus_b_pattern() closer to usage
`a` and `b` had to be declared at the top of the function before since
they were used by the `make_return_value()` lambda. But now that
doesn't exist, we can move them to where they are used - or eliminate
them entirely.
2022-04-29 00:07:31 +02:00
Sam Atkins
f2d6bdce3f LibWeb: Handle trailing tokens outside of parse_a_n_plus_b_pattern()
parse_a_n_plus_b_pattern()'s job is to parse as much of the TokenStream
as it can as a An+B, and then stop. The caller can then deal with any
trailing tokens as it wishes.
2022-04-29 00:07:31 +02:00
Sam Atkins
d6ae08d023 LibWeb: Rename a local variable to not collide with a parameter 2022-04-29 00:07:31 +02:00
Sam Atkins
d784a8aaf0 LibWeb: Replace Result with ErrorOr in CSS Parser
...using a ParseErrorOr type alias.

This lets us replace a bunch of manual error-checking with TRY. :^)

I also replaced the ParsingResult::Done value with returning an
Optional. I wasn't happy with treating "Done" as an error when I first
wrote this, and this makes a clear distinction between the two.
2022-04-29 00:07:31 +02:00
Sam Atkins
761d29d647 LibWeb: Make CSS ParsingContext::m_url not Optional
This always has a value, so let's make that clearer.
2022-04-29 00:07:31 +02:00