This PR removes the CRLF characters from the message body data before
passing it to `decode_base64()` so that we can properly display the
message contents.
The :host family of pseudo class selectors select the shadow host
element when matching against a rule from within the element's shadow
tree.
This is a bit convoluted due to the fact that the document-level
StyleComputer keeps track of *all* style rules, and not just the
document-level ones.
In the future, we should refactor style storage so that shadow roots
have their own style scope, and we can simplify a lot of this.
(cherry picked from commit 4c326fc5f6f64797764e7f32a9789b74665f2fec)
This fixes an issue where :host(foo) would parse as if "foo" was the
on the right side of a descendant combinator.
Not testable yet, but will be in the next commit.
(cherry picked from commit 274c46a3c97e1f9969d18b7704ced4c39770e152)
This PR fixes truncation of quoted strings containing escaped quotes,
which were not being handled properly by the parser, resulting in
occasional crashes.
This is the expected behavior per the HTML spec. Fixes an issue where
styling these elements wouldn't have the expected effect unless you also
set the display property.
(cherry picked from commit 3faff34bf6a290e4df1c73f92e8c7d992a78a8e0)
This way, we still perform UTF-8 validation, but don't go through the
slow generic code path that rebuilds the decoded string one code point
at a time.
This was a bottleneck when loading a canned copy of reddit.com, which
ended up being ~120 MiB large.
- Time spent decoding UTF-8 before this change: 1192 ms
- Time spent decoding UTF-8 after this change: 154 ms
That's still a long time, but 7.7x faster is nothing to sneeze at! :^)
Note that if the input fails UTF-8 validation, we still fall back to
the slow path and insert replacement characters per the WHATWG Encoding
spec: https://encoding.spec.whatwg.org/#utf-8-decode
(cherry picked from commit 1a46d8df5fc81eb2c320d5c8a5597285d3d8fb3a)
In `PaintableBox::set_scroll_offset()` the scrollport size was measured
by `content_size()` instead of `absolute_padding_box_rect()`.
Fixes#788
(cherry picked from commit 54066ec5a454f33d8c5e4ea1f8695942b95b1b82)
...except for images that already use a color indexing transform
or are constant-alpha grayscale.
This makes some images larger, but it's on average better than
not doing it: When compressing all images in:
* Base/res/wallpapers
* qoi_benchmark_suite/screenshot_web
* qoi_benchmark_suite/textures_photo
...this reduces the combined output size from 105M to 88M (16%).
See PR for details on reproducing this.
(Runtime for compressing all images increases from a little under
4.4s to a little over 4.4s, so no big per cost either.)
For the images in those directories, it's even always a win.
The size of qoi_benchmark_suite/textures_pk01/pk01_floor01_local.png
increases from 366K to 375K (2.5%), so it's not _always_ a win.
Total size of qoi_benchmark_suite/textures_pk01 increases by 0.6%,
small enough that `du -sh` output is identical for that directory.
sunset_retro.png (876K):
1.4M -> 1.2M, 31.3 ms ± 0.7 ms -> 31.4 ms ± 0.8 ms
From 60% larger than the input file to 37% larger (13.3% smaller),
for a less-than-1% slowdown.
(The size of my two test gifs doesn't change, since those use the
color indexing transform.)
We used to write a color indexing transform for grayscale images.
This stores a palette and then indexes into that palette.
For grayscale images with constant alpha, we don't need to store
the palette image: Using a subtract green transform has the same effect.
(For animations, most frames don't have constant alpha because
AnimationWriter replaces identical pixels with transparent black,
making sure that these frames have a mix of opaque and transparent
pixels. But the first frame of a grayscale animation will use this.)
Only saves a couple of bytes for storing the palette image,
but it's also free in term of performance, and it's conceptually
pleasing.
Reduces the size of 7z7c.webp by 30 bytes, from 8818 to 8788 bytes.
This PR fixes a crash where the parser assumes parenthesized lists of
address structures should be separated by whitespace. Per RFC-9051,
there is no indication of this.
This PR avoids crashing the parser when a group address is encountered,
and keeps the Mail reader happy :^).
Eventually, when we are able to send messages, we may want some kind of
GroupAddress object, but for now this should be ok.
Having resolution of all properties for all paintable types in a single
function was hard to iterate on, so this change separates it into
smaller functions per paintable type.
(cherry picked from commit 7047fcf761ba3cac775befca78e7e6f758dc7c8b)
The Response interface of the Fetch API can now parse form urlencoded
bodies when Content-Type is set to 'application/x-www-form-urlencoded'.
(cherry picked from commit b8fa572c6742c0f1f63da0f63c8b86835a86988d)
This getter returns the concatenation of the data of the contiguous
Text nodes of `this` (being this plus its siblings) in tree order.
(cherry picked from commit 69da6a0ce400d4a675bfba1f1dd1d313ee1f13c0)
This to avoid clashing with the GCC typeof extension, which apparently
confuses clang-format.
(cherry picked from commit 14beda00c9e823dd34da74e7d8fdf46aa57e845c)
The typeof operator has a very small set of possible resulting strings,
so let's make it much faster by caching those strings on the VM.
~8x speed-up on this microbenchmark:
for (let i = 0; i < 10_000_000; ++i) {
typeof i;
}
(cherry picked from commit d0b11af3876a64e6b254b5fc3f474d9bbe552024)
Previously, if a document had any element with a name attribute that
was set to the empty string, then `document.getElementsByName("")` and
`element.getElementsByName("")` would return a collection including
those elements.
(cherry picked from commit e40352b6b59e99a9f3fd922142c2abafd9840e6c)
Previously, `document.getElementsByClassName("")` would return a
collection containing all elements in the given document.
(cherry picked from commit 0fceede029e6af0cab98e86f20367d8835008472)
Previously, we had two implementations of the same function in
`Document` and `Element`, which had inadvertantly diverged.
(cherry picked from commit faf64bfb41393a59e958e21545aa556c9bb9d6a8)
Previously, if a document had an element whose id was the empty string,
then `document.getElementById("")` and `element.getElementById("")`
would return that element.
(cherry picked from commit f666d967d6bac289346cf19f833f81bdc22adbdb)
Before this change, removing a style element from inside a shadow tree
would cause it to be unregistered with the document-level list of sheets
instead of the shadow-root-level list.
This would eventually lead to a verification failure if someone tried to
update the text contents of that style element, since it was still in
the shadow-root-level list, but now with a null owner element.
Fixes a crash on https://www.swedbank.se/
(cherry picked from commit 3b7534b3628641244b0998fd5061c6fa75a61cf5)
This would have saved me an hour of debugging, so putting it here for
the next person. :^)
(cherry picked from commit ebacb921dac6f8fd335d917100e6b04521a3f893)
This avoids a crash that occurred when calling `getBBox()` on an SVG
element that had a transform with no inverse.
Found by Domato.
(cherry picked from commit d417b7568360f20487e4182e52872b82c8fbbf60)
Previously, `SVGSVGBox` would have a natural aspect ratio of 0 if it
had a viewbox with zero width. This led to a division by zero, causing
a crash.
Found by Domato.
(cherry picked from commit 4cdafea36334bcff8c4bbb083076ae55b599177c)
Previously calling `PaintableBox::set_scroll_offset()` with a
PaintableBox whose content size was larger than its scrollble overflow
rect would cause a crash.
Found by Domato.
(cherry picked from commit 604f6040a180ac409cf338045c8709a171d920d5)
GCC 14 emits a warning when an always succeeding `dynamic_cast`'s return
value is compared to NULL inside the `AK::is<T>(U)` template when `T` ==
`U`.
While warning on tautological `is` calls seems useful, it's a bit
awkward when it comes from a function template where the cast may fail
in some instantiation. There is a GCC bug open for it:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115664
Work around the warning by performing the algorithm on the base type
(`EventTarget`), with a wrapper that casts it to the more specialized
input type.
(cherry picked from commit 31eb0ed938dff11dee7391a4f616f4132aa250c0)
Previously, you'd see one frame of the sleeping animation, and then it
would stop. This was because Frame2 = 0x1 and Frame1 = 0x0, so once the
Frame2 bit was set, or-ing with Frame1 would not unset it. Since the
current frame was already tracked separately to the state, we can avoid
setting it in the state, and instead only use it when we fetch the
bitmap, preventing this issue.
This method accepts a namespace URI as an argument and returns true if
the given URI is the default namespace on the given node, false
otherwise.
(cherry picked from commit 055c902a375bb34b8c0e31f015c2815fe935c6a9)
This method takes a prefix and returns the namespace URI associated
with it on the given node, or null if no namespace is found.
(cherry picked from commit 27d429a85f359b9c87bf9807e4dea33f7092308a)
This change implements the download, ping, rel, hreflang, and type
attributes using the [Reflect] annotation in the IDL file.
(cherry picked from commit 7562f89d4e2b0dd22430962e102a2195186f8458)
Add fetch group concept from the '2.4. Fetch groups' in
the fetch specs to the environment settings object.
(cherry picked from commit 9e223f6daeb3969d3997084a973b26daff6b4f7e)
Previously, `Node::is_equal_node()` would return true for nodes in
different namespaces that were otherwise equal.
(cherry picked from commit 7ab7be694d1232f4cdc108a2adc88812fc0a9ca9)
This matches the behavior of other browsers. Previously, a click event
was used, so the value was only updated when the mouse was released.
(cherry picked from commit b4b947c60797328d930c8d3de466b8ef292d0ed4)
An input event is now fired when the step up or step down button of an
input element of type number is clicked.
This ensures that any associated <output> element is updated when these
buttons are clicked.
(cherry picked from commit 2a980816e756d727261d53450b4b3f48069d5d50)
Input elements without a defined user-interaction behavior need to fire
an input event when the user changes the element's value in some way.
This change moves the code to do this into its own function and adds
some spec text to explain what is being done.
(cherry picked from commit a3d12e569c88d0dae530657e5bddc18699fb9c9b)
The spec allows setting a constructor on non built-in Iterator objects.
This is a normative change in the Iterator Helpers proposal. See:
https://github.com/tc39/proposal-iterator-helpers/commit/30b3501
(cherry picked from commit fb228a3d850eb5e4b06550823755719a377b41e6)
The spec allows setting the prototype on non built-in Iterator objects.
This is a normative change in the Iterator Helpers proposal. See:
https://github.com/tc39/proposal-iterator-helpers/commit/30b3501
(cherry picked from commit 734e37442db4419b58228e25702bfe176e52f5e3)
The EntryType has three possible values: Fetching, Failed or
ModuleScript. It is possible that we transition from Fetching to Failed
as in #13.1. Change the assertion to include the failed scenario.
Fixes: https://github.com/LadybirdBrowser/ladybird/issues/661
(cherry picked from commit 319bb6353e0ba64fc5e54b32ddb2b38736cedef9)
This fixes some bugs on wpt.dom/events/Event-init-while-dispatching.html,
although the test still fails due to [GH-23722].
[GH-23722]: https://github.com/SerenityOS/serenity/issues/23722
(cherry picked from commit aefab1de38948b0d86a6aed33647e995340859e2)
- Change min track sizing function to be "auto" when flex size is
specified.
- Never check if min track sizing funciton is flexible, because only
max is allowed to be flexible.
- Address FIXME in automatic_minimum_size to avoid regressions after
making two fixes mentioned above.
(cherry picked from commit 3270df476dd46b140e1b9de1e8328647744b56ab)
Areas are disassembled into boundary lines on `build_grid_areas()` step,
so we can always use them to find grid item's position during placement.
This way we support both ways to define area: `grid-template-areas` and
implicitly using `-start` and `-end` boundary line names.
(cherry picked from commit 7a1f3f7ae3af2744e2f99df29baf09153d631b24)
We're expected to handle this situation gracefully, and certainly not
by falling apart like we were.
Found by Domato.
(cherry picked from commit 33207174a9c1c87657e2ae0875cc85cbf41075f8)
If the anchor and focus nodes are not within the same document, we can't
use them for a selection range.
Found by Domato.
(cherry picked from commit 416c4788763baa778465d1d004080d322462c0bf)
Instead of allowing arbitrarily large values (which could eventually
overflow an i32), let's just cap them at the same limit as Firefox does.
Found by Domato.
(cherry picked from commit 4e0edd42b95abf8ad707c64414dbe618313ce89e)
We were incorrectly assuming that setAttribute() could never fail here,
even when passed an invalid name.
Found by Domato.
(cherry picked from commit 093f1dd805f699801079f55d0d490d80b463ccbb)
We already have a FlyString of its value from parsing, and most users
also want a FlyString from it, so let's use that instead of converting
backwards and forwards.
The two users that did want a String are:
- Quotes, which make sense as FlyString instead, so I've converted that.
- Animation names, which should probably be FlyString too, but the code
currently also allows for other kinds of StyleValue, and I don't want
to dive into this right now to figure out if that's needed or not.
(cherry picked from commit 9fb44cb05777c6d7a8a1950258edadfcee6d4e09)
This does not appear to be correct; the `grid-area` property's value is
quite complicated, and not just a string.
(cherry picked from commit d2f04b9f0415ebfebb1d8f6386ff13f8df053674)
This PR adds basic support for loading iCalendar (.ics) files and
parsing VEVENT properties that are currently supported by Calendar
Events: summary, start and end.
The JS::Error types all store their exception messages as a String. So
by using ByteString, we hit the StringView constructor, and end up
allocating the same string twice.
(cherry picked from commit c3f8202d0ca7761caaabf0af5f413dc25337801f)
We had a const and non-const version of this function, with slightly
different behavior (oops!)
This patch consolidates the implementations and keeps only the correct
behavior in there.
Fixes an issue where comments were not collapsible on Hacker News.
(cherry picked from commit 98f88d49de852e1e524655accb39724f1134a23f)
These were being immediately stored in JS::GCPtrs (and dutifully visited
by HTMLParser), so creating temporary handles for them was a complete
waste of time.
(cherry picked from commit f9f11dc51d50746ccb1a82cd304fe30901edc347)
When loading a canned version of reddit.com, we end up parsing many many
shadow tree style sheets of roughly ~170 KiB text each.
None of them have '\r' or '\f', yet we spend 2-3 ms for each sheet just
looping over and reconstructing the text to see if we need to normalize
any newlines.
This patch makes the common case faster in two ways:
- We use TextCodec::Decoder::to_utf8() instead of process()
This way, we do a one-shot fast validation and conversion to UTF-8,
instead of using the generic code-point-at-a-time callback API.
- We scan for '\r' and '\f' before filtering, and if neither is present,
we simply use the unfiltered string.
With these changes, we now spend 0 ms in the filtering function for the
vast majority of style sheets I've seen so far.
(cherry picked from commit dba6216caa71796f25831908035cd9eb0fb54715)
When appending a single Unicode code point, we don't have to go through
the trouble of creating a Utf32View wrapper over it.
(cherry picked from commit 7892ee355df95f6414ab5334d8d997c2c0356a45)
Implement for CreatePerIterationEnvironment for 'for' loops per the Ecma
Standard. This ensures each iteration of a 'for' loop has its own
lexical environment so that variables declared in the loop are scoped to
the current iteration.
(cherry picked from commit dbc2f7ed48f00234f5f94a30b06b83842d9cf4dd)
When traversing the layout tree to find an appropriate box child to
derive the baseline from. Only the child's margin and offset was being
applied. Now we sum each offset on the recursive call.
(cherry picked from commit 3c897e7cf3594f02f559599e1bf28747c9edba13)
The LibELF validate_program_headers method tried to do too many things
at once, and as a result, we had an awkward return type from it.
To be able to simplify it, we no longer allow passing a StringBuilder*
but instead we require to pass an Optional<Elf_Phdr> by reference so
it could be filled with actual ELF program header that corresponds to
an INTERP header if such found.
As a result, we ensure that only certain implementations that actually
care about the ELF interpreter path will actually try to load it on
their own and if they fail, they can have better diagnostics for an
invalid INTERP header.
This change also fixes a bug that on which we failed to execute an ELF
program if the INTERP header is located outside the first 4KiB page of
the ELF file, as the kernel previously didn't have support for looking
beyond that for that header.
Together with a first JSON file for bringing up a fully functional
BuggieBox container, we allow users to take advantage of the kernel
unsharing features that were introduced in earlier commits.
This new syscall will be used by the upcoming runc (run-container)
utility.
In addition to that, this syscall allows userspace to neatly copy RAMFS
instances to other places, which was not possible in the past.
These programs are capable of running other programs, so we should
restrict them from potentially running SUID programs, which was never a
functionality we supported for those programs anyway.
The whole concept of Jails was far more complicated than I actually want
it to be, so let's reduce the complexity of how it works from now on.
Please note that we always leaked the attach count of a Jail object in
the fork syscall if it failed midway.
Instead, we should have attach to the jail just before registering the
new Process, so we don't need to worry about unsuccessful Process
creation.
The reduction of complexity in regard to jails means that instead of
relying on jails to provide PID isolation, we could simplify the whole
idea of them to be a simple SetOnce, and let the ProcessList (now called
ScopedProcessList) to be responsible for this type of isolation.
Therefore, we apply the following changes to do so:
- We make the Jail concept no longer a class of its own. Instead, we
simplify the idea of being jailed to a simple ProtectedValues boolean
flag. This means that we no longer check of matching jail pointers
anywhere in the Kernel code.
To set a process as jailed, a new prctl option was added to set a
Kernel SetOnce boolean flag (so it cannot change ever again).
- We provide Process & Thread methods to iterate over process lists.
A process can either iterate on the global process list, or if it's
attached to a scoped process list, then only over that list.
This essentially replaces the need of checking the Jail pointer of a
process when iterating over process lists.
Expose some initial interfaces in the mount-related syscalls to select
the desired VFSRootContext, by specifying the VFSRootContext index
number.
For now there's still no way to create a different VFSRootContext, so
the only valid IDs are -1 (for currently attached VFSRootContext) or 1
for the first userspace VFSRootContext.
Negative numbers now display correctly in SpinBox.
Previously, they displayed as the negative sign only (no number).
Now the user can also type negative numbers into the SpinBox.
These were accidentally no longer set after
2c396b5378fec5f4470e1e1e950806dff8005f08
(cherry picked from commit f20010c1d3a66aaabd5da5a96c578ad013756f99)
Previously we relied on signed overflow, this commit makes the same
behaviour explicit (avoiding UB in the process).
(cherry picked from commit 8c8310f0bddc874a9f7f07c4158f0abc799357d4)
With this we pass an additional ~2100 tests.
We are left with 7106 WASM fails :).
There's still some test cases in the iNxM tests that fail with
this PR, but they are somewhat weird.
(cherry picked from commit b4acd4fb0b7f4105c7ef673ccc00904114c3c468)
Co-authored-by: Diego Frias <styx5242@gmail.com>
Previously the validator put a `v128` on the stack, which is not what
the spec defines.
(cherry picked from commit 0d38572d8bd2a276be1b6066b62efd376ddbd4d6)
After a `memory.grow`, the type of the memory instance should be
updated so potential memory imports on the boundary are unlinkable.
(cherry picked from commit cdb6e834a1c0eaa6e62a9018026a599916332ab3)
Single-type blocktypes previously gave loop labels an arity of 1, even
though they're shorthand for `[] -> [T]`.
(cherry picked from commit ad6a80144c23f9ccdeeccb123a9de85396524040)
Since be2bf05 the ThreadEventQueue is now destroyed via a phread key
destructor, which leads to many other objects being destroyed. A bunch
of these destructors reference globals, but exit() calls destructors
on globals before phread destructors, this bad state leads to the hangs
seen in #24694.
Fixes#24694
When the min option is given the read will only be fulfilled when there
are min or more elements available in the readable byte stream.
When the min option is not given the default value for min is 1.
(cherry picked from commit 907dc84c1e8c3c236ade581f46dabdb144915c1d)
Lossless WebP allows having a 1-bit to 11-bit addressed
"color cache", where pixels are inserted into a content-addressed
cache of size `1 << color_cache_bits`. Pixels in the color
cache can be addressed using their index. This can be used
to refer to literal pixels using a single color_cache_bits
large symbol, instead of up to 4 symbols for GBRA.
We default to always using a color cache with 6 bits, unless
the input image already uses only a single channel already
(either as-is, or if we write a color indexing transform).
Due to this change, the size of the first prefix group
changes from being known at compile time (256 + 24)
to being known at runtime (256 + 24 + color_cache_size).
Change a few Array<>s to Vector<>s to make this work.
sunset_retro.png (876K):
1.6M -> 1.4M, 29.1 ms ± 0.9 ms -> 31.7 ms ± 0.9 ms
From 83% larger than the input file to 60% larger (12.5% smaller),
for a 9% slowdown.
The two gifs I usually test with don't change: Files using the
color _index_ transform (i.e. that have < 256 colors) don't
use the color _cache_ in our encoder.
This property is now correctly parsed.
Ladybird always uses overlay scrollbars so this property does nothing.
(cherry picked from commit 662317726549cd2dde4c7902b99f0b83397a3396)
The spec doesn't explicitly forbid calling this when the document
doesn't have a node navigable, so let's handle that situation gracefully
by just returning an empty list of ancestors.
I hit this VERIFY somewhere on the web, but I don't know how to
reproduce it.
Previously, the presence of surrounding whitespace would give file paths
the `https` schema instead of the `file` schema, making navigation
unsuccessful.
(cherry picked from commit ff7ca5c48c316e07b1bf631b2d7ed14c358dfa42)
This fixes many tests on
wpt/html/webappapis/scripting/events/event-handler-all-global-events.html
(cherry picked from commit 59f74b909ba161a143fb4cd5cbaf6dcf6734d240)
This fixes wpt/html/webappapis/scripting/events/messageevent-constructor.https.html
(cherry picked from commit ffb3a28684b1b4c028af93aa6d7d9194f002d503)
This allows selection to work within shadow roots and prevents the
selection being cleared if the mouse moves outside of the current
document or shadow root.
(cherry picked from commit e5d1261640a71a672c5cd19910f5f6288e65ed04)