Commit graph

255 commits

Author SHA1 Message Date
Shannon Booth
636a85f04e LibWeb: Use Optional<FlyString> directly in Document & DOMImplementation
Use the [FlyString] extended attribute to allow these functions to take
an Optional<FlyString> directly, allowing us to tidy up some conversions
from Optional<String>.
2024-01-13 08:33:10 +01:00
Aliaksandr Kalenik
07928129dd LibWeb: Wait until new document becomes active before running scripts
Fixes https://github.com/SerenityOS/serenity/issues/22485

With this change WebContent does not crash when `location.reload()` is
invoked but `Navigable::reload()` still not working because of spec
issue (https://github.com/whatwg/html/issues/9869) so we can't add a
test yet.
2023-12-30 19:32:31 +01:00
Sam Atkins
a20951fbc0 LibWeb: Support making a document active after it has completely loaded
So far, we always call make_active() before update_readiness
(Complete), but this will soon not be the case once we implement the
spec document-loading algorithms.

Co-authored-by: Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
2023-12-26 18:35:29 +01:00
Sam Atkins
40f7cab21e LibWeb: Implement Document::populate_with_html_head_and_body() 2023-12-26 18:35:29 +01:00
Andreas Kling
7c95ebc302 LibWeb: Make Document::page() return a Page&
Now that Document always has a Page, and always keeps it alive, we can
make this return a Page&, exposing various unnecessary null checks.
2023-12-15 22:04:46 +01:00
Andreas Kling
70193c0009 LibWeb: Let Document have a direct GCPtr to its containing Web::Page
With this change, Document now always has a Web::Page. This means we no
longer rely on the breakable link between Document and BrowsingContext
to find a relevant Web::Page.

Fixes #22290
2023-12-15 22:04:46 +01:00
Aliaksandr Kalenik
41a3c19cfe LibWeb: Make HTML::DecodedImageData to be GC-allocated
This change fixes GC-leak caused by following mutual dependency:
- SVGDecodedImageData owns JS::Handle for Page.
- SVGDecodedImageData is owned by visited objects.
by making everything inherited from HTML::DecodedImageData and
ListOfAvailableImages to be GC-allocated.

Generally, if visited object has a handle, very likely we leak
everything visited from object in a handle.
2023-12-12 23:01:08 +01:00
Aliaksandr Kalenik
6ac43274b2 LibWeb+LibJS: Use JS::GCPtr for pointers to GC-allocated objects
Fixes warnings found by LibJSGCVerifier
2023-12-11 16:55:25 +01:00
Shannon Booth
83758d4cdd LibWeb: Wrap PseudoElements stored in SimpleSelector in a class
No functional impact intended. This is just a more complicated way of
writing what we have now.

The goal of this commit is so that we are able to store the 'name' of a
pseudo element for use in serializing 'unknown -webkit-
pseudo-elements', see:

https://www.w3.org/TR/selectors-4/#compat

This is quite awkward, as in pretty much all cases just the selector
type enum is enough, but we will need to cache the name for serializing
these unknown selectors. I can't figure out any reason why we would need
this name anywhere else in the engine, so pretty much everywhere is
still just passing around this raw enum. But this change will allow us
to easily store the name inside of this new struct for when it is needed
for serialization, once those webkit unknown elements are supported by
our engine.
2023-12-11 16:54:59 +01:00
Shannon Booth
f976ec005c LibWeb: Port DOM::Document from DeprecatedString 2023-12-02 22:54:53 +01:00
Sam Atkins
2805e16c1c LibWeb: Let NavigableContainers delay the document load event 2023-12-01 10:28:02 +01:00
Sam Atkins
6c5450f9ce LibWeb: Report if anything is delaying load event, not the count
Some elements that delay the load event are more complicated than a
simple count will allow for. We'll implement those in a bit!
2023-12-01 10:28:02 +01:00
Sam Atkins
cc633123ca LibWeb: Extract shared lazy-loading behavior into a base class
`<iframe>` and `<img>` tags share the same spec for several aspects of
lazy-loading: how the `loading` attribute works, the "will lazy load
element" steps, and a member for storing the lazy-load resumption
steps. So let's share the implementation by using a base class.

This mostly involves moving things around. However, we also change the
`start_intersection_observing_a_lazy_loading_element()` method to take
a LazyLoadingElement, and operate on one, instead of always casting to
HTMLImageElement.

We do unfortunately have to do some shenanigans to make the cast work,
by adding a virtual function stub in DOM::Element.
2023-12-01 10:28:02 +01:00
Andreas Kling
bfd354492e LibWeb: Put most LibWeb GC objects in type-specific heap blocks
With this change, we now have ~1200 CellAllocators across both LibJS and
LibWeb in a normal WebContent instance.

This gives us a minimum heap size of 4.7 MiB in the scenario where we
only have one cell allocated per type. Of course, in practice there will
be many more of each type, so the effective overhead is quite a bit
smaller than that in practice.

I left a few types unconverted to this mechanism because I got tired of
doing this. :^)
2023-11-19 22:00:48 +01:00
Matthew Olsson
979b9b942b LibWeb: Add Document's pending animation event queue
This is needed for Animation's update finished state procedure
2023-11-19 18:54:37 +01:00
Matthew Olsson
13ae2a4dab LibWeb: Store all timelines associated with a document on the document
This will be required for propagating the current animation time to all
relevant timelines, which each propagate that time to all of their
relevant animations.
2023-11-07 15:17:09 +01:00
Matthew Olsson
2fbb9649e3 LibWeb: Add a default DocumentTimeline object to DOM::Document 2023-11-07 15:17:09 +01:00
Shannon Booth
b337b4370a LibWeb: Port validate_and_extract from DeprecatedFlyString 2023-11-07 11:33:41 +01:00
Andreas Kling
6b20a109c6 LibWeb: Pass DOM namespace strings as FlyString in more places 2023-11-04 21:28:30 +01:00
Aliaksandr Kalenik
8ebb4e8047 LibWeb: Forbid sharing image requests across documents
This change addresses the bug where images unable to load when the
reload button in the UI is clicked repeatedly. Before this fix, it was
possible to use SharedImageRequests across multiple documents. However,
when the document that initiated the request is gone, tasks scheduled
on the event loop remain in the fetching state because the originating
document is no longer active. Furthermore, another reason to prohibit
the sharing of image requests across documents is that the "Origin"
header in an image request is dependent on the document.
2023-10-18 10:58:01 +02:00
Karol Kosek
426b7ffa41 LibWeb: Don't include Window.h in Element.h and Document.h
Window.h is a rather heavy file, so let's try not to include it in
header files when we can!

Element.h now also includes LibWeb/Bindings/Intrinsics.h, but that's
just out of my laziness. Most if not all objects call
`Bindings::ensure_web_prototype<>()` anyway, so I don't think we would
gain much by sticking the header to source files instead.
2023-10-09 07:29:27 +02:00
Shannon Booth
48f367adbb LibWeb: Port get_element_by_id from DeprecatedFlyString
We needed to keep the old versions of these functions around before all
of the IDL interfaces were ported over to new AK String, but now that is
done, we can remove the deprecated versions of these functions.
2023-10-08 08:11:48 -04:00
Aliaksandr Kalenik
dc19de58d0 LibWeb: Do not use JS::Handle for "scripts to execute" in DOM::Document
Using JS::Handle in members of GC-allocated object almost always leaks.
Instead we should visit these members in visit_edges().
2023-09-27 19:39:57 +02:00
Aliaksandr Kalenik
67c727177e LibWeb: Clear all active timers when document is destroyed
This change implements a step from the document's destroy procedure in
the specification, saying that all active timers should be cleared.

By doing this, we also fix the leaking of a document in case where we
have navigated away from a page that has scheduled timers that haven't
yet been triggered.
2023-09-26 19:42:59 +02:00
Aliaksandr Kalenik
699ead0939 LibWeb: Start fleshing out update document for history step application 2023-09-23 17:59:10 -06:00
Andrew Kaster
dc0f7c4c54 LibWeb: Align NavigationParams and the creation AOs to the spec
And remove assorted spec FIXMEs along the way. Also align
populate_session_history_entry_document to the spec, with a bonus spec
bug to be filed.

This involves creating a new NonFetchSchemeNavigationParams spec, and
having the associated AOs take a Variant rather than Optional to
accomodate the fact that this extra struct could be returned by the
algorithm. We don't actually *do* anything with these params, but the
scaffolding is there now, with less TODOs.
2023-09-22 19:45:11 -06:00
Shannon Booth
8ce9e51c97 LibWeb: Port Node interface from DeprecatedString to String
Which is fortunately quite straight forward :^)
2023-09-17 20:29:18 +02:00
Aliaksandr Kalenik
f01cbaf5fb LibWeb: Remove unused javascript: url navigation methods in Document
Those are superseded by methods to navigate `javascript:` url in
navigables.
2023-09-16 16:53:32 +02:00
Aliaksandr Kalenik
cd75b1de3d LibWeb: Delete discard() in Document and BrowsingContext
Those are not used anymore after moving to navigables.
2023-09-16 16:53:32 +02:00
Aliaksandr Kalenik
2fbb6ae520 LibWeb: Add did_stop_being_active_document_in_navigable() 2023-09-16 16:53:32 +02:00
Aliaksandr Kalenik
e5302e0f56 LibWeb: Update Document::unload() to match latest spec 2023-09-16 16:53:32 +02:00
Aliaksandr Kalenik
359d8a3dc2 LibWeb: Update Document::create_and_initialize() to match latest spec 2023-09-16 16:53:32 +02:00
Shannon Booth
e74031a396 LibWeb: Port Document interface from DeprecatedString to String 2023-09-16 11:17:19 +02:00
Shannon Booth
c3e6077cfc LibWeb: Make Document::{visibility,read}_state return a StringView
Also using the visibility state enum to change strcmp to a simple
enum state check :^)
2023-09-13 07:26:35 +02:00
Shannon Booth
49eb3bfb1d LibWeb: Make Document::run_the_document_write_steps take a StringView
Which flows on down into HTMLTokenizer::insert_input_at_insertion_point.
2023-09-13 07:26:35 +02:00
Shannon Booth
827170f6e6 LibWeb: Take a StringView in Document::get_elements_by_class_name
We only ever use the view of the DeprecatedFlyString anyway, so let's
just use a StringView.
2023-09-13 07:26:35 +02:00
Shannon Booth
ec39a5a41a LibWeb: Const qualify Document::number_of_things_delaying_the_load_event 2023-09-13 07:26:35 +02:00
Shannon Booth
e42bda5f19 LibWeb: Make Document::open functions take a StringView
One of these functions doesn't make any use of the arguments at all, and
the other defers to an open helper which already takes a StringView.
2023-09-13 07:26:35 +02:00
Shannon Booth
8ad05fff4a LibWeb: Make Document::set_cookie take a StringView
Enabled by also making the same change to ParsedCookie::parse_cookie :^)
2023-09-13 07:26:35 +02:00
Andrew Kaster
03eae09619 LibWeb: Implement snapshotting source snapshot params per the spec 2023-08-28 09:47:11 +02:00
Andrew Kaster
7ad45d9e71 LibWeb: Expose a getter for Document's unload_counter
We need to check this value from the Navigation APIs.
2023-08-25 19:51:13 +02:00
Andrew Kaster
5374fbfbcf LibWeb: Make Document::determine_the_indicated_part public
We need to call this from NavigateEvent as part of the Navigation API.
2023-08-24 11:03:57 -06:00
Aliaksandr Kalenik
5ff7448fee LibWeb: Move viewport subscriptions from BrowsingContext to Document
With this change, elements that want to receive viewport rect updates
will need to register on document instead of the browsing context.

This change solves the problem where a browsing context for a document
is guaranteed to exist only while the document is active so browsing
context might not exit by the time DOM node that want to register is
constructed.

This is a part of preparation work before switching to navigables where
this issue becomes more visible.
2023-08-23 20:14:20 +02:00
Andreas Kling
234a73e43e LibWeb: Implement "document-tree child navigables" 2023-08-23 19:49:26 +02:00
Andreas Kling
ae5313d33c LibWeb: Add Document::viewport_rect()
This is a convenience helper that returns an empty rect if there is no
browsing context (to get the actual rect from).
2023-08-21 13:56:18 +02:00
Aliaksandr Kalenik
01cc14714e LibWeb: Implement getting "inclusive ancestor navigables" of a document 2023-08-20 16:07:24 +02:00
Andreas Kling
e211f6c925 LibWeb: Implement getting "ancestor navigables" of a document 2023-08-20 16:07:24 +02:00
Andreas Kling
25375bf1d5 LibWeb: Make Document::paintable() return a ViewportPaintable 2023-08-20 05:02:59 +02:00
Andreas Kling
72c9f56c66 LibJS: Make Heap::allocate<T>() infallible
Stop worrying about tiny OOMs. Work towards #20449.

While going through these, I also changed the function signature in many
places where returning ThrowCompletionOr<T> is no longer necessary.
2023-08-13 15:38:42 +02:00
Sam Atkins
8bd3b74e3a LibWeb: Implement and use "scroll to the fragment" algorithm
This will eventually be used by Navigable but for now, it's just when
traversing the history.
2023-08-12 08:39:04 +02:00