The tag switch already covered fieldset inheritance through isDisabled.
Dropping it suppressed click() on a <fieldset disabled> itself, which
Chrome and Firefox still dispatch.
An unrecognized value used to declare the property as visible/auto, which
overrode the inherited value. Now it declares nothing, as the cascade
drops invalid declarations.
Per the HTML spec, the value IDL attribute has four modes. In "default"
(hidden, submit, image, reset, button) and "default/on" (checkbox, radio)
modes, the setter sets the value content attribute and the getter reads
it back (falling back to "" or "on"). Lightpanda only stored the value
internally for every type, so getAttribute("value"), serialization and
[value=...] selectors never saw it.
Changing the type attribute now follows the spec's type change steps:
value -> default writes a non-empty current value to the attribute, and
default -> value restarts from the attribute with the dirty flag cleared.
https://html.spec.whatwg.org/multipage/input.html#dom-input-valuehttps://html.spec.whatwg.org/multipage/input.html#input-type-change
An Attr handed out through el.attributes, getNamedItem, getAttributeNode
or an XPath query cached the value it had when it was created: a later
setAttribute updated the element's entry but not the Attr, so attr.value
and el.attributes kept serving the old value while getAttribute returned
the new one. Per the DOM spec an Attr is the attribute itself.
List._put() is the single place an existing entry's value changes, so it
now also updates the Attr cached in page.attribute_lookup, when it is
still attached. The Attr that setAttributeNode replaces is detached
before put() and keeps its old value.
Dependencies:
- v8: zig-v8-fork 0.17 branch (lightpanda-io/zig-v8-fork#218).
- sqlite3: build the amalgamation directly; the allyourcodebase wrapper
has no 0.17 support yet.
- pcre2: master commit with 0.17 support (no release yet).
- translate_c package (2.0.0) replaces the deprecated addTranslateC.
default_init is set to keep 0.16's zero-initialized struct fields.
Build:
- b.pathFromRoot/build_root/args/sysroot are gone: resolve paths from
b.root, use addPassthruArgs, declare configure-time file and directory
dependencies, and poison the configure cache for the git version.
- Drop curl config values the template never used (now an error).
- Drop the 0.16 zip-fetch workaround from the Makefile and CI.
- -Doptimize=ReleaseFast -> -Doptimize=fast.
Language and std:
- @intFromEnum/@enumFromInt -> @backingInt/@fromBackingInt.
- Struct-of-arrays @typeInfo (field_names, field_types, decl_names,
param_types, error_names).
- `a ** n` removed: @splat for arrays, string.repeat for strings.
- errdefer captures removed: split WebDriver.run and fulfillRedirect.
- @hasDecl only sees pub decls: make StyleManager's Spec.finish pub,
otherwise it silently stops running.
- SafeAllocator replaces DebugAllocator; the test runner now has to
initialize std.testing.allocator_instance itself.
- std.fmt.allocPrint/bufPrint -> Allocator.print/std.mem.print,
dupeZ -> dupeSentinel, std.builtin -> std.lang, builtin.os ->
builtin.target.os, zon.parse arena API, BufferFirstAllocator, and the
remaining renames (getLastOrNull, bit_set, ascii.find*, meta.Int).
Focusing an element inside an iframe only updated that iframe's document,
so the parent's activeElement stayed <body>, and Input.insertText /
Input.dispatchKeyEvent — resolved against the main frame's focused
element — typed nothing. Element.focus now also focuses the containing
<iframe> in its parent frame (the HTML focus chain runs through navigable
containers), and the Input domain sends keys to the focused frame:
user_input.focusedFrame descends while the focused element is an
<iframe> with a loaded document.
Closes#3758
The HTML UA stylesheet has
`[popover]:not(:popover-open):not(dialog[open]) { display: none }`, but
matchesUaDisplayNoneRule — the UA display:none fallback shared by
checkVisibility() and getComputedStyle().display — had no popover arm,
so a popover that was never shown, and its whole subtree, read as
rendered. Add the arm next to dialog:not([open]); showing or hiding a
popover already calls frame.domChanged(), which invalidates the memo.
Closes#3756
Timer, requestAnimationFrame and requestIdleCallback callbacks, inline
on* handlers (attribute or property) and directly dispatched property
handlers such as window.onmessage caught their exceptions and only
counted them, so window's "error" event and onerror never saw them.
Call them inside a TryCatch, the way Listener.run already does, and hand
the exception to the global's reportError (HTML "report an exception").
GlobalScope.reportError routes it to the window or worker global.
Closes#3754
A script inserted by a running script executes synchronously inside that script's call, but the post-execution microtask checkpoint and scheduler run happened regardless of call depth. MutationObserver callbacks, promise reactions and ready timers then ran between the inserting script's statements, once per inserted script. Only drain at an empty JS stack, as the pre-execution checkpoint already does.