Files
rhinelab-ui/reference/document-decryption-check.html

52 lines
3.5 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<meta charset="utf-8">
<title>文档同步解密 · 验证</title>
<style>body{background:#e8e5e1;color:#252820;font:14px system-ui;margin:24px}iframe{width:960px;height:540px;border:0}pre{white-space:pre-wrap}button{padding:10px 20px}</style>
<h1>文档同步解密</h1>
<button id="replay">重新体验</button>
<pre id="result">正在验证遮挡、同步揭示和页签切换…</pre>
<iframe id="app" src="/?scene=detail"></iframe>
<script type="module">
const app=document.querySelector('#app'), result=document.querySelector('#result'), checks=[];
const wait=async test=>{const start=performance.now();while(!test()){if(performance.now()-start>45000)throw Error('等待超时');await new Promise(r=>setTimeout(r,16))}};
const check=(name,value)=>{checks.push({name,passed:!!value});if(!value)throw Error(name)};
const sleep=ms=>new Promise(r=>setTimeout(r,ms));
document.querySelector('#replay').onclick=async()=>{const api=app.contentWindow.rhine;api.archive();await sleep(600);api.detail()};
try{
await wait(()=>app.contentWindow.rhine?.stats().ready);
const api=app.contentWindow.rhine, doc=app.contentDocument;
const covers=()=>[...doc.querySelectorAll('.document-redaction-ink')];
await wait(()=>api.stats().decryption.phase==='joining');
check('模型合拢时标题、字段、正文完整遮挡',covers().length>8&&covers().every(n=>n.style.transform==='translateX(0%)'));
const body=doc.querySelector('#tab-panel');
const bodyHeight=body.clientHeight;
check('摘要遮挡不会撑出横向滚动',body.scrollWidth===body.clientWidth);
doc.querySelector('[data-tab="notes"]').click();
check('解密中切换页签,新内容仍受遮挡',doc.querySelectorAll('.research-notes .document-redaction-ink').length>0);
const rows=[...doc.querySelectorAll('.research-notes li')];
const positions=rows.map(n=>n.getBoundingClientRect().top);
await wait(()=>api.stats().decryption.phase==='revealing');
await wait(()=>covers().some(n=>parseFloat(n.style.transform.slice(11))>5));
check('模型清晰揭示触发文字错峰退开',covers().some(n=>n.style.transform!==covers()[0].style.transform));
check('退开时正文布局稳定',rows.every((n,i)=>Math.abs(n.getBoundingClientRect().top-positions[i])<.1));
check('揭示过程中正文无横向溢出',body.scrollWidth===body.clientWidth&&body.clientHeight===bodyHeight);
await wait(()=>covers().length===0);
check('动画结束清除所有遮挡且模型清晰',api.stats().decryption.clarity===1);
check('解密前后正文高度不变',body.clientHeight===bodyHeight);
const panel=doc.querySelector('#tab-panel');
doc.querySelector('[data-action="bookmark"]').click();doc.querySelector('[data-action="bookmark"]').click();
check('收藏保留正文节点且不重播',doc.querySelector('#tab-panel')===panel&&covers().length===0);
doc.querySelector('[data-tab="history"]').click();
check('解密后其他页签直接可读',covers().length===0&&doc.querySelector('.log-row'));
api.archive();await sleep(650);api.detail();
await wait(()=>api.stats().decryption.phase==='joining');
check('退出再进入重新遮挡',covers().length>0&&covers().every(n=>n.style.transform==='translateX(0%)'));
api.archive();await sleep(80);api.detail();
await wait(()=>api.stats().decryption.phase==='clear');await wait(()=>covers().length===0);
check('快速退出再进入正常完成',true);
result.textContent=JSON.stringify({passed:true,checks},null,2);
}catch(error){result.textContent=JSON.stringify({passed:false,error:String(error),checks},null,2)}
</script>
</html>