Initial commit: RHINE LAB · ANALYSIS OS:三维界面与动效实验(本仓库不含个人归档索引数据)
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
import {createServer} from 'node:http';
|
||||
import {readFile,mkdir,writeFile} from 'node:fs/promises';
|
||||
import {resolve,extname} from 'node:path';
|
||||
import {createRequire} from 'node:module';
|
||||
import assert from 'node:assert/strict';
|
||||
const {chromium}=createRequire(import.meta.url)(process.env.PLAYWRIGHT_MODULE||'playwright');
|
||||
const server=createServer(async(req,res)=>{try{let path=new URL(req.url,'http://localhost').pathname;if(path==='/')path='/index.html';let data=await readFile(path==='/wallpaper.jpg'?'reference/extracted-3088099655/wallpaper-2.jpg':resolve('release/wallpaper'+path));if(path.endsWith('.html'))data=Buffer.from(data.toString().replace('</head>',`<script>wallpaperPropertyListener.applyUserProperties({hudparallax:{value:true},huddepth:{value:20},hudtracking:{value:true},load3donstartup:{value:false},boot:{value:false},desktopmode:{value:'workbench'},sound:{value:false},music:{value:false}})</script></head>`));res.setHeader('Content-Type',({'.js':'text/javascript','.css':'text/css','.html':'text/html'})[extname(path)]||'application/octet-stream');res.end(data)}catch{res.statusCode=404;res.end()}});await new Promise(r=>server.listen(5186,'127.0.0.1',r));
|
||||
const browser=await chromium.launch({channel:'msedge',headless:true});
|
||||
try{const page=await browser.newPage({viewport:{width:1600,height:900}}),errors=[];page.on('pageerror',e=>errors.push(e.message));await page.goto('http://127.0.0.1:5186/');await page.waitForFunction(()=>window.rhine?.stats().ready);await page.locator('[data-wb-lane="3"]').click();
|
||||
await page.evaluate(()=>{window.rhineWallpaperMedia={properties:{title:'Dive',artist:'Olivia Dean'},timeline:{position:59,duration:203},playing:true};window.dispatchEvent(new Event('rhine-wallpaper-media'))});
|
||||
await page.waitForTimeout(550);await page.evaluate(()=>{window.mediaTitle=document.querySelector('.wb-media h3');window.mediaReel=mediaTitle.firstChild;window.rhineWallpaperMedia.timeline.position=60;window.dispatchEvent(new Event('rhine-wallpaper-media'))});
|
||||
assert.equal(await page.evaluate(()=>mediaTitle===document.querySelector('.wb-media h3')&&mediaReel===mediaTitle.firstChild),true);
|
||||
await page.evaluate(()=>{rhineWallpaperMedia.properties={title:'A New Song',artist:'Another Artist'};window.dispatchEvent(new Event('rhine-wallpaper-media'))});await page.waitForTimeout(550);assert.equal(await page.evaluate(()=>mediaTitle===document.querySelector('.wb-media h3')),true);
|
||||
const mediaMotion=[];for(const title of ['Dive','888999','Wide letters WWW','Thin letters iii','Another Artist - Song']){await page.evaluate(title=>{rhineWallpaperMedia.properties={title,artist:title+' Artist'};window.dispatchEvent(new Event('rhine-wallpaper-media'))},title);await page.waitForTimeout(120);mediaMotion.push({title,active:await page.locator('.wb-media h3').evaluate(el=>el.getAnimations({subtree:true}).filter(a=>a.playState==='running').length)});await page.waitForTimeout(550)}assert.ok(mediaMotion.every(s=>s.active>0));
|
||||
await page.evaluate(()=>{rhineWallpaperMedia.properties={title:'A very long media title that must end with an ellipsis instead of being cut off at the edge of the player',artist:'Artist'};window.dispatchEvent(new Event('rhine-wallpaper-media'))});await page.waitForTimeout(550);assert.ok((await page.locator('.wb-media h3 .rn-value').textContent()).endsWith('…'));assert.ok((await page.locator('.wb-media h3').getAttribute('title')).includes('player'));
|
||||
assert.ok(await page.locator('.wb-clock').evaluate(el=>el.children.length>0));assert.ok(await page.locator('#clock').evaluate(el=>el.children.length>0));const clockMotion=await page.evaluate(async()=>{const samples=[];for(let i=0;i<35;i++){const el=document.querySelector('#clock');samples.push({text:el.getAttribute('aria-label'),running:el.getAnimations({subtree:true}).filter(a=>a.playState==='running').length});await new Promise(r=>setTimeout(r,60))}return samples});assert.ok(clockMotion.some(s=>s.running>0));assert.ok(new Set(clockMotion.map(s=>s.text)).size>1);assert.equal(await page.locator('#clock > .rn-root').count(),3);
|
||||
await page.evaluate(()=>{const NativeDate=window.Date;window.clockNativeDate=NativeDate;window.clockTestValue=new NativeDate(2026,8,11,12,59,59).getTime();window.Date=class extends NativeDate{constructor(...args){super(...(args.length?args:[window.clockTestValue]))}}});
|
||||
await page.waitForFunction(()=>document.querySelector('#clock').getAttribute('aria-label')==='12:59:59');await page.waitForTimeout(500);
|
||||
const digitMotion=[];for(const sec of [0,1,2,3,4,5,6,7,8,9,10]){await page.evaluate(sec=>{window.clockTestValue=new clockNativeDate(2026,8,11,12,59,sec).getTime()},sec);await page.waitForFunction(sec=>document.querySelector('#clock').getAttribute('aria-label')===`12:59:${String(sec).padStart(2,'0')}`,sec);await page.waitForTimeout(120);const state=await page.locator('#clock > span:last-child').evaluate(el=>({active:el.getAnimations({subtree:true}).filter(a=>a.playState==='running').length,reels:[...el.querySelectorAll('.rn-reel')].map(e=>({transform:getComputedStyle(e).transform,faces:e.textContent}))}));digitMotion.push({sec,...state});await page.waitForTimeout(550)}assert.ok(digitMotion.every(s=>s.active>0));
|
||||
await page.evaluate(()=>{window.clockTestValue=new clockNativeDate(2026,8,11,13,0,0).getTime()});await page.waitForFunction(()=>document.querySelector('#clock').getAttribute('aria-label')==='13:00:00'&&document.querySelector('#clock').getAnimations({subtree:true}).some(a=>a.playState==='running'));await page.evaluate(()=>{window.Date=window.clockNativeDate});
|
||||
await page.evaluate(()=>{wallpaperPropertyListener.applyUserProperties({reduced:{value:true}});rhineWallpaperMedia.properties={title:'Final Song',artist:'Final Artist'};window.dispatchEvent(new Event('rhine-wallpaper-media'))});
|
||||
await mkdir('verification/workbench-rolling',{recursive:true});await page.evaluate(()=>wallpaperPropertyListener.applyUserProperties({customwallpaper:{value:true},customwallpaperfile:{value:'http://127.0.0.1:5186/wallpaper.jpg'},customwallpapermask:{value:0},uifrost:{value:true},colortheme:{value:'light'}}));await page.waitForFunction(()=>document.querySelector('#stage').dataset.customWallpaperVisible==='true');await page.waitForTimeout(800);await page.screenshot({path:'verification/workbench-rolling/media.png'});
|
||||
await page.locator('[data-wb-lane="4"]').click();assert.ok(await page.locator('.wb-timer-digits').count());await page.locator('[data-wb-timer="toggle"]').click();await page.waitForTimeout(1200);assert.ok(await page.locator('.wb-timer-digits').evaluate(el=>el.children.length>0));assert.deepEqual(errors,[]);await writeFile('verification/workbench-rolling/results.json',JSON.stringify({retainedMediaNode:true,retainedUnchangedReel:true,clockReels:true,longTitleEllipsis:true,digitMotion,mediaMotion,footerNumericReels:3,footerRunningAnimation:true,footerHourCarry:true,focusReels:true,reducedMotion:true,errors},null,2));console.log('Clock, media identity/progress/track changes, focus timer and reduced motion passed.');
|
||||
}finally{await browser.close();server.close()}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user