(() => { // navigator.webdriver Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); // languages Object.defineProperty(navigator, 'languages', { get: () => [{{.Languages}}] }); // navigator.platform Object.defineProperty(navigator, 'platform', { get: () => '{{.Platform}}' }); // plugins (non-empty) Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5] }); // chrome runtime stub window.chrome = window.chrome || { runtime: {} }; // permissions query consistency const origQuery = window.navigator.permissions && window.navigator.permissions.query; if (origQuery) { window.navigator.permissions.query = (params) => params && params.name === 'notifications' ? Promise.resolve({ state: Notification.permission }) : origQuery(params); } // WebGL vendor/renderer spoof const getParam = WebGLRenderingContext.prototype.getParameter; WebGLRenderingContext.prototype.getParameter = function (p) { if (p === 37445) return '{{.WebGLVendor}}'; // UNMASKED_VENDOR_WEBGL if (p === 37446) return '{{.WebGLRenderer}}'; // UNMASKED_RENDERER_WEBGL return getParam.call(this, p); }; })();