fix(desk): the heid bug-hunt panel on the row controls (round "Slate", 4/4)
- Touch: on a coarse pointer every row control is at least 28px square again (32px), and wipe stands clear of the zip link. The move onto the facts line had dropped the deliberate 28px floor to ~21px, 4-6px from zip; with scripts off no confirm fires, so a mis-tap on wipe is the delete. The zip link no longer breaks between its glyph and its word, and each separator is glued to the item after it. - The wipe dialog shows the name as it should be read: control and bidi formatting characters in an agent-made name show as U+FFFD, so U+202E or a newline cannot rewrite what the operator approves. An unknown data-confirm word now prompts generically instead of submitting unguarded (fail closed). - No page scrolls sideways: `code` wraps anywhere, so a long unbreakable install path in the footer or the empty Desk no longer widens every page. The overflow test now sweeps 390/720/850/1000/1400 with the heaviest row the Desk draws, and compares scrollWidth with the page's own clientWidth. Its first fixture used a hyphenated path, which wrapped by itself; the test passed with the bug present until the path became one unbreakable run. r2_flow.toml: 27/27 proved. 749 passed.
This commit is contained in:
@@ -182,8 +182,64 @@ new = '''
|
||||
[[mutation]]
|
||||
label = "the stacked Desk column is a bare 1fr (content sets its minimum)"
|
||||
file = "booth/templates/base.html"
|
||||
test = "tests/test_flow_browser.py::test_the_desk_never_scrolls_sideways_on_a_phone"
|
||||
test = "tests/test_flow_browser.py::test_the_desk_never_scrolls_sideways_at_any_width"
|
||||
old = '''
|
||||
@media (max-width:1000px){.desk{grid-template-columns:minmax(0,1fr)}}'''
|
||||
new = '''
|
||||
@media (max-width:1000px){.desk{grid-template-columns:1fr}}'''
|
||||
|
||||
[[mutation]]
|
||||
label = "a long unbreakable install path in <code> scrolls the page sideways"
|
||||
file = "booth/templates/base.html"
|
||||
test = "tests/test_flow_browser.py::test_the_desk_never_scrolls_sideways_at_any_width"
|
||||
old = '''
|
||||
padding:1px 6px;border-radius:var(--radius-sm);border:1px solid var(--border-subtle);overflow-wrap:anywhere}'''
|
||||
new = '''
|
||||
padding:1px 6px;border-radius:var(--radius-sm);border:1px solid var(--border-subtle)}'''
|
||||
|
||||
[[mutation]]
|
||||
label = "the row's text column cannot shrink (the 700-1000px window overflows)"
|
||||
file = "booth/templates/base.html"
|
||||
test = "tests/test_flow_browser.py::test_the_desk_never_scrolls_sideways_at_any_width"
|
||||
old = '''
|
||||
.desk-main{flex:1 1 auto;min-width:0}'''
|
||||
new = '''
|
||||
.desk-main{flex:1 1 auto}'''
|
||||
|
||||
[[mutation]]
|
||||
label = "a coarse pointer gets the compact ~21px controls"
|
||||
file = "booth/templates/base.html"
|
||||
test = "tests/test_flow_browser.py::test_on_a_touch_screen_the_row_controls_keep_their_tap_floor"
|
||||
old = '''
|
||||
.desk-facts form button{min-height:32px;min-width:32px;padding:0 10px;margin-left:6px;vertical-align:middle}'''
|
||||
new = '''
|
||||
.desk-facts form button{padding:0 10px;margin-left:6px;vertical-align:middle}'''
|
||||
|
||||
[[mutation]]
|
||||
label = "the zip link may break between its glyph and its word"
|
||||
file = "booth/templates/base.html"
|
||||
test = "tests/test_flow_browser.py::test_on_a_touch_screen_the_row_controls_keep_their_tap_floor"
|
||||
old = '''
|
||||
.desk-facts .dl-link{white-space:nowrap}'''
|
||||
new = '''
|
||||
.desk-facts .dl-link{}'''
|
||||
|
||||
[[mutation]]
|
||||
label = "the wipe dialog shows the agent-made name raw (bidi, newline)"
|
||||
file = "booth/templates/index.html"
|
||||
test = "tests/test_flow_browser.py::test_the_wipe_dialog_shows_what_is_being_wiped_and_never_fails_open"
|
||||
old = '''
|
||||
if (!confirm(word(shown(form.getAttribute('data-booth') || '')))) ev.preventDefault();'''
|
||||
new = '''
|
||||
if (!confirm(word(form.getAttribute('data-booth') || ''))) ev.preventDefault();'''
|
||||
|
||||
[[mutation]]
|
||||
label = "an unknown data-confirm word submits with no prompt (fail open)"
|
||||
file = "booth/templates/index.html"
|
||||
test = "tests/test_flow_browser.py::test_the_wipe_dialog_shows_what_is_being_wiped_and_never_fails_open"
|
||||
old = '''
|
||||
var word = WORDS[form.getAttribute('data-confirm')] || ASK;
|
||||
if (!confirm('''
|
||||
new = '''
|
||||
var word = WORDS[form.getAttribute('data-confirm')];
|
||||
if (word && !confirm('''
|
||||
|
||||
Reference in New Issue
Block a user