Commit Graph
29 Commits
Author SHA1 Message Date
Halil Durak a457ddf8a7 Merge pull request #2703 from lightpanda-io/nikneym/rework-url-resolve
`URL`: Rework `resolve` with new URL implementation
2026-06-27 23:56:47 +03:00
Karl Seguin bf14d2f05c fix: Fix innerHTML parsing based on the target
The parsing behavior of HTML depends on what we're parsing it for. innerHTML on
a script is parsed (slightly) differently than for, say, the body. html5ever
supports this, we just have to give it the tag name (which we have access to
in the html5ever bridge already).

Also, extend the tag types that dump does NOT escape for beyond noscript/script.

Fixes warnings with some NextJS sites
2026-06-26 18:05:06 +08:00
Halil Durak 7d5553238e URL: changes on host(name) setter, introduce clean_hostname_input 2026-06-25 18:05:48 +03:00
Halil Durak 3c91f3b3e2 URL: fix missing port problem in setter 2026-06-25 18:05:47 +03:00
Halil Durak 0ddca754a4 URL: move resolver functions to Rust
Implements `url_resolve_with_encoding` and `url_resolve_without_encoding` in Rust; that way, we don't pay the cost of extra `Box`es we allocate during resolving.
2026-06-25 18:05:08 +03:00
Halil Durak a307833e5a URL: introduce url_parse_with_base
This results in creating one less `Box`; hence should be the preferred way when creating a URL object from a base.
2026-06-11 19:18:22 +03:00
Halil Durak 0942b16595 URL: migrate search getter/setter, setHref and toString 2026-06-11 19:18:19 +03:00
Halil Durak 12b3d2c9f4 bind & implement more rust-url utilities 2026-06-11 19:18:19 +03:00
Halil Durak 3f006bf912 add rust-url dependency and bindings for it 2026-06-11 19:18:18 +03:00
Karl Seguin 320ffa2819 Improve WPT /url/ tests
This is a bit all over the place.

1 - Replace libidn2 with rust-idna. It looks like there are different idna
    profiles, and rust-idna (from the servo project) implements the whatwg
    one. libidn2 would be too strict in some cases and not strict enough in
    others. (Gemini says I could use libidn2 for this, but what it suggested
    didn't work, and I couldn't figure it out myself, and claude insisted it
    _did not_ have the correct implementation for what we want).

2 - We previously only ran a URL through idna if it wasn't ascii. Turns out
    we also need to run it if there's a "xn--" (aka, an IDNA ACE prefix) in
    there. This helps us pass hundreds of WPT cases, and it's pretty cheap.

3 - Implement more of the Area WebAPI. Mostly copied from Anchor.

4 - Add username/password accessor to Anchor/Area

5 - window.open validates the URL (i.e. tries to resolve it and handles the
    error)

6 - Invalid idna conversion maps to a TypeError

7 - Cleanup closed popups on the next tick (like destroyed pages), rather than
    at an interval or on shutdown. This one seems unrelated, but some of these
    tests are opening hundreds (thousands?) of popups and then closing them.
2026-05-29 18:06:44 +08:00
Karl Seguin 0b4ba17236 Heed Rust warning and replace copy with ignore 2026-05-28 16:48:27 +08:00
Karl Seguin 13547c0ff8 Add declarative shadow dom (DSD)
Normally, a shadow dom is attached to an element via `el.attachShadow(mode)`.
With DSD, the shadow dom is attached during parsing. Essentially, when we see:

<template shadowrootmode="open">...</template>

it has the end result of calling attachShadow on the parent element. This is
used increasingly by a number of frameworks, though normally with backwards
compatibility that fallbacks to doing it in JavaScript.

DSD happens during parsing and document.write, but not via innerHTML = ''.
However, both Element and DocumentFragment gain a `setHTMLUnsafe` which is like
innerHTML WITH DSD.

I initially thought this feature could be implement exactly like I describe:
when the parser adds a template, check for a `shadowrootmode` attribute and
call attachShadow...except..you need to call attachShadow on the parent, which
the parser hasn't popped yet, and it alters where the children are added.
Thankfully, html5ever has a boolean to enable/disable dsd..hence the html5ever
binding changes to (a) enable / disable this featuer and (b) the new callback.
2026-05-27 19:11:43 +08:00
Karl Seguin 8509b112b8 Various small fixes
Extracted from https://github.com/lightpanda-io/browser/pull/2242
2026-04-25 13:22:41 +08:00
Karl Seguin e7c44d34f4 This updates html5ever and the other Rust dependencies.
Inspired by:
https://github.com/lightpanda-io/browser/security/dependabot/1
2026-04-17 12:39:15 +08:00
Karl Seguin 05229fdc53 Use the document's charset to determine if/how to encode querystring
Whenever we resolve a URL, say from `anchor.href`, we should consider the
document's charset when encoding the querystring. This probably isn't the
most important feature, but it makes tens of thousands of WPT cases pass, e.g

/encoding/legacy-mb-tchinese/big5/big5-encode-href-errors-han.html?3001-4000 and
/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html?17001-18000

DOM elements previous called `URL.resolveURL(...)`. They now call
`self.asNode().resolveURL(...)`, where `Node#resolveURL` will provide the
document's charset.
2026-04-10 16:47:42 +08:00
Karl Seguin 828715b751 Improve TextDecoder to support all necessary encoding types
Uses the newly added encoding_rs to implement TextDecoder for all encoding.
Claude wrote 100% of the Rust binding.

Improves various WPT tests, e.g. /encoding/api-basics.any.html.
2026-04-10 16:47:41 +08:00
Karl Seguin 763927c352 Use encoding_rs on non-UTF-8 html to convert to utf-8
Using our existing MIME type detection, this uses encoding_rs to convert non-
UTF-8 content to UTF-8, which can then be passed to html5ever.

Issue: https://github.com/lightpanda-io/browser/issues/2089
2026-04-08 18:32:08 +08:00
Taylor 88e0b39d6b chore: fix dead code and error swallowing warnings
Fixes issues reported by polyglot-scanner:
- Removed explicit `return` keywords and trailing semicolons to resolve DEAD_CODE/DEAD_BRANCH warnings.
- Replaced `epoch::advance().unwrap()` and `stats::resident::read().unwrap()` with safer alternatives (`drop` and `unwrap_or(0)`) to resolve ERROR_SWALLOW warnings.
- Replaced `let _ = Box::from_raw(...)` with `drop(Box::from_raw(...))` to correctly drop the box while fixing the ERROR_SWALLOW warning.
2026-03-26 09:58:49 -07:00
Halil Durak 56d89895a8 initial XML parsing support in DOMParser 2026-01-07 14:37:43 +03:00
Karl Seguin 7c7240d5ab Try to protect against invalid use of document.write
Specifically, try to block multiple document.write which, when combined, have
multiple html documents.
2025-12-30 10:07:56 +08:00
Karl Seguin 9969ff7165 implement html5ever append_based_on_parent_node and append_before_sibling 2025-12-24 07:37:44 +08:00
Karl Seguin 32c83d166d implement html5ever createPI callback 2025-12-21 16:04:59 +08:00
Karl Seguin 218d08b1f6 add some skeleton implementations for various CSS WebAPIs 2025-11-25 13:00:32 +08:00
Karl Seguin c3ba39c80f add reparent_children html5ever callback 2025-11-16 07:53:55 +08:00
Karl Seguin ff3a9c51f3 add remove_from_parent html5ever callback 2025-11-16 07:40:07 +08:00
Karl Seguin 19dfea7762 Work on HTMLTemplateElement
Implement Html5ever get_template_contents and add_attrs_if_missing callbacks
2025-11-15 22:04:39 +08:00
Karl Seguin c311828217 add add_attrs_if_missing callback 2025-11-14 23:33:31 +08:00
Karl Seguin 1164da5e7a copyright notices 2025-11-14 10:52:43 +08:00
Karl Seguin b047cb6dc1 remove libdom 2025-10-27 22:14:59 +08:00