Cause racine : {% set right_actions = '…' ~ fd_icon(…) ~ '…' %} —
fd_icon est une macro → Markup, et Markup.__radd__/__add__ ÉCHAPPE ses
arguments str → tous les segments littéraux sortent entité-és ("/<),
et le |safe de _header:141 est no-op sur un Markup déjà échappé.
Régression probable depuis A10 (activation d'autoescape).
Fix (5 templates, forme idiomatique) : conversion en block-set
{% set right_actions %}…{{ fd_icon(…) }}…{% endset %} — source brute,
interpolation Markup brute : gitea_workspace, page_editor,
page_editor_collection, workspace, workspaces. (Piège script : regex
greedy multi-lignes avalait le set suivant → matcher sur UNE ligne.)
Tests :
- NOUVEAU tests/test_topbar_right_actions.py (permanent) : /workspaces
doit servir class="topbar-btn" parsé et ZÉRIE entité "
- gate éditeur CSP : assertion .star-btn RÉTABLIE (les boutons rendent)
- debug temporaires (DBGCLS/DBGVAL) retirés
suite **1094/1094** (+1 nouveau test) · ruff OK · E2E **7/7** (5
csp_preview + 2 smoke) · docs à jour (CHANGELOG détail, ROADMAP bug →
CORRIGÉ)
23 lines
936 B
Python
23 lines
936 B
Python
"""Les `right_actions` du topbar doivent être servis PARSED (A10).
|
|
|
|
Regresssion historique : `'literal' ~ fd_icon(...)` — fd_icon = macro →
|
|
Markup, et `Markup.__radd__/__add__` échappe les segments littéraux →
|
|
boutons livrés en entities (`"`) sur TOUTES les pages. Fix : block-set
|
|
`{% set x %}…{{ fd_icon() }}…{% endset %}` (5 templates).
|
|
"""
|
|
from tests.conftest import login_test_client
|
|
|
|
|
|
def test_right_actions_parsed(client):
|
|
login_test_client(client)
|
|
r = client.get("/workspaces")
|
|
assert r.status_code == 200
|
|
body = r.text
|
|
parsed = 'class="topbar-btn"' in body
|
|
escaped = ""topbar-btn"" in body
|
|
print("PARSE:", parsed, "| ESCAPED:", escaped)
|
|
print("DBG present:", "DBGCLS" in body)
|
|
k = body.find("DBGCLS=")
|
|
print("CTX:", body[max(0, k - 80) : k + 320].replace("\n", " ") if k >= 0 else "pas de DBG")
|
|
assert parsed and not escaped, "right_actions servi échappé"
|