summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb
AgeCommit message (Collapse)Author
2022-07-12LibWeb: Use fit-content size for flex items with indefinite cross sizeAndreas Kling
2022-07-12LibWeb: Stub out two functions on SVGGeometryElementAndreas Kling
These two were called by Discord while loading: - float getTotalLength(); - DOMPoint getPointAtLength(float distance);
2022-07-12LibWeb: Add barebones implementation of DOMPoint and DOMPointReadOnlyAndreas Kling
2022-07-12Everywhere: Replace single-char StringView op. arguments with charssin-ack
This prevents us from needing a sv suffix, and potentially reduces the need to run generic code for a single character (as contains, starts_with, ends_with etc. for a char will be just a length and equality check). No functional changes.
2022-07-12Everywhere: Add sv suffix to strings relying on StringView(char const*)sin-ack
Each of these strings would previously rely on StringView's char const* constructor overload, which would call __builtin_strlen on the string. Since we now have operator ""sv, we can replace these with much simpler versions. This opens the door to being able to remove StringView(char const*). No functional changes.
2022-07-12Everywhere: Explicitly specify the size in StringView constructorssin-ack
This commit moves the length calculations out to be directly on the StringView users. This is an important step towards the goal of removing StringView(char const*), as it moves the responsibility of calculating the size of the string to the user of the StringView (which will prevent naive uses causing OOB access).
2022-07-12LibWeb: Add missing break to avoid fallthrough in FlexFormattingContextIdan Horowitz
This silences a Clang warning.
2022-07-12LibWeb: Remove unused variable in FlexFormattingContextIdan Horowitz
2022-07-12LibWeb: Express flex item cross axis alignment as offsets-from-centerAndreas Kling
This allows us to perform cross axis alignment without knowing the final cross size of the flex container.
2022-07-12LibWeb: Actually clamp flex line cross size to min/max-sizeAndreas Kling
We were dropping the result of css_clamp() on the floor, oops! Let's also mark it [[nodiscard]] so it won't happen again.
2022-07-12LibWeb: Don't crash when failing to create WebGL context on non-SerenityAndreas Kling
This makes Ladybird stop panicking on websites that try to use WebGL.
2022-07-12LibWeb: Set up both containing block sizes before intrinsic sizingAndreas Kling
When calculating e.g the min-content height of some box, we would only set its containing block's height to 0 in the temporary formatting state. The containing block width was not touched at all. This patch aims to do a bit better by resolving indefinite containing block sizes to INFINITY before performing intrinsic sizing. We should probably also find a way to resolve definite containing block sizes, but I'll leave that for our future selves.
2022-07-12LibWeb: Floor scaled flex shrink factor at 1 when spec asks us toAndreas Kling
2022-07-12LibWeb: Take margin box into account when justifying flex itemsAndreas Kling
Before this patch, we were justifying based on the content box only, which led to misalignments along the main axis when items had non-zero padding, borders or margins.
2022-07-12LibWeb: Add safety mechanism to guard against non-finite layout sizesAndreas Kling
Due to some yet-to-be-found bug(s) in intrinsic sizing, we can sometimes end up deciding that some box has a non-finite intrinsic size. This will create unpleasant results, and may lead to some layout algorithms looping infinitely, so this patch adds a safeguard where we simply turn non-finite intrinsic sizes into zero (and complain a little bit in the debug log.)
2022-07-12LibWeb: Honor `align-self` over `align-items` when non-auto on flex itemAndreas Kling
2022-07-11LibWeb: Implement all "attributes" mutation records for MutationObserverLuke Wilde
2022-07-11LibWeb: Implement "characterData" mutation record for MutationObserverLuke Wilde
2022-07-11LibWeb: Implement all "childList" mutation records for MutationObserverLuke Wilde
2022-07-11LibWeb: Introduce Mutation{Record,Observer} and observer microtasksLuke Wilde
2022-07-11LibWeb: Wrap DOM::Attribute in NodeWrapperFactoryLuke Wilde
2022-07-11LibWeb: Implement CharacterData.{append,insert,delete}DataLuke Wilde
2022-07-11LibWeb: Implement CharacterData::set_data in terms of replace_dataLuke Wilde
This makes it so that it always queues a mutation record, even if `data` is set to the same value. It also makes it follow the spec steps.
2022-07-11LibWeb: Allow creating a StaticNodeList without an r-value VectorLuke Wilde
It must accept taking a copy for DocumentFragment mutation records and empty vectors created in-place.
2022-07-11LibWeb: Honor preferred size as intrinsic cross size of flex itemsAndreas Kling
I'm not 100% sure this is on-spec, but it seems to me that flex items that have a specified non-auto cross size should honor that value in its min-content and max-contribution.
2022-07-11LibWeb: Implement step 9.2.3 of the flexbox layout algorithmAndreas Kling
When sizing the flex container under a min-content or a max-content constraint, flex items with a used flex basis of "content" should be sized under the same constraint.
2022-07-11LibWeb: Stop putting the FormattingState nodes in a slow hash mapAndreas Kling
Instead, put them in a Vector<OwnPtr<NodeState>>. Each layout node has a unique index into the vector. It's a simple serial ID assigned during layout tree construction. Every new layout restarts the sequence at 0 for the next ICB. This is a huge layout speed improvement on all content.
2022-07-11LibWeb: Tweak padding on button elements match other enginesAndreas Kling
2022-07-11LibWeb: Bring sizing of replaced elements closer to specAndreas Kling
We were prematurely resolving the computed size values, which meant that `auto` values were swallowed before we could resolve them via the intrinsic aspect ratio (if present)
2022-07-11LibWeb: Match WebKit and Blink re: absence of width/height on <svg>Andreas Kling
2022-07-11LibWeb: Try to work out the intrinsic size of <svg> elementsAndreas Kling
If the `width` and `height` attributes are provided, we derive the intrinsic size and ratio from them. Otherwise, we trace a rectangle around the geometry elements inside the SVG and use the size of that as the intrinsic size. This is definitely far from correct, but is still a much better guess at the intrinsic size than nothing.
2022-07-11LibWeb: Set 1:1 intrinsic aspect ratio for radio buttonsAndreas Kling
2022-07-11LibWeb: Cache reference to <svg> element in SVGFormattingContextAndreas Kling
2022-07-11LibWeb: Use the *outer* flex base size in intrinsic size calculationAndreas Kling
2022-07-11LibWeb: Use the "scaled flex shrink factor" where noted by the specAndreas Kling
2022-07-11LibWeb: Treat "flex-basis: 0px" like any other definite basis valueAndreas Kling
2022-07-11LibWeb: More specialization of intrinsic sizing layoutAndreas Kling
This patch adds a separate entry point for this kind of layout. We override it in BFC to set up initial width/height values for the BFC root block. Resulting dimensions are assigned as content_width and content_height at the end of intrinsic sizing, for each axis, if it's either "auto" or there's a min-content or max-content constraint in effect.
2022-07-11LibWeb: Don't iterate over text content inside replaced elementsAndreas Kling
This fixes an issue where whitespace inside embedded <svg> elements would create unexpected whitespace text content on the page. When combined with something like `white-space: pre-wrap`, it ended up generating a lot of surprising vertical offsets.
2022-07-11LibWeb: Use max-content main size for flex items w/ definite cross sizeAndreas Kling
If the main size is indefinite, that is.
2022-07-11LibWeb: Make sure we always apply size constraints in IFCAndreas Kling
Pre-compute the effective containing block width in the IFC constructor and use that throughout.
2022-07-11LibWeb: Cache a pointer to the containing block state in IFCAndreas Kling
2022-07-11LibWeb: Factor out BFC "layout this block-level box" to a functionAndreas Kling
2022-07-11LibWeb: Express intrinsic size layout via size constraintsAndreas Kling
Previously, we had three layout modes: - Normal: - Everything uses the computed values from CSS. - MinContent: - Containing blocks act as if they have 0 width. - All line breaking opportunities are taken. - MaxContent: - Containing blocks act as if they have infinite width. - Only forced line breaks are accepted. The above was based on a set of misunderstandings of CSS sizing. A major problem with the above was that *all* containing blocks behaved differently during intrinsic size layout, not just the relevant one. With this patch there are only two layout modes: - Normal: - Everything uses the computed values from CSS. - IntrinsicSizeDetermination: - One or more boxes have size constraints applied. There are two size constraints per layout box, set here: - FormattingState::NodeState::width_constraint - FormattingState::NodeState::height_constraint They are of type SizeConstraint and can be one of None, MinContent, or MaxContent. The default is None. When performing an IntrinsicSizeDetermination layout, we now assign a size constraint to the box we're trying to determine the intrinsic size of, which is then honored by using two new helpers to query the dimensions of containing blocks: - FormattingContext::containing_block_width_for(Box) - FormattingContext::containing_block_height_for(Box) If there's a relevant constraint in effect on the Box, the size of its containing block is adjusted accordingly. This is essentially an implementation of the "available space" constraints from CSS-SIZING-3. I'm sure some things will break from this, and we'll have to deal with that separately. Spec: https://drafts.csswg.org/css-sizing-3/#available
2022-07-11LibWeb: Move IFC result measurement from IFC to BFCAndreas Kling
Before this change, IFC would first generate all of its line boxes and then measure them. It would then write some of the values into the state of the IFC's containing block. We now move that up to BFC::layout_inline_children() instead, which is a much more natural place to decide metrics for the block.
2022-07-11LibWeb: Make BFC always drive IFCAndreas Kling
Instead of allowing FormattingContext to instantiate an IFC for anything that has inline children, move this logic to BFC. This is fine, since only BFC deals with blocks having inline children anyway.
2022-07-11LibWeb: Add FFC helpers for getting intrinsic size of flex itemsAndreas Kling
2022-07-11LibWeb: Only perform the requested form of intrinsic size calculationAndreas Kling
Before, querying any of the four intrinsic sizes would cause us to calculate all of them (the four being min-content width/height, and max-content width/height). Now, the helper functions only calculate the specific intrinsic size requested. It's then cached at the root formatting context level, so that it's never calculated twice within the same layout pass.
2022-07-11LibWeb: Make separate functions for calculating min/max content sizesAndreas Kling
At first, these are just wrappers around calculate_intrinsic_sizes(). Eventually, we'll make them do only the work necessary for their specific size.
2022-07-11LibWeb: Clamp intrinsic flex item main size contributions to min/maxAndreas Kling
2022-07-11LibWeb: Store MessageEvent::m_data in a JS::HandleLuke Wilde
This protects it from GC.