Expand description
JS ⇄ レンダラの DOM ブリッジ。
dom::parse_html の結果を ドキュメント順 にフラット化した軽量アリーナを持ち、
JS から document.getElementById 等で参照されるノードと、textContent /
style / classList の変更、addEventListener('click') で登録されたリスナを保持する。
レンダラは毎レイアウトで last_html を再パースするため、ブリッジは
「同一 HTML を同一ドキュメント順で歩けばインデックスが一致する」性質を使い、
apply_overrides で再パース木へ JS の変更を焼き戻してから CSS カスケードに渡す。
これにより既存のレンダリング経路をそのまま再利用できる(HTML 再シリアライズ不要)。
Structs§
- AttrSel 🔒
- Compound
Sel 🔒 - DomBridge
- DOM ブリッジ本体。
JsRuntimeがRc<RefCell<>>で保持し、レンダラと共有する。 - DomNode
- ブリッジ上の 1 ノード。要素またはテキスト。
- Listener
- click 等のイベントリスナ登録。
- MutObs
Reg - MutationObserver の登録エントリ。
- MutRec
- MutationObserver に届けるレコード(Rust 側内部表現)。
- NthFormula 🔒
- SelStep 🔒
- Validity
Flags ValidityState(HTML5 制約検証)の個別フラグ。以前はelement.validityがvalid/valueMissing/customErrorの3つしか公開せず、input.validity. patternMismatch/.typeMismatch/.rangeOverflow等、特定の制約だけを狙い撃ちして カスタムエラーメッセージを出し分ける定番パターンが常にundefined(falsy)に なっていた。
Enums§
- AttrOp 🔒
- Combinator 🔒
- PosPseudo 🔒
Functions§
- build_
steps 🔒 - トークン列(コンパウンド文字列と結合子記号が混在)から
SelStep列を組み立てる。 - css_
prop_ 🔒from_ camel backgroundColor→background-color。既にケバブならそのまま。- html_
escape_ 🔒attr outerHTML直列化用の最小限の HTML エスケープ(属性値。"も escape する)。- html_
escape_ 🔒text outerHTML直列化用の最小限の HTML エスケープ(テキストノード本文)。- is_
listener_ 🔒aborted - is_
signal_ aborted AbortSignalオブジェクトの.abortedがtrueか。- nth_
formula_ 🔒matches position(1始まり)がan+b式(nは 0,1,2,…)のいずれかのnで 表せるか判定する。- parse_
attr_ 🔒sel [attr...]1件を解析する(name/name=val/name^=val/name$=val/name*=val/name~=val。値の前後のクォートは剥がす)。- parse_
compound 🔒 - コンビネータを含まない単一コンパウンドセレクタ(
div.active#foo[data-x=y])を解析する。*(ユニバーサルセレクタ)は制約が何も無いCompoundSel::default()になるが、 末尾の「制約が空なら無効」判定に引っかかってNoneに潰れてしまい、querySelectorAll('*')が常に0件になる回帰があった(自己検証で発見)。*はここで即座に有効な(=全ノードにマッチする)セレクタとして扱う。 - parse_
inline_ 🔒style color: red; font-size: 12px→ マップ。- parse_
nth_ 🔒formula :nth-child()引数(odd/even/N/aN+b/aN-b/-aN+b)を解析する。- serialize_
inline_ 🔒style - split_
top_ 🔒level_ commas - セレクタ文字列全体を、トップレベル(
[...]/(...)の外側)のカンマだけで 分割する(selector.split(',')を単純に使うと:is(.a, .b)の中のカンマも セレクタグループの区切りと誤認識し、:is(.a/.b)という壊れた2グループに 分解されてしまうバグがあった。node_matches/query_allの「カンマ区切りは OR」処理の入口はここを必ず経由すること)。 - strip_
style_ 🔒priority - 生の宣言値末尾の
!important(大小文字・空白ゆれ許容)を切り離す。(値本体, important か)を返す。CSS カスケード側(css.rs)の!importantパーサとは別実装だが、element.style.getPropertyValue/.getPropertyPriority(丸ごと未対応だった。2026-07-16 発見)専用の 軽量版。 - tokenize_
selector_ 🔒group - カンマで区切られた1グループ分のセレクタ文字列を、結合子記号(
>/+/~)と 空白区切りのコンパウンドセレクタ文字列トークンへ分割する([...]/(...)内の 空白は区切りとして扱わない)。