Commit Graph
8487 Commits
Author SHA1 Message Date
Muki Kiboigo 3bfec6d7ff skip body dupe on expired without validators on Cache.get 2026-08-03 18:17:43 -07:00
Muki Kiboigo 04e93cd592 check vary before we dupe in SqliteCache.get 2026-08-03 18:17:43 -07:00
Muki Kiboigo 94c029ff32 get rid of file variant in CachedData 2026-08-03 18:17:43 -07:00
Muki Kiboigo a96543052c manually delete and reinsert 2026-08-03 18:17:43 -07:00
Muki Kiboigo 671b110aa2 loadBody can return null 2026-08-03 18:17:43 -07:00
Muki Kiboigo b2727a1ab4 remove Storage and FsCache 2026-08-03 18:17:43 -07:00
Muki Kiboigo 4d59b61a33 remove primary key on url name 2026-08-03 18:17:43 -07:00
Muki Kiboigo 047280e0d6 use strict tables 2026-08-03 18:17:43 -07:00
Pierre Tachoire 1308639a9f cap delta-seconds values per RFC 9111
Huge max-age/Age header values previously either panicked in the
i64 casts when storing metadata, or were silently truncated to their
first 8 digits by the fixed-size lowercase buffer in
CacheControl.parse. Cap them at 2^31 as RFC 9111 §1.2.2 prescribes
and compare directives case-insensitively without truncation.
2026-08-03 18:17:42 -07:00
Muki Kiboigo 0f2957cda2 add SqliteCache as default local impl 2026-08-03 18:17:40 -07:00
Karl Seguin 5f88b33ed6 Merge pull request #3118 from lightpanda-io/refactor-http-client-headers
refactor: rework how httpclient headers work
2026-08-04 06:42:10 +08:00
Karl Seguin f5c40da81c Merge pull request #3111 from lightpanda-io/cdp-json-protocol
cdp: add /json/protocol endpoint
2026-08-04 06:41:55 +08:00
Karl Seguin aecb3ac459 Merge pull request #3105 from lightpanda-io/string-align
mem: rework string.String to be align(8)
2026-08-04 06:41:43 +08:00
Karl Seguin df11a6e4af Merge pull request #3104 from lightpanda-io/node-bare-tag
mem: Switch Node's _type to a bare tag
2026-08-04 06:41:26 +08:00
Karl Seguin ccc0a988a3 Merge pull request #3103 from lightpanda-io/scheduler
Rework scheduler
2026-08-04 06:41:11 +08:00
Karl Seguin 940796d4da Merge pull request #3101 from lightpanda-io/script-cacheable-log
chore: remove cacheable field from ScriptManager log
2026-08-04 06:40:53 +08:00
Karl Seguin 1d5a25bf4e remove reference to generator (didn't like it, don't want to include it) 2026-08-03 18:48:40 +08:00
Karl Seguin fd2e6a8512 refactor: rework how httpclient headers work
Adding headers to an HTTP request was a bit awkward due to my desire to avoid
having an intermediate representation (e.g. an ArrayList(Header)). Going
straight to a curl slist avoids double-copying the headers (first to Zig, then
to curl).

But the CORS work (https://github.com/lightpanda-io/browser/pull/3002) showcases
that this micro-optimization simply isn't worth it, since it needs that
intermediate representation anyways.

And, this change isn't just for CORS. Headers have been a silly pain in the past
like unclear ownership, and messy APIs used in _a lot_ of places (WebBotAuth,
WebSocket, Fetch, ...)

This new approach stores headers on the transfer in an ArrayList. The API is:

```
const transfer = try client.newRequest(.{...}, owner);
{
    errdefer transfer.deinit();
    try transfer.addHeader("Over", "9000", .{});
}
try transfer.submit();
```

This:
1 - Eliminates ambiguity about errdefer cleanup responsibility
2 - Eliminates a bunch of stringZ concat that Frame, Config, CDP were doing
3 - Transfer.arena is now available for headers
2026-08-03 18:26:32 +08:00
Karl Seguin f4783d8fcc cdp: add /json/protocol endpoint
https://krabarena.com/claims/browserless-exposes-57-cdp-domains-for-discovery-lightpanda-s-endpoint-is-a-404
2026-08-03 15:51:42 +08:00
Karl Seguin 876ff8400b mem: rework string.String to be align(8)
Moves from packed to extern which causes alignment to drop from 16 to 8. Paired
with https://github.com/lightpanda-io/browser/pull/3104 this results in a -8
bytes per Text node.
2026-08-03 13:07:28 +08:00
Karl Seguin 7db42891a7 mem: Switch Node's _type to a bare tag
Alignment allowing (1) this reduces Node size by 8 bytes. It also aligns with
previous cdata changes with the end-goal to have the entire Node chain adopt
bare tags.

(1) string.String is 16-byte aligned, so Text doesn't shrink with this change.
Hopefully this can be addressed separately.
2026-08-03 12:19:41 +08:00
Karl Seguin 3b9359dc98 Rework scheduler
This does 2 scheduler-related changes. The first is that the high/low priority
queues are gone. These were misleading and hinted at some type of ordering. The
point was strictly to help us decide when do we consider a page "done" and that
some tasks SHOULD hold up the page (high priority) and some pages SHOULD NOT
(low priority).

So, when adding a task, `low_priority == true` is now `blocks_done == false`.
But it isn't just a rename:

1 - There two queues are merged, and we keep a blocking count
2 - Past a certain timer depth, blocks_done == true, so it protects against more
    cases than just the previous RAF

The other change relates to the Scheduler's implementation. While low/high have
been merged into a single PriorityQueue, "immediate" and "front" tasks get their
own distinct queue (so we now have 3). This is an optimization for the very
common case where run_at = 0 - it can be a plain FIFO.

Rather than comparing tasks on run_at (u64) and sequence (u64), the key (u64)
merges the two.
2026-08-02 20:14:34 +08:00
Karl Seguin 596d236551 chore: remove cacheable field from ScriptManager log
Cacheable for ScriptManager means something very specific (should the js.Context
cache the module for subsequent loads). With HTTP caching coming, I'm removing
this field from the ScriptManager logs because (a) it isn't very useful anyways
and (b) it doesn't mean what most people who see it would think it means.
2026-08-02 13:17:29 +08:00
Karl Seguin 70bbdadf4b Merge pull request #3098 from lightpanda-io/page-double-free
uaf: Fix page double-free on navigate failure.
2026-08-02 08:49:18 +08:00
Karl Seguin a4970bfd9b Merge pull request #3097 from lightpanda-io/lp-is_debug-is_test
chore: add lp.IS_DEBUG and lp.IS_TEST
2026-08-02 08:49:04 +08:00
Karl Seguin 634e27c9c6 uaf: Fix page double-free on navigate failure.
This is a classic (for us) issue. Session.initiateRootNavigation errdefer a
number of steps BUT, if the frame.navigate() call reaches libcurl's event-loop,
then those errdefer can conflict with the `frameErrorCallback`. Who's
responsible for cleaning up? It depends where the failure happened.

So the cleanup is now more defensive. Page.destroying guards against multiple
calls to Session.queuePageDestruction and initiateRootNavigation no longer
assumes that the new Page is in the pages collection.

I believe this is the cause of the "release overflow" for `Selection` that is
infrequent but has been seen for a long time.
2026-08-01 17:41:19 +08:00
Karl Seguin 6a83881634 chore: add lp.IS_DEBUG and lp.IS_TEST
Change all users to builtin.mode and built.is_test
2026-08-01 09:15:18 +08:00
Karl Seguin 5125912a04 Merge pull request #3095 from lightpanda-io/webcrypto-wpt
wpt: improve webcrypto WPT results
2026-08-01 08:04:48 +08:00
Karl Seguin b40bf98651 Merge pull request #3094 from lightpanda-io/webapi-scheduler
webapi: Add Scheduler (window and worker)
2026-08-01 08:04:26 +08:00
Karl Seguin 2b70736b06 Merge pull request #3093 from lightpanda-io/element-proto-removal
mem: remove _proto field from most Node types
2026-08-01 08:04:11 +08:00
Karl Seguin 9809cbb9fb Merge pull request #3092 from lightpanda-io/arena-optimizations
mem: improve ArenaPool usage
2026-08-01 08:03:58 +08:00
Karl Seguin ba1980da84 Merge pull request #3091 from lightpanda-io/blob-mem-tweak
mem: improve memory efficiency of blob
2026-08-01 08:03:43 +08:00
Karl Seguin b415cbe944 wpt: improve webcrypto WPT results
Adds a proper QuoteExceededError WebApi.

Handles more invalid parameters.

The most significant change is that types which return a promise don't return
an error, they reject. This is an issue that we run into a lot, and this
commit has started to work on a more generic (i.e. in the bridge) solution.
2026-07-31 18:19:58 +08:00
Karl Seguin 0672fad797 webapi: Add Scheduler (window and worker)
This is a new API, but it's in all browser (nightly in Firefox). It's
essentially a more powerful api than setTimeout, it has priority and
cancellation.
2026-07-31 17:23:33 +08:00
Karl Seguin c52cba3858 mem: remove _proto field from most Node types
Continues the work started in https://github.com/lightpanda-io/browser/pull/3070

Removes the _proto field from intermediary (non-leaf) elements and uses the
relative positioning from the contiguous allocation. With the work done in
previous commit, this is pretty mechanical.

This essentially saves 8 bytes per type. Pretty small, but now Node->* is
consistently designed 1 way. Empty leaf nodes are still an issue, and the _proto
remains in them (for now). It's an issue because, if it's truly empty, the leaf
can have the same address as the parent or a sibling. This is something we
used to have problems with (hence some types have a _pad: bool). Solvable, but
separately.
2026-07-31 15:31:31 +08:00
Karl Seguin 2bd9848c07 mem: improve ArenaPool usage
1 - Add a metric to track the number of inlight arenas from the pool
2 - Script now use 2 arenas:
    - An initial (small) one for the script
    - A sized one for the body
    Should result in less pressure on our limited .large arenas
3 - DOMPoint and DOMPointRO are now arena free (they live on the slab only)
4 - TextDecoder no longer accumulate garbage in its arena
5 - Response object is much better at picking its arena size, rather than just
    using a .large
2026-07-31 14:36:22 +08:00
Karl Seguin 8c7706f6a1 mem: improve memory efficiency of blob
This figures out the size of Blob/File to chose a better arena, potentially
avoiding holding a .large arena (which we have limited) for small data.

This happens to circumvent an allocation bug in std.Io.Writer.Allocating that
can over-reserve memory.

It also removes some page: *Page parameters in favor of *js.Execution which I
think should always be preferred (for no other reason that going from
Execution -> Page is easy, but going from Page -> Execution is more complicated
so we should just always use Execution).
2026-07-31 11:38:03 +08:00
Karl Seguin 392bb4c772 Merge pull request #3088 from lightpanda-io/improve-test-output-and-logs
tests: improve test output and test log handling
2026-07-31 11:01:53 +08:00
Karl Seguin c726b022e8 tests: improve test output and test log handling
1 - TEST_VERBOSE is now off by default
2 - There's a afterEach callback that is automatically run after each tests, it:
     a - clears the log filters
     b - resets the test arena
3 - LogFilter replace with
     a - testing.silenceLog(&.{...scopes...}); to silence all logs for the given
         scopes.
     b - testing.expectLog(&.{...scopes}); to set log expectations, 1 per log.
         The goal here isn't so much to expect logs (though, you can do that),
         but rather to silence an expected # of logs, without silencing more.
2026-07-31 07:30:25 +08:00
Karl Seguin 6d824c880e Merge pull request #3087 from lightpanda-io/fix-options-set-value-uaf
fix: potential UAF when option's value is programmatically set
2026-07-31 07:23:50 +08:00
Karl Seguin 93922f7a0e Merge pull request #3086 from lightpanda-io/arena-type
mem: arena allocation metric + report zig->v8 memory usage hints
2026-07-31 07:23:33 +08:00
Karl Seguin 31d730a7c4 Merge pull request #3089 from lightpanda-io/zig-memory-report
mem: add metric for arena allocations
2026-07-30 18:12:33 +08:00
Karl Seguin a06f8f2161 mem: add metric for arena allocations
Report memory held by arenas which are waiting on v8 finalization to v8. This
acts as a hint to the v8 GC, so that it knows about external memory which is
being held up by it.

This is opt-in, code needs to getArena() -> getPinnedArena() and then needs to
report() where it makes sense (e.g. no point reporting XHR memory if the Zig-
side still needs to instance).
2026-07-30 17:17:32 +08:00
Adrià Arrufat c2fa38e516 Merge pull request #3075 from lightpanda-io/codex
agent: support subscription auth via Codex
2026-07-30 08:02:11 +02:00
Karl Seguin 5ce274cec4 fix: potential UAF when option's value is programmatically set 2026-07-30 13:53:08 +08:00
Karl Seguin bdce49a4b5 refactor: Introduce Arena wrapper
Introduces a ArenaAllocator wrappre (lp.Arena). This is groundwork for better
memory tracking and reporting memory usage to v8. This is almost purely a
mechanical change to lay a foundation for a follow up PR that will address
https://github.com/lightpanda-io/browser/issues/3027

Some code became a bit leaner: a pooled arena can release itself (it has a
reference to the ArenaPool).

Some code became uglier: The Frame has a `_local_arena: *lp.Arena` and a
`local_arena: Allocator` (same with call_arena, and same with a few other types)
so that consumers aren't impacted (they continue to use `frame.local_arena`).
2026-07-30 13:02:13 +08:00
Karl Seguin 5f6085fd03 Merge pull request #3085 from lightpanda-io/fix-script-setattribute-src
Fix script setattribute src
2026-07-30 11:30:28 +08:00
Karl Seguin edcd9eabf4 Merge pull request #3084 from lightpanda-io/max-timer-test
test: add max-timers test
2026-07-30 09:53:58 +08:00
Karl Seguin 961da45ece Ignore empty Script.src values
Don't hold an map entry over attributeChange callback, since we can now execute
JavaScript which could invalidate the map.
2026-07-30 09:49:47 +08:00
Karl Seguin 3a4e6febad test: add max-timers test 2026-07-30 08:03:17 +08:00