fix(payment): 导入提示的条目列表改用 <ul> 承载,圆点不再越出文字边界

四条导入提示里的 <li> 原先裸挂在 <div class="aksrt-submsg"> 下,没有列表容器:
list-style-position 默认 outside,圆点画在内容盒左侧的 padding 区里,而 <li>
自身没有 padding,于是圆点溢出到提示块的文字边界之外(真实后台 CSS 下实测 −8px,
视觉上紧贴提示块左侧色条)。

改动:
- 四条提示的 <li> 各用一个 <ul class="aksrt-submsg-list"> 包起来(同时修掉
  <li> 缺少列表父元素的非法标记)。
- .aksrt-submsg-list 显式声明 margin / padding-left / list-style,不依赖 UA
  或后台对 ul 的默认值,避免别处的重置再次把圆点挤出去。
- 新增契约用例:提示内的 <li> 必须在 <ul class="aksrt-submsg-list"> 中、标签成对、
  每条提示只有一个列表容器,且该类的 CSS 必须带 padding-left 与 list-style。

实测(真实 Chrome + 真实后台 common/forms/list-tables CSS):圆点左缘由
「文字边界 −8px(溢出)」变为「文字边界 +12px(界内)」,条目文字缩进 20px。
This commit is contained in:
2026-09-17 12:28:09 +08:00
parent d787f3ff97
commit 1e5286d36b
2 changed files with 39 additions and 0 deletions
@@ -239,6 +239,33 @@ test('导入提示不得使用 WP 的 .notice 类(否则被 common.js 搬到
assert.match(page, /class="notice notice-error"/, '页面级错误通知仍应使用 notice');
});
test('导入提示的条目列表由 <ul> 承载,圆点不越出文字边界', () => {
// list-style-position 默认 outside:圆点画在内容盒左侧的 padding 区里。
// <li> 若没有列表容器提供缩进(历史上的写法是裸 <li> 直接挂在 div 下),
// padding 区为空,圆点就会溢出到提示块的文字边界之外。
const calls = extractCalls(page, '->submessage_row(');
assert.ok(calls.length >= 4, '未解析到足够的 submessage_row 调用:' + calls.length);
let checked = 0;
for (const call of calls) {
const opens = [...call.text.matchAll(/<li>/g)].length;
if (!opens) continue;
checked++;
assert.match(
call.text,
/<ul class="aksrt-submsg-list">/,
'提示内的 <li> 必须包在 <ul class="aksrt-submsg-list"> 中'
);
assert.equal([...call.text.matchAll(/<ul class="aksrt-submsg-list">/g)].length, 1, '每条提示只应有一个条目列表');
assert.equal(opens, [...call.text.matchAll(/<\/li>/g)].length, '<li> 标签必须成对');
assert.equal([...call.text.matchAll(/<\/ul>/g)].length, 1, '</ul> 必须成对');
}
assert.equal(checked, 4, '四条导入提示都应带条目列表');
assert.match(page, /\.aksrt-submsg-list \{[^}]*padding-left:/, '.aksrt-submsg-list 必须给出 padding-left,圆点才有落点');
assert.match(page, /\.aksrt-submsg-list \{[^}]*list-style:\s*disc/, '.aksrt-submsg-list 应显式声明圆点样式,不依赖 UA 默认值');
});
test('行内脚本不再保留解析期的空操作求值(死代码)', () => {
assert.doesNotMatch(script, /evalDeps\(\);\s*\}\)\(\);/);
assert.match(script, /document\.addEventListener\('change'/);