Files
lsky-pro-docker/test
mole404 90e151eef0 feat: 长按阈值 500→250ms;入口脚本改为每次启动强制同步代码进已有卷
老师的两个要求:

1) 长按 0.5s 偏长 → LONG_PRESS_DELAY 减半到 250ms。
   - 配套保留「手指移动 >10px 即取消」,用来抵消阈值变短带来的误触风险
   - blade 的资源版本串递增为 ?v=ios-longpress2,击穿 Safari 的启发式缓存
     (否则老浏览器还在用 500ms 那份 JS)
   - test/ 增加两个阈值回归用例(320ms 必须触发、160ms 必须不触发)

2) 升级不再需要人工 cp 文件:entrypoint.sh 在「已有部署」分支里每次启动都把
   镜像代码同步进卷(tar 覆盖式),并自动清掉编译视图缓存。
   - 绝不覆盖:.env / database/(SQLite)/ storage/(上传·日志·会话)/
     bootstrap/cache/ / public/i —— 这五项是站点数据与配置,不是镜像代码
   - Dockerfile 增加静态护栏:排除清单少一项就构建失败
   - CI 新增「Verify forced code sync」步骤:模拟已有部署的卷(塞旧代码 +
     .env/数据库/上传/编译缓存的哨兵文件),断言代码被更新、数据一项没被碰;
     不过就 exit 1,不会 promote 到 latest
   - README 重写升级/回滚章节并写明代价:手工改卷里的代码会失效、回滚必须连镜像一起回滚

自证:本地仿真 9/9(代码更新 + 五项数据保全)、jsdom 行为测试 25/25、
patch 能干净打到上游 911275c、Dockerfile 全部断言 grep 命中。
2026-09-28 18:24:08 +08:00
..

补丁行为测试(node + jsdom)

没有 iPhone 也能先把补丁的每条分支跑一遍:用真实的 DOM + jQuery 事件复刻 resources/views/user/images.blade.php 的用法,验证"只在 iOS 生效、其它平台一行新代码都不执行"。

运行

cd test
npm install
npm test                       # 测 ../overlay/context-js.js
node longpress.test.mjs /path/to/other/context-js.js   # 测指定的文件(例如未打补丁的原版)

覆盖到的用例

  • iPhone Safari:长按 500ms 弹出图床自己的菜单;内容包含"图片操作/复制链接";beforeOpen / afterOpen 回调照旧被调用并拿到元素与菜单节点;菜单用触摸坐标定位;注入了 -webkit-touch-callout 抑制样式;抬手补发的 click 被吞掉(不会误开图片预览);时间窗过后的正常点击照旧生效
  • 取消条件:手指移动 >10px(滚动/框选)、多指触摸、短按(<500ms 抬手)都不触发菜单
  • iPad 请求桌面网站(UA 伪装成 Mac、maxTouchPoints=5):仍走长按分支
  • Mac(含苹果 M 系列)(MacIntel 但 maxTouchPoints=0):不触发长按,右键 contextmenu 照旧
  • Android Chrome:长按不触发新分支、不注入 iOS 样式,contextmenu 照旧打开菜单且阻止浏览器默认菜单
  • Windows 桌面:只有右键路径,连续右键仍能开菜单(去重窗口不误伤)

已知局限

  • jsdom 没有排版引擎(元素高度恒为 0),所以只校验菜单的 left 与数值型 top,真实定位要靠真机
  • 原生 callout 是否真的被压掉、touchend 的 preventDefault 是否真的省掉了原生 click,这些属于浏览器行为,必须真机验证(本测试只能证明代码路径与事件处理逻辑正确)