Initial commit: RHINE LAB · ANALYSIS OS:三维界面与动效实验(本仓库不含个人归档索引数据)
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
<!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>
|
||||
Reference in New Issue
Block a user