Skip to main content

Module dom_bridge

Module dom_bridge 

Source
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 🔒
CompoundSel 🔒
DomBridge
DOM ブリッジ本体。JsRuntimeRc<RefCell<>> で保持し、レンダラと共有する。
DomNode
ブリッジ上の 1 ノード。要素またはテキスト。
Listener
click 等のイベントリスナ登録。
MutObsReg
MutationObserver の登録エントリ。
MutRec
MutationObserver に届けるレコード(Rust 側内部表現)。
NthFormula 🔒
SelStep 🔒
ValidityFlags
ValidityState(HTML5 制約検証)の個別フラグ。以前は element.validityvalid/valueMissing/customError の3つしか公開せず、input.validity. patternMismatch/.typeMismatch/.rangeOverflow 等、特定の制約だけを狙い撃ちして カスタムエラーメッセージを出し分ける定番パターンが常に undefined(falsy)に なっていた。

Enums§

AttrOp 🔒
Combinator 🔒
PosPseudo 🔒

Functions§

build_steps 🔒
トークン列(コンパウンド文字列と結合子記号が混在)から SelStep 列を組み立てる。
css_prop_from_camel 🔒
backgroundColorbackground-color。既にケバブならそのまま。
html_escape_attr 🔒
outerHTML 直列化用の最小限の HTML エスケープ(属性値。" も escape する)。
html_escape_text 🔒
outerHTML 直列化用の最小限の HTML エスケープ(テキストノード本文)。
is_listener_aborted 🔒
is_signal_aborted
AbortSignal オブジェクトの .abortedtrue か。
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グループ分のセレクタ文字列を、結合子記号(>/+/~)と 空白区切りのコンパウンドセレクタ文字列トークンへ分割する([...]/(...) 内の 空白は区切りとして扱わない)。