code wiki / _hdl_build / nx_browser_forms_focus_gate.nx
nx_browser_forms_focus_gate.nx source
↩ module page · 89 lines · 5112 B
1import "nx_gate_base.nx"
2// nx_browser_forms_focus_gate.nx -- proves the synthetic form LAYOUT + click-to-FOCUS: bf_layout_fields
3// gives each visible field a rect (hidden -> none), and br_hit_input maps a click to the right field (or
4// -1 outside). Paint (bf_paint_field) uses the SAME rects, so what you see is what you click. GREEN iff
5// 7/7. This is the headlessly-verifiable half of the focus rung; the X11 keypress plumbing composes it on
6// a live display. license_tier: ORIGINAL
7import "nx_browser_forms.nx"
8import "nx_syscalls.nx"
9
10func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
11" as *u8); return ok }
12func gwn(v: i64) -> i64 { var m: i64=v; if m<0 {gw("-" as *u8);m=0-m} let t: *u8=sys_mmap(24); var k: i64=0; if m==0 {t[0]=48 as u8;k=1} while m>0 {t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} let o: *u8=sys_mmap(24); var i: i64=0; while i<k {o[i]=t[k-1-i];i=i+1} sys_write(1,o,k); return 0 }
13func gcell(ok: i64, id: *u8, txt: *u8) -> i64 { if ok==1 {gw(" PASS " as *u8)} else {gw(" FAIL " as *u8)} gw(id); gw(" " as *u8); gw(txt); gw("\n" as *u8); return ok }
14
15func main() -> i64 {
16 gw("=== NX-BROWSER-FORMS-FOCUS-GATE -- synthetic field layout + click-to-focus (headless) ===\n" as *u8)
17 let h1: *u8 = "<form method=post action=/admin/login><input type=hidden name=ui value=1><input name=handle><input name=passphrase type=password></form>" as *u8
18 var hl: i64 = 0
19 while h1[hl] != (0 as u8) { hl = hl + 1 }
20 let forms: *BrForm = sys_mmap(NX_BRFORM_BYTES * 4) as *BrForm
21 let fields: *BrField = sys_mmap(NX_BRFIELD_BYTES * 8) as *BrField
22 let nf: i64 = bf_parse(h1, hl, forms, 4, fields, 8)
23 // layout: x0=20, y0=100, width=300, row height=28 (gap 6)
24 let used: i64 = bf_layout_fields(forms, 0, fields, 20, 100, 300, 28)
25 let f_ui: *BrField = bf_field(fields, 0)
26 let f_h: *BrField = bf_field(fields, 1)
27 let f_p: *BrField = bf_field(fields, 2)
28 var pass: i64 = 0
29
30 // F1: hidden ui field gets NO rect
31 var t1: i64 = 0
32 if f_ui.fh == 0 { t1 = 1 }
33 pass = pass + gcell(t1, "F1" as *u8, "hidden field (ui) gets NO rect (fh=0): not shown, not clickable" as *u8)
34
35 // F2: handle is the FIRST visible field at (20,100,300,28)
36 var t2: i64 = 0
37 if f_h.fx == 20 { if f_h.fy == 100 { if f_h.fw == 300 { if f_h.fh == 28 { t2 = 1 } } } }
38 pass = pass + gcell(t2, "F2" as *u8, "handle laid out first at (20,100,300,28)" as *u8)
39
40 // F3: passphrase stacks below handle at y = 100 + 28 + 6 = 134
41 var t3: i64 = 0
42 if f_p.fy == 134 { t3 = 1 }
43 pass = pass + gcell(t3, "F3" as *u8, "passphrase stacks below at y=134 (row+gap)" as *u8)
44
45 // F4: click inside the handle rect -> handle (idx 1)
46 var t4: i64 = 0
47 if br_hit_input(forms, 0, fields, 100, 110) == 1 { t4 = 1 }
48 pass = pass + gcell(t4, "F4" as *u8, "click (100,110) inside handle -> focus field 1 (handle)" as *u8)
49
50 // F5: click inside passphrase rect -> passphrase (idx 2)
51 var t5: i64 = 0
52 if br_hit_input(forms, 0, fields, 100, 140) == 2 { t5 = 1 }
53 pass = pass + gcell(t5, "F5" as *u8, "click (100,140) inside passphrase -> focus field 2 (passphrase)" as *u8)
54
55 // F6: click BELOW all fields -> -1 (no focus)
56 var t6: i64 = 0
57 if br_hit_input(forms, 0, fields, 100, 300) == (0 - 1) { t6 = 1 }
58 pass = pass + gcell(t6, "F6" as *u8, "click (100,300) below all fields -> -1 (miss is real)" as *u8)
59
60 // F7: click LEFT of the fields (x=5 < x0=20) -> -1; and the gap between fields (y=131) -> -1
61 var t7: i64 = 0
62 var a: i64 = 0
63 var b: i64 = 0
64 if br_hit_input(forms, 0, fields, 5, 110) == (0 - 1) { a = 1 }
65 if br_hit_input(forms, 0, fields, 100, 131) == (0 - 1) { b = 1 }
66 if a == 1 { if b == 1 { t7 = 1 } }
67 pass = pass + gcell(t7, "F7" as *u8, "click left of fields (x=5) AND in the inter-field gap (y=131) -> -1" as *u8)
68
69 // F8: the submit button is laid out BELOW the two fields (y = 100 + 28+6 + 28+6 = 168)
70 let fm0: *BrForm = bf_form(forms, 0)
71 var t8: i64 = 0
72 if fm0.sy == 168 { if fm0.sh == 28 { t8 = 1 } }
73 pass = pass + gcell(t8, "F8" as *u8, "submit button laid out below the fields at y=168" as *u8)
74
75 // F9: a click on the submit button -> br_hit_submit==1 (and NOT a field)
76 var t9: i64 = 0
77 if br_hit_submit(forms, 0, 40, 176) == 1 { if br_hit_input(forms, 0, fields, 40, 176) == (0 - 1) { t9 = 1 } }
78 pass = pass + gcell(t9, "F9" as *u8, "click (40,176) on submit -> br_hit_submit=1 (and no field focus): the login fires" as *u8)
79
80 // F10: a click NOT on the submit button -> 0
81 var t10: i64 = 0
82 if br_hit_submit(forms, 0, 40, 110) == 0 { t10 = 1 }
83 pass = pass + gcell(t10, "F10" as *u8, "click on a field (not the button) -> br_hit_submit=0 (no accidental submit)" as *u8)
84
85 gw("NX-BROWSER-FORMS-FOCUS-GATE pass=" as *u8); gwn(pass); gw("/10 verdict=" as *u8)
86 if pass == 10 { gw("GREEN (fields+submit laid out; click focuses the right field OR fires submit; paint uses the same rects = WYSIWYC)\n" as *u8); sys_exit(0); return 0 }
87 gw("RED\n" as *u8); sys_exit(1)
88 return 1
89}