Skip to main contentModule window_api
Source - abort_controller_abort 🔒
controller.abort(reason?)。以前は signal.aborted を立てるだけで、(1) 既に中断済み
の場合の二重発火防止、(2) 仕様どおりの signal.reason、(3) signal.addEventListener ('abort', fn)/signal.onabort によるコールバック通知、のいずれも欠けていた
(addEventListener 自体が単なる no-op だったため、abort() を呼んでも登録した
リスナが一切発火しないサイレントなバグ)。- abort_controller_ctor 🔒
- abort_signal_abort_static 🔒
AbortSignal.abort(reason?)(ES2022)。既に中断済みの状態で signal を返す
静的ファクトリ。AbortController を経由せず即座に中断済み signal が欲しい
場合(引数バリデーション失敗時の早期中断等)に使われる。- abort_signal_add_event_listener 🔒
signal.addEventListener('abort', fn)。以前は無条件 no-op で、リスナが一切
保持/発火されなかった。他の EventTarget 風オブジェクト(XHR 等)と同じ
「on<type> プロパティへ格納する単一リスナ」簡略方式で対応する。- abort_signal_any 🔒
AbortSignal.any(iterable)(ES2024)。渡した signal 群のいずれかが中断された
時点で中断される合成 signal を返す(複数の中断条件を1つの signal にまとめる
定番パターン)。既存の addEventListener('abort', fn) は「on<type> に単一
リスナを格納する」簡略実装のため、入力 signal 側に別のリスナが既に登録済みだと
上書きしてしまう制約がある(この処理系の EventTarget 系オブジェクト全般に
共通の既知の簡略化)。abort_signal_timeout と同じ理由(ネイティブ関数は
クロージャで値を束縛できない)で、入力配列をグローバルの一時変数経由で
渡した上で eval_source に組み立てた JS を実行する。- abort_signal_remove_event_listener 🔒
signal.removeEventListener('abort', fn)。addEventListener は実装済みなのに
対をなす削除側が無条件 no-op のままだったバグ(登録したリスナを外すつもりが
何も起きず、後から abort() すると外したはずのリスナがまだ発火する)。
「on<type> に単一リスナを格納する」既存の簡略方式に合わせ、渡された関数が
現在登録済みのものと同一参照の場合のみ消す(別の関数参照を渡した場合は
仕様どおり no-op のまま)。- abort_signal_throw_if_aborted 🔒
signal.throwIfAborted()(ES2022/DOM。既に中断済みなら reason を投げ、
そうでなければ何もしない、fetch 等のループ内チェックで頻出のイディオム)が
丸ごと未対応だった。AbortSignal.timeout()/.any() は内部で
new AbortController() を経由するため、abort_controller_ctor/
abort_signal_abort_static の2箇所にさえ追加すれば全生成経路をカバーする。- abort_signal_timeout 🔒
AbortSignal.timeout(ms)(ES2022)。指定ミリ秒後に自動的に abort する
AbortSignal を返す、fetch のタイムアウト実装で最頻出のイディオム。この
エンジンの setTimeout は実時間を計測せずマクロタスクキューに積むだけの
簡略実装のため、正確な実時間待機ではなくキュー順序に従った近似になる
(既存の setTimeout 全体の簡略化と同じ水準)。ネイティブ関数はクロージャで
ms を束縛できないため、AbortController/setTimeout を組み合わせる
JS ソースを組み立てて eval_source で実行する。
AbortSignal.timeout(ms)。以前は c.abort() を引数無しで呼んでおり、
signal.reason が仕様どおりの TimeoutError(DOM Level 4 legacy code
23)ではなく既定の AbortError(code 20)になっていたバグ。
abort_signal_any と同じ「グローバル一時変数経由で Rust 側の値を JS へ
渡す」パターンで、事前に構築した TimeoutError の DOMException を
束縛してから c.abort(reason) を呼ぶ。- deepest_last_descendant 🔒
- 部分木内で最も深い「最後の子孫」(
previousNode の下降先探索用)。 - document_add_event_listener 🔒
document.addEventListener(type, fn, options)。window 固有の固定
イベント種別(scroll/hashchange/error等)は従来どおり windowと
共有する隠し配列へ登録するが、それ以外の汎用種別(click/keydown等)は
document自身が持つEventTarget風の_listeners(event_target_add_ event_listenerと同じ格納形式)へ登録する。実クリック等の実DOMイベント
バブリングの最終到達点としてdispatch_event_in_interp
(interp/calls.rs)がこちらを読み出す(丸ごと未対応だった。以前は
固定種別以外をwindow_add_event_listenerの_ => {}アームで黙って
破棄しており、document.addEventListener('click', fn)という定番の
イベント委譲パターンが登録すら行われず一切機能しなかった。2026-07-16
発見・実装)。- document_create_node_iterator 🔒
document.createNodeIterator(root, whatToShow?, filter?)。- document_create_tree_walker 🔒
document.createTreeWalker(root, whatToShow?, filter?)(DOM 標準。
丸ごと未対応だった。DOM 部分木を走査する定番パターン)。whatToShow/
filter は保持のみで実際の絞り込みは行わない簡略実装(:where() を
:is() と同一視するのと同じ「フィルタは常に通過」方針)。- document_dispatch_event 🔒
document.dispatchEvent(event)。JS側から直接document.dispatchEvent(new Event('click'))のように合成発火する経路(実クリックのDOMバブリング経由の
到達はdispatch_event_in_interp側の別経路)。固定種別以外はdocument
自身をターゲットとしてevent_target_dispatch_eventと同じロジックで
発火する(丸ごと未対応だった。2026-07-16 発見・実装)。- document_exit_fullscreen 🔒
document.exitFullscreen()(対をなす解除メソッド。丸ごと未対応だった)。- document_exit_picture_in_picture 🔒
document.exitPictureInPicture()(対をなす解除メソッド。丸ごと未対応
だった)。- document_exit_pointer_lock 🔒
document.exitPointerLock()(対をなす解除メソッド。丸ごと未対応だった)。- document_has_storage_access 🔒
document.hasStorageAccess()(Storage Access API。丸ごと未対応
だった)。この処理系にはサードパーティ Cookie 分離/ブロック機構自体が
無くストレージは常にアクセス可能なため、常に true を返す簡略実装。- document_remove_event_listener 🔒
document.removeEventListener。document_add_event_listenerと対になる
振り分け(丸ごと未対応だった。2026-07-16 発見・実装)。- document_request_storage_access 🔒
document.requestStorageAccess()(対をなす要求メソッド。丸ごと未対応
だった)。理由は hasStorageAccess と同じで、常に成功を返す。- dom_exception_ctor 🔒
new DOMException(message?, name?)。仕様どおり既定値は message=""/
name="Error"。- dom_exception_legacy_code 🔒
name から DOM Level 4 のレガシー数値定数(err.code)を引く。未知の
名前は仕様どおり 0。- dom_exception_to_string 🔒
- dom_request_fullscreen
element.requestFullscreen()(Fullscreen API。丸ごと未対応だった)。
実際の画面占有切り替えは行わず、document.fullscreenElement を更新する
だけの簡略実装(fullscreenchange イベントは対象外)。CSS :fullscreen
疑似クラス(丸ごと未対応だった。2026-07-18 発見・実装)が対象要素を
判定できるよう、:indeterminateの_indeterminateと同じ内部専用属性
_fullscreenもあわせて書き込む。- dom_request_picture_in_picture
<video> の .requestPictureInPicture()(Picture-in-Picture API。丸ごと
未対応だった)。requestFullscreen/requestPointerLock と全く同じ
「状態のみ追跡する」簡略方針。仕様どおり解決済み Promise(
PictureInPictureWindow 相当のダミーオブジェクトで解決)を返す。- dom_request_pointer_lock
element.requestPointerLock()(Pointer Lock API。丸ごと未対応だった)。
requestFullscreen/fullscreenElement と全く同じ「実際のロック/画面占有
までは行わず状態のみ追跡する」簡略方針(pointerlockchange イベントは
対象外)。- element_scroll_into_view 🔒
- is_window_shared_event_type 🔒
document.addEventListener/removeEventListener/dispatchEvent が
window と共有する固定イベント種別の集合(window_add_event_listenerの
match armと同じ)。- make_abort_error 🔒
AbortSignal 用の既定の中断理由(DOMException("AbortError") の簡易近似)。- make_dom_exception 🔒
DOMException インスタンスを構築する共通ヘルパー。AbortController. abort() 等、エンジン内部で例外を作る箇所からも再利用する(詳細は
dom_exception_ctor 参照)。- ni_pointer_before 🔒
- ni_ref_idx 🔒
- ni_root_idx 🔒
- ni_set_state 🔒
- node_iterator_next_node 🔒
NodeIterator.prototype.nextNode()。- node_iterator_previous_node 🔒
NodeIterator.prototype.previousNode()。- node_iterator_step_next 🔒
- pre-order で
idx の次のノード(root 部分木の範囲内)。 - push_window_listener 🔒
- window の隠し props 配列(ObjKind::Array)へリスナを追記する。
scroll/popstate など、eval をまたいで永続させたいリスナの保存に使う
(Interp ローカルだと eval 毎に破棄されるため window オブジェクトに退避)。
エントリは
addEventListener の {signal} 対応(2026-07-14 発見・実装)
のため [cb, signal] 形式で格納する(event_target_* 系の [cb, once, signal] と同系統。window 系イベントには once 概念が無いためこちら
は2要素)。window_listeners(interp.rs)/_message_listeners/
_error_listeners の発火経路側で event_target_listener_cb/
window_listener_aborted を使って読み解く。 - report_error 🔒
reportError(error)(丸ごと未対応だった。未捕捉例外と同じ経路で
window.onerror(レガシー5引数シグネチャ)/
window.addEventListener('error', fn)(ErrorEvent 風オブジェクト)へ
同期的に通知する。仕様上のイベントループ経由の非同期報告・
event.preventDefault() によるコンソール抑制は簡略化し、常に
console.error へも出力する)。- screen_orientation_lock 🔒
screen.orientation.lock(orientation)(Screen Orientation API。丸ごと
未対応だった)。実際にディスプレイの向きを固定する機構は無いため、
fullscreenElement 等と同じ「要求された値へ type を書き換えるだけ」の
簡略実装。- screen_orientation_unlock 🔒
screen.orientation.unlock()(対をなす解除メソッド。丸ごと未対応
だった)。現在のビューポート寸法から求めた自然な向きへ type を戻す
(window.screen 初期化時の判定ロジックと同じ)。- tree_walker_first_child 🔒
TreeWalker.prototype.firstChild()。- tree_walker_last_child 🔒
TreeWalker.prototype.lastChild()。- tree_walker_next_node 🔒
TreeWalker.prototype.nextNode()。文書順で次のノードへ移動する(root
を越えない)。- tree_walker_next_sibling 🔒
TreeWalker.prototype.nextSibling()。- tree_walker_parent_node 🔒
TreeWalker.prototype.parentNode()。- tree_walker_previous_node 🔒
TreeWalker.prototype.previousNode()。- tree_walker_previous_sibling 🔒
TreeWalker.prototype.previousSibling()。- tw_current_idx 🔒
- tw_root_idx 🔒
- tw_set_current 🔒
- window_add_event_listener 🔒
- window.addEventListener(‘load’|‘DOMContentLoaded’, cb) → load は即時発火。
‘scroll’ は window の隠し props
_scroll_listeners、‘popstate’ は _popstate_listeners、
‘hashchange’ は _hashchange_listeners、‘resize’ は _resize_listeners
配列へ永続記録(該当イベント発生時にホストが発火)。 - window_close 🔒
window.close()(丸ごと未対応だった。理由はwindow_openと同じ)。
この処理系にはウィンドウを閉じる操作自体が無いため無害な no-op
(window.print()と同方針)。- window_confirm 🔒
window.confirm(message)(丸ごと未対応だった。window.alertはconsole_ logで無害に代替されていたが、対になるconfirm/prompt自体がグローバル
にもwindowにも一切登録されておらず、呼び出すとReferenceError/
TypeErrorになっていた。2026-07-16 発見・実装)。この処理系にはブロッキング
モーダルダイアログ機構が無いため、メッセージをconsole_logと同じ経路へ
出力したうえで、常に「OK」を選択したものとしてtrueを返す(alertと
同じ「実際のUIは出さないが呼び出し自体は安全に完了させる」簡略方針)。- window_dispatch_event 🔒
window.dispatchEvent(event)(丸ごと未対応だった。window オブジェクトに
addEventListener/removeEventListener はあったが dispatchEvent 自体が
存在せず、window.dispatchEvent(new HashChangeEvent(...)) のような JS 側
からのイベントシミュレーションが一切できなかった。window_add_event_ listener が対応する6種の固定イベント種別(scroll/popstate/
hashchange/resize/message/error)に限り、対応する隠し配列
(push_window_listenerが書き込む先)からリスナを読み出し、渡された
event オブジェクトをそのまま転送して呼び出す(fire_window_listeners
のような独自 Event 再構築は行わず、JS 側が構築した実際のオブジェクトを
そのまま渡す)。対応外の種別は無害に無視する(addEventListener側の
未対応種別の扱いと同じ)。window.onerror(report_error側で既に
対応済み)と同様に、window.on<type>(window.onhashchange = fn等の
IDL属性スタイルのハンドラ)が設定されていればそれも合わせて呼び出す。- window_focus 🔒
window.focus()/.blur()(丸ごと未対応だった。理由はwindow_openと
同じ)。この処理系にはウィンドウ/タブという概念自体が無く(
document.hasFocus()が常にtrue固定なのと同じ理由)、フォーカス要求
先も存在しないため無害な no-op。- window_listener_aborted 🔒
push_window_listener の格納エントリ [cb, signal] の signal が
abort 済みかどうか。- window_match_media 🔒
- window_open 🔒
window.open(url, target, features)(丸ごと未対応だった。confirm/
promptと同じ監査で発見。typeof window.open === 'function'という
定番のフィーチャー検出ガードや、ポップアップを試みるコードが
TypeErrorで丸ごと落ちる状態だった。2026-07-16 発見・実装)。この処理系
には複数ウィンドウ/ポップアップを新規に開く仕組みが無いため、実際には
何も開かず、仕様上「開けなかった(ポップアップブロック等)」場合と
同じnullを返す誠実な簡略実装(ブラウザのポップアップブロッカーが
window.open()を拒否した場合の正規の戻り値と同じ形)。- window_post_message 🔒
window.postMessage(data, targetOrigin)(丸ごと未対応だった)。詳細は
window.props.insert("postMessage", ...) 箇所のコメント参照。- window_prompt 🔒
window.prompt(message, default)(丸ごと未対応だった。理由はwindow_ confirmと同じ)。default引数があればそれをそのまま返す(ユーザーが
何も変更せず「OK」を押した相当)。無指定時は仕様どおりnull。- window_remove_event_listener 🔒
window.removeEventListener(type, cb)(丸ごと未対応だった。以前は
無害な domNoop のままで、window.addEventListener で登録した
リスナが AbortSignal 経由以外では二度と解除できないバグだった)。
window_add_event_listener と同じ6種の固定イベント種別に限り対応する
隠し配列から、参照が一致するエントリを取り除く(event_target_remove_ event_listener と同じ Rc::ptr_eq 比較パターン)。- window_scroll_by 🔒
window.scrollBy(x, y)(丸ごと未対応だった。dom_noopのまま何もせず、
相対スクロールが一切機能しなかった。2026-07-16 発見・実装)。複数回
呼ばれた場合は次の描画までの分を加算する。- window_scroll_to 🔒
window.scrollTo(x, y)/window.scroll(x, y)(丸ごと未対応だった。以前は
SCROLL_Y という孤立した static へ書き込むだけの実装で、window. scrollY(fire_scroll経由でレンダラが更新する別経路)にも実際の描画位置
にも一切反映されない死んだ経路だった。2026-07-16 発見・修正)。
DomBridge::pending_scroll_abs_yへ保留し、render.rsのdraw()冒頭で
消費・WebEngine::scroll_yへ適用・fire_scroll()呼び出しまで行う。- window_stop 🔒
window.stop()(丸ごと未対応だった。ブラウザの「読み込み中止」ボタン
に相当する定番API。2026-07-17 発見)。この処理系はページ全体を同期的に
パースしてから<script>を実行するため、途中で中断できる非同期の
読み込み処理自体が無く、window.close/.printと同じ無害なno-op。