1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 04:58:13 +00:00
Commit graph

2691 commits

Author SHA1 Message Date
Andreas Kling
fc8c4ea23f LibWeb: Let BFC compute width for block-level replaced elements
We never really hit this code path before, but now that IMG elements can
be block-level, we need to get them hooked up with box model metrics.
2022-04-11 01:04:09 +02:00
Andreas Kling
edfa4508a5 LibWeb: Create a no-op formatting context for childless replaced boxes
This is a hack that allows block-level replaced elements to be flex
items. Flexbox layout currently assumes (in many places) that it's
always possible to create an independent formatting context for each of
its items.
2022-04-11 01:03:47 +02:00
Andreas Kling
b1a6a8600a LibWeb: Honor "display:block" on IMG elements
Previously we forced all image elements to be inline-level. Now they can
participate in block layout if they prefer. :^)
2022-04-11 01:03:47 +02:00
Andreas Kling
ca2807ba42 AK: Honor box's own intrinsic size in calculate_intrinsic_sizes()
If a layout box claims to have both intrinsic width and height, we can
simply return those instead of performing any kind of layout.
2022-04-11 00:11:53 +02:00
Andreas Kling
07a3002d39 LibWeb: Bring Element.client{Left,Top} closer to spec
These are supposed to return values based on the computed border size
of the element. Not the X/Y position values of the principal box.
2022-04-10 21:35:55 +02:00
Andreas Kling
e81594d9a1 LibWeb: Sketch out a very basic SVG <clipPath> element
This element doesn't actually support anything at the moment, but it
still massively speeds up painting performance on Wikipedia! :^)

How? Because we no longer paint SVG <path> elements found inside
<clipPath> elements. SVGClipPathElement::create_layout_node() returns
nullptr which stops the layout tree builder from recursing further into
the subtree, and so the <path> element never gets a layout or paint box.

Mousing over Wikipedia now barely break 50% CPU usage on my machine :^)
2022-04-10 21:35:55 +02:00
Andreas Kling
25f6d2e2ab LibWeb: Update layout in Element.getBoundingClientRect() 2022-04-10 20:44:29 +02:00
Andreas Kling
60ec006265 LibWeb: Update layout in HTMLElement.offset{Width,Height}
If we don't do this, we may be returning stale values.
2022-04-10 20:38:16 +02:00
Andreas Kling
bb17f74fb1 LibWeb: Bring Element.client{Width,Height} closer to spec
There were two main issues with these functions:

1. They were not updating layout before inspecting metrics.
2. They were not returning viewport metrics for the root and body
   elements when appropriate.
2022-04-10 20:30:19 +02:00
Andreas Kling
b5faeb7840 LibWeb: Resolve SVG "scaled viewport size" without triggering layout
Percentage stroke widths are resolved against the scaled viewport size
which we were retrieving by calling client_width() and client_height()
on the element. Now that those accessors may trigger layout, this means
that we can't use them from the stroke_width() getter, which is itself
used *from within* layout.
2022-04-10 20:18:38 +02:00
Andreas Kling
5e35167e05 LibWeb: Don't mark non-painted images as being inside the viewport 2022-04-10 20:16:09 +02:00
Andreas Kling
20c65e4298 LibWeb: Don't include children of overflow:hidden in scrollable overflow
This fixes an issue where Google Maps was getting page scrollbars
when it shouldn't have.
2022-04-10 20:02:53 +02:00
Luke Wilde
89c4e011e4 LibWeb: Stub CanvasRenderingContext2D.clip
This is primarily required by Google Maps Street View, but the map view
works without this.
2022-04-10 19:59:14 +02:00
Luke Wilde
27cc8742ce LibWeb: Implement CanvasRenderingContext2D.resetTransform 2022-04-10 19:59:14 +02:00
Luke Wilde
329e740c85 LibWeb: Implement CanvasRenderingContext2D.setTransform 2022-04-10 19:59:14 +02:00
Luke Wilde
df7a83ac0e LibWeb: Implement CanvasRenderingContext2D.transform 2022-04-10 19:59:14 +02:00
Andreas Kling
751b605690 LibWeb: Cache scaled web fonts instead of recreating them every time
Previously, we would create a new Gfx::ScaledFont whenever we needed one
for an element's computed style. This worked fine on Acid3 since the use
of web fonts was extremely limited.

In the wild, web fonts obviously get used a lot more, so let's have a
per-point-size font cache for them.
2022-04-10 12:40:07 +02:00
Anthony Van de Gejuchte
69ca27d3d7 LibWeb: Show correct favicon when default favicon is loaded
Block the replacement of the favicon by the default favicon loader
when a favicon that is loaded through a link tag is already active.

This way, the favicon in the link tags will be prioritized against
the default favicons from `/favicon.ico` or the seranity default icon.
2022-04-10 12:10:59 +02:00
Anthony Van de Gejuchte
06d9853a8b LibWeb: Update displayed favicon when a favicon is loaded
When a favicon has been loaded, trigger a favicon update on
document level. Of all the link tags in the header, the last
favicon that is load should be shown.

When the favicon could not be loaded, load the next icon in reverse tree
order.
2022-04-10 12:10:59 +02:00
Anthony Van de Gejuchte
13847aa7e8 LibWeb: Add icon as possible resource type on the link tag 2022-04-10 12:10:59 +02:00
Andreas Kling
9ed5a14af2 LibWeb: Remove unused ResourceLoader::load_sync()
There are no remaining users of this API, everyone has been migrated
to asynchronous resource loading.
2022-04-10 01:37:45 +02:00
Andreas Kling
3724ce765e AK+LibWeb: Encode ' ' as '+' in application/x-www-form-urlencoded
This matches what the URL and HTML specifications ask us to do.
2022-04-10 01:37:45 +02:00
Simon Wanner
b19e134999 LibWeb: Invalidate layout after the computed font changes
If the font resource finishes loading we need to make sure the element
using it gets a chance to re-layout, even if the font-family property
didn't change.
2022-04-09 23:48:18 +02:00
Simon Wanner
539adf5b9c LibWeb: Support WOFF in font-face 2022-04-09 23:48:18 +02:00
Simon Wanner
f386b0d43c LibWeb: Migrate SC::FontLoader from TTF::Font to Gfx::VectorFont 2022-04-09 23:48:18 +02:00
Simon Wanner
5136c5ae1a LibGfx: Move ScaledFont and new base class VectorFont out of TTF 2022-04-09 23:48:18 +02:00
Simon Wanner
206d6ece55 LibGfx: Move other font-related files to LibGfx/Font/ 2022-04-09 23:48:18 +02:00
Simon Wanner
6f8fd91f22 LibGfx: Move TTF files from TrueTypeFont/ to Font/TrueType/ 2022-04-09 23:48:18 +02:00
Igor Pissolati
7f45a9e9c1 LibWeb: Add "which" attribute to UIEvent
This is non-standard but is supported by all major browsers.
2022-04-09 18:27:24 +02:00
Igor Pissolati
1b94b4c593 LibWeb: Bring MouseEvent a bit closer to spec 2022-04-09 18:27:24 +02:00
Igor Pissolati
a2bc97a9c2 LibWeb: Skip anchor activation behavior if the click event was cancelled 2022-04-09 18:27:24 +02:00
Andreas Kling
cc77c82383 LibWeb: Follow relaxed CSS clamping rules in flexbox layout
AFAICT, css-values-4 tells us that clamping numbers to a range where
min>max is okay. That means we can't use AK::clamp() since it will
VERIFY that max>=min.

This patch adds a css_clamp() helper (locally in FFC for now).

This fixes an issue where a bunch of sites were crashing due to the
VERIFY in AK::clamp().
2022-04-09 14:50:05 +02:00
Andreas Kling
f21eb90294 LibWeb: Remove debug spam about proxy configuration lookups 2022-04-09 14:50:05 +02:00
Ali Mohammad Pur
a42e03b01a Browser+LibWeb+WebContent: Implement per-URL-pattern proxies
...at least for SOCKS5.
2022-04-09 12:21:43 +02:00
Andreas Kling
45db35ad04 LibWeb: Fix double-sized box model metrics on inline replaced elements
We were mistakenly treating inline replaced elements as if they are the
start of a regular display:inline element. This meant that we collected
the horizontal start and end metrics from the box model, and then added
those to the inline-level item produced by InlineLevelIterator.

This effectively meant that <img>, <svg> and other replaced elements got
double-sized values for margin/border/padding on the left and right
sides. (Which manifested as a mysterious margin around the element.)
2022-04-08 23:12:04 +02:00
Andreas Kling
6e70670e0b LibWeb: Load fonts from style sheet once when sheet is added
Previously, we were running the "load fonts if needed" machine at the
start of every style computation. That was a lot of unnecessary work,
especially on sites with lots of style rules, since we had to traverse
every style sheet to see if any @font-face rules needed loading.

With this patch, we now load fonts once per sheet, right after adding
it to a document's style sheet list.
2022-04-08 21:27:35 +02:00
Andreas Kling
5b72a9cb11 LibWeb: Use paint tree traversal helpers in StackingContext 2022-04-08 20:58:42 +02:00
Andreas Kling
dcbb83a33e LibWeb: Add some basic paint tree traversal helpers
Give the Paintable class some basic helpers for traversing the paint
tree. Note that they actually piggy-back on the layout tree for links
between nodes.
2022-04-08 20:58:42 +02:00
Simon Wanner
a2d89f11d1 LibWeb: Use the correct painter for painting stacking contexts
When cloning the PaintContext we should be using the painter backed by
the bitmap created for this stacking context layer.

Fixes: 54c3053bc3 ("LibWeb: Preserve paint state when painting...")
2022-04-08 20:44:23 +02:00
Simon Wanner
a57bfc2f8c LibWeb: Take already computed height for flex container's auto height
Similar to BlockFormattingContext, FlexFormatting context already
handles height:auto sizing correctly and sets the content_height
correspondingly.
2022-04-08 20:44:23 +02:00
Oliver Wales
382eacc08e LibWeb: Select correct context menu when right clicking image 2022-04-08 07:59:01 -04:00
Sam Atkins
12b8570ce3 LibWeb: Understand the format() part of a @font-face's src
This is used to skip downloading fonts in formats that we don't support.
Currently we only support TTF as far as I am aware.

The parts of a `src` are in a fixed order, unusually, which makes the
parsing more nesty instead of loopy.
2022-04-07 21:20:14 +02:00
Sam Atkins
dbb0b68175 LibWeb: Disallow global CSS keywords in @font-face font-family 2022-04-07 21:20:14 +02:00
Sam Atkins
dbbd6d3508 LibWeb: Parse @font-face unicode-range descriptor 2022-04-07 21:20:14 +02:00
Sam Atkins
ef7d80ced2 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 21:20:14 +02:00
Sam Atkins
1f7bf46061 LibWeb: Add CSS::UnicodeRange class
This corresponds to `<urange>` in CSS grammar.
2022-04-07 21:20:14 +02:00
Sam Atkins
802ccc210f LibWeb: Expose Declaration's internals with getters
This is more in line with our style of not accessing `m_foo` fields
directly.
2022-04-07 21:20:14 +02:00
Sam Atkins
611a209756 LibWeb: Rename StyleDeclarationRule -> Declaration
This is the term used in the CSS specs.
2022-04-07 21:20:14 +02:00
Sam Atkins
8b538b1578 LibWeb: Rename StyleComponentValueRule -> ComponentValue
"Component value" is the term used in the spec, and it doesn't conflict
 with any other types, so let's use the shorter name. :^)

Also, this doesn't need to be friends with the Parser any more.
2022-04-07 21:20:14 +02:00
Andreas Kling
36d9943d3a LibWeb: Fix logic mistake in CRC2D's default_source_size()
If the source has a bitmap, we should indeed use the bitmap's size
instead of always using the source's own size.
2022-04-07 17:06:02 +02:00