diff --git a/.isu/issues.json b/.isu/issues.json index a842eea..bc0855b 100644 --- a/.isu/issues.json +++ b/.isu/issues.json @@ -1,5 +1,5 @@ { - "next_id": 290, + "next_id": 291, "issues": [ { "id": 1, @@ -3500,6 +3500,19 @@ "author": "piefev", "state": "open", "created_at": "2026-05-25T16:43:00Z" + }, + { + "id": 290, + "repo": "we", + "title": "bing.com hydration still blocked after first-level JS replay", + "body": "Follow-up from isu issue 280 after seeding bing.com first-level script bundles in the offline real-web snapshot.\n\nRepro:\n\n cargo run -p we-e2e -- --scenario crates/e2e/scenarios/real-web/bing.com.we --out-dir crates/e2e/artifacts\n\nCurrent result:\n\n- desktop screenshot still matches only about 5.10% of crates/e2e/scenarios/real-web/bing.com.desktop.chromium.expected.png\n- mobile screenshot still matches only about 6.34% of crates/e2e/scenarios/real-web/bing.com.mobile.chromium.expected.png\n- rendered page remains the unhydrated Bing shell; do not remove the xfail from crates/e2e/scenarios/real-web/bing.com.we yet\n\nArtifacts from the failing run:\n\n- crates/e2e/artifacts/real-web/bing.com/desktop.png\n- crates/e2e/artifacts/real-web/bing.com/desktop.png.diff.png\n- crates/e2e/artifacts/real-web/bing.com/mobile.png\n- crates/e2e/artifacts/real-web/bing.com/mobile.png.diff.png\n- crates/e2e/artifacts/real-web/bing.com/desktop_dom.txt\n- crates/e2e/artifacts/real-web/bing.com/mobile_dom.txt\n\nRemaining runner script errors seen after the parser, matchMedia, performance, _w alias, and captured var declaration fixes:\n\n- https://r.bing.com/rp/mwh9KsAwlngFDUvI3rY7crOD9X0.js: TypeError: undefined is not a function\n- https://r.bing.com/rp/6EHNaAzAbu-ADYy6VtbEC2WZs4E.js: TypeError: undefined is not a function\n- https://www.bing.com/rp/LVg6IaJY4y94xTELT_HrBZ1S4r8.js: Error: function i() { [native code] }\n- https://r.bing.com/rp/QSCMj9i5CNitjnEQnZy2uyGGvBY.js: TypeError: Cannot read properties of undefined (reading 'length')\n- https://r.bing.com/rp/PuxwB9kWYvv5HkQ2NtmvHeaGH4w.js: TypeError: Cannot read properties of undefined (reading 'length')\n- https://r.bing.com/rp/RVMg7eMIfRv9OBqTC5vFN4zwJFE.js: TypeError: undefined is not a function\n- inline _w.rms.js(...) loader: TypeError: Cannot read properties of undefined (reading 'length')\n\nNext step: reduce the first undefined-call site in the seeded bundles and add the missing DOM/JS primitive needed for Bing hydration.", + "labels": [ + "real-web" + ], + "assigned": [], + "author": "piefev", + "state": "open", + "created_at": "2026-05-25T17:03:57Z" } ] } diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rb/4O/jnc,nj/cKzGnam6-Fytml03VT3ixBZ9tTs.js.empty b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rb/4O/jnc,nj/cKzGnam6-Fytml03VT3ixBZ9tTs.js.empty new file mode 100644 index 0000000..e69de29 diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rb/5S/jnc,nj/iDmydssBbFY1ad3gHr--gHb_nsk.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rb/5S/jnc,nj/iDmydssBbFY1ad3gHr--gHb_nsk.js new file mode 100644 index 0000000..fc6a086 --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rb/5S/jnc,nj/iDmydssBbFY1ad3gHr--gHb_nsk.js @@ -0,0 +1 @@ +var perf;(function(n){function f(n){return i.hasOwnProperty(n)?i[n]:n}function e(n){var t="S";return n==0?t="P":n==2&&(t="M"),t}function o(n){for(var c,i=[],t={},r,l=0;l").concat(i,"<\/TS><\/D><\/E>"),s="".concat(h,"<\/Events>").concat(i,"<\/STS><\/ClientInstRequest>"),f=!_w.navigator||!navigator[o];if(!f)try{_G.DLPState!=null&&typeof Log!="undefined"&&Log&&Log.LogPerf?Log.LogPerf("{".concat(r.join(","),"}")):navigator[o](e,s)}catch(c){f=!0}f&&(_G.DLPState!=null&&typeof Log!="undefined"&&Log&&Log.LogPerf?Log.LogPerf("{".concat(r.join(","),"}")):(u=sj_gx(),u.open("POST",e,!0),u.setRequestHeader("Content-Type","text/xml"),u.send(s)))}}(window.perf),function(n){function a(){return c(Math.random()*1e4)}function o(){return y?c(f.now())+l:+new Date}function v(n,r,f){t.length===0&&i&&sb_st(u,1e3);t.push({k:n,v:r,t:f})}function p(n){return i||(r=n),!i}function w(n,t){t||(t=o());v(n,t,0)}function b(n,t){v(n,t,1)}function u(){var u,f;if(t.length){for(u=0;u=0){v=!1;for(r in f)o=f[r],typeof o=="number"&&o>0&&r!=="navigationStart"&&r!==c&&(typeof _w.ajaxloadT=="number"&&r==="loadEventEnd"&&(o=_w.ajaxloadT),u.mark(r,o),r==="loadEventEnd"&&(v=!0));((a=_G===null||_G===void 0?void 0:_G.EF)===null||a===void 0?void 0:a.ajaxiffix)&&!v&&typeof _w.ajaxloadT=="number"&&u.mark("loadEventEnd",_w.ajaxloadT);_G.FCT&&u.mark("FN",_G.FCT);_G.BCT&&u.mark("BN",_G.BCT)}u.record("nav",c in f?f[c]:performance[c].type)}s="connection";l="";_w.navigator&&navigator[s]&&(l=',"net":"'.concat(navigator[s].type,'"'),navigator[s].downlinkMax&&(l+=',"dlMax":"'.concat(navigator[s].downlinkMax,'"')));_G.PPImg=new Image;_G.PPImg.src=_G.lsUrl+'&Type=Event.CPT&DATA={"pp":{"S":"'+(t||"L")+'",'+h.join(",")+',"CT":'+(n-_G.ST)+',"IL":'+_d.images.length+"}"+(_G.C1?","+_G.C1:"")+l+"}"+(_G.P?"&P="+_G.P:"")+(_G.DA?"&DA="+_G.DA:"")+(_G.MN?"&MN="+_G.MN:"")+"&dl=5";_G.PPS=1;sb_st(function(){u&&u.flush();sj_evt.fire("onPP");sj_evt.fire(_w.p1)},1)}};_w.onbeforeunload=function(){si_PP(new Date,"A")};sj_evt.bind("ajax.requestSent",function(){window.perf&&perf.reset()}),function(n,t){onload=function(){_G.BPT=new Date;n&&n();!_w.sb_ppCPL&&t&&sb_st(function(){t(new Date)},0)}}(_w.onload,_w.si_PP),function(){if((_w.confidenceLog||(_w.confidenceLog={confidenceLogged:!1}),!_w.confidenceLog.confidenceLogged)&&"PerformanceObserver"in window&&PerformanceObserver.supportedEntryTypes.indexOf("navigation")!==-1){var n=new PerformanceObserver(function(n){for(var t,i=0,r=n.getEntries();i=0?encodeURIComponent(atob(decodeURIComponent(v[1]))):v[1])):e=encodeURIComponent(n[u]("href")),clc.furl&&!n[u]("data-private")?o+="&url="+e:clc.mfurl&&(o+="&abc="+e)),r&&(o+="&source="+r),w="",clc.mc&&(w="&c="+ctcc++),l="",y=n[u]("data-ig"),y&&(l+="IG="+y),l+="&"+o+w,!y&&_G!==undefined&&_G.EF!==undefined&&_G.EF.clicktodynevent===1){for(b=!1,c=n;c&&c!==document.body;){if(c.id==="b_header"){b=!0;break}c=c.parentNode}if(!b){for(f=n;f&&f!==document.body&&f.tagName!=="A";)f=f.parentNode;if(h=f&&f.tagName==="A"?f[u]("href"):"",h=h||"",d=h.toLowerCase(),g=!h||h==="#"||d.indexOf("javascript:")===0,g){var p=o.match(/ID=([^,]+),([^,&]+)/),nt=p?p[1]:"",it=p?p[2]:"";if(_w.Log&&_w.Log.LogCustomData){_w.Log.LogCustomData("CI.PositiveInteractionEvent","APSAT","NonNavClick",nt,{AppNS:nt,K:it,OrigHref:h});break}}}}_w.si_sbwu(l)||_w[s]&&_w[s](l,n,i,a);break}if(t)break}}catch(tt){_w.SharedLogHelper?SharedLogHelper.LogWarning("clickEX",null,tt):_w.directLog('[{"T":"CI.Warning","FID":"CI","Name":"JSWarning","Text":"'+tt.message+'"}]',1)}return!0};_w.si_sbwu||(_w.si_sbwu=function(){return!1}),function(){_w._G&&(_G.si_ct_e="click")}() \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/6EHNaAzAbu-ADYy6VtbEC2WZs4E.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/6EHNaAzAbu-ADYy6VtbEC2WZs4E.js new file mode 100644 index 0000000..b845cfb --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/6EHNaAzAbu-ADYy6VtbEC2WZs4E.js @@ -0,0 +1,2 @@ +/*!DisableJavascriptProfiler*/ +var BM=BM||{};BM.config={B:{timeout:250,delay:750,maxUrlLength:300,sendlimit:20,maxPayloadSize:7e3},V:{distance:20,debounce:500},N:{maxUrlLength:300},E:{buffer:30,timeout:5e3,maxUrlLength:300},C:{distance:50},BD:{basic:1,e:1}},function(n){function yt(){if(!document.querySelector||!document.querySelectorAll){k({FN:"init",S:"QuerySelector"});return}w={};o=[];et=1;ft=0;ut=0;s=[];h=0;c=!1;var n=Math.floor(Math.random()*1e4).toString(36);t={P:{C:0,N:0,I:n,S:oi,M:r,T:0,K:r,F:0}};wi()}function si(n,t){var r={};for(var i in n)i.indexOf("_")!==0&&(i in t&&(n[i]!==t[i]||i==="i")?(r[i]=t[i],n[i]=t[i]):r[i]=null);return r}function hi(n){var i={};for(var t in n)n.hasOwnProperty(t)&&(i[t]=n[t]);return i}function b(n,t,r,u){if(!c){k({FN:"snapshot",S:n});return}r=r||ti;t=t||!1;var f=g()+r;st(s,n)===-1&&s.push(n);t?(pt(),wt(t,u)):f>h&&(pt(),ut=sb_st(wt,r),h=f)}function k(n){var u={T:"CI.BoxModelError",FID:"CI",Name:ct,SV:lt,P:t&&"P"in t?d(t.P):r,TS:f(),ST:y},i,e;for(i in n)u[i]=n[i];e=d(u);bt(e)}function pt(){h>0&&(sb_ct(ut),h=0)}function wt(n,i){var r,u;if(!c){k({FN:"send",S:s.join(v[1])});return}(et<=ri||n)&&(t.P.S=s.join(v[1]),t.P.F=n?1:0,t.P.M=bi(),r=f(),ci(),t.P.T=f(),t.P.N=et++,t.P.C+=f()-r,u=ai(t),t.P.C=0,bt(u,i),s=[],h=0)}function ci(){c&&ht("compute")}function bt(n,t){var s,u;if(dt(window,"Log2")&&Log2.LogEvent&&JSON)Log2.LogEvent("ClientInst",JSON.parse(n),null,null,null,null,null,null),t&&t.force===!0&&Log2.ForceFlush(!0,t);else{var e="/fd/ls/lsp.aspx",r=g(),h="Event.ClientInst<\/T>"+_G.IG+"<\/IG>"+r+"<\/TS>","]]]\]>")+"]]\]><\/D><\/E>",f=""+h+"<\/Events>"+r+"<\/STS><\/ClientInstRequest>",o=!1;li(t,f.length)&&(_G.DirectLogPost!=null?_w.directLogPost("Event.ClientInst",_G.IG,r,"["+n.replace("]\]>","]]]\]>")+"]",2,navigator[rt]):(s=new Blob([f],{type:"text/plain"}),o=navigator[rt](e,s)));o||(_G.DirectLogPost!=null?_w.directLogPost("Event.ClientInst",_G.IG,r,"["+n.replace("]\]>","]]]\]>")+"]",2):(u=sj_gx(),u.open("POST",e,!0),u.setRequestHeader("Content-Type","text/xml"),u.send(f)))}sj_evt.fire("BM",n)}function li(n){return!fi||!n||!n.useSendBeacon?!1:!0}function d(n){var i=r,u,t;for(u in n)if(t=n[u],t!==r){var o=typeof t=="number",f='"',e=o||t.indexOf("{")===0?r:f;i+=f+u+f+":"+e+t+e+","}return"{"+(i.length>0?i.substr(0,i.length-1):r)+"}"}function ai(n){function k(n,t){function a(n){return n.replace(ei,encodeURIComponent)}var h=!0,f=[],u,i,e,s,o,c,l;if(t=t||1,!("_c"in n)||t<=1){for(u in n)if(i=n[u],s=u.charCodeAt(0)>=65&&u.charCodeAt(0)<=90,s&&f.push(u),u.indexOf("_")===0)continue;else typeof i=="number"?(e=parseInt(i.toString()).toString(36),f.push(e),g(e)):typeof i=="string"?(e=a(i),f.push(e),g(e)):i==null?f.push(r):typeof i=="object"&&(o=k(i,t+1,u),(o&&o.length>0||s)&&f.push(o),h=!1);h&&(n._c=!0)}return c=v[t],l=f.join(p+c+p),l}function g(n){n.length>2&&(n in a&&st(o,n)===-1?o.push(n):a[n]=1)}var nt=f(),a={},e={T:"CI.BoxModel",FID:"CI",Name:ct,SV:lt,P:r},u,h,y,i,s,b,c,l;_G.RGUID&&(e.RGUID=_G.RGUID,_G.NARGUID&&(e.NARGUID=1));u={};for(i in n)i!=="P"&&(h=k(n[i]),h&&h.length>0&&(u[i]=h.split(p)));y=o.slice(ft).join(v[1]);ft=o.length;t.P.K=y;for(i in u){if(i!=="M")for(s=0;s=0&&(u[i][s]=p+c.toString(36));l=u[i].join(r);i in w&&w[i]===l||(e[i]=w[i]=l)}return t.P.C+=f()-nt,e.P=d(t.P),d(e)}function st(n,t){for(var i=0;i0?e:-1;var st="innerWidth"in window?window.innerWidth:r.clientWidth,ht="innerHeight"in window?window.innerHeight:r.clientHeight,ct=window.pageXOffset||r.scrollLeft,lt=window.pageYOffset||r.scrollTop,at=o in document?document[o]:l;for(h=n.exists(window,"devicePixelRatio")?window.devicePixelRatio:-1,ft={t:n.time(),x:ct,y:lt,w:st,h:ht,dw:v.clientWidth,dh:v.clientHeight,d:h,s:e,v:at,e:l},it=n.dequeue("V"),it.push({t:ft.t,i:ft}),et=0;et1){if(f=r[1]?"visible":"hidden",r.length>2)switch(r[2]){case 0:f="apphidden";break;case 1:f="appvisible";break;case 2:f="webvisible"}e=n.clone(i[t]);e.t=n.time();e.v=f;e.e="cortana";u.push(e);n.snapshot(t,f==="hidden")}}function nt(){var f=n.clone(i[t]);f.t=n.time();f.w="innerWidth"in window?window.innerWidth:r.clientWidth;f.h="innerHeight"in window?window.innerHeight:r.clientHeight;f.v="peekexpand";f.e="cortana";u.push(f);n.snapshot(t)}function tt(n,t){var i=n.x-t.x,r=n.y-t.y;return Math.sqrt(i*i+r*r)}function st(r){for(var f,o,s=u.length,e=0;eut)&&(e===0?n.metric(1,f.t):y+=tt(f,o),r[t].push(n.delta(i[t],f)),o=f);n.metric(8,parseInt(y));u=[]}function it(){return o in document?document.visibilityState:l}function ht(){a=!1;sj_ue(window,"scroll",k);sj_ue(window,"resize",d);sj_ue(window,"pageshow",s);sj_ue(window,"pagehide",s,f);o in document&&(sj_ue(document,"visibilitychange",s,f),sj_evt.unbind("visibility",g),sj_evt.unbind("peekexpand",nt));u=[]}var c="boxmodel",t="V",h,e,v,r,rt="",l="default",o="visibilityState",i,u=[],ut=n.config[t].distance,y,a,p,w=_G&&_G.EF,f=w&&w.bmcov===1,ct=n.extend({id:t,load:ft,compute:st,unload:ht});ct&&(n.viewport=et)}(BM||(BM={})),function(n){function d(r){r[t]=[];f=r;h=document.body;i={};i[t]=[];u=n.dequeue("L");a(document,n.time());u=[]}function g(){return i[t]}function a(n,t){var u,f,i,o;if(n.querySelectorAll)for(u in c){var e=c[u],s=e[0],h=e[1];for(u+=!e[2]?r:" >*",f=n.querySelectorAll(u),i=0;i0}function y(n){while(n&&n.hasAttribute&&n!==document.body){if(n.hasAttribute("data-bm"))return parseInt(n.getAttribute("data-bm"));n=n.parentElement}return null}function tt(n,r,u,f){var o,e;if(n){for(o=i[t],e=0;e-1?(e=n.layout()[c],s=e&&e._e===t?e.p:b(t)):s=b(t);f={t:u,i:null,s:p(t),k:ut(t),x:0,y:0,w:t.offsetWidth,h:t.offsetHeight,z:0,e:i,p:s,_e:t,_s:r,_ex:-1,_ey:-1};o=t;try{if(t.offsetParent)do f.x+=t.offsetLeft,f.y+=t.offsetTop;while(t=t.offsetParent)}catch(l){f.x=null;f.y=null}while(o!==h&&(o=o.parentElement))f.z++;return f}function it(t){try{if(n.exists(t,"src")&&t.src.indexOf("data:")!==0)return t.src?t.src:r}catch(i){}return r}function b(n){for(var t=Number(n.getAttribute(e+k))||Number(n.getAttribute(e+l))||-1;(n=n.parentElement)&&t===-1;)t=Number(n.getAttribute(e+l))||t;return t}function rt(n){if(n){var t=n.className;if(t){if(typeof t=="string")return t;if(typeof t=="object"&&"baseVal"in t)return t.baseVal}}return""}function ut(n){var t,u;if(rt(n).split(" ").indexOf("b_ans")>-1&&n.hasAttribute("h"))return s(n.getAttribute("h"));if(n.tagName==="IMG"||p(n).indexOf("rms_img")>=0){if(t=y(n),t!=null&&t=0?r:t}function ft(){for(var u,s,f=i[t],e=n.time(),r=0;r0&&(r=h,n.snapshot(i))}}function a(n){if(typeof _w.SVGElement!="undefined"&&n instanceof SVGElement)return!1;var t=n.offsetWidth>=20||n.offsetHeight>=20,i=r.indexOf(n.parentNode)>=0;return t&&!i}function v(){}function y(){t&&t.disconnect();t=null;r=[]}var i="MT",r=[],t,u,e,f=_G&&_G.EF,o=f&&f.bminlinechatdwelltime===1;n.register({id:i,check:s,load:h,compute:v,unload:y})}(BM),function(n){function tt(){return!0}function it(n){n[u]=[];g=n;l=0;e=0;s=!0}function rt(i){for(var k,nt,c,tt,it=n.viewport().w,g=n.layout(),b=0;b=0?it-s-r.offsetWidth:s,s>=0&&!w(o.x,s)&&(v=o.k.length===0?p(r):v,i[u].push({t:n.time(),l:o.i,e:"X",v:Math.abs(o.x-s),m:v}),e++),d>=0&&!w(o.y,d)&&(v=o.k.length===0?p(r):v,i[u].push({t:n.time(),l:o.i,e:"Y",v:Math.abs(o.y-d),m:v}),e++),r.tagName!=="IMG"||o.i in t||(c=ut(r),c&&(k=n.exists(r,k)?r[k]:!0,nt=n.exists(r,h)?r[h]>0:!0,k?nt||(t[o.i]={_e:r,_s:c,_d:!0,_b:!1},y(b,c)):(t[o.i]={_e:r,_s:c,_d:!1,_b:!0},a(r,!0)))),r.tagName!=="DIV"||!r.hasAttribute("data-src")||o.i in t||(c=r.getAttribute("data-src"),tt=r.style.backgroundImage,tt||(t[o.i]={_e:r,_s:c,_d:!1,_b:!1},a(r,!1))))}n.metric(5,e);n.metric(6,l)}function ut(t){try{if(n.exists(t,"src"))return t.src?t.src:f}catch(i){}return f}function a(n,t){t&&(sj_be(n,"load",r),sj_be(n,"error",r));i||(i=sb_st(v,d))}function r(n){if(!nt||s){var t=window.event||n,i=sj_et(n);return v(t.type,i)}}function v(u,f){var s=0,e,o,h;for(e in t)if(!t[e]._d&&(!f||t[e]._e===f)&&(o=t[e]._e,h=o.tagName==="IMG"?!o[b]||u&&u==="error":!o.style.backgroundImage,t[e]._b&&(sj_ue(o,"load",r),sj_ue(o,"error",r)),h&&(y(e,t[e]._s),s++),t[e]._d=!0,f))return;s>0&&n.snapshot("E");i=0}function y(){}function p(n){var t=n.querySelector("a");return t&&t.href?t.href.substr(0,k):f}function w(n,t){return n>=t-c&&n<=t+c}function ft(){var u,n;for(u in t)n=t[u],n._b&&!n._d&&(sj_ue(n._e,"load",r),sj_ue(n._e,"error",r));s=!1;i&&(sb_ct(i),i=0);t={}}var u="E",f="",b="complete",h="naturalWidth",o=n.config[u],c=o.buffer,k=o.maxUrlLength,d=o.timeout,i=0,l,e,t={},g,s,nt=_G!==undefined&&_G.EF!==undefined&&_G.EF.bmcov===1;n.register({id:u,check:tt,load:it,compute:rt,unload:ft})}(BM),function(n){function k(){return Boolean(_w.performance)&&Boolean(performance.now)&&Boolean(performance.getEntries)}function d(t){t[r]=[];a[r]=[];f=performance.timing.loadEventEnd-performance.timing.navigationStart;c=n.viewport();l=0;nt()}function g(u){var k,it,d,h,nt,rt;if(r in a){var ct=u[r],y=a[r],kt=performance.timing,ut=performance.getEntries();for(h=0;h=0&&g.indexOf("progrender=1")===-1&&(i=o.startTime,f=o.duration),h=0;h=0||w[1]===e){ft=!1;break}ft&&l++;var et=t(o.startTime,i),lt=s(o.duration),at=t(o.connectStart,i),vt=o.secureConnectionStart===0?0:t(o.secureConnectionStart,i),yt=t(o.connectEnd,i),pt=t(o.requestStart,i),wt=t(o.responseStart,i),bt=t(o.responseEnd,i),ot=null,st=n.layout();for(nt=0;nt=0?f.substr(0,a):f,t=t.indexOf(o)===0?t.substr(1):t,r=u.search.toLowerCase(),v=l.length>0?t.substr(0,y):n.substr(0,y),r.length>0&&(h=r.indexOf("event."))>0&&(c=r.indexOf("&data"))>0?(t=r.substr(h,c-h).replace("event.",e),t==="clientinst"&&(s=b.exec(r.replace(/%22/g,'"')),s!=null&&s.length>1&&(t=s[1]))):t.indexOf("rms/")===0&&(i=t.split(o))&&i.length>1?t=i[1].replace("rms%20answers%20",e).replace(".source",e):(i=t.split(o))&&i.length>=2&&(t=i[i.length-2]+o+i[i.length-1]),[f,l,t,v]}function t(n,t){return n&&n>0?s(n-t):-1}function s(n){return n<-1?-1:parseInt(n)}function it(){}var h,r="N",v=0,i=0,f,c,l,y=n.config.N.maxUrlLength,u=document.createElement("A"),e="",o="/",w=":",b=/"name":"(.*?)"/,a=(h={},h[r]=[],h),p=[location.hostname,"live.com","virtualearth.net","bing.net","msedge.net","skype.com","microsofttranslator.com","footprintdns.com","testanalytics.net","footprintpredict.com","msftstatic.com"];n.register({id:r,check:k,load:d,compute:g,unload:it})}(BM),function(n){function b(){return!0}function k(n){r=1;n[t]=[];y=n;s=document.documentElement;u=[];o=0;f={};l(sj_be,h);d();r=2}function l(n,t){for(var o,f,r,u=0;u=0;r--)i[r]===f&&i.splice(r,1)}function d(){for(var r,i=n.dequeue("EVT"),t=0;t0?f.touches[0]:null,h=f.pointerType||f.type.indexOf("touch")==0&&"touch"||"mouse",l={_e:f.target,t:e||n.time(),l:null,e:f.type,p:h,b:n.exists(f,"button")?f.button:null,x:o?o.pageX:"pageX"in f?f.pageX:"clientX"in f?f.clientX+s.scrollLeft:null,y:o?o.pageY:"pageY"in f?f.pageY:"clientY"in f?f.clientY+s.scrollTop:null,s:n.exists(f,"buttons")?f.buttons:null,et:n.time(f.timeStamp)};return u.push(l),r===2||r===1?n.snapshot(t):!c&&(!p||i&&i.length>0)&&(n.error({FN:"enqueue",S:"C",ET:f.type,EVTS:i.join("+")}),c=!0),!0}function a(n,t){var i=n.x-t.x,r=n.y-t.y;return Math.sqrt(i*i+r*r)}function nt(i){var c=u.length,s,h,r,e,l;if(c>0){for(s=(t in f)?f[t]:null,h=0;hv)&&(r.l=n.match(r._e),s===null?(n.metric(1,r.t),s=f[t]=n.clone(r),i[t].push(r)):(o+=a(r,s),i[t].push(n.delta(s,r))),w&&r.l===174&&r._e!=null&&(e=r._e,l=e.tagName+(e.id?"#"+e.id:e.className?"."+e.className:""),e.hasAttribute("data-bm")&&(l+='[data-bm="'.concat(e.getAttribute("data-bm"),'"]')),Log.Log("Info","BMIndex",l)));u=[]}n.metric(9,parseInt(o))}function tt(){r=3;l(sj_ue,h);r=4}var t="C",u=[],f={},v=n.config[t].distance,e=["click","mousedown","mouseup","mousemove","touchstart","touchend","touchmove"],o,s,y,c=!1,r=0,i=[],p=_G!==undefined&&_G.EF!==undefined&&_G.EF.bmcov===1,w=_G!==undefined&&_G.EF!==undefined&&_G.EF.bmilog===1;n.register({id:t,check:b,load:k,compute:nt,unload:tt})}(BM),function(n){function e(){return!0}function o(n){n[t]=[];u=n;f(sj_be,i);s()}function f(n,t){for(var u,i=0;i0&&location.href.indexOf("&rdr=1")===-1&&location.href.indexOf("?")>0?(l=location.href+"&rdr=1"+(_G&&_G.IG?"&rdrig="+_G.IG:""),typeof sj_lc!="undefined"?window.sj_lc(l):location.href=l):(a=document.getElementById("b_content"),a&&(a.style.visibility="visible"))))}function e(n,t){for(var r,i=0;i0&&u(t[0].i,t[0].t)}}function u(t,f){if(r){t=t||_w.event;var o=""+Math.round((new Date).getTime()/1e3),h=(_G===null||_G===void 0?void 0:_G.Salt)||"notFound";s[i].push({t:f||n.time(),e:t.type,s:o});sj_cook.set("SRCHHPGUSR","HV",o,!0,"/");sj_cook.set("SRCHHPGUSR","HVE",h,!0,"/");r=!1;e(sj_ue,u);n.metric(10,1);n.snapshot(i)}return!0}function y(){}function p(){r&&(e(sj_ue,u),r=!1)}var f,i="BD",o=["click","mousedown","mouseup","touchstart","touchend","mousemove","touchmove","scroll","keydown","resize"],s,r=!1,t=n.config[i],h=t&&t.basic?t.basic:!1,c=(f=t===null||t===void 0?void 0:t.e)!==null&&f!==void 0?f:!1;n.register({id:i,check:l,load:a,compute:y,unload:p})}(BM),function(n){function o(){return!0}function s(o){f=o;f[r]=[];try{if(typeof navigator!="object"){o[r].push({a:i,h:u,pf:undefined,ps:undefined,ch:undefined,os:undefined,cc:undefined,op:undefined,br:undefined});return}navigator.webdriver&&(i=1);document.__selenium_unwrapped||document.__webdriver_evaluate||document.__driver_evaluate?i=2:typeof document.$cdc_asdjflasutopfhvcZLmcfl_!="undefined"?i=3:typeof process=="object"&&window.process.type==="renderer"?i=4:typeof process=="object"&&typeof window.process.versions=="object"&&window.process.versions.hasOwnProperty("electron")?i=4:window.__nightmare?i=6:(window.callPhantom||window._phantom||window.phantom)&&(i=7);(navigator.userAgent&&navigator.userAgent.search("headless")!=-1||navigator.appVersion&&navigator.appVersion.search("headless")!=-1)&&(u=1);t.platform=navigator.platform;t.productSub=navigator.productSub;t.chrome=typeof chrome!="undefined"?1:undefined;t.oscpu=typeof navigator.oscpu!="undefined"?1:undefined;t.cpuClass=typeof navigator.cpuClass!="undefined"?1:undefined;t.opera=typeof opera!="undefined"?1:undefined;t.brave=typeof opera!="undefined"?1:undefined;o[r].push({a:i,h:u,pf:t.platform,ps:t.productSub,ch:t.chrome,os:t.oscpu,cc:t.cpuClass,op:t.opera,br:t.brave});n.snapshot(r)}catch(s){}}function h(){}function c(){}var r="BF",e="boxmodel",i=0,u=0,t={},f;n.register({id:r,check:o,load:s,compute:c,unload:h})}(BM) \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/9LvGW2UjtVDIrXhFGqkyxWXeQDg.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/9LvGW2UjtVDIrXhFGqkyxWXeQDg.js new file mode 100644 index 0000000..4c8338b --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/9LvGW2UjtVDIrXhFGqkyxWXeQDg.js @@ -0,0 +1 @@ +ClTrCo={} \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/AwudvPCWCx5LrsnXEQOzlMREKfk.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/AwudvPCWCx5LrsnXEQOzlMREKfk.js new file mode 100644 index 0000000..79b06e2 --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/AwudvPCWCx5LrsnXEQOzlMREKfk.js @@ -0,0 +1 @@ +_w.si_sbwu=function(n){var u=_G.BQIG==null?_G.IG:_G.BQIG,r="/fd/ls/GLinkPingPost.aspx?",t,i;if(r+=n.length>2&&n.substring(0,3)==="IG="?n:"IG="+u+n,t="sendBeacon",i=!1,navigator&&navigator[t])try{navigator[t](r,"");i=!0}catch(f){}return i} \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/D5G8rA7h76k8B81shEt4t4fE9vo.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/D5G8rA7h76k8B81shEt4t4fE9vo.js new file mode 100644 index 0000000..9c95e2a --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/D5G8rA7h76k8B81shEt4t4fE9vo.js @@ -0,0 +1 @@ +define("fallback",["require","exports"],function(n,t){function f(){var n=function(){for(var h,c,l,r=[],t=0;t0)for(o=!1,f=0;f0&&c[0].classList.contains(v));h?!y||t==e(i,o)&&navigator.cookieEnabled?(l="dmreload",b(l)?(u(),f("dmnoreload_alreadyreloaded")):(f("dmreloadlight"+t),sb_st(function(){var n=new URLSearchParams(_w.location.search);n.set(l,"1");_w.location.replace("?"+n)},1))):(u(),f("dmnoreload_cookieenabled_"+navigator.cookieEnabled)):w&&t=="1"&&(u(),f("dmnoreload_initial"))}function f(n){typeof Log!==r&&Log.LogFilterFlare&&Log.LogFilterFlare([n])}function b(n){if(_w.location.search&&typeof URLSearchParams!==r){var t=new URLSearchParams(_w.location.search);return t.get(n)}return null}function d(){b("lightschemeovr")==="1"&&l(i,a,"0",!0,"/")}var l=sj_cook.set,e=sj_cook.get,i="SRCHHPGUSR",o="PREFCOL",a="WEBTHEME",r="undefined",v="b_dark",y=typeof n!==r&&!!(n===null||n===void 0?void 0:n.defaultThemeOption),p=!1,s=null,t="0",c;typeof sj_cook!==r&&sj_cook&&_w.self===_w.top&&_w.matchMedia&&navigator.cookieEnabled&&(d(),h(),sj_evt.unbind("ajax.load",h),sj_evt.bind("ajax.load",h),c=_w.matchMedia("(prefers-color-scheme: dark)"),typeof c.addEventListener=="function"&&c.addEventListener("change",function(){w();u()}))})(DarkSchemeCookies||(DarkSchemeCookies={})) \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/PuxwB9kWYvv5HkQ2NtmvHeaGH4w.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/PuxwB9kWYvv5HkQ2NtmvHeaGH4w.js new file mode 100644 index 0000000..2c19704 --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/PuxwB9kWYvv5HkQ2NtmvHeaGH4w.js @@ -0,0 +1 @@ +function getBrowserWidth_Desktoptd(){var t=_d.documentElement,n=Math.round(_w.innerWidth||t.clientWidth);return n<100&&(n=1496),n}function getBrowserHeight_Desktoptd(){var t=_d.documentElement,n=Math.round(_w.innerHeight||t.clientHeight);return n<100&&(n=796),n}function getBrowserScrollWidth_Desktoptd(){var n=Math.round(_d.body.clientWidth);return n<100&&(n=1496),n}function getBrowserScrollHeight_Desktoptd(){var n=Math.round(_d.body.clientHeight);return n<100&&(n=796),n}(function(){function nt(n,t){var i="XW",r;n<=p&&(i="W");n<=w&&(i="M");n<=b&&(i="N");n<=k&&(i="S");n<=d&&(i="HTP");n<=g&&(i="NOTP");r="T";t<=a&&(r="M");t<=v&&(r="S");e(y,i,"width",n.toString());e(l,r,"height",t.toString())}function e(r,u,f,e){o("Info",r,u,f,e);t(n,r)!==u&&i(n,r,u,!0,"/",null)}function o(n,t,i,r,u){typeof Log!==f&&Log.Log&&Log.Log(n,t,i,!1,r,u)}function r(n){typeof Log!==f&&Log.LogFilterFlare&&Log.LogFilterFlare([n])}function u(u,f,e){var o=t(n,f);o&&o===u||(i(n,f,u,!0,"/",null),o&&e&&r("browserresize"+e))}function tt(){var s=t(n,"DPR"),u=_w.devicePixelRatio!=null&&!isNaN(_w.devicePixelRatio)?_w.devicePixelRatio.toFixed(1):"1",h,f,l;o("Info",c,u,"RawDPR",u);s&&+s==+u||i(n,"DPR",u,!0,"/",null);h=t(n,"UTC");f=((new Date).getTimezoneOffset()*-1).toString();h!==f&&i(n,"UTC",f,!0,"/",null);var e=navigator.userAgent,a=navigator.maxTouchPoints||0,v=Math.max(_w.screen.width,_w.screen.height),y=!!e.match(/Macintosh/i),p=/Android/i.test(e),w=/Mobile/i.test(e),b=navigator.userAgentData?navigator.userAgentData.mobile?"1":"0":"na",k=y&&a>1,d=p&&!w&&b==="0"&&v>=600;(k||d)&&(r("misdetect_d"),l=t(n,"forcetab"),l!=="1"&&(i(n,"forcetab","1",!0,"/",null),sj_evt.fire("ajax.clearCache")))}function it(){s();tt()}function s(){rt();ut()}function rt(){var n=getBrowserWidth_Desktoptd(),t=getBrowserHeight_Desktoptd();nt(n,t);u(n.toString(),"CW","W");u(t.toString(),"CH","H");u(getBrowserScrollWidth_Desktoptd().toString(),"SCW","");u(getBrowserScrollHeight_Desktoptd().toString(),"SCH","")}function ut(){var i=+t(n,"CW");i&&i!==getBrowserWidth_Desktoptd()?r("clientcookiecorrupt"):Math.round(_d.body.clientWidth)!=Math.round(_d.body.scrollWidth)&&r("clientwidthoverflow")}function ft(){var r=t(n,"CW"),u=t(n,"CH");r&&i(n,"PRVCW",r,!0,"/",null);u&&i(n,"PRVCH",u,!0,"/",null)}function h(){var t=_ge("b_context"),i=_ge("b_results"),u,n;t!=null&&i!=null&&t.clientHeight>i.clientHeight&&r("rightrailhigher");u=_w.self===_w.top;n=!1;try{n=_w.location.hostname===_w.parent.location.hostname}catch(f){}(u||!n)&&(ft(),it());(navigator===null||navigator===void 0?void 0:navigator.cookieEnabled)||r("clientcookiedisabled")}var i=sj_cook.set,t=sj_cook.get,n="SRCHHPGUSR",c="DPR",l="BRH",a=1e3,v=700,y="BRW",p=1406.9,w=1362.9,b=1274.9,k=1164,d=854,g=686,f="undefined";h();sj_evt.bind("ajax.load",h);sj_be(_w,"resize",s)})();window.ClientObserver={getBrowserWidth:getBrowserWidth_Desktoptd,getBrowserHeight:getBrowserHeight_Desktoptd,getBrowserScrollWidth:getBrowserScrollWidth_Desktoptd,getBrowserScrollHeight:getBrowserScrollHeight_Desktoptd} \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/QSCMj9i5CNitjnEQnZy2uyGGvBY.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/QSCMj9i5CNitjnEQnZy2uyGGvBY.js new file mode 100644 index 0000000..d248c69 --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/QSCMj9i5CNitjnEQnZy2uyGGvBY.js @@ -0,0 +1 @@ +var DarkModeLogging;(function(){function o(){var n=l(),r=sj_cook.get("SRCHHPGUSR",h),u,f,e;i("OSTHEME"+n);u=c(r,n);i("BINGTHEME"+u);i("HMTHEME"+(r||"NONE"));f=t.matchMedia?t.matchMedia("(forced-colors: active)").matches:!1;i("FORCEDCOLORS"+ +f);e=t.matchMedia?t.matchMedia("(prefers-contrast: more)").matches:!1;i("PREFERSCONTRAST"+ +e);navigator.cookieEnabled||i("COOKIEDISABLED")}function c(t,i){return t===n.systemDefault?i:t===n.light||t===n.dark?t:e===n.systemDefault?i:e}function i(n){typeof Log!==r&&Log.LogFilterFlare&&Log.LogFilterFlare([n])}function l(){if(!t.matchMedia)return"0";var n=t.matchMedia("(prefers-color-scheme: dark)");return n.matches?"1":"0"}function u(){o();sj_be(f,"visibilitychange",function(){f.visibilityState==="visible"&&o()})}var n;(function(n){n.light="0";n.dark="1";n.systemDefault="2"})(n||(n={}));var r="undefined",t=window,f=document,s=typeof DarkSchemeCookies!==r,h="WEBTHEME",e=s&&typeof(DarkSchemeCookies===null||DarkSchemeCookies===void 0?void 0:DarkSchemeCookies.defaultThemeOption)!==r?DarkSchemeCookies.defaultThemeOption:n.light;typeof sj_cook!==r&&sj_cook&&(u(),sj_evt.unbind("ajax.load",u),sj_evt.bind("ajax.load",u))})(DarkModeLogging||(DarkModeLogging={})) \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/RJCuLkK5GWeRhlsFY0jtwWOl9ZM.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/RJCuLkK5GWeRhlsFY0jtwWOl9ZM.js new file mode 100644 index 0000000..ec85f88 --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/RJCuLkK5GWeRhlsFY0jtwWOl9ZM.js @@ -0,0 +1 @@ +var MultiLingualKeyboardScriptLoader;(function(n){function u(t,u,f,e,o){n.Languages=t.split(",");n.Languages!==null&&n.Languages.length>0&&(r=n.Languages[0].split(":")[0]);n.EmojiEnabled=f;n.ExtendedKeyboardLayout=e;n.IsSettingsPage=o;n.EmojiEnabled&&sj_evt.bind("onP1",i,!0);n.KeyboardType=u}function i(){typeof MultiLingualKeyBoard=="undefined"||MultiLingualKeyBoard.prevSelectedLang!==r&&MultiLingualKeyBoard.KeyboardTypes.Tabbed!==n.KeyboardType?loadMultiKeyBoardScript():MultiLingualKeyBoard.initializeKeyboard()}function f(){n.KbdIconPressed=!0;e()?MultiLingualKeyBoard.closeKeyboard():i()}function e(){var n=_ge("keyboard");return n!==null&&(n.style.display==="block"||n.style.display==="")?!0:!1}var r="",t;n.EmojiEnabled=!1;n.ExtendedKeyboardLayout=!1;n.IsSettingsPage=!1;n.KbdIconPressed=!1;n.init=u;n.keyboardScriptLoader=i;t=_ge("vkeyIcon");t&&(t.className="vkeyRest",sj_be(t,"click",f))})(MultiLingualKeyboardScriptLoader||(MultiLingualKeyboardScriptLoader={})) \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/RVMg7eMIfRv9OBqTC5vFN4zwJFE.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/RVMg7eMIfRv9OBqTC5vFN4zwJFE.js new file mode 100644 index 0000000..2352ab5 --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/RVMg7eMIfRv9OBqTC5vFN4zwJFE.js @@ -0,0 +1 @@ +var sa_storage={},sa_eL=!1;(function(){function f(t){var i=decodeURIComponent(sa_config.u+encodeURIComponent(t));return n.ascsr&&(i=i+"&csr=1"),n.isPathSearch&&(i=i+"&pths=1"),n.enableRequeryParam&&(i=i+"&rqry=1"),n.ascssdis||n.ascsr||(i=i+"&css=1"),_G.IG!==null&&_G.IG!==""&&_G.IG!==undefined?(n.isP0&&(n.sfx=(n.sfx||0)+1,i=i+"&sfx="+n.sfx+"&iid=AS&ig="+_G.IG),i+"&zis=1&pf=1&cvid="+_G.IG):""}function a(n){Log&&Log.Log&&Log.Log("AS.Error",n,"AS",!0)}function v(){var e,u=t&&t.getAttribute("value")?t.getAttribute("value").toLocaleLowerCase():"",r,h,o;u.length<30&&(r=sj_gx(),h=f(u),h!==""&&(r.open("GET",f(u),!0),i!==null&&i.parentNode!==null&&(o=(e=i.parentNode.offsetWidth)===null||e===void 0?void 0:e.toString(),n.cors?r.setRequestHeader("contentWidth",o):r.setRequestHeader("X-Autosuggest-ContentWidth",o)),n.IsBingPrivate&&!n.cors&&r.setRequestHeader("preferAnonymous","1"),r.onload=function(){r.status===200&&(!n.ascsr||n.ascsr&&s(r.responseText))&&(sa_storage[u]=r)},r.send()))}function y(){var u=t&&t.getAttribute("value")?t.getAttribute("value").toLocaleLowerCase():"",i=sj_gx(),e=f(u),r;e!==""&&(i.open("GET",e,!0),n.IsBingPrivate&&!n.cors&&i.setRequestHeader("preferAnonymous","1"),n.eibs&&typeof SearchBoxImageManager!="undefined"&&(r=SearchBoxImageManager.getAttachedImageFields()||null,r===null||r===void 0?void 0:r.forEach(function(n){var t=n[0],r=n[1];return i.setRequestHeader("vss-"+t,r)})),i.onload=function(){i.status===200&&(!n.ascsr||n.ascsr&&s(i.responseText))&&(sa_storage[u]=i)},i.send())}function p(t){try{var i=_w.localStorage?_w.localStorage.getItem(t):null,r=JSON.parse(i),u=parseInt(r.expiry,10),f=(new Date).getTime();u>f&&(n.asprefrev3?y():v())}catch(e){}}function s(n){if(typeof n!="string"||n.length===0)return!1;try{return JSON.parse(n),!0}catch(t){return!1}}function h(t,i,r){t&&k(t,i);sa_eL=sa_eL||r;var u=i==="load"&&n.bundleearly;o||u||(o=!0,sj_evt.fire("AS.bootload",t),sa_loader(),(n.aspreinitcss||n.ascsr)&&w(),n.ascsr&&typeof preact=="undefined"&&typeof sa_preactloader!="undefined"&&sa_preactloader(),n.csr_precompbootstrap&&typeof sa_preactcompsloader!="undefined"&&sa_preactcompsloader())}function w(){var n=document.getElementById("as-css-link");n!==null&&n.setAttribute("rel","stylesheet")}function b(){var n,t=document.querySelectorAll('link[id="as-css-link"]');t!==null&&t!==undefined&&t.length>1&&((n=document.querySelector('link[id="as-css-link"][rel="prefetch"]'))===null||n===void 0?void 0:n.remove())}function u(n){h(t,n.type,!0,sj_ev(n))}function c(n){h(_w,"load",!1,sj_ev(n))}function l(i){"ontouchend"in _w&&i(t,"touchend",u);i(t,"click",u);i(t,"keydown",u);n.ol&&i(_w,"load",c)}function k(n,t){t==="touchend"||t==="click"||t==="keydown"?sj_ue(n,t,u):t==="load"&&sj_ue(n,t,c)}function d(){l(sj_ue)}var n,t,i,r,e,o;if(typeof sa_config=="undefined"||!sa_config){a("sa_config is not defined");return}if(n=sa_config,t=_ge(n.i),t&&t.setAttribute("autocomplete","off"),performance.mark("AutosuggestBootstrapLoaded"),n.asaccfixid&&b(),i=_ge(n.c),!i){if(r=_ge("sa_qs")||t,!r){_w.sj_log&&sj_log("CI.AS","AS Init Failed","sq_qs_or_sb_not_found");return}i=sj_ce("div");i.id=n.c;n.isCS?(e=_ge("b_copilot_composer_sbox"),e&&e.appendChild(i)):_ge("sb_form_q").nodeName==="TEXTAREA"?r.parentNode&&r.parentNode.parentNode.appendChild(i):r.parentNode.appendChild(i)}n.asprefre&&p("asUsed");o=!1;_w.sa_loader&&(l(sj_be),sj_evt.bind("unload",d,!0))})() \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/UgmP1j-4Pi955B_bo_8XJ3dd2AM.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/UgmP1j-4Pi955B_bo_8XJ3dd2AM.js new file mode 100644 index 0000000..23bce9d --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/UgmP1j-4Pi955B_bo_8XJ3dd2AM.js @@ -0,0 +1 @@ +var amd,define,require;(function(n){function e(n,i,u){t[n]||(t[n]={dependencies:i,callback:u},r(n))}function r(n){if(n){if(n)return u(n)}else{if(!f){for(var r in t)u(r);f=!0}return i}}function u(n){var s,e;if(i[n])return i[n];if(t.hasOwnProperty(n)){var h=t[n],f=h.dependencies,l=h.callback,a=r,o={},c=[a,o];if(f.length<2)throw"invalid usage";else if(f.length>2)for(s=f.slice(2,f.length),e=0;e=0&&Log&&Log.LogFilterFlare&&Log.LogFilterFlare(["ClickRefreshImp"]);var t=_d.getElementsByTagName("a"),i=!1,r,u=_G!==undefined&&_G.NTT!==undefined?_G.NTT:null;for(n=0;n=0||t[n].getAttribute("href").indexOf("/rebates/welcome")>=0||t[n].hasAttribute("class")&&t[n].getAttribute("class").indexOf("b_ignbt")>=0||t[n].hasAttribute("onclick")&&t[n].getAttribute("onclick").indexOf("return false;")>=0||(sj_be(t[n],"click",function(n){for(var t=sj_et(n);t!=null;){if(t.tagName.toLowerCase()=="a"){u!=null&&(r=sb_st(function(){i=!0},u));break}t=t.parentNode}}),sj_evt.bind("uarequery",function(){sb_ct(r)}));u!=null&&(window.history.scrollRestoration="auto",_d.addEventListener("visibilitychange",function(){if(_d.visibilityState==="visible"&&!(_w&&_w._isConvAutoHide)&&(sj_evt.fire("openNewTabonP1"),sb_ct(r),Log&&Log.LogFilterFlare&&Log.LogFilterFlare(["ClickBackFromTab"]),i&&(window.history.scrollRestoration="manual",i=!1,window.location.href.indexOf("/search")>=0))){Log&&Log.Log&&Log.Log("NTRef","Refresh","");(Log===null||Log===void 0?void 0:Log.LogFilterFlare)&&(Log===null||Log===void 0?void 0:Log.LogFilterFlare(["ClickRefreshAjax"]));var n=window.location.href+(window.location.href.indexOf("&ntref=1")<0?"&ntref=1":"");window.location.href=n}}))})() \ No newline at end of file diff --git a/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/k02upO3eJWjKAquJryP9z-tXM5o.js b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/k02upO3eJWjKAquJryP9z-tXM5o.js new file mode 100644 index 0000000..e5dcf05 --- /dev/null +++ b/crates/e2e/real-web/snapshots/bing.com/r.bing.com/rp/k02upO3eJWjKAquJryP9z-tXM5o.js @@ -0,0 +1 @@ +(function(n){function i(){var e,o,u,s,f,r;if(document.querySelector&&document.querySelectorAll){e=[];o=n.rules;for(u in o)for(s=o[u],u+=!s[2]?"":" >*",f=document.querySelectorAll(u),r=0;r=100?"":"alpha(opacity="+t+")",n.style.opacity=t/100)}t.__esModule=!0;t.getTime=t.getOffset=t.stopPropagation=t.preventDefault=t.wrap=t.forEach=void 0;var i=sb_ie;t.forEach=s;t.wrap=r;t.preventDefault=u;t.stopPropagation=f;t.getOffset=e;t.getTime=o;window.sj_b=document.body;window.sb_de=document.documentElement;window.sj_wf=r;window.sj_pd=u;window.sj_sp=f;window.sj_go=e;window.sj_ev=h;window.sj_et=c;window.sj_mi=l;window.sj_mo=a;window.sj_we=v;window.sb_gt=o;window.sj_so=p;window.sj_lc=y});define("env",["require","exports","shared"],function(n,t,i){function y(n,t){return t.length&&typeof n=="function"?function(){return n.apply(null,t)}:n}function p(n,t){var o=[].slice.apply(arguments).slice(2),i,s=y(n,o);return o.length===1&&typeof o[0]=="string"&&o[0]==="ASInternal"?(u(h),i=f(s,t),h=i,i):(typeof s=="function"&&(i=window.setImmediate&&!window.setImmediate.Override&&(!t||t<=16)?"i"+setImmediate(s):f(s,t),r[e]=i,e=(e+1)%v),i)}function w(n,t){var r=[].slice.apply(arguments).slice(2),i=a(y(n,r),t);return s[o]=i,o=(o+1)%v,i}function b(){c.forEach(r,u);c.forEach(s,window.clearInterval);u(h);e=o=s.length=r.length=0;r=[]}function u(n){if(n!=null&&(typeof n=="string"&&n.indexOf("i")===0?window.clearImmediate(parseInt(n.substr(1),10)):l(n),typeof _G!="undefined"&&_G.ClearTimersOpt===!0)){var t=r.indexOf(n);t!==-1&&r.splice(t,1)}}var c=i,r=[],s=[],h,f,l,a,v=1024,e=0,o=0;f=window.setTimeout;t.setTimeout=p;a=window.setInterval;t.setInterval=w;t.clear=b;l=window.clearTimeout;t.clearTimeout=u;window.sb_rst=f;window.setTimeout=window.sb_st=p;window.setInterval=window.sb_si=w;window.clearTimeout=window.sb_ct=u});define("event.custom",["require","exports","shared","env"],function(n,t,i,r){function f(n){return u[n]||(u[n]=[])}function e(n,t){n.d?l.setTimeout(c.wrap(n,t),n.d):n(t)}function v(n,t,i){var r,f;for(r in u)f=i?t&&r.indexOf(t)===0:!(r.indexOf(a)===0)&&!(t&&r.indexOf(t)===0)&&!(n!=null&&n[r]!=null),f&&delete u[r]}function o(n){for(var t=f(n),u=t.e=arguments,i,r=0;r0&&r*6e4<33696e6?r*6e4:33696e6,c=new Date((new Date).getTime()+Math.min(h,33696e6)),f="",e;w()&&(e=p(),f=e+(u?";SameSite="+u:";SameSite=None"));document.cookie=n+s+(t?";expires="+c.toGMTString():"")+(i?";path="+i:"")+f}function h(n,t,r,u,f){if(!i){var e=n+"="+t;s(e,r,u,f)}}function c(){return!i}function r(n,t){var r,f;return i||!u(n,t)?(window.Log&&window.Log.Log?Log.Log("CookieGetBlocked",n,t):window.directLog(JSON.stringify([{T:"CI.CookieGetBlocked",FID:n,Name:t}]),0),null):(r=document.cookie.match(new RegExp("\\b"+n+"=[^;]+")),t&&r)?(f=r[0].match(new RegExp("\\b"+t+"=([^&]*)")),f?f[1]:null):r?r[0]:null}function l(n,t,f,e,o,h){var a,c,l,v;if(!i)try{window.cookieGetAccess=!0;c=t+"="+f;l=r(n);l?(v=r(n,t),a=v!==null?l.replace(t+"="+v,c):l+"&"+c):a=n+"="+c;u(n,t)?s(a,e,o,h):window.Log&&window.Log.Log?Log.Log("CookieSetBlocked",n,t):window.directLog(JSON.stringify([{T:"CI.CookieSetBlocked",FID:n,Name:t}]),0)}finally{window.cookieGetAccess=!1}}function a(n,t){if(!i){var r=n+"=",u=o();document.cookie=r+u+";expires="+y+(t?";path="+t:"")}}var e;Object.defineProperty(t,"__esModule",{value:!0});t.clear=t.set=t.get=t.areCookiesAccessible=t.setNoCrumbs=t.isCookieAccessAllowed=void 0;var v=["dsc","__RequestVerificationToken","_C_Auth","_C_ETH","_DPC","_EDGE_E","_EDGE_S","_EDGE_V","_FP","_IDET","_NTPC","_RwBf","_Rwho","_SS","_TTSS_IN","_TTSS_OUT","_uetmsclkid","_uetsid","3PAdsOptOut","ACL","ACLUSR","ak_bmsc","BFB","BCP","BN","bngps","btstkn","cct","CortanaAppUID","EDGSRVC","EDGSRVCPERSIST","ENSEARCH","fbar","GC","imganim","imgv","ipv6","mapc","MMCASM","msau","msedgmig","MSPTC","MUID","MUIDB","NAP","OIDI","OIDJSO","OIDR","OIDST","OIDT","OPLCLNTUA","OptanonConsent","PPLState","sbi","SMHV","SNRHOP","SnrOvr","SRCHCNT","SRCHD","SRCHHPGUSR","SRCHUID","SRCHUSR","SUID","tarLang","TRBDG","TTRSL","UCB","videoanim",],i=!1,f=!0,y=new Date(0).toGMTString();window.cookieGetAccess=!1;try{e=document.cookie}catch(k){i=!0}t.isCookieAccessAllowed=u;t.setNoCrumbs=h;t.areCookiesAccessible=c;t.get=r;t.set=l;t.clear=a;window.sj_cook={get:r,set:l,setNoCrumbs:h,clear:a,areCookiesAccessible:c}});define("rmsajax",["require","exports"],function(n,t){function w(){for(var i,n=[],t=0;t=n.length)&&!i){var r=_G.EnableRMSINPOpt&&t%10==0&&!document.hidden;r?at(function(){vt(n,t);k(n,t+1)}):(vt(n,t),k(n,t+1))}}function vt(n,t){if(!i){var r=n[t];r.run=e;vi(r,function(t){return function(){yi(t,n)}}(r))}}function yt(){var t=arguments,n,r;if(t.length===0||i)return!1;if(n=u[kt(t[0])],t.length>1)r=ki.apply(null,t),k(r,0);else{if(tt(n))return!0;n.run=e;dt(n,function(){wt(n)})}return!0}function vi(n,t){var u,o,e,f;if(n.state){n.state===s&&n.callbacks.length>0&&d(n);return}if(!i){if(n.state=si,fi(n)){t();return}typeof XMLHttpRequest!="undefined"&&XMLHttpRequest?(u=new XMLHttpRequest,u.open("GET",n.url,!0),(_G===null||_G===void 0?void 0:_G.YBLNS)?(o=function(){!a&&(u.status<200||u.status>=400)&&(rt(n.url,"2",{resourceUrl:n.url,pageUrl:window.location.href,status:u.status,response:u.responseText}),a=!0);t()},u.onload=o,u.onerror=o):u.onreadystatechange=function(){u.readyState==4&&(!a&&(u.status<200||u.status>=400)&&(rt(n.url,"2",{resourceUrl:n.url,pageUrl:window.location.href,status:u.status,response:u.responseText}),a=!0),t())},u.send()):window.ActiveXObject!==undefined||li.test(navigator.userAgent)?(e=new Image,e.onload=t,e.onerror=t,e.src=n.url):(f=r.createElement("object"),f.setAttribute("width","0"),f.setAttribute("height","0"),f.setAttribute("tabindex","-1"),f.setAttribute("aria-hidden","true"),f.onload=t,f.onerror=t,f.setAttribute("data",n.url),r.body.appendChild(f))}}function yi(n,t){n.run!=e||i||(n.state=ft,bt(t))}function pt(n,t){n.run!=e||i||dt(n,function(n){return function(){wt(n,t)}}(n))}function wt(n,t){n.run!=e||i||(n.state=s,d(n),n.ro&&!y[n.key]&&(y[n.key]=!0),t)&&bt(t)}function bt(n){for(var i,t=0;t0){var t=n.callbacks.shift();t.dec()}}function dt(n,t){var c,u,v,o,y,e,h,l,f;if(n.state==et||n.state==s){n.state===s&&n.callbacks.length>0&&d(n);return}if(!i)if(n.state=et,u=r.createElement("SCRIPT"),v=n.ct!==undefined?n.ct:"text/javascript",u.type=v,u.setAttribute("data-rms","1"),n.key!==undefined&&n.key==="rms:answers:AutoSuggest:AutoSug"&&(u.onerror=function(){n.state=hi}),u.onreadystatechange=u.onload=function(){var i=u.readyState;if(!i||/loaded|complete/.test(i))try{gt(t)}catch(r){throw new TypeError("processCallback threw error for script:"+n.key+" script Url:"+n.url+" error stack:"+(r?r.stack:""));}},fi(n)){if(o=_w.jsDefer,o)o.length>n.pos&&(u.text=o[n.pos],r.body.appendChild(u));else if(y=n.app?st:ot,l=it("tempscripttag"),(e=r.getElementById(y))&&(h=l?(c=e===null||e===void 0?void 0:e.content)===null||c===void 0?void 0:c.childNodes:e===null||e===void 0?void 0:e.childNodes)&&h[n.pos]&&(f=h[n.pos].innerHTML,wi(h,n.pos),f&&(f===null||f===void 0?void 0:f.length))){if(!l){var p=4,w=3,a=f.length,b=f.substring(0,p),k=f.substring(a-w,a);b==""&&(f=f.substring(p,a-w))}u.text=typeof DefaultTrustedTypesPolicy!="undefined"&&DefaultTrustedTypesPolicy.getOpaqueScript?DefaultTrustedTypesPolicy.getOpaqueScript(f):f;r.body.appendChild(u)}gt(t)}else u.src=n.url,(!ei()||ei()&&di(u.src))&&u.setAttribute("crossorigin","anonymous"),ct||(rt(u.src,"1",{resourceUrl:u.src}),ct=!0),r.body.appendChild(u)}function wi(n,t){var i,r,u=(i=n[t])===null||i===void 0?void 0:i.getAttribute("rkey"),f=(r=n[t+1])===null||r===void 0?void 0:r.getAttribute("rkey");_w.lirab=u;_w.liraa=f}function gt(n){n.done||(n.done=!0,n())}function ni(n){return ht.call(n)=="[object Function]"}function ti(n){return ht.call(n)=="[object Array]"}function ii(n,t,i){for(var u,f=new g(i),r=0;r=0}function tt(n){return n&&n.ro&&n.key&&y[n.key]}function it(n){return _G!==undefined&&_G.EF!==undefined&&_G.EF[n]===1}function nr(n){if(v&&v.length>0)for(var t=0;ti[sr]&&(f.errorType="Overload",i[s]=!1),h={impressionGuid:r,timestamp:o,data:{eventType:dt,eventData:f}},ai([h])):tt(dt,f,null))}function su(){ou();lr();try{w=_w.localStorage;u.initialize()}catch(n){}}function p(n){u.append(n);l()}function li(n){return JSON.stringify(n).replace(/]]>/g,"]]]\]>")}function r(n,t,i){n.push("<",t,">",i,"<\/",t,">")}function hu(n,t,i){var s,o=n.data,f=o.eventData,h,u,e;f||(f=o.eventData={});t.push("");r(t,"T","Event."+o.eventType);r(t,"IG",f.OvrIG||n[et]);n[fi]&&(r(t,"PrevIG",n[fi]),n[ei]&&r(t,"DominantIG",n[ei]));h=o.dataSources;h&&r(t,"DS","");u=o.pageLayout;u&&(t.push(""),e=!1,"Name"in u&&(r(t,"Name",u.Name),e=!0),"Number"in u&&(r(t,"Num",u.Number),e=!0),"IID"in u&&(r(t,"IID",u.IID),e=!0),"SFX"in u&&(r(t,"SFX",u.SFX),e=!0),e&&(u=(s=u.L)!==null&&s!==void 0?s:[]),r(t,"L",""),t.push("<\/Page>"));f.UTS=i;ir&&(delete f.RTS,delete f.CurUrl,delete f.SDK,delete f.XLSF);r(t,"D","");r(t,"TS",n[rr]);t.push("<\/E>")}function ct(n){var t=_w.location.href,i;return ut&&t.indexOf(ut)===0||(i=t.indexOf("?"),i<0&&(i=t.indexOf("#")),ut=i<0?t:t.substring(0,i)),n.CurUrl=ut,n}function ar(n){var i={isCompressed:!1,stringValue:""},t=[""],l=(new Date).getTime(),a=_G.CID||sj_cook.get(pi,pi),s,u,v,f,h,c,e,y,o;if(a&&r(t,"CID",a),n.length>0){for(s=n[0].data,s.eventType==gt&&(u=s.pageLayout,u&&u.IID&&u.SFX&&(v=u.IID+"_"+u.SFX,r(t,"AppNS",v))),f=0,h=ru;f0){for(t.push(""),e=0;e")}}if(t.push("<\/ClientInstRequest>"),o=t.join(""),_G.EnableCompression&&_w.fflate){var w=_w.fflate.strToU8(o),k=_w.fflate.deflateSync(w),p=btoa(String.fromCharCode.apply(String,k));if(p.lengthi[d]||r&&r.forceFlushNoSB)e[f].abort(),e[f]=null,y("TimedOut",1,_G.IG);else return;if(a=gr(r),v=u.getBatch(n),v.length!=0){if(p=v.map(function(n){return n.log}),a&&at(p,"SB"),h=ar(p),w=vr(h),a&&lu(w,h.stringValue)){e[f]&&t&&(e[f].abort(),e[f]=null);u.clearSentItems(n,!0)&&!n&&l(!1);l(!0);return}o=sj_gx();o.open("POST",w,!0);i[d]>=1e3&&(o.timeout=i[d]);o.onload=function(){return cu(o,e,n)};o.setRequestHeader("Content-type","text/xml");e[f]=o;e[ur]=(new Date).getTime();o.send(h.stringValue)}}}function at(n,t,i){n.forEach(function(n){var r,u;(r=(u=n.data.eventData)[kt])!==null&&r!==void 0?r:u[kt]={};n.data.eventData[kt][t]=i!==null&&i!==void 0?i:"1"})}function cu(n,t,i){if(n.readyState===4){t[f]=null;var r=Math.floor(n.status/100);r===2?(u.clearSentItems(i)&&!i&&l(!1),l(!0)):r===4?(u.markFailedItems(!0,i),l(!0)):u.markFailedItems(!1,i);i&&u.recordRetryAttempt()}}function vt(n,t,i,r,u,f,e,o,s){for(var d,h,a,v,l,y,g,c,p,w,b,k=0,nt=iu;k=0?h.T=i:(i.substring(0,3)==="CI."&&(i=i.substring(3)),h.T="CI."+i)),v=s||(new Date).getTime(),h.TS=v,h.RTS=v-bi,h.SEQ=ni++,l=(c={},c[et]=f||h.ImpressionGuid||_G.IG,c[fi]=e,c[rr]=v,c.data={eventType:n||rt,eventData:h,dataSources:r,pageLayout:u},c[ei]=o,c),_G.XLSThrottle&&eu.indexOf(h.T)===-1){if(y=[l[et],n!==null&&n!==void 0?n:rt,(p=h.T)!==null&&p!==void 0?p:"",(w=h.FID)!==null&&w!==void 0?w:"",(b=h.Name)!==null&&b!==void 0?b:""].join(","),si.hasOwnProperty(y)||(si[y]=0),g=++si[y],g>_G.XLSThrottle)return null;g===_G.XLSThrottle&&at([l],"TT")}return h.T==="CI.Click"||h.T==="CI.PositiveInteractionEvent"&&ft||h.T==="CI.PredictionShown"||n===gt?(h.T==="CI.Click"&&ft&&h.AppNS&&h.K&&h.Component!=="SearchByImage"&&(h.T="CI.PositiveInteractionEvent",h.OrigFID=h.FID,h.OrigName=h.Name,h.FID="APSAT",h.Name="NonNavClick"),ai([l]),null):l}function ai(n){var i=ar(n),r=vr(i),u=i.stringValue,t;navigator&&navigator.sendBeacon?navigator.sendBeacon(r,u):(t=sj_gx(),t.open("POST",r),t.setRequestHeader("Content-type","text/xml"),t.send(u))}function yr(n,t){var r=[];for(var i in n)n.hasOwnProperty(i)&&(typeof n[i]=="string"&&(n[i]=decodeURIComponent(n[i])),r.push(i,n[i]));a(n.T,n.FID,n.Name,t,r,"DL")}function vi(n,t){(new Image).src=_G.lsUrl+"&dl=2&Type=Event.ClientInst&DATA="+n;a("Info","XLS","DLFallback",!1,["DATA",n,"SRC",t],"DLF")}function yi(n,t,i){var r,u,f,e;if(_G.DirectLogFlight!=null&&t<=_G.DirectLogFlight)try{r=null;try{r=JSON.parse(n)}catch(o){r=JSON.parse(decodeURIComponent(n).replace(/[\u0000-\u001F]+/g,""))}if(Array.isArray(r))for(u=0,f=r;u0&&tt(wi,(t={queryTags:i.join(",")},t[e]="F",t),wi)}function br(n,t,r,u,f,o){var h,l,c;if(i[s]){if(!n||!t||!r||!u)return console.error("LogCustomData: Missing one or more required identifier fields in data object");(l=__assign((h={T:n,FID:t,Name:r,Namespace:u,CustomDataKeys:Object.keys(f).join(",")},h[e]=v+"CD",h),f),c=vt(rt,l,n,null,null,o),c)&&p(c)}}function lu(n,t){var i="sendBeacon",r=!1;if(navigator&&navigator[i])try{r=navigator[i](n,t)}catch(u){y("SBFail",1,_G.IG)}return r}function gr(n){return _w[o]&&_w[o][nr]?_w[o][nr](n):n&&n.useSendBeacon}function nu(n,t){n===void 0&&(n=!0);(gr(t)||t&&t.forceFlushNoSB)&&(u.dumpToStorage(),nt(!1,!0,t))}function yt(){u.dumpToStorage();nt(!1,!1)}function pt(){u.dumpToStorage();ii=!0;nt(!1,!0,{useSendBeacon:!0})}function tu(n,t,i){n!==null&&n!==void 0?n:n={};n[e]=v+"LP";tt(gt,n,"ClientSidePartialImpression",t,i)}var it,wt,bt,cr,u,c,kr,dr,a;Object.defineProperty(t,"__esModule",{value:!0});t.LogPartialImpression=t.FlushMainQueueDontForce=t.ForceFlush=t.Log2=t.Log=t.LogCustomData=t.LogFilterFlare=t.LogEvent=t.LogPerf=t.DirectLog=t.modifyRoute=t.collectCommonEventProperties=t.enqueue=void 0;var v="XLS-",e="SDK",kt="XLSF",pi="MUID",dt="CIQueueError",gt="PartialDynamicContent.FrontDoor",rt="ClientInst",wi="FilterFlare",i,ni,bi,w,ut,ki=0,di="ClientInstConfig",ti="XLS_PreProcessor",iu=["ChatPrivacy","WSB"],b="XLS_PostProcessor",ru=["WSB"],o="XLS_Plugin_Function_Overrides",gi="determineRoute",nr="useSendBeacon",tr="forceFlushNoSendBeacon",ii=!1,ri=!1,ft=!1,ir=!1;var h="inProgress",ui="retried",et="impressionGuid",fi="previousImpressionGuid",ei="dominantImpressionGuid",rr="timestamp",f="currentRequest",ur="requestSentTimestamp",ot="mainQueue",k="retryQueue",st="flushTimeoutHandle",d="flushInterval",fr="retryInterval",er="maxStorageUse",or="maxBatchSize",oi="queueDumpInterval",s="isInstrumentationEnabled",sr="maxDirectErrors",fu="pageInfoTimeout",hr="enableInpOptimizedDump",si={},eu=["CI.Click","CI.BoxModel","CI.FilterFlare"],hi={},g="sj_evt",ht="sj_be",ci;(function(n){n[n.EVENT=0]="EVENT";n[n.MASTER_PAGE_IMPRESSION=1]="MASTER_PAGE_IMPRESSION"})(ci||(ci={}));cr=["IsCI","VDPChapterTimestampClick"],function(n){function k(n){var t=["proactive","search","zinc"].some(function(t){return n.indexOf(t)==1});return"eventLogQueue"+(t?"_Online":"_Offline")}function v(){return f&&i[s]}function u(){var n,t;if(o=!1,v()){n=ut();try{t=c;w[t]=n}catch(i){if(i.name.toLowerCase().indexOf("quota")>=0)f=!1;else throw i;}}}function a(){var n,t,r;if(v()){if(i&&i[hr]){if(o)return;o=!0;n=i[oi];t=_w.requestIdleCallback;typeof t=="function"?(r=t(u,{timeout:n}),_w.addEventListener("beforeunload",function(){_w.cancelIdleCallback(r)})):setTimeout(u,n);return}e&&clearTimeout(e);e=setTimeout(u,i[oi])}}function d(){var n,e,i,u,r;if(w){if(n=w[c],t=[],typeof n=="string"||n&&n.length!==0)try{if(t=JSON.parse(n),t.some(function(n){return!n.log}))y("LSItemErr",t.length,_G.IG),t=[];else if(e=t.length,e>0){for(i=0,u=t;i0}function it(n,i){for(var f=[],s=i?r[0]:t,e=0,u,o,c;e0&&(c=o/2,r.push(f.slice(0,c)),r.push(f.slice(c)));a()}function rt(){var n,t,i;if(r.length>0){for(n=r[0],t=0;t0)for(r=0,n=0;n=u){t.splice(0,n+1);y("QueueTrim",n+1,_G.IG,!0);break}return JSON.stringify(t)}function ft(n){var i,r=(i={log:n,retried:!1},i[h]=!1,i.size=0,i),f=JSON.stringify(r).length+3;r.size=f;t.push(r);ii?u():a()}var t=[],f=!1,e=null,o=!1,r=[],p=_w.location.pathname,c=k(p);n.dumpToStorage=u;n.initialize=d;n.getBatch=g;n.clearSentItems=tt;n.markFailedItems=it;n.recordRetryAttempt=rt;n.append=ft}(u||(u={}));t.enqueue=p;t.collectCommonEventProperties=ct;t.modifyRoute=lt;c=(it={},it[ot]={getInterval:function(){return i[d]}},it[k]={getInterval:function(){return i[fr]}},it);t.DirectLog=yi;t.LogPerf=pr;t.LogEvent=tt;t.LogFilterFlare=wr;t.LogCustomData=br;kr=function(n,t,i,r){for(var f=[],u=4;u0&&f.length%2==0)for(c=0;c>1)),o=0,f=function(n){e[o++]=n};for(u=0;ue.length&&(h=new i(o+8+(c-u<<1)),h.set(e),e=h),r=n.charCodeAt(u),r<128||t?f(r):r<2048?(f(192|r>>6),f(128|r&63)):r>55295&&r<57344?(r=65536+(r&1047552)|n.charCodeAt(++u)&1023,f(240|r>>18),f(128|r>>12&63),f(128|r>>6&63),f(128|r&63)):(f(224|r>>12),f(128|r>>6&63),f(128|r&63));return it(e,0,o)}var i=Uint8Array,r=Uint16Array,l=Int32Array,a=new i([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),v=new i([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),k=new i([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),d=function(n,t){for(var e,f,u=new r(31),i=0;i<31;++i)u[i]=t+=1<>1|(t&21845)<<1,u=(u&52428)>>2|(u&13107)<<2,u=(u&61680)>>4|(u&3855)<<4,p[t]=((u&65280)>>8|(u&255)<<8)>>1;for(o=function(n,t,i){for(var o=n.length,u=0,h=new r(t),f,e,c,a;u>c]=v}}else for(e=new r(o),u=0;u>15-n[u]);return e},e=new i(288),t=0;t<144;++t)e[t]=8;for(t=144;t<256;++t)e[t]=9;for(t=256;t<280;++t)e[t]=7;for(t=280;t<288;++t)e[t]=8;for(s=new i(32),t=0;t<32;++t)s[t]=5;var ct=o(e,9,0),lt=o(s,5,0),tt=function(n){return(n+7)/8|0},it=function(n,t,r){return(t==null||t<0)&&(t=0),(r==null||r>n.length)&&(r=n.length),new i(n.subarray(t,r))},f=function(n,t,i){i<<=t&7;var r=t/8|0;n[r]|=i;n[r+1]|=i>>8},h=function(n,t,i){i<<=t&7;var r=t/8|0;n[r]|=i;n[r+1]|=i>>8;n[r+2]|=i>>16},w=function(n,t){for(var s,o,d,w,e,h,k,g,nt,u=[],f=0;fw&&(w=o[f].s);if(e=new r(w+1),h=b(u[y-1],e,0),h>t){var f=0,c=0,tt=h-t,it=1<t)c+=it-(1<>=tt;c>0;)g=o[f].s,e[g]=0&&c;--f)nt=o[f].s,e[nt]==t&&(--e[nt],++c);h=t}return{t:new i(e),l:h}},b=function(n,t,i){return n.s==-1?Math.max(b(n.l,t,i+1),b(n.r,t,i+1)):t[n.s]=i},rt=function(n){for(var i=n.length,f;i&&!n[--i];);var o=new r(++i),s=0,e=n[0],t=1,u=function(n){o[s++]=n};for(f=1;f<=i;++f)if(n[f]==e&&f!=i)++t;else{if(!e&&t>2){for(;t>138;t-=138)u(32754);t>2&&(u(t>10?t-11<<5|28690:t-3<<5|12305),t=0)}else if(t>3){for(u(e),--t;t>6;t-=6)u(8304);t>2&&(u(t-3<<5|8208),t=0)}while(t--)u(e);t=1;e=n[f]}return{c:o.subarray(0,s),n:i}},c=function(n,t){for(var r=0,i=0;i>8,n[r+2]=n[r]^255,n[r+3]=n[r+1]^255,u=0;u4&&!st[k[ot-1]];--ot);var si=g+5<<3,gt=c(l,e)+c(y,s)+p,ni=c(l,pt)+c(y,wt)+p+14+3*ot+c(et,st)+2*et[16]+3*et[17]+7*et[18];if(d>=0&&si<=gt&&si<=ni)return ut(t,nt,n.subarray(d,d+g));if(f(t,nt,1+(ni15&&(f(t,nt,vt[tt]>>5&127),nt+=vt[tt]>>12)}else ht=ct,at=e,ti=lt,ii=s;for(tt=0;tt255?(it=ft>>18&31,h(t,nt,ht[it+257]),nt+=at[it+257],it>7&&(f(t,nt,ft>>23&31),nt+=a[it]),yt=ft&31,h(t,nt,ti[yt]),nt+=ii[yt],yt>3&&(h(t,nt,ft>>5&8191),nt+=v[yt])):(h(t,nt,ht[ft]),nt+=at[ft]);return h(t,nt,ht[256]),nt+at[256]},at=new l([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),et=new i(0),vt=function(n,t,u,f,e,o){var p=o.z||n.length,dt=new i(f+p+5*(1+Math.ceil(p/7e3))+e),et=dt.subarray(f,dt.length-e),st=o.l,h=(o.r||0)&7,lt,w,ci,ii,c,ui,fi,s,kt;if(t){h&&(et[0]=o.r>>3);for(var ei=at[t-1],ai=ei>>13,vi=ei&8191,oi=(1<7e3||k>24576)&&(lt>423||!st)){for(h=ft(n,et,0,ht,ot,yt,pt,k,ct,s-ct,h),k=ni=pt=0,ct=s,c=0;c<286;++c)ot[c]=0;for(c=0;c<30;++c)yt[c]=0}var rt=2,bt=0,pi=vi,b=d-g&32767;if(lt>2&&ti==hi(s-b))for(var wi=Math.min(ai,lt)-1,bi=Math.min(32767,s),ki=Math.min(258,lt);b<=bi&&--pi&&d!=g;){if(n[s+rt]==n[s+rt-b]){for(w=0;wrt){if(rt=w,bt=b,w>wi)break;for(ci=Math.min(b,w-2),ii=0,c=0;cii&&(ii=li,g=ri)}}}d=g;g=vt[d];b+=d-g&32767}bt?(ht[k++]=268435456|y[rt]<<18|nt[bt],ui=y[rt]&31,fi=nt[bt]&31,pt+=a[ui]+v[fi],++ot[257+ui],++yt[fi],wt=s+rt,++ni):(ht[k++]=n[s],++ot[n[s]])}}for(s=Math.max(s,wt);s=p&&(et[h/8|0]=st,kt=p),h=ut(et,h+1,n.subarray(s,kt));o.i=p}return it(dt,0,f+tt(h)+e)},yt=function(n,t,r,u,f){if(!f&&(f={l:1},t.dictionary)){var e=t.dictionary.subarray(-32768),o=new i(e.length+n.length);o.set(e);o.set(n,e.length);n=o;f.w=e.length}return vt(n,t.level==null?6:t.level,t.mem==null?f.l?Math.ceil(Math.max(8,Math.min(13,Math.log(n.length)))*1.5):20:12+t.mem,r,u,f)};var ot=typeof TextEncoder!="undefined"&&new TextEncoder,wt=typeof TextDecoder!="undefined"&&new TextDecoder,bt=0;try{wt.decode(et,{stream:!0});bt=1}catch(dt){}return n.deflateSync=pt,n.strToU8=kt,Object.defineProperty(n,"__esModule",{value:!0}),n}({});fallbackReplay=require("fallback");typeof fallbackReplay!="undefined"&&fallbackReplay!=null&&fallbackReplay.replay();var sj_anim=function(n){var s=25,t=this,c,u,h,f,e,o,l,i,r;t.init=function(n,s,a,v,y){if(c=n,e=s,o=a,l=v,r=y,v==0){f=h;r&&r();return}i||(i=e);u||t.start()};t.start=function(){h=sb_gt();f=Math.abs(o-i)/l*s;u=setInterval(t.next,s)};t.stop=function(){clearInterval(u);u=0};t.next=function(){var u=sb_gt()-h,s=u>=f;i=e+(o-e)*u/f;s&&(t.stop(),i=o);n(c,i);s&&r&&r()};t.getInterval=function(){return s}},sj_fader=function(){return new sj_anim(function(n,t){sj_so(n,t)})},customEvents=require("event.custom");customEvents.bind("onPP",function(){customEvents.fire("onP1Lazy")},!0),function(n){function i(n,t){return typeof n[t]!="undefined"}function t(){_d.addEventListener("visibilitychange",function(){_d.visibilityState==="visible"&&(i(window,"Log2")&&Log2.LogEvent?(Log2.LogEvent("TabFocusChanged",{Name:_d.visibilityState,FID:"TabFocused"},"TabFocusChanged",!1),Log.Log("TabFocusChanged","CI","TabFocused",!1,"Text","Triggered"),Log.LogFilterFlare(["tabFocusChanged"])):Log&&Log.LogCustomEvent?(Log.LogCustomEvent("TabFocusChanged","TabFocused",_d.visibilityState,!0),Log.Log("TabFocusChanged","CI","TabFocused",!1,"Text","Triggered"),Log.LogFilterFlare(["tabFocusChanged"])):Log.Log("CI.TabFocusChanged","TabFocused","Triggered"))})}n.LogEventOnTabVisibilityChange=t;sj_evt.bind("onP1",function(){t()},1)}(EventLoggingModule||(EventLoggingModule={})) \ No newline at end of file diff --git a/crates/e2e/scenarios/real-web/bing.com.we b/crates/e2e/scenarios/real-web/bing.com.we index 7245855..0abd045 100644 --- a/crates/e2e/scenarios/real-web/bing.com.we +++ b/crates/e2e/scenarios/real-web/bing.com.we @@ -32,6 +32,40 @@ cache_put bing https://r.bing.com/rs/2A/5z/cc,nc/VJ8ZtHtD4GLnQmx3uHNqrAvbpik.css # returns the same status Chromium sees when re-baselining the golden. cache_put_status bing https://r.bing.com/rb/2A/cir3,cc,nc/t6ilQvdm1Kf1VaabvAwljycjim4.css?bu=CPIB9QGWAqgCmQKZApkC4gI&or=w 404 ../../real-web/snapshots/bing.com/r.bing.com/rb/2A/cir3,cc,nc/t6ilQvdm1Kf1VaabvAwljycjim4.css.empty text/css Not Found +# First-level script bundles from the snapshot document. These let the +# offline run exercise Bing's bootstrap/hydration path rather than stopping at +# deterministic network misses. +cache_put bing https://r.bing.com/rp/Yvu4V7hzvXm-5_FtB2akUvonmKM.js ../../real-web/snapshots/bing.com/r.bing.com/rp/Yvu4V7hzvXm-5_FtB2akUvonmKM.js application/javascript +cache_put bing https://r.bing.com/rp/DB0udn8H5cDxTqZJgNshPTecxvc.js ../../real-web/snapshots/bing.com/r.bing.com/rp/DB0udn8H5cDxTqZJgNshPTecxvc.js application/javascript +cache_put bing https://r.bing.com/rp/k02upO3eJWjKAquJryP9z-tXM5o.js ../../real-web/snapshots/bing.com/r.bing.com/rp/k02upO3eJWjKAquJryP9z-tXM5o.js application/javascript +cache_put bing https://r.bing.com/rp/mwh9KsAwlngFDUvI3rY7crOD9X0.js ../../real-web/snapshots/bing.com/r.bing.com/rp/mwh9KsAwlngFDUvI3rY7crOD9X0.js application/javascript +cache_put bing https://r.bing.com/rp/6EHNaAzAbu-ADYy6VtbEC2WZs4E.js ../../real-web/snapshots/bing.com/r.bing.com/rp/6EHNaAzAbu-ADYy6VtbEC2WZs4E.js application/javascript +cache_put bing https://r.bing.com/rs/6q/gm/jnc,nj/tlifxqsNyCzxIJnRwtQKuZToQQw.js?or=w ../../real-web/snapshots/bing.com/r.bing.com/rs/6q/gm/jnc,nj/tlifxqsNyCzxIJnRwtQKuZToQQw.js application/javascript +cache_put bing https://r.bing.com/rp/W__x2Ywb6nncGyDnYvyiUuZsTV0.js ../../real-web/snapshots/bing.com/r.bing.com/rp/W__x2Ywb6nncGyDnYvyiUuZsTV0.js application/javascript +cache_put bing https://r.bing.com/rp/JR0XRqcnAQqVjEnEFkLdPrKHlsw.js ../../real-web/snapshots/bing.com/r.bing.com/rp/JR0XRqcnAQqVjEnEFkLdPrKHlsw.js application/javascript +cache_put bing https://r.bing.com/rp/UgmP1j-4Pi955B_bo_8XJ3dd2AM.js ../../real-web/snapshots/bing.com/r.bing.com/rp/UgmP1j-4Pi955B_bo_8XJ3dd2AM.js application/javascript +cache_put bing https://r.bing.com/rp/D5G8rA7h76k8B81shEt4t4fE9vo.js ../../real-web/snapshots/bing.com/r.bing.com/rp/D5G8rA7h76k8B81shEt4t4fE9vo.js application/javascript +cache_put bing https://r.bing.com/rp/vLKeuDLdCvxOWxuEByD_cvYGgD8.js ../../real-web/snapshots/bing.com/r.bing.com/rp/vLKeuDLdCvxOWxuEByD_cvYGgD8.js application/javascript +cache_put bing https://r.bing.com/rp/zHySMyVYNaSvXuYyJETWJdw6lhU.js ../../real-web/snapshots/bing.com/r.bing.com/rp/zHySMyVYNaSvXuYyJETWJdw6lhU.js application/javascript +cache_put bing https://r.bing.com/rp/cC8cvzy5myMTv0ycqwKfwYQi4Q8.js ../../real-web/snapshots/bing.com/r.bing.com/rp/cC8cvzy5myMTv0ycqwKfwYQi4Q8.js application/javascript +cache_put bing https://r.bing.com/rp/AwudvPCWCx5LrsnXEQOzlMREKfk.js ../../real-web/snapshots/bing.com/r.bing.com/rp/AwudvPCWCx5LrsnXEQOzlMREKfk.js application/javascript +cache_put bing https://r.bing.com/rp/9LvGW2UjtVDIrXhFGqkyxWXeQDg.js ../../real-web/snapshots/bing.com/r.bing.com/rp/9LvGW2UjtVDIrXhFGqkyxWXeQDg.js application/javascript +cache_put bing https://r.bing.com/rp/5oKgTNeAPzIqnjnTmXOcqJ2c1DE.js ../../real-web/snapshots/bing.com/r.bing.com/rp/5oKgTNeAPzIqnjnTmXOcqJ2c1DE.js application/javascript +cache_put bing https://www.bing.com/rp/LVg6IaJY4y94xTELT_HrBZ1S4r8.js ../../real-web/snapshots/bing.com/www.bing.com/rp/LVg6IaJY4y94xTELT_HrBZ1S4r8.js application/javascript +cache_put bing https://r.bing.com/rb/5S/jnc,nj/iDmydssBbFY1ad3gHr--gHb_nsk.js?bu=BsQEyATKBIMEsQTWBA&or=w ../../real-web/snapshots/bing.com/r.bing.com/rb/5S/jnc,nj/iDmydssBbFY1ad3gHr--gHb_nsk.js application/javascript +cache_put bing https://r.bing.com/rp/QSCMj9i5CNitjnEQnZy2uyGGvBY.js ../../real-web/snapshots/bing.com/r.bing.com/rp/QSCMj9i5CNitjnEQnZy2uyGGvBY.js application/javascript +cache_put bing https://r.bing.com/rp/PgszOuYoEdM0WVemW6HokQ9ndkI.js ../../real-web/snapshots/bing.com/r.bing.com/rp/PgszOuYoEdM0WVemW6HokQ9ndkI.js application/javascript +cache_put bing https://r.bing.com/rp/PuxwB9kWYvv5HkQ2NtmvHeaGH4w.js ../../real-web/snapshots/bing.com/r.bing.com/rp/PuxwB9kWYvv5HkQ2NtmvHeaGH4w.js application/javascript +cache_put bing https://r.bing.com/rp/keiqF_esxssgaPFguVetKavXwCw.js ../../real-web/snapshots/bing.com/r.bing.com/rp/keiqF_esxssgaPFguVetKavXwCw.js application/javascript +cache_put bing https://r.bing.com/rp/RVMg7eMIfRv9OBqTC5vFN4zwJFE.js ../../real-web/snapshots/bing.com/r.bing.com/rp/RVMg7eMIfRv9OBqTC5vFN4zwJFE.js application/javascript +cache_put bing https://r.bing.com/rp/RJCuLkK5GWeRhlsFY0jtwWOl9ZM.js ../../real-web/snapshots/bing.com/r.bing.com/rp/RJCuLkK5GWeRhlsFY0jtwWOl9ZM.js application/javascript +cache_put bing https://r.bing.com/rp/ckGcAAlLNyAz9X8tSNrGy4LIjpM.js ../../real-web/snapshots/bing.com/r.bing.com/rp/ckGcAAlLNyAz9X8tSNrGy4LIjpM.js application/javascript +cache_put_status bing https://r.bing.com/rb/4O/jnc,nj/cKzGnam6-Fytml03VT3ixBZ9tTs.js?bu=A6UzqDOrMw&or=w 404 ../../real-web/snapshots/bing.com/r.bing.com/rb/4O/jnc,nj/cKzGnam6-Fytml03VT3ixBZ9tTs.js.empty application/javascript Not Found +cache_put bing https://r.bing.com/rp/y_8Q_2aCPV7xMwmnkTxgDurroYc.js ../../real-web/snapshots/bing.com/r.bing.com/rp/y_8Q_2aCPV7xMwmnkTxgDurroYc.js application/javascript +cache_put bing https://r.bing.com/rp/KkY9l6-STTsQwlAYHQ2QJWJJQYQ.js ../../real-web/snapshots/bing.com/r.bing.com/rp/KkY9l6-STTsQwlAYHQ2QJWJJQYQ.js application/javascript +cache_put bing https://r.bing.com/rp/GkeGDcmu3-ad3G4UpsS_xYPCTU4.js ../../real-web/snapshots/bing.com/r.bing.com/rp/GkeGDcmu3-ad3G4UpsS_xYPCTU4.js application/javascript +cache_put bing https://r.bing.com/rp/yxEBdurcURLxXOL9puyCSO1FZzs.js ../../real-web/snapshots/bing.com/r.bing.com/rp/yxEBdurcURLxXOL9puyCSO1FZzs.js application/javascript + goto_as https://www.bing.com/ crates/e2e/real-web/snapshots/bing.com/index.html screenshot real-web/bing.com/desktop.png dump_dom real-web/bing.com/desktop_dom.txt diff --git a/crates/js/src/builtins.rs b/crates/js/src/builtins.rs index 5084eba..ab373b5 100644 --- a/crates/js/src/builtins.rs +++ b/crates/js/src/builtins.rs @@ -282,12 +282,15 @@ pub fn init_builtins(vm: &mut Vm) { // Register Atomics built-in object. init_atomics_builtin(vm); - // Register PerformanceObserver stub so defensive feature-detection - // patterns like `PerformanceObserver.supportedEntryTypes.indexOf(...)` - // don't abort scripts on pages we don't yet support performance entries - // for. + // Register minimal Performance API stubs so defensive feature-detection + // and telemetry calls don't abort page scripts before hydration. + crate::performance::init_performance_object(vm); crate::performance::init_performance_observer(vm); + // Register matchMedia() as a conservative, non-matching MediaQueryList + // shim for responsive feature-detection code. + crate::media_query::init_match_media(vm); + // Execute JS preamble for callback-based methods. init_js_preamble(vm); @@ -8044,10 +8047,35 @@ mod sab_atomics_tests { // Allocate a SAB and build an Int32Array backed by it. let (sab_id, _) = alloc_shared_buffer(4); - // Notifier thread: wait a bit, write 1, then notify. + // Main: build a VM with the SAB, then call Atomics.wait. + let mut vm = Vm::new(); + + // Build the SAB JS object directly with our known sab_id. + let mut sab_obj = crate::vm::ObjectData::new(); + sab_obj.insert_property( + "__sab_id__".to_string(), + crate::vm::Property::builtin(Value::Number(sab_id as f64)), + &mut vm.shapes, + ); + sab_obj.insert_property( + "byteLength".to_string(), + crate::vm::Property::builtin(Value::Number(4.0)), + &mut vm.shapes, + ); + let sab_ref = vm.gc.alloc(HeapObject::Object(sab_obj)); + vm.set_global("__sab__", Value::Object(sab_ref)); + + let src = r#" + var ta = new Int32Array(__sab__); + Atomics.wait(ta, 0, 0, 500); + "#; + let prog = Parser::parse(src).unwrap(); + let func = compiler::compile(&prog).unwrap(); + + // Notifier thread: wait a bit after setup, write 1, then notify. let notifier_id = sab_id; let notifier = thread::spawn(move || { - thread::sleep(Duration::from_millis(20)); + thread::sleep(Duration::from_millis(100)); let buf = get_shared_buffer(notifier_id).unwrap(); let mut data = buf.data.lock().unwrap(); write_i32(&mut data, 0, 1); @@ -8055,34 +8083,7 @@ mod sab_atomics_tests { buf.condvar.notify_all(); }); - // Main: build a VM with the SAB, call Atomics.wait. - let result = { - let mut vm = Vm::new(); - - // Build the SAB JS object directly with our known sab_id. - let mut sab_obj = crate::vm::ObjectData::new(); - sab_obj.insert_property( - "__sab_id__".to_string(), - crate::vm::Property::builtin(Value::Number(sab_id as f64)), - &mut vm.shapes, - ); - sab_obj.insert_property( - "byteLength".to_string(), - crate::vm::Property::builtin(Value::Number(4.0)), - &mut vm.shapes, - ); - let sab_ref = vm.gc.alloc(HeapObject::Object(sab_obj)); - vm.set_global("__sab__", Value::Object(sab_ref)); - - let src = r#" - var ta = new Int32Array(__sab__); - Atomics.wait(ta, 0, 0, 500); - "#; - let prog = Parser::parse(src).unwrap(); - let func = compiler::compile(&prog).unwrap(); - let val = vm.execute(&func).unwrap(); - val.to_js_string(&vm.gc) - }; + let result = vm.execute(&func).unwrap().to_js_string(&vm.gc); notifier.join().unwrap(); assert_eq!(result, "ok"); diff --git a/crates/js/src/compiler.rs b/crates/js/src/compiler.rs index 91c479b..2850891 100644 --- a/crates/js/src/compiler.rs +++ b/crates/js/src/compiler.rs @@ -23,6 +23,10 @@ struct FunctionCompiler { /// Set of local variable names that are captured by inner functions. /// Pre-populated before compilation by scanning inner function bodies. captured_names: HashSet, + /// Function-scope declarations visible to inner functions even before + /// their statement has been emitted. Used to resolve captures of later + /// `var` / function declarations. + declared_names: HashSet, /// True for the top-level script scope. Top-level `var` declarations /// are also stored as globals so they persist across `execute()` calls. is_top_level: bool, @@ -87,6 +91,7 @@ impl FunctionCompiler { loop_stack: Vec::new(), upvalues: Vec::new(), captured_names: HashSet::new(), + declared_names: HashSet::new(), is_top_level: false, overflow_error: None, optional_chain_patches: None, @@ -302,6 +307,48 @@ fn collect_pattern_names(pat: &Pattern, names: &mut HashSet) { } } +fn collect_pattern_names_many(patterns: &[Pattern], names: &mut HashSet) { + for pattern in patterns { + collect_pattern_names(pattern, names); + } +} + +fn collect_stmt_decls_many(stmts: &[Stmt], declared: &mut HashSet) { + for stmt in stmts { + collect_stmt_decls(stmt, declared); + } +} + +fn predeclare_captured_decls(fc: &mut FunctionCompiler) { + let mut names: Vec = fc + .declared_names + .intersection(&fc.captured_names) + .cloned() + .collect(); + names.sort(); + + for name in names { + if fc.find_local_info(&name).is_none() { + let reg = fc.define_local_ext(&name, true, false); + fc.builder.emit_reg(Op::NewCell, reg); + } + } +} + +fn initialize_var_initializer_binding( + fc: &mut FunctionCompiler, + name: &str, + reg: Reg, + is_top_level_var: bool, +) { + if is_top_level_var { + let name_idx = fc.builder.add_name(name); + fc.builder.emit_reg_u16(Op::LoadGlobal, reg, name_idx); + } else { + fc.builder.emit_reg(Op::LoadUndefined, reg); + } +} + /// Collect all variable/function declarations in a statement (not recursing into /// inner functions — those form their own scope). fn collect_stmt_decls(stmt: &Stmt, declared: &mut HashSet) { @@ -809,10 +856,12 @@ pub fn compile(program: &Program) -> Result { // Pre-scan to find which top-level locals are captured by inner functions. fc.captured_names = collect_inner_captures(&program.body); + collect_stmt_decls_many(&program.body, &mut fc.declared_names); // Reserve r0 for the implicit return value. let result_reg = fc.alloc_reg(); fc.builder.emit_reg(Op::LoadUndefined, result_reg); + predeclare_captured_decls(&mut fc); compile_stmts(&mut fc, &program.body, result_reg)?; @@ -1329,7 +1378,20 @@ fn compile_var_declarator( match &decl.pattern.kind { PatternKind::Identifier(name) => { let is_const = kind == VarKind::Const; - let is_captured = fc.captured_names.contains(name.as_str()); + let existing = if kind == VarKind::Var { + fc.find_local_info(name).map(|local| { + ( + local.reg, + local.is_captured, + local.is_top_level_var || (fc.is_top_level && kind == VarKind::Var), + ) + }) + } else { + None + }; + let is_captured = existing + .map(|(_, captured, _)| captured) + .unwrap_or_else(|| fc.captured_names.contains(name.as_str())); if is_const && decl.init.is_none() { return Err(JsError::SyntaxError( @@ -1337,13 +1399,25 @@ fn compile_var_declarator( )); } - let is_top_level_var = fc.is_top_level && kind == VarKind::Var; - let reg = fc.define_local_full(name, is_captured, is_const, is_top_level_var); + let is_top_level_var = existing + .map(|(_, _, top_level_var)| top_level_var) + .unwrap_or(fc.is_top_level && kind == VarKind::Var); + let reg = existing.map(|(reg, _, _)| reg).unwrap_or_else(|| { + fc.define_local_full(name, is_captured, is_const, is_top_level_var) + }); if is_captured { // Allocate a cell for this variable. - fc.builder.emit_reg(Op::NewCell, reg); + if existing.is_none() { + fc.builder.emit_reg(Op::NewCell, reg); + } if let Some(init) = &decl.init { + if is_top_level_var { + let tmp = fc.alloc_reg(); + initialize_var_initializer_binding(fc, name, tmp, true); + fc.builder.emit_reg_reg(Op::CellStore, reg, tmp); + fc.free_reg(tmp); + } let tmp = fc.alloc_reg(); compile_expr(fc, init, tmp)?; fc.builder.emit_reg_reg(Op::CellStore, reg, tmp); @@ -1356,8 +1430,11 @@ fn compile_var_declarator( } // No init => cell stays undefined (already the default). } else if let Some(init) = &decl.init { + if existing.is_none() { + initialize_var_initializer_binding(fc, name, reg, is_top_level_var); + } compile_expr(fc, init, reg)?; - } else { + } else if existing.is_none() { fc.builder.emit_reg(Op::LoadUndefined, reg); } @@ -1618,12 +1695,25 @@ fn compile_function_decl(fc: &mut FunctionCompiler, func_def: &FunctionDef) -> R let inner = compile_function_body_with_captures(fc, func_def)?; let func_idx = fc.builder.add_function(inner); - let is_captured = fc.captured_names.contains(name.as_str()); - let reg = fc.define_local_ext(&name, is_captured, false); + let existing = if name.is_empty() { + None + } else { + fc.find_local_info(&name) + .map(|local| (local.reg, local.is_captured)) + }; + let is_captured = existing + .map(|(_, captured)| captured) + .unwrap_or_else(|| fc.captured_names.contains(name.as_str())); + let reg = existing + .map(|(reg, _)| reg) + .unwrap_or_else(|| fc.define_local_ext(&name, is_captured, false)); if is_captured { - // Create a cell, then create the closure into a temp, then store into cell. - fc.builder.emit_reg(Op::NewCell, reg); + // Create a cell if this declaration was not already hoisted for a + // later-declaration capture, then store the closure into that cell. + if existing.is_none() { + fc.builder.emit_reg(Op::NewCell, reg); + } let tmp = fc.alloc_reg(); fc.builder.emit_reg_u16(Op::CreateClosure, tmp, func_idx); fc.builder.emit_reg_reg(Op::CellStore, reg, tmp); @@ -1717,6 +1807,8 @@ fn compile_function_body_inner( // Pre-scan to find which of this function's locals are captured by ITS inner functions. let inner_caps = collect_inner_captures(&func_def.body); inner.captured_names = inner_caps; + collect_pattern_names_many(&func_def.params, &mut inner.declared_names); + collect_stmt_decls_many(&func_def.body, &mut inner.declared_names); // Allocate registers for parameters. for p in &func_def.params { @@ -1748,6 +1840,7 @@ fn compile_function_body_inner( // Result register for the function body. let result_reg = inner.alloc_reg(); inner.builder.emit_reg(Op::LoadUndefined, result_reg); + predeclare_captured_decls(&mut inner); compile_stmts(&mut inner, &func_def.body, result_reg)?; diff --git a/crates/js/src/iframe_bridge.rs b/crates/js/src/iframe_bridge.rs index 686ba02..cf5f003 100644 --- a/crates/js/src/iframe_bridge.rs +++ b/crates/js/src/iframe_bridge.rs @@ -125,6 +125,7 @@ pub fn init_window_object(vm: &mut Vm, context_id: &str, origin: &str) { // Browsing-context properties are also exposed as bare globals because the // Window object is the global object in page scripts. vm.set_global("self", Value::Object(window_ref)); + vm.set_global("_w", Value::Object(window_ref)); vm.set_global("location", Value::Object(location_ref)); vm.set_global("history", Value::Object(history_ref)); @@ -136,6 +137,13 @@ pub fn init_window_object(vm: &mut Vm, context_id: &str, origin: &str) { "origin", Value::String(origin.to_string()), ); + set_builtin_prop( + &mut vm.gc, + &mut vm.shapes, + window_ref, + "_w", + Value::Object(window_ref), + ); // Register postMessage method. let post_msg = make_native(&mut vm.gc, "postMessage", window_post_message); @@ -755,6 +763,7 @@ mod tests { "location === window.location && \ history === window.history && \ self === window && \ + _w === window && \ typeof history.replaceState === 'function'", ) .expect("parse"); @@ -826,6 +835,22 @@ mod tests { } } + #[test] + fn bing_window_alias_reads_global_bindings() { + use crate::compiler; + use crate::parser::Parser; + + let mut vm = Vm::new(); + init_window_object(&mut vm, "main", "https://example.com"); + + let ast = Parser::parse("var BM = { ready: 1 }; _w.BM.ready").expect("parse"); + let func = compiler::compile(&ast).expect("compile"); + match vm.execute(&func).expect("execute") { + Value::Number(n) => assert_eq!(n, 1.0), + v => panic!("expected BM readiness, got {v:?}"), + } + } + #[test] fn message_queue_drain() { MESSAGE_QUEUE.with(|q| { diff --git a/crates/js/src/lib.rs b/crates/js/src/lib.rs index 6fce6e3..73d5e6f 100644 --- a/crates/js/src/lib.rs +++ b/crates/js/src/lib.rs @@ -20,6 +20,7 @@ pub mod jit; pub mod lexer; pub mod location; pub mod main_thread_worker; +pub mod media_query; pub mod parser; pub mod performance; pub mod regex; diff --git a/crates/js/src/media_query.rs b/crates/js/src/media_query.rs new file mode 100644 index 0000000..bfde1b6 --- /dev/null +++ b/crates/js/src/media_query.rs @@ -0,0 +1,137 @@ +//! Minimal `matchMedia` support. +//! +//! Full media query parsing and live viewport updates belong to the style and +//! layout layers. This module provides a conservative `matchMedia()` shape so +//! real-world feature-detection and telemetry code can run without treating the +//! API as missing. + +use crate::builtins::{make_native, set_builtin_prop}; +use crate::vm::*; + +fn match_media(args: &[Value], ctx: &mut NativeContext) -> Result { + let media = args + .first() + .map(|v| v.to_js_string(ctx.gc)) + .unwrap_or_default(); + + let mut data = ObjectData::new(); + data.insert_property( + "matches".to_string(), + Property::builtin(Value::Boolean(false)), + ctx.shapes, + ); + data.insert_property( + "media".to_string(), + Property::builtin(Value::String(media)), + ctx.shapes, + ); + data.insert_property( + "onchange".to_string(), + Property::data(Value::Null), + ctx.shapes, + ); + let list_ref = ctx.gc.alloc(HeapObject::Object(data)); + + for name in [ + "addListener", + "removeListener", + "addEventListener", + "removeEventListener", + ] { + let func = make_native(ctx.gc, name, media_query_list_noop); + set_builtin_prop(ctx.gc, ctx.shapes, list_ref, name, Value::Function(func)); + } + + let dispatch = make_native(ctx.gc, "dispatchEvent", media_query_list_dispatch_event); + set_builtin_prop( + ctx.gc, + ctx.shapes, + list_ref, + "dispatchEvent", + Value::Function(dispatch), + ); + + Ok(Value::Object(list_ref)) +} + +fn media_query_list_noop(_args: &[Value], _ctx: &mut NativeContext) -> Result { + Ok(Value::Undefined) +} + +fn media_query_list_dispatch_event( + _args: &[Value], + _ctx: &mut NativeContext, +) -> Result { + Ok(Value::Boolean(true)) +} + +pub fn init_match_media(vm: &mut Vm) { + let func = make_native(&mut vm.gc, "matchMedia", match_media); + vm.set_global("matchMedia", Value::Function(func)); +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::compiler; + use crate::iframe_bridge; + use crate::parser::Parser; + + fn eval(source: &str, with_window: bool) -> Result { + let program = Parser::parse(source).expect("parse"); + let func = compiler::compile(&program).expect("compile"); + let mut vm = Vm::new(); + if with_window { + iframe_bridge::init_window_object(&mut vm, "main", "https://example.com"); + } + vm.execute(&func) + } + + #[test] + fn match_media_returns_media_query_list_shape() { + let result = eval( + "var m = matchMedia('(min-width: 900px)'); \ + m.addListener(function(){}); \ + m.addEventListener('change', function(){}); \ + m.media + ':' + m.matches + ':' + m.dispatchEvent({})", + false, + ) + .expect("ok"); + + assert!(matches!( + result, + Value::String(s) if s == "(min-width: 900px):false:true" + )); + } + + #[test] + fn window_match_media_falls_through_to_global() { + let result = eval("typeof window.matchMedia", true).expect("ok"); + assert!(matches!(result, Value::String(s) if s == "function")); + } + + #[test] + fn bing_dark_mode_pattern_reads_window_match_media() { + let result = eval( + "var sj_cook = { get: function(){ return '2'; } }; \ + var sj_evt = { bind: function(){}, unbind: function(){} }; \ + function sj_be(){} \ + var navigator = { cookieEnabled: true }; \ + var DarkModeLogging; \ + (function(){ \ + function l(){ \ + if (!t.matchMedia) return '0'; \ + var n = t.matchMedia('(prefers-color-scheme: dark)'); \ + return n.matches ? '1' : '0'; \ + } \ + function u(){ l(); } \ + var r = 'undefined', t = window, f = document; \ + typeof sj_cook !== r && sj_cook && u(); \ + })(DarkModeLogging || (DarkModeLogging = {})); \ + 'ok'", + true, + ) + .expect("ok"); + assert!(matches!(result, Value::String(s) if s == "ok")); + } +} diff --git a/crates/js/src/parser.rs b/crates/js/src/parser.rs index bcb5bdc..658450a 100644 --- a/crates/js/src/parser.rs +++ b/crates/js/src/parser.rs @@ -2165,7 +2165,14 @@ impl Parser { }); } - let expr = self.parse_expression()?; + // `in` is disallowed at the top level of a regular `for` initializer + // so `for (x in y)` can be parsed as for-in. Parentheses start a nested + // expression where `in` is valid again, e.g. `for (x = ("k" in obj);;)`. + let old_allow_in = self.allow_in; + self.allow_in = true; + let expr = self.parse_expression(); + self.allow_in = old_allow_in; + let expr = expr?; self.expect(&TokenKind::RParen)?; Ok(expr) } @@ -3561,6 +3568,12 @@ mod tests { assert!(matches!(stmt.kind, StmtKind::ForIn { .. })); } + #[test] + fn test_for_initializer_allows_parenthesized_in_expression() { + let stmt = parse_stmt("for (s = (t in f) ? f[t] : null, h = 0; h < c; h++) {}"); + assert!(matches!(stmt.kind, StmtKind::For { .. })); + } + #[test] fn test_for_of() { let stmt = parse_stmt("for (const item of arr) {}"); diff --git a/crates/js/src/performance.rs b/crates/js/src/performance.rs index ad40a7a..0cb1da7 100644 --- a/crates/js/src/performance.rs +++ b/crates/js/src/performance.rs @@ -1,7 +1,8 @@ -//! Minimal `PerformanceObserver` stub. +//! Minimal Performance API stubs. //! //! The full Performance Timeline API is part of Phase 15. This module -//! registers a no-op `PerformanceObserver` global so scripts that probe +//! registers a small `performance` object plus a no-op `PerformanceObserver` +//! global so scripts that probe //! `PerformanceObserver.supportedEntryTypes` (a common defensive pattern //! on real-world pages such as bing.com's image-of-the-day loader) do not //! crash with `TypeError: undefined is not a function` when they read @@ -16,10 +17,248 @@ //! feature-detection patterns like //! `PerformanceObserver.supportedEntryTypes.indexOf("element") !== -1` //! evaluate to `false` and the gated code path is skipped. +//! - `performance.now()`, `mark()`, `measure()`, and timeline query/clear +//! methods are intentionally shallow, but callable. Real-world telemetry +//! bundles commonly call these unconditionally; returning empty data is a +//! better failure mode than aborting page hydration. use crate::builtins::{make_native, set_builtin_prop}; use crate::gc::GcRef; use crate::vm::*; +use std::time::{SystemTime, UNIX_EPOCH}; + +const ARRAY_PROTOTYPE_KEY: &str = "__array_prototype__"; + +fn performance_now(_args: &[Value], _ctx: &mut NativeContext) -> Result { + Ok(Value::Number(now_ms())) +} + +fn performance_mark(args: &[Value], ctx: &mut NativeContext) -> Result { + let name = args + .first() + .map(|v| v.to_js_string(ctx.gc)) + .unwrap_or_default(); + Ok(performance_entry(ctx, name, "mark", now_ms(), 0.0)) +} + +fn performance_measure(args: &[Value], ctx: &mut NativeContext) -> Result { + let name = args + .first() + .map(|v| v.to_js_string(ctx.gc)) + .unwrap_or_default(); + Ok(performance_entry(ctx, name, "measure", now_ms(), 0.0)) +} + +fn performance_get_entries( + _args: &[Value], + ctx: &mut NativeContext, +) -> Result { + Ok(empty_array_value(ctx)) +} + +fn performance_noop(_args: &[Value], _ctx: &mut NativeContext) -> Result { + Ok(Value::Undefined) +} + +fn performance_entry( + ctx: &mut NativeContext, + name: String, + entry_type: &str, + start_time: f64, + duration: f64, +) -> Value { + let mut data = ObjectData::new(); + data.insert_property( + "name".to_string(), + Property::builtin(Value::String(name)), + ctx.shapes, + ); + data.insert_property( + "entryType".to_string(), + Property::builtin(Value::String(entry_type.to_string())), + ctx.shapes, + ); + data.insert_property( + "startTime".to_string(), + Property::builtin(Value::Number(start_time)), + ctx.shapes, + ); + data.insert_property( + "duration".to_string(), + Property::builtin(Value::Number(duration)), + ctx.shapes, + ); + Value::Object(ctx.gc.alloc(HeapObject::Object(data))) +} + +fn now_ms() -> f64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_secs_f64() * 1000.0) + .unwrap_or(0.0) +} + +fn empty_array_value(ctx: &mut NativeContext) -> Value { + let mut data = ObjectData::new(); + data.prototype = array_prototype_from_context(ctx); + data.insert_property( + "length".to_string(), + Property { + value: Value::Number(0.0), + writable: true, + enumerable: false, + configurable: false, + }, + ctx.shapes, + ); + Value::Object(ctx.gc.alloc(HeapObject::Object(data))) +} + +fn array_prototype_from_context(ctx: &NativeContext) -> Option { + let callee = ctx.callee?; + match ctx.gc.get(callee) { + Some(HeapObject::Function(fdata)) => { + fdata + .properties + .get(ARRAY_PROTOTYPE_KEY) + .and_then(|prop| match &prop.value { + Value::Object(r) => Some(*r), + _ => None, + }) + } + _ => None, + } +} + +fn attach_array_prototype(vm: &mut Vm, func_ref: GcRef) { + let Some(array_proto) = vm.array_prototype else { + return; + }; + if let Some(HeapObject::Function(fdata)) = vm.gc.get_mut(func_ref) { + fdata.properties.insert( + ARRAY_PROTOTYPE_KEY.to_string(), + Property::builtin(Value::Object(array_proto)), + ); + } +} + +fn make_performance_method( + vm: &mut Vm, + name: &str, + callback: fn(&[Value], &mut NativeContext) -> Result, +) -> GcRef { + let func_ref = make_native(&mut vm.gc, name, callback); + attach_array_prototype(vm, func_ref); + func_ref +} + +/// Register a minimal `performance` global object. +pub fn init_performance_object(vm: &mut Vm) { + let obj_ref = vm.gc.alloc(HeapObject::Object(ObjectData::new())); + let time_origin = now_ms(); + + set_builtin_prop( + &mut vm.gc, + &mut vm.shapes, + obj_ref, + "timeOrigin", + Value::Number(time_origin), + ); + + let timing_ref = create_performance_timing(vm, time_origin); + set_builtin_prop( + &mut vm.gc, + &mut vm.shapes, + obj_ref, + "timing", + Value::Object(timing_ref), + ); + + let now = make_performance_method(vm, "now", performance_now); + set_builtin_prop( + &mut vm.gc, + &mut vm.shapes, + obj_ref, + "now", + Value::Function(now), + ); + + let mark = make_performance_method(vm, "mark", performance_mark); + set_builtin_prop( + &mut vm.gc, + &mut vm.shapes, + obj_ref, + "mark", + Value::Function(mark), + ); + + let measure = make_performance_method(vm, "measure", performance_measure); + set_builtin_prop( + &mut vm.gc, + &mut vm.shapes, + obj_ref, + "measure", + Value::Function(measure), + ); + + for name in ["getEntries", "getEntriesByType", "getEntriesByName"] { + let func = make_performance_method(vm, name, performance_get_entries); + set_builtin_prop( + &mut vm.gc, + &mut vm.shapes, + obj_ref, + name, + Value::Function(func), + ); + } + + for name in ["clearMarks", "clearMeasures", "clearResourceTimings"] { + let func = make_performance_method(vm, name, performance_noop); + set_builtin_prop( + &mut vm.gc, + &mut vm.shapes, + obj_ref, + name, + Value::Function(func), + ); + } + + vm.set_global("performance", Value::Object(obj_ref)); +} + +fn create_performance_timing(vm: &mut Vm, time_origin: f64) -> GcRef { + let mut data = ObjectData::new(); + for name in [ + "navigationStart", + "unloadEventStart", + "unloadEventEnd", + "redirectStart", + "redirectEnd", + "fetchStart", + "domainLookupStart", + "domainLookupEnd", + "connectStart", + "connectEnd", + "secureConnectionStart", + "requestStart", + "responseStart", + "responseEnd", + "domLoading", + "domInteractive", + "domContentLoadedEventStart", + "domContentLoadedEventEnd", + "domComplete", + "loadEventStart", + "loadEventEnd", + ] { + data.insert_property( + name.to_string(), + Property::builtin(Value::Number(time_origin)), + &mut vm.shapes, + ); + } + vm.gc.alloc(HeapObject::Object(data)) +} fn observer_constructor(_args: &[Value], ctx: &mut NativeContext) -> Result { let data = ObjectData::new(); @@ -61,24 +300,14 @@ fn observer_noop(_args: &[Value], _ctx: &mut NativeContext) -> Result Result { - let arr = empty_array(ctx); - Ok(Value::Object(arr)) -} - -fn empty_array(ctx: &mut NativeContext) -> GcRef { - let mut data = ObjectData::new(); - data.insert_property( - "length".to_string(), - Property::builtin(Value::Number(0.0)), - ctx.shapes, - ); - ctx.gc.alloc(HeapObject::Object(data)) + Ok(empty_array_value(ctx)) } /// Register `PerformanceObserver` as a global on the VM. Safe to call once /// from [`crate::builtins::init_builtins`] after `Array.prototype` is set. pub fn init_performance_observer(vm: &mut Vm) { let ctor = make_native(&mut vm.gc, "PerformanceObserver", observer_constructor); + attach_array_prototype(vm, ctor); let mut arr_data = ObjectData::new(); arr_data.prototype = vm.array_prototype; @@ -145,6 +374,34 @@ mod tests { assert!(matches!(result, Value::Number(n) if n == 0.0)); } + #[test] + fn performance_mark_and_entry_queries_are_callable() { + let result = eval( + "var mark = performance.mark('bing-start'); \ + performance.measure('bing-measure'); \ + performance.clearMarks(); \ + mark.name + ':' + mark.entryType + ':' + performance.getEntriesByName('bing-start').length", + ) + .expect("ok"); + assert!(matches!(result, Value::String(s) if s == "bing-start:mark:0")); + } + + #[test] + fn performance_now_returns_number() { + let result = eval("typeof performance.now()").expect("ok"); + assert!(matches!(result, Value::String(s) if s == "number")); + } + + #[test] + fn performance_timing_navigation_start_exists() { + let result = eval( + "typeof performance.timing.navigationStart + ':' + \ + (performance.timing.loadEventEnd >= performance.timing.navigationStart)", + ) + .expect("ok"); + assert!(matches!(result, Value::String(s) if s == "number:true")); + } + /// Closely mirrors the first inline script on bing.com: a defensive /// `PerformanceObserver.supportedEntryTypes.indexOf("element") !== -1 /// && (...)` short-circuits to the right branch and the surrounding diff --git a/crates/js/tests/top_level_var_propagation.rs b/crates/js/tests/top_level_var_propagation.rs index d5c3ea4..de3761b 100644 --- a/crates/js/tests/top_level_var_propagation.rs +++ b/crates/js/tests/top_level_var_propagation.rs @@ -74,3 +74,21 @@ fn top_level_var_propagation_with_compound_assignment() { let result = run_in_fresh_vm_pair("var counter = 1; counter += 4;", "counter"); assert_number(result, 5.0); } + +#[test] +fn bing_bm_wireup_persists_across_scripts() { + let result = run_in_fresh_vm_pair( + "var BM=BM||{};(function(n){n.wireup=1})(BM);", + "typeof BM + ':' + typeof BM.wireup + ':' + BM.wireup", + ); + assert_string(result, "object:number:1"); +} + +#[test] +fn top_level_self_referential_var_preserves_existing_global() { + let result = run_in_fresh_vm_pair( + "var BM={wireup:1};", + "var BM=BM||{}; typeof BM + ':' + typeof BM.wireup + ':' + BM.wireup", + ); + assert_string(result, "object:number:1"); +}