Commit graph

1614 commits

Author SHA1 Message Date
Sam Atkins
67e1125b4c LibWeb: Handle fallback values for CSS variables :^) 2021-12-09 21:30:31 +01:00
Sam Atkins
23dc0dac88 LibWeb: Parse and resolve UnresolvedStyleValues
If a property is custom or contains a `var()` reference, it cannot be
parsed into a proper StyleValue immediately, so we store it as an
UnresolvedStyleValue until the property is compute. Then, at compute
time, we resolve them by expanding out any `var()` references, and
parsing the result.

The implementation here is very naive, and involves copying the
UnresolvedStyleValue's tree of StyleComponentValueRules while copying
the contents of any `var()`s it finds along the way. This is quite an
expensive operation to do every time that the style is computed.
2021-12-09 21:30:31 +01:00
Sam Atkins
000fb5a70d LibWeb: Add new UnresolvedStyleValue class
This represents a property value that hasn't been converted to a
"proper" StyleValue yet. That is, it's either a custom property's value,
or a value that includes `var()` references, (or both!) since neither of
those can be fully resolved at parse time.
2021-12-09 21:30:31 +01:00
Sam Atkins
d2f9d2fe51 LibWeb: Make StyleBlockRule more accessible to outsiders
For our naive var() implementation, we need to be able to create
StyleBlockRules outside of the Parser, and these changes make that
possible.
2021-12-09 21:30:31 +01:00
Sam Atkins
1d5d27aa22 LibWeb: Include custom properties in CSS dump 2021-12-09 21:30:31 +01:00
Andreas Kling
c268d0fa13 LibWeb: Make CSS::Screen forward its ref count to DOM::Window 2021-12-09 21:28:52 +01:00
Andreas Kling
7fc770cfac LibWeb: Make DOM::NamedNodeMap forward its ref count to DOM::Element
This allows JS to keep an element alive by retaining a reference to
element.attributes
2021-12-09 21:28:52 +01:00
Andreas Kling
d368b08698 LibWeb: Make DOMImplementation forward its ref count to DOM::Document
This allows document.implementation to keep the underlying document
alive for as long as we need it (for example, if someone holds on to a
DOMImplementation JS wrapper after the document is GC'd.)
2021-12-09 21:28:52 +01:00
Andreas Kling
e1287a9a45 LibWeb: Use RefCountForwarder for NavigationTiming::PerformanceTiming
This object already forwarded its ref count to DOM::Window. This patch
simply adopts the new RefCountForwarder base to achieve the same thing.
2021-12-09 21:28:52 +01:00
Andreas Kling
81047d8f9c LibCore: Make LocalServer::take_over_from_system_server() return ErrorOr
This allows us to use TRY() or MUST() when calling it.
2021-12-06 19:22:16 +01:00
Andreas Kling
58b99df16d LibWeb: Make StyleSheet::m_parent_style_sheet a WeakPtr
It's not safe for this to be a raw pointer, as the child can outlive the
parent.
2021-12-06 19:22:16 +01:00
Andreas Kling
e8b85b13e2 LibWeb: Make CSSStyleSheet::m_owner_css_rule a WeakPtr
It's not safe for this to be a raw pointer, as the imported style sheet
can outlive the rule.
2021-12-06 19:22:16 +01:00
Andreas Kling
f47c658275 LibWeb: Make CSSImportRule::m_document a WeakPtr
It's not safe for this to be a raw reference, as CSSImportRule can
outlive the document.
2021-12-06 19:22:16 +01:00
Sam Atkins
7196570f9b LibWeb: Cast unused smart-pointer return values to void 2021-12-05 15:31:03 +01:00
Andreas Kling
108de5dea0 LibWeb: Stop sending "load" event twice to iframes
The "completely finish loading" algorithm (from the HTML spec) is
responsible for sending a "load" event to nested browsing context
containers (iframes).

This patch removes the old mechanism for sending "load" events, which we
had mistakenly kept around, causing two events to be sent instead of
one. :^)
2021-12-04 14:47:24 +01:00
Andreas Kling
58309444d7 LibWeb: Fix DOMImplementation changing content type of wrong document
DOMImplementation.createDocument() should set the content type of the
newly created document, not replace the content type of the
DOMImplementation's own host document.
2021-12-04 14:38:16 +01:00
Andreas Kling
cb9cac4e40 LibIPC+IPCCompiler+AK: Make IPC value decoders return ErrorOr<void>
This allows us to use TRY() in decoding helpers, leading to a nice
reduction in line count.
2021-11-28 23:14:19 +01:00
Sam Atkins
dea4f83037 LibWeb: Use a string instead of an internal Parser class in Supports
Now that we can serialize CSS tokens, we can just hold a string and then
re-parse it when the Supports is evaluated. This feels a little weird,
but it only happens once so it's not going to slow it down much, and it
keep the API cleaner.
2021-11-24 22:57:46 +01:00
Sam Atkins
7d5c626276 LibWeb: Add <general-enclosed> support to Media Queries 2021-11-24 22:57:46 +01:00
Sam Atkins
b03dac99a5 LibWeb: Use MatchResults for MediaQuery evaluation 2021-11-24 22:57:46 +01:00
Sam Atkins
99e18f40fb LibWeb: Use new GeneralEnclosed class in Supports 2021-11-24 22:57:46 +01:00
Sam Atkins
e760263728 LibWeb: Parse CSS <general-enclosed> 2021-11-24 22:57:46 +01:00
Sam Atkins
42176d37fc LibWeb: Implement independent GeneralEnclosed class
This is `<general-enclosed>` in CSS grammar. It represents a section of
a `@media` or `@supports` rule that exists in some future standard that
we don't understand yet, but don't want to make the entire rule invalid.

There's not much that it can usefully do, but we store a string
representation of its contents so that it can be serialized out.
2021-11-24 22:57:46 +01:00
Sam Atkins
b40388584b LibWeb: Make StyleRule to_string() methods output valid CSS
Also removed unused `append_raw()` function.
2021-11-24 22:57:46 +01:00
Sam Atkins
933a271a78 LibWeb: Implement StyleComponentValueRule::to_string() 2021-11-24 22:57:46 +01:00
Sam Atkins
cf07da082e LibWeb: Implement CSS::Token::to_string()
This outputs valid CSS, as opposed to to_debug_string().
2021-11-24 22:57:46 +01:00
Vyacheslav Pukhanov
3f006d81fe LibWeb: Add JSON serialization for nested browsing contexts
This changes allows for nested browser contexts to be embedded in the
serialized JSON of their container element (like `iframe`) and enables
their inspection in the DOM Inspector.
2021-11-24 19:07:48 +01:00
Andreas Kling
5bd3d0cf25 LibWeb: Use the sandboxed image ImageDecoder when loading favicons 2021-11-20 11:25:46 +01:00
Andreas Kling
25a8bd3a8a LibWeb: Use the sandboxed ImageDecoder when creating image documents
An image document is the synthetic DOM::Document we create to wrap an
image when you open the URL of an image directly in a web view.
The path that creates these documents will now also call out to the
separate ImageDecoder process for the actual decoding work.
2021-11-20 10:56:36 +01:00
Andreas Kling
e017fe92e6 LibWeb: Move ImageDecoder client connection singleton to its own file
This will allow us to use it in more places around LibWeb.
2021-11-20 10:56:31 +01:00
Sam Atkins
85e5586a27 LibWeb: Add spec comments to CSS Tokenizer
Some of the code has been slightly rearranged to match the spec order,
but otherwise I've tried not to mess with it.
2021-11-19 22:35:05 +01:00
Sam Atkins
9403cc42f9 LibWeb: Convert CSS Token::m_value from StringBuilder to FlyString
Again, this value does not change once we have finished creating the
Token, so it can be more lightweight.
2021-11-19 22:35:05 +01:00
Sam Atkins
75e7c2c5c0 LibWeb: Convert CSS Token::m_unit from StringBuilder to FlyString
This value doesn't change once it's assigned to the Token, so it can be
more lightweight than a StringBuilder.
2021-11-19 22:35:05 +01:00
Sam Atkins
9286aa77bc LibWeb: Break friendship between CSS Token and Parser :^(
The Parser no longer needs to mess with Token's internals, since we have
getter functions that are safer.
2021-11-19 22:35:05 +01:00
Sam Atkins
d37f62fd54 LibWeb: Verify that the Tokenizer doesn't produce Dimensions from %
If `12.34%` ever produces a Dimension token instead of a Percentage,
then something has gone wrong and we want to know about it!
2021-11-19 22:35:05 +01:00
Sam Atkins
522faa1554 LibWeb: Use number value from CSS Tokens
This lets us get rid of `try_parse_float()`, and simplifies the various
places we were calling it before.
2021-11-19 22:35:05 +01:00
Sam Atkins
1d2276f0e7 LibWeb: Return numeric values from Token value getters
This saves user code from having to parse the numbers, as we already did
that while Tokenizing. :^)

As a bonus, we now round extremely large integers to the closest
available value, like the spec tells us to.
2021-11-19 22:35:05 +01:00
Sam Atkins
f6869797a7 LibWeb: Convert numeric tokens to numbers in CSS Tokenizer
The spec wants us to produce numeric values as the Tokenizer sees them,
rather than waiting until the parse stage. This is a first step towards
that.
2021-11-19 22:35:05 +01:00
TheFightingCatfish
57541f433b LibWeb+LibHTTP: Support multiple Set-Cookie response headers 2021-11-19 13:54:35 +03:30
Andreas Kling
7c57961c61 LibWeb: Move BrowsingContext into HTML/
Browsing contexts are defined by the HTML specification, so let's move
them into the HTML directory. :^)
2021-11-18 21:11:30 +01:00
Sam Atkins
d106f20a73 LibWeb: Delete CSSLoader
All CSS loading is now done by the relevant classes:
- CSSImportRule, which loads its linked stylesheet
- HTMLStyleElement, which "loads" its contents
- HTMLLinkElement, which loads its linked stylesheet
2021-11-18 21:11:19 +01:00
Sam Atkins
60867703c0 LibWeb: Make HTMLLinkElement responsible for its own loading
This is the last use of CSSLoader, which can now be deleted.
2021-11-18 21:11:19 +01:00
Sam Atkins
6fc1810190 LibWeb: Remove for_first_not_loaded_import_rule() :^)
This was only used for making sure `@import` rules got loaded, and since
they handle that themselves now, we can get rid of all this code!
2021-11-18 21:11:19 +01:00
Sam Atkins
9d72815deb LibWeb: Remove redundant @import-handling code from CSSLoader
Now that `@import` rules load themselves, we don't want to also load
them here.
2021-11-18 21:11:19 +01:00
Sam Atkins
738e682ae0 LibWeb: Make @import rules functional again :^)
The changes in commit d462a6720a meant
that `CSSLoader::load_next_import_if_needed()` was no longer being
called, so no `@import` rules were loading.

The spec does not seem to mention when that loading should take place,
but WebKit does this at parse time, as each rule is added to the style
sheet. If it works for them, it's probably not that bad. :^)

So, that's what we now do here. The `CSSImportRule` creates a fetch
request when it is constructed, so each one is responsible for its own
contents.
2021-11-18 21:11:19 +01:00
Sam Atkins
92708746c8 LibWeb: Implement background-repeat: round :^) 2021-11-17 22:20:01 +01:00
Sam Atkins
493435c655 LibWeb: Implement background-repeat: space 2021-11-17 22:20:01 +01:00
Sam Atkins
3d1ee5b2de LibWeb: Implement background-size :^)
This is including the `cover` and `contain` modes.
2021-11-17 22:20:01 +01:00
Sam Atkins
80642b4f9d LibWeb: Implement background-position and background-origin :^) 2021-11-17 22:20:01 +01:00
Sam Atkins
16d9ae0f88 LibWeb: Stop consuming too many tokens when parsing background-position
This was causing inputs like `0% 0%` to think only one value was
provided.
2021-11-17 22:20:01 +01:00