chromiumoxide/javascript/
spoofs.rs

1// use https://github.com/spider-rs/headless-browser for ideal default settings.
2pub const HIDE_CHROME: &str = "window.chrome={runtime:{}};['log','warn','error','info','debug','table'].forEach((method)=>{console[method]=()=>{}});";
3pub const DISABLE_DIALOGS: &str  = "(()=>{const a=window.alert.toString(),c=window.confirm.toString(),p=window.prompt.toString();window.alert=function alert(){};Object.defineProperty(window.alert,'toString',{value:()=>a,configurable:true});window.confirm=function confirm(){return true};Object.defineProperty(window.confirm,'toString',{value:()=>c,configurable:true});window.prompt=function prompt(){return ''};Object.defineProperty(window.prompt,'toString',{value:()=>p,configurable:true});})();";
4pub const HIDE_WEBGL: &str = "(()=>{const getParameter=WebGLRenderingContext.getParameter;WebGLRenderingContext.prototype.getParameter=function(parameter){ if (parameter === 37445) { return 'Google Inc. (NVIDIA)';} if (parameter === 37446) { return 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1050 Direct3D11 vs_5_0 ps_5_0, D3D11-27.21.14.5671)' } return getParameter(parameter);};";
5pub const HIDE_PERMISSIONS: &str = "(()=>{const originalQuery=window.navigator.permissions.query;window.navigator.permissions.__proto__.query=parameters=>{ return parameters.name === 'notifications' ? Promise.resolve({ state: Notification.permission }) : originalQuery(parameters) }; })();";
6pub const NAVIGATOR_SCRIPT: &str = r#"(()=>{const nativeGet=new Function("return true");Object.defineProperty(nativeGet,"toString",{value:()=>"function get pdfViewerEnabled() { [native code] }"});Object.defineProperty(Navigator.prototype,"pdfViewerEnabled",{get:nativeGet,configurable:!0});})()"#;
7pub const PLUGIN_AND_MIMETYPE_SPOOF: &str = r#"(()=>{const m=[{type:'application/pdf',suffixes:'pdf',description:'Portable Document Format'},{type:'text/pdf',suffixes:'pdf',description:'Portable Document Format'}],names=['PDF Viewer','Chrome PDF Viewer','Chromium PDF Viewer','Microsoft Edge PDF Viewer','WebKit built-in PDF'],plugins=[],mimes=[(()=>{const mt={__proto__:MimeType.prototype};Object.defineProperties(mt,{type:{value:m[0].type,configurable:true},suffixes:{value:m[0].suffixes,configurable:true},description:{value:m[0].description,configurable:true}});return mt})(),(()=>{const mt={__proto__:MimeType.prototype};Object.defineProperties(mt,{type:{value:m[1].type,configurable:true},suffixes:{value:m[1].suffixes,configurable:true},description:{value:m[1].description,configurable:true}});return mt})()];names.forEach(name=>{const pl={__proto__:Plugin.prototype,length:2,name,filename:'internal-pdf-viewer',description:'Portable Document Format'};Object.defineProperty(mimes[0],'enabledPlugin',{value:pl,configurable:true});Object.defineProperty(mimes[1],'enabledPlugin',{value:pl,configurable:true});pl[0]=mimes[0];pl[1]=mimes[1];plugins.push(pl)});Object.defineProperty(PluginArray.prototype,'item',{value:function(i){return this[i]||null},configurable:true});Object.defineProperty(PluginArray.prototype,'namedItem',{value:function(n){return this[n]||null},configurable:true});Object.defineProperty(MimeTypeArray.prototype,'item',{value:function(i){return this[i]||null},configurable:true});Object.defineProperty(MimeTypeArray.prototype,'namedItem',{value:function(n){return this[n]||null},configurable:true});const pa=Object.create(PluginArray.prototype);plugins.forEach((p,i)=>{Object.defineProperty(pa,i,{value:p,configurable:true,enumerable:false});Object.defineProperty(pa,p.name,{value:p,configurable:true,enumerable:false})});Object.defineProperty(pa,'length',{value:plugins.length,configurable:true,enumerable:false});const ma=Object.create(MimeTypeArray.prototype);mimes.forEach((mt,i)=>{Object.defineProperty(ma,i,{value:mt,configurable:true,enumerable:false});Object.defineProperty(ma,mt.type,{value:mt,configurable:true,enumerable:false})});Object.defineProperty(ma,'length',{value:mimes.length,configurable:true,enumerable:false});function g(v,n){const f=()=>v;Object.defineProperty(f,'toString',{value:()=>`function get ${n}() { [native code] }`,configurable:true});return f}Object.defineProperties(Navigator.prototype,{plugins:{get:g(pa,'plugins'),configurable:true,enumerable:false},mimeTypes:{get:g(ma,'mimeTypes'),configurable:true,enumerable:false},pdfViewerEnabled:{get:g(true,'pdfViewerEnabled'),configurable:true,enumerable:false}})})()"#;
8pub const HIDE_WEBDRIVER: &str = r#"Object.defineProperty(Navigator.prototype,'webdriver',{get:()=>!1,configurable:!0,enumerable:!1});"#;
9pub const GPU_SPOOF_SCRIPT: &str = r#"class WGSLanguageFeatures{constructor(){this.size=4}}class GPU{get wgslLanguageFeatures(){return new WGSLanguageFeatures()}requestAdapter(){return Promise.resolve({requestDevice:()=>Promise.resolve({})})}getPreferredCanvasFormat(){return'bgra8unorm'}get [Symbol.toStringTag](){return'GPU'}}Object.defineProperty(Navigator.prototype,'gpu',{get:()=>new GPU(),configurable:true,enumerable:false});"#;
10
11// spoof unused atm for headless browser settings entry.
12// pub const SPOOF_MEDIA: &str = r#"Object.defineProperty(Navigator.prototype,'mediaDevices',{get:()=>({getUserMedia:undefined}),configurable:!0,enumerable:!1}),Object.defineProperty(Navigator.prototype,'webkitGetUserMedia',{get:()=>undefined,configurable:!0,enumerable:!1}),Object.defineProperty(Navigator.prototype,'mozGetUserMedia',{get:()=>undefined,configurable:!0,enumerable:!1}),Object.defineProperty(Navigator.prototype,'getUserMedia',{get:()=>undefined,configurable:!0,enumerable:!1});"#;