103 lines
5.4 KiB
JavaScript
103 lines
5.4 KiB
JavaScript
(async()=>{
|
|
const storageKey = 'wv-verified';
|
|
const verifiedTime = localStorage.getItem(storageKey);
|
|
if(verifiedTime && Date.now() - verifiedTime < 2592000000) {
|
|
return;
|
|
}
|
|
|
|
const s=document.createElement('style');s.textContent=`
|
|
:root{--overlay-bg:#000;--card-bg:rgba(0,0,0,0.85);--accent:#fff;--text-main:#fff;--text-secondary:rgba(255,255,255,0.7);--radius:12px;--transition:.3s ease;--dot-size:8px;--dot-gap:8px}
|
|
#wv-check-overlay{position:fixed;inset:0;background:var(--overlay-bg);display:flex;align-items:center;justify-content:center;font-family:system-ui,sans-serif;z-index:2147483647;opacity:1;transition:opacity .4s ease-out}
|
|
#wv-check-overlay.fade-out{opacity:0}
|
|
#wv-check-card{background:var(--card-bg);backdrop-filter:blur(12px);border-radius:var(--radius);padding:32px 24px;width:340px;text-align:center;color:var(--text-main);transition:transform var(--transition)}
|
|
#wv-check-card h2{margin:0 0 16px;font-size:1.6rem;display:flex;align-items:center;justify-content:center;gap:.5rem}
|
|
#wv-progress-bar{width:0;height:6px;background:var(--accent);transition:width var(--transition);border-radius:var(--radius)}
|
|
#wv-info{margin:12px 0 20px;font-size:.95rem;color:var(--text-secondary)}
|
|
#wv-loading-dots{display:flex;justify-content:center;align-items:center;gap:var(--dot-gap);margin-top:5px}
|
|
#wv-loading-dots .dot{width:var(--dot-size);height:var(--dot-size);background:var(--accent);border-radius:50%;opacity:.3;animation:windows-load 1s infinite ease-in-out}
|
|
#wv-loading-dots .dot:nth-child(1){animation-delay:0s}#wv-loading-dots .dot:nth-child(2){animation-delay:.2s}#wv-loading-dots .dot:nth-child(3){animation-delay:.4s}#wv-loading-dots .dot:nth-child(4){animation-delay:.6s}
|
|
@keyframes windows-load{0%,80%,100%{opacity:.3;transform:scale(1)}40%{opacity:1;transform:scale(1.4)}}
|
|
#wv-complete{display:none;text-align:center}#wv-complete.show{display:block;animation:fade-in .4s ease-out forwards}
|
|
#wv-complete h2{display:flex;align-items:center;justify-content:center;gap:.5rem;font-size:1.5rem;margin-bottom:8px;color:var(--accent)}
|
|
#wv-complete p{color:var(--accent);font-size:1rem;text-align:center;margin:0 auto;width:100%}@keyframes fade-in{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}
|
|
`;document.head.appendChild(s);
|
|
|
|
const overlay=document.createElement('div');overlay.id='wv-check-overlay';overlay.innerHTML=`
|
|
<div id="wv-check-card">
|
|
<h2><i class="fas fa-shield-alt"></i>Verifying Your Browser...</h2>
|
|
<div id="wv-progress"><div id="wv-progress-bar"></div></div>
|
|
<div id="wv-info">Starting tests...</div>
|
|
<div id="wv-loading-dots"><div class="dot"></div><div class="dot"></div><div class="dot"></div><div class="dot"></div></div>
|
|
</div>
|
|
<div id="wv-complete">
|
|
<h2><i class="fas fa-check-circle"></i>Success!</h2>
|
|
<p>You may continue.</p>
|
|
</div>`;
|
|
document.body.appendChild(overlay);
|
|
|
|
const info=overlay.querySelector('#wv-info'), bar=overlay.querySelector('#wv-progress-bar');
|
|
const tests=[
|
|
async()=>({msg:'Browser Automation',pass:!navigator.webdriver}),
|
|
async()=>{
|
|
const ua = navigator.userAgent.toLowerCase();
|
|
return {msg:'Headless Mode',pass:!/headless|phantomjs|puppeteer|selenium/i.test(ua)};
|
|
},
|
|
async()=>({msg:'Language Support',pass:navigator.languages && navigator.languages.length > 0}),
|
|
async()=>({msg:'Browser Plugins',pass:navigator.plugins.length > 0}),
|
|
async()=>{
|
|
try {
|
|
const c=document.createElement('canvas');
|
|
const gl=c.getContext('webgl')||c.getContext('experimental-webgl');
|
|
if(!gl) return {msg:'WebGL Support',pass:false};
|
|
const debugInfo=gl.getExtension('WEBGL_debug_renderer_info');
|
|
const vendor=debugInfo ? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) : '';
|
|
return {msg:'Graphics Driver',pass:!/swiftshader|lavapipe/i.test(vendor)};
|
|
} catch(e) {
|
|
return {msg:'WebGL Support',pass:false};
|
|
}
|
|
},
|
|
async()=>({msg:'Screen Resolution',pass:screen.width >= 320 && screen.height >= 480}),
|
|
async()=>{
|
|
try {
|
|
const start = performance.now();
|
|
const buffer = new ArrayBuffer(1000000);
|
|
const view = new Uint8Array(buffer);
|
|
return {msg:'Performance Check',pass:performance.now() - start < 30};
|
|
} catch(e) {
|
|
return {msg:'Performance Check',pass:false};
|
|
}
|
|
},
|
|
async()=>({msg:'Device Memory',pass:!navigator.deviceMemory || navigator.deviceMemory > 0.5}),
|
|
async()=>{
|
|
const mq=window.matchMedia('(pointer:fine)');
|
|
return {msg:'Input Method',pass:mq.matches};
|
|
}
|
|
];
|
|
|
|
const failures=[];
|
|
for(let i=0;i<tests.length;i++){
|
|
try {
|
|
const res=await tests[i]();
|
|
info.textContent=`Test ${i+1}/${tests.length}: ${res.msg}`;
|
|
if(!res.pass) failures.push(res.msg);
|
|
bar.style.width=`${((i+1)/tests.length)*100}%`;
|
|
await new Promise(r=>setTimeout(r,300));
|
|
} catch(e) {
|
|
failures.push(`Test error`);
|
|
}
|
|
}
|
|
|
|
if(failures.length===0){
|
|
localStorage.setItem(storageKey, Date.now());
|
|
overlay.querySelector('#wv-check-card').style.display='none';
|
|
overlay.querySelector('#wv-complete').classList.add('show');
|
|
setTimeout(()=>{
|
|
overlay.classList.add('fade-out');
|
|
setTimeout(()=>overlay.remove(),400);
|
|
},800);
|
|
} else {
|
|
info.innerHTML=`Verification failed:<br>${failures.map(m=>`• ${m}`).join('<br>')}`;
|
|
bar.style.background='red';
|
|
overlay.querySelector('#wv-loading-dots').remove();
|
|
}
|
|
})(); |