code wiki / _hdl_build / nx_browser_forms.nx

nx_browser_forms.nx

buildroot/runtime/_hdl_build/nx_browser_forms.nx

15832 B325 linesdepth 3pulls 4 transitivereach 5 importersview sourcekind tooltopic browser
docsdependenciesstructsconstsfunctions

about

nx_browser_forms.nx -- the SOVEREIGN Nishi-browser FORM model: parse <form>/<input>/<textarea> from a rendered page, hold each field's EDITABLE value, and on submit produce the exact HTTP request (method + action + application/x-www-form-urlencoded body). This is the load-bearing browser-core rung that makes the nishi-first no-JS portals (docportal/mail/siteedit login + editor) ACTUALLY OPERABLE in the Nishi browser (operator 2026-07-05 doctrine: nishi os/browser FIRST). PURE bytes-in/values-out -- no X11, no paint -- so it is fully gate-provable (nx_browser_forms_gate); the render (draw input boxes + caret) and the live keyboard/click wiring COMPOSE this core. Reuses the shipped HTML tokenizer + DOM attr finder (rule 15 DRY, same as br_extract). license_tier: ORIGINAL

dependencies 3 imports · 4 importers

nx_syscalls.nx nx_html_tokenizer.nx nx_dom_query.nx nx_browser_forms.nx nx_browser_forms_e2e_gate.nx nx_browser_forms_focus_gate.nx nx_browser_forms_gate.nx nx_browser_forms_paint.nx

imports: nx_syscalls.nxnx_html_tokenizer.nxnx_dom_query.nx

imported by: nx_browser_forms_e2e_gate.nxnx_browser_forms_focus_gate.nxnx_browser_forms_gate.nxnx_browser_forms_paint.nx

call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown

main sys_mmap bf_parse sys_mmap ↻ nx_html_cursor_init nx_html_next_token _scan_name _is_name _is_void_element _lc bf_field bf_ci_eq bf_form nx_dom_find_attr _dq_strlen _dq_find_substr_ci _dq_byte_eq_ci _dq_lc bf_copy sys_mmap ↻ bf_submit_body bf_form ↻ bf_field ↻ bf_urlenc sys_write

structs

21struct BrField
35struct BrForm

consts

12const BF_MAGIC_65536: i64 = 65536
13const BF_MAGIC_4096: i64 = 4096
14const BF_MAGIC_131072: i64 = 131072
16const BF_K_TEXT: i64 = 0 // <input> text/other
17const BF_K_HIDDEN: i64 = 1 // <input type=hidden>
18const BF_K_TEXTAREA: i64 = 2 // <textarea>
19const BF_K_PASSWORD: i64 = 3 // <input type=password>
33const NX_BRFIELD_BYTES: i64 = 80
46const NX_BRFORM_BYTES: i64 = 72

functions

48func bf_field(fields: *BrField, i: i64) -> *BrField { return ((fields as i64) + i * NX_BRFIELD_BYTES) as *BrField }
49func bf_form(forms: *BrForm, i: i64) -> *BrForm { return ((forms as i64) + i * NX_BRFORM_BYTES) as *BrForm }
52func bf_copy(html: *u8, off: i64, len: i64) -> *u8
called by 1: bf_parse calls 1: sys_mmap
60func bf_ci_eq(html: *u8, off: i64, len: i64, lit: *u8) -> i64
called by 1: bf_parse
76func bf_parse(html: *u8, hlen: i64, forms: *BrForm, maxf: i64, fields: *BrField, maxfld: i64) -> i64
177func bf_layout_fields(forms: *BrForm, fi: i64, fields: *BrField, x0: i64, y0: i64, fw: i64, rh: i64) -> i64
called by 1: main calls 2: bf_formbf_field
204func br_hit_submit(forms: *BrForm, fi: i64, dx: i64, dy: i64) -> i64
called by 1: main calls 1: bf_form
212func br_hit_input(forms: *BrForm, fi: i64, fields: *BrField, dx: i64, dy: i64) -> i64
called by 1: main calls 2: bf_formbf_field
227func bf_type(fld: *BrField, ch: i64) -> i64 { if fld.val_len < fld.val_cap - 1 { fld.val[fld.val_len] = ch as u8; fld.val_len = fld.val_len + 1 } return 0 }
called by 1: bf_set
228func bf_backspace(fld: *BrField) -> i64 { if fld.val_len > 0 { fld.val_len = fld.val_len - 1 } return 0 }
230func bf_set(fld: *BrField, s: *u8) -> i64 { fld.val_len = 0; var i: i64 = 0; while s[i] != (0 as u8) { bf_type(fld, s[i] as i64); i = i + 1 } return 0 }
called by 3: mainmainmain calls 1: bf_type
234func bf_urlenc(src: *u8, n: i64, out: *u8, o: i64) -> i64
called by 1: bf_submit_body
263func bf_submit_body(forms: *BrForm, fi: i64, fields: *BrField, out: *u8) -> i64
279func bf_cats(out: *u8, o: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){out[o+i]=s[i];i=i+1} return o+i }
called by 1: bf_submit_request
280func bf_catn(out: *u8, o: i64, v: i64) -> i64 { if v==0 {out[o]=48 as u8; return o+1} let t: *u8=sys_mmap(24); var m: i64=v; var k: i64=0; while m>0 {t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k {out[o+i]=t[k-1-i];i=i+1} return o+k }
called by 1: bf_submit_request calls 1: sys_mmap
286func bf_submit_request(host: *u8, hostlen: i64, forms: *BrForm, fi: i64, fields: *BrField, out: *u8) -> i64
310func main() -> i64