VulpesOS/tools/test-feedback-preview10.py
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

61 lines
4.6 KiB
Python

#!/usr/bin/env python3
"""Check reported Gaia layout, brightness, local homepage and navigation regressions."""
import sys,importlib.util,json,time
from pathlib import Path
sys.path.insert(0,str(Path.cwd()/'tools'))
from marionette_client import Client
spec=importlib.util.spec_from_file_location('probe','tools/probe-desktop.py');p=importlib.util.module_from_spec(spec);spec.loader.exec_module(p)
results={}
with Client(2857) as c:
p.register(c)
def ev(app,code,path='/'):
r=p.evaluate(c,app,code,path);assert 'error' not in r,r;return r.get('value')
def wait(app,code,path='/'):
for _ in range(80):
r=ev(app,code,path)
if r:return r
time.sleep(.15)
raise AssertionError((app,code))
def launch(app,entry=None):
ev('system','await VulpesCompat.call("apps.launch",'+json.dumps({'manifestURL':f'http://{app}.localhost:8765/manifest.webapp',**({'entryPoint':entry} if entry else {})})+');return true;')
wait(app,'return document.readyState==="complete" && !!window.VulpesGaiaUI;')
wait('system','return document.body?.getAttribute("ready-state")==="fullyLoaded";')
ev('system','lockScreen.unlock(true);ScreenManager.turnScreenOn(true);navigator.mozSettings.createLock().set({"screen.timeout":0});return true;')
launch('communications','dialer')
for tab in ['recents','contacts','keypad']:
ident={'recents':'option-recents','contacts':'option-contacts','keypad':'option-keypad'}[tab]
ev('communications',f'document.getElementById("{ident}").click();return true;')
time.sleep(.5)
r=ev('communications','return {scrollY,header:[...document.querySelectorAll("gaia-header")].filter(e=>e.getBoundingClientRect().width>0).map(e=>e.getBoundingClientRect().top)};')
assert r['scrollY']==0,r
results[tab]=r
launch('settings');wait('settings','return typeof require==="function";')
ev('settings','require(["modules/settings_service"],s=>s.navigate("display"));return true;')
wait('settings','return !!document.querySelector("#display.current .brightness-manual input");')
ev('settings','const e=document.querySelector("#display .brightness-manual input");e.value="0.4";e.dispatchEvent(new Event("input",{bubbles:true}));e.dispatchEvent(new Event("change",{bubbles:true}));return true;')
results['brightness']=wait('system','return typeof ScreenManager._userBrightness==="number" && Math.abs(navigator.mozPower.screenBrightness-0.4)<.02 ? {user:ScreenManager._userBrightness,power:navigator.mozPower.screenBrightness}:null;')
results['select']=ev('settings','const e=document.querySelector("#display select"),s=getComputedStyle(e);return {top:s.top,lineHeight:s.lineHeight,padding:s.padding,appearance:s.appearance};')
assert results['select']['top']=='0px',results['select']
launch('video')
results['video']=wait('video','const e=document.querySelector("#overlay-text"),r=e?.getBoundingClientRect();return r?.width>0 ? {left:r.left,right:r.right,width:innerWidth,overflow:e.scrollWidth>e.clientWidth}:null;')
assert results['video']['left']>=0 and results['video']['right']<=results['video']['width'] and not results['video']['overflow'],results['video']
launch('search')
results['browser']=wait('search','return document.querySelector("#vulpes-local-home")?.contentDocument?.querySelector("h1")?.textContent;','/newtab.html')
assert results['browser'] in ['Le Web vous attend.', 'The Web is yours.']
# App layouts must reserve navigation space; Home alone may overlay wallpaper.
for w,h in [(480,844),(844,480)]:
c.execute(f"Services.wm.getMostRecentWindow('vulpes:host').resizeTo({w},{h});")
time.sleep(.3)
launch('settings')
time.sleep(.8)
r=c.execute("const w=Services.wm.getMostRecentWindow('vulpes:host'),s=w.document.getElementById('screen').getBoundingClientRect(),h=w.document.getElementById('home').getBoundingClientRect();return {s:s.toJSON(),h:h.toJSON(),landscape:w.innerWidth>w.innerHeight};")
assert r['s']['right']<=r['h']['left']+1 if r['landscape'] else r['s']['bottom']<=r['h']['top']+1,r
results['navigation-'+str(w)]=r
c.execute("Services.wm.getMostRecentWindow('vulpes:host').document.getElementById('home').click();")
time.sleep(.6)
r=c.execute("const w=Services.wm.getMostRecentWindow('vulpes:host'),d=w.document,s=d.getElementById('screen').getBoundingClientRect();return {active:d.documentElement.hasAttribute('home-active'),width:s.width,height:s.height,innerWidth:w.innerWidth,innerHeight:w.innerHeight};")
assert r['active'] and r['width']==r['innerWidth'] and r['height']==r['innerHeight'],r
results['wallpaper-'+str(w)]=r
c.execute("Services.wm.getMostRecentWindow('vulpes:host').resizeTo(480,844);")
Path('logs/feedback-preview10-checks.json').write_text(json.dumps(results,indent=2)+'\n')
print(json.dumps(results,indent=2))