jumpy-lion 0.0.33 → 0.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-controller.d.ts +2 -2
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +34 -5
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +21 -0
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +10 -4
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/browser.d.ts +15 -0
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +6 -3
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/crawler.d.ts +15 -0
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/anti-webgpu/background.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/background.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/background.js +6 -0
- package/dist/fingerprinting/anti-webgpu/background.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js +50 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js +179 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.js +95 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.js +255 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.js +87 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.js +13 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.js +109 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.js.map +1 -0
- package/dist/fingerprinting/fingerprint-injector.d.ts +85 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +188 -90
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +87 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +95 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +96 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts +7 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +219 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +19 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js +19 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +262 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +7 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +103 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +228 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +20 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +227 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +84 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +440 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +95 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts +12 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +167 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +205 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +96 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/page.d.ts +1 -0
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +42 -1
- package/dist/page.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebGL Fingerprinting Protection
|
|
3
|
+
* Platform-aware GPU spoofing for WebGL contexts
|
|
4
|
+
*/
|
|
5
|
+
export const createWebGLSpoofingScript = (fingerprintWebGL) => {
|
|
6
|
+
// If fingerprint data is provided, use it; otherwise use platform-based defaults
|
|
7
|
+
const useFingerprint = fingerprintWebGL && (fingerprintWebGL.vendorUnmasked || fingerprintWebGL.rendererUnmasked);
|
|
8
|
+
return `
|
|
9
|
+
(() => {
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
// WebGL Spoofing for 2025 - Platform-aware
|
|
13
|
+
const spoofWebGL = () => {
|
|
14
|
+
const getParameterProto = WebGLRenderingContext.prototype.getParameter;
|
|
15
|
+
const getExtensionProto = WebGLRenderingContext.prototype.getExtension;
|
|
16
|
+
const getSupportedExtensionsProto = WebGLRenderingContext.prototype.getSupportedExtensions;
|
|
17
|
+
|
|
18
|
+
${useFingerprint ? `
|
|
19
|
+
// Use fingerprint-provided WebGL values
|
|
20
|
+
const fingerprintConfig = ${JSON.stringify(fingerprintWebGL)};
|
|
21
|
+
const selectedVendor = fingerprintConfig.vendorUnmasked || fingerprintConfig.vendor || 'Intel Inc.';
|
|
22
|
+
const selectedRenderer = fingerprintConfig.rendererUnmasked || fingerprintConfig.renderer || 'Intel Iris OpenGL Engine';
|
|
23
|
+
` : `
|
|
24
|
+
// Detect platform from navigator
|
|
25
|
+
const platform = navigator.platform || 'Linux x86_64';
|
|
26
|
+
|
|
27
|
+
// Platform-specific GPU configurations
|
|
28
|
+
const gpuConfigs = {
|
|
29
|
+
'Win32': {
|
|
30
|
+
vendors: ['NVIDIA Corporation', 'AMD', 'Intel Inc.'],
|
|
31
|
+
renderers: [
|
|
32
|
+
'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
33
|
+
'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
34
|
+
'ANGLE (AMD, AMD Radeon RX 6600 Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
35
|
+
'ANGLE (Intel, Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
'MacIntel': {
|
|
39
|
+
vendors: ['Apple Inc.', 'Intel Inc.', 'AMD'],
|
|
40
|
+
renderers: [
|
|
41
|
+
'ANGLE (Apple, Apple M1 Pro, OpenGL 4.1)',
|
|
42
|
+
'ANGLE (Apple, Apple M2, OpenGL 4.1)',
|
|
43
|
+
'ANGLE (Intel Inc., Intel(R) Iris(TM) Plus Graphics OpenGL Engine, OpenGL 4.1)',
|
|
44
|
+
'ANGLE (AMD, AMD Radeon Pro 5500M OpenGL Engine, OpenGL 4.1)',
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
'Linux x86_64': {
|
|
48
|
+
vendors: ['Intel', 'NVIDIA Corporation', 'AMD'],
|
|
49
|
+
renderers: [
|
|
50
|
+
'ANGLE (Intel, Mesa Intel(R) UHD Graphics 630 (CFL GT2), OpenGL 4.6)',
|
|
51
|
+
'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2, OpenGL 4.6)',
|
|
52
|
+
'ANGLE (AMD, AMD Radeon RX 6600 (NAVY_FLOUNDER, DRM 3.42.0, 5.15.0-56-generic, LLVM 12.0.0), OpenGL 4.6)',
|
|
53
|
+
'ANGLE (Intel, Mesa Intel(R) Xe Graphics (TGL GT2), OpenGL 4.6)',
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const config = gpuConfigs[platform] || gpuConfigs['Linux x86_64'];
|
|
59
|
+
const selectedVendor = config.vendors[Math.floor(Math.random() * config.vendors.length)];
|
|
60
|
+
const selectedRenderer = config.renderers.find(r => r.includes(selectedVendor.split(' ')[0])) || config.renderers[0];
|
|
61
|
+
`}
|
|
62
|
+
|
|
63
|
+
// Override getParameter
|
|
64
|
+
WebGLRenderingContext.prototype.getParameter = function(param) {
|
|
65
|
+
// UNMASKED_VENDOR_WEBGL
|
|
66
|
+
if (param === 0x9245) {
|
|
67
|
+
return selectedVendor;
|
|
68
|
+
}
|
|
69
|
+
// UNMASKED_RENDERER_WEBGL
|
|
70
|
+
if (param === 0x9246) {
|
|
71
|
+
return selectedRenderer;
|
|
72
|
+
}
|
|
73
|
+
// Standard WebGL parameters - use fingerprint values if available
|
|
74
|
+
if (param === 0x1F00) { // VENDOR
|
|
75
|
+
return ${useFingerprint && fingerprintWebGL?.vendor ? `'${fingerprintWebGL.vendor}'` : "'WebKit'"};
|
|
76
|
+
}
|
|
77
|
+
if (param === 0x1F01) { // RENDERER
|
|
78
|
+
return ${useFingerprint && fingerprintWebGL?.renderer ? `'${fingerprintWebGL.renderer}'` : "'WebKit WebGL'"};
|
|
79
|
+
}
|
|
80
|
+
if (param === 0x1F02) { // VERSION
|
|
81
|
+
return 'WebGL 1.0 (OpenGL ES 2.0 Chromium)';
|
|
82
|
+
}
|
|
83
|
+
// MAX_TEXTURE_SIZE
|
|
84
|
+
if (param === 0x0D33) {
|
|
85
|
+
return 16384;
|
|
86
|
+
}
|
|
87
|
+
// MAX_VIEWPORT_DIMS
|
|
88
|
+
if (param === 0x0D3A) {
|
|
89
|
+
return new Int32Array([32767, 32767]);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return getParameterProto.apply(this, arguments);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Also apply to WebGL2
|
|
96
|
+
if (typeof WebGL2RenderingContext !== 'undefined') {
|
|
97
|
+
WebGL2RenderingContext.prototype.getParameter = function(param) {
|
|
98
|
+
// For WebGL2, return appropriate version
|
|
99
|
+
if (param === 0x1F02) { // VERSION
|
|
100
|
+
return 'WebGL 2.0 (OpenGL ES 3.0 Chromium)';
|
|
101
|
+
}
|
|
102
|
+
// Use same logic as WebGL1 for other params
|
|
103
|
+
return WebGLRenderingContext.prototype.getParameter.call(this, param);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Override getSupportedExtensions with platform-appropriate extensions
|
|
108
|
+
const baseExtensions = [
|
|
109
|
+
'ANGLE_instanced_arrays', 'EXT_blend_minmax', 'EXT_color_buffer_half_float',
|
|
110
|
+
'EXT_disjoint_timer_query', 'EXT_float_blend', 'EXT_frag_depth',
|
|
111
|
+
'EXT_shader_texture_lod', 'EXT_texture_compression_rgtc',
|
|
112
|
+
'EXT_texture_filter_anisotropic', 'EXT_sRGB', 'KHR_parallel_shader_compile',
|
|
113
|
+
'OES_element_index_uint', 'OES_fbo_render_mipmap', 'OES_standard_derivatives',
|
|
114
|
+
'OES_texture_float', 'OES_texture_float_linear', 'OES_texture_half_float',
|
|
115
|
+
'OES_texture_half_float_linear', 'OES_vertex_array_object', 'WEBGL_color_buffer_float',
|
|
116
|
+
'WEBGL_compressed_texture_s3tc', 'WEBGL_compressed_texture_s3tc_srgb',
|
|
117
|
+
'WEBGL_debug_renderer_info', 'WEBGL_debug_shaders', 'WEBGL_depth_texture',
|
|
118
|
+
'WEBGL_draw_buffers', 'WEBGL_lose_context', 'WEBGL_multi_draw'
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
${!useFingerprint ? `
|
|
122
|
+
// Add platform-specific extensions
|
|
123
|
+
const platformExtensions = {
|
|
124
|
+
'Win32': ['EXT_texture_compression_bptc', 'WEBGL_compressed_texture_astc'],
|
|
125
|
+
'MacIntel': ['WEBGL_compressed_texture_pvrtc', 'WEBKIT_WEBGL_compressed_texture_pvrtc'],
|
|
126
|
+
'Linux x86_64': ['EXT_texture_compression_bptc'],
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const allExtensions = [...baseExtensions, ...(platformExtensions[platform] || [])];
|
|
130
|
+
` : `
|
|
131
|
+
const allExtensions = baseExtensions;
|
|
132
|
+
`}
|
|
133
|
+
|
|
134
|
+
WebGLRenderingContext.prototype.getSupportedExtensions = function() {
|
|
135
|
+
return allExtensions;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
if (typeof WebGL2RenderingContext !== 'undefined') {
|
|
139
|
+
WebGL2RenderingContext.prototype.getSupportedExtensions = function() {
|
|
140
|
+
return [...allExtensions, 'EXT_color_buffer_float', 'EXT_disjoint_timer_query_webgl2', 'WEBGL_compressed_texture_etc'];
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Override getExtension to handle WEBGL_debug_renderer_info properly
|
|
145
|
+
WebGLRenderingContext.prototype.getExtension = function(name) {
|
|
146
|
+
const result = getExtensionProto.apply(this, arguments);
|
|
147
|
+
|
|
148
|
+
if (name === 'WEBGL_debug_renderer_info' && result) {
|
|
149
|
+
// Return the extension but ensure our spoofed values are used
|
|
150
|
+
return {
|
|
151
|
+
UNMASKED_VENDOR_WEBGL: 0x9245,
|
|
152
|
+
UNMASKED_RENDERER_WEBGL: 0x9246,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return result;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
if (typeof WebGL2RenderingContext !== 'undefined') {
|
|
160
|
+
WebGL2RenderingContext.prototype.getExtension = WebGLRenderingContext.prototype.getExtension;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
spoofWebGL();
|
|
165
|
+
})();`;
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=webgl-spoofing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgl-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,gBAA8B,EAAU,EAAE;IAChF,iFAAiF;IACjF,MAAM,cAAc,GAAG,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,cAAc,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAElH,OAAO;;;;;;;;;;UAUD,cAAc,CAAC,CAAC,CAAC;;oCAES,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;;;SAG3D,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAsCH;;;;;;;;;;;;;;yBAcgB,cAAc,IAAI,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU;;;yBAGxF,cAAc,IAAI,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2CjH,CAAC,cAAc,CAAC,CAAC,CAAC;;;;;;;;;SASnB,CAAC,CAAC,CAAC;;SAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiCH,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgpu-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,0BAA0B,kCAA+B,MAuMrE,CAAC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebGPU Fingerprinting Protection
|
|
3
|
+
* Spoofs GPU adapter information and fakes GPU uptime
|
|
4
|
+
*/
|
|
5
|
+
export const createWebGPUSpoofingScript = (experimentalMode = false) => {
|
|
6
|
+
return `
|
|
7
|
+
(() => {
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
// WebGPU Fingerprinting Protection for 2025
|
|
11
|
+
const spoofWebGPU = () => {
|
|
12
|
+
// Experimental mode: completely disable WebGPU
|
|
13
|
+
${experimentalMode ? `
|
|
14
|
+
if ('GPU' in window) {
|
|
15
|
+
delete window.GPU;
|
|
16
|
+
}
|
|
17
|
+
if ('navigator' in window && 'gpu' in navigator) {
|
|
18
|
+
delete navigator.gpu;
|
|
19
|
+
}
|
|
20
|
+
// Return early as WebGPU is completely disabled
|
|
21
|
+
return;
|
|
22
|
+
` : ''}
|
|
23
|
+
|
|
24
|
+
// Standard mode: spoof WebGPU
|
|
25
|
+
// Fake GPU uptime - make it look like the GPU has been running for hours/days
|
|
26
|
+
const fakeGPUStartTime = Date.now() - (Math.random() * 48 + 24) * 60 * 60 * 1000; // 24-72 hours ago
|
|
27
|
+
|
|
28
|
+
if ('GPU' in window && window.GPU) {
|
|
29
|
+
const OriginalGPU = window.GPU;
|
|
30
|
+
|
|
31
|
+
// Override requestAdapter to provide consistent fake adapter info
|
|
32
|
+
window.GPU = new Proxy(OriginalGPU, {
|
|
33
|
+
get(target, prop) {
|
|
34
|
+
if (prop === 'requestAdapter') {
|
|
35
|
+
return async function(options) {
|
|
36
|
+
const adapter = await target.requestAdapter.call(target, options);
|
|
37
|
+
if (!adapter) return null;
|
|
38
|
+
|
|
39
|
+
// Wrap the adapter to provide fake but consistent info
|
|
40
|
+
return new Proxy(adapter, {
|
|
41
|
+
get(adapterTarget, adapterProp) {
|
|
42
|
+
if (adapterProp === 'name') {
|
|
43
|
+
// Return a common GPU name based on platform
|
|
44
|
+
const gpuNames = [
|
|
45
|
+
'NVIDIA GeForce RTX 3060',
|
|
46
|
+
'NVIDIA GeForce GTX 1660 Ti',
|
|
47
|
+
'AMD Radeon RX 6600',
|
|
48
|
+
'Intel(R) UHD Graphics 630',
|
|
49
|
+
'Apple M1',
|
|
50
|
+
];
|
|
51
|
+
return gpuNames[Math.floor(Math.random() * gpuNames.length)];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (adapterProp === 'features') {
|
|
55
|
+
// Return a consistent set of features
|
|
56
|
+
const fakeFeatures = new Set([
|
|
57
|
+
'depth-clip-control',
|
|
58
|
+
'depth32float-stencil8',
|
|
59
|
+
'texture-compression-bc',
|
|
60
|
+
'texture-compression-etc2',
|
|
61
|
+
'texture-compression-astc',
|
|
62
|
+
'timestamp-query',
|
|
63
|
+
'indirect-first-instance',
|
|
64
|
+
'shader-f16',
|
|
65
|
+
'rg11b10ufloat-renderable',
|
|
66
|
+
'bgra8unorm-storage',
|
|
67
|
+
'float32-filterable',
|
|
68
|
+
]);
|
|
69
|
+
|
|
70
|
+
return new Proxy(adapterTarget.features || fakeFeatures, {
|
|
71
|
+
get(featuresTarget, featuresProp) {
|
|
72
|
+
if (featuresProp === 'has') {
|
|
73
|
+
return (feature) => fakeFeatures.has(feature);
|
|
74
|
+
}
|
|
75
|
+
if (featuresProp === 'size') {
|
|
76
|
+
return fakeFeatures.size;
|
|
77
|
+
}
|
|
78
|
+
if (featuresProp === Symbol.iterator) {
|
|
79
|
+
return fakeFeatures[Symbol.iterator].bind(fakeFeatures);
|
|
80
|
+
}
|
|
81
|
+
return Reflect.get(featuresTarget, featuresProp);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (adapterProp === 'limits') {
|
|
87
|
+
// Return realistic GPU limits
|
|
88
|
+
return {
|
|
89
|
+
maxTextureDimension1D: 16384,
|
|
90
|
+
maxTextureDimension2D: 16384,
|
|
91
|
+
maxTextureDimension3D: 2048,
|
|
92
|
+
maxTextureArrayLayers: 2048,
|
|
93
|
+
maxBindGroups: 4,
|
|
94
|
+
maxBindGroupsPlusVertexBuffers: 24,
|
|
95
|
+
maxBindingsPerBindGroup: 1000,
|
|
96
|
+
maxDynamicUniformBuffersPerPipelineLayout: 8,
|
|
97
|
+
maxDynamicStorageBuffersPerPipelineLayout: 4,
|
|
98
|
+
maxSampledTexturesPerShaderStage: 16,
|
|
99
|
+
maxSamplersPerShaderStage: 16,
|
|
100
|
+
maxStorageBuffersPerShaderStage: 8,
|
|
101
|
+
maxStorageTexturesPerShaderStage: 4,
|
|
102
|
+
maxUniformBuffersPerShaderStage: 12,
|
|
103
|
+
maxUniformBufferBindingSize: 65536,
|
|
104
|
+
maxStorageBufferBindingSize: 134217728,
|
|
105
|
+
minUniformBufferOffsetAlignment: 256,
|
|
106
|
+
minStorageBufferOffsetAlignment: 256,
|
|
107
|
+
maxVertexBuffers: 8,
|
|
108
|
+
maxBufferSize: 268435456,
|
|
109
|
+
maxVertexAttributes: 16,
|
|
110
|
+
maxVertexBufferArrayStride: 2048,
|
|
111
|
+
maxInterStageShaderComponents: 60,
|
|
112
|
+
maxInterStageShaderVariables: 16,
|
|
113
|
+
maxColorAttachments: 8,
|
|
114
|
+
maxColorAttachmentBytesPerSample: 32,
|
|
115
|
+
maxComputeWorkgroupStorageSize: 16384,
|
|
116
|
+
maxComputeInvocationsPerWorkgroup: 256,
|
|
117
|
+
maxComputeWorkgroupSizeX: 256,
|
|
118
|
+
maxComputeWorkgroupSizeY: 256,
|
|
119
|
+
maxComputeWorkgroupSizeZ: 64,
|
|
120
|
+
maxComputeWorkgroupsPerDimension: 65535,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (adapterProp === 'requestDevice') {
|
|
125
|
+
return async function(descriptor) {
|
|
126
|
+
const device = await adapterTarget.requestDevice.call(adapterTarget, descriptor);
|
|
127
|
+
if (!device) return null;
|
|
128
|
+
|
|
129
|
+
// Wrap the device to intercept timing queries
|
|
130
|
+
return new Proxy(device, {
|
|
131
|
+
get(deviceTarget, deviceProp) {
|
|
132
|
+
if (deviceProp === 'createQuerySet') {
|
|
133
|
+
return function(descriptor) {
|
|
134
|
+
const querySet = deviceTarget.createQuerySet.call(deviceTarget, descriptor);
|
|
135
|
+
|
|
136
|
+
// If it's a timestamp query, we need to fake the results
|
|
137
|
+
if (descriptor.type === 'timestamp') {
|
|
138
|
+
return new Proxy(querySet, {
|
|
139
|
+
get(queryTarget, queryProp) {
|
|
140
|
+
// Intercept resolve operations to fake timestamps
|
|
141
|
+
return Reflect.get(queryTarget, queryProp);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return querySet;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return Reflect.get(deviceTarget, deviceProp);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return Reflect.get(adapterTarget, adapterProp);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (prop === 'getPreferredCanvasFormat') {
|
|
163
|
+
return function() {
|
|
164
|
+
// Return the most common format
|
|
165
|
+
return 'bgra8unorm';
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return Reflect.get(target, prop);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Override performance.now() to fake GPU uptime when called from WebGPU context
|
|
175
|
+
const originalPerformanceNow = performance.now;
|
|
176
|
+
performance.now = function() {
|
|
177
|
+
const stack = new Error().stack;
|
|
178
|
+
|
|
179
|
+
// Check if called from WebGPU context
|
|
180
|
+
if (stack && (stack.includes('GPU') || stack.includes('WebGPU') || stack.includes('gpu'))) {
|
|
181
|
+
// Return a time that makes it look like GPU has been running for a while
|
|
182
|
+
const currentTime = originalPerformanceNow.call(this);
|
|
183
|
+
const fakeUptime = Date.now() - fakeGPUStartTime;
|
|
184
|
+
return Math.min(currentTime, fakeUptime);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return originalPerformanceNow.call(this);
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Override GPU timing-related APIs
|
|
191
|
+
if (window.GPUCommandEncoder) {
|
|
192
|
+
const originalWriteTimestamp = GPUCommandEncoder.prototype.writeTimestamp;
|
|
193
|
+
if (originalWriteTimestamp) {
|
|
194
|
+
GPUCommandEncoder.prototype.writeTimestamp = function(querySet, queryIndex) {
|
|
195
|
+
// Call original but the query results will be intercepted elsewhere
|
|
196
|
+
return originalWriteTimestamp.call(this, querySet, queryIndex);
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
spoofWebGPU();
|
|
203
|
+
})();`;
|
|
204
|
+
};
|
|
205
|
+
//# sourceMappingURL=webgpu-spoofing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgpu-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,gBAAgB,GAAG,KAAK,EAAU,EAAE;IAC3E,OAAO;;;;;;;UAOD,gBAAgB,CAAC,CAAC,CAAC;;;;;;;;;SASpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqLR,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webrtc-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,0BAA0B,QAAO,MA0F7C,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebRTC Spoofing
|
|
3
|
+
* Prevents IP leaks and provides fake device information
|
|
4
|
+
*/
|
|
5
|
+
export const createWebRTCSpoofingScript = () => {
|
|
6
|
+
return `
|
|
7
|
+
(() => {
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
// WebRTC Spoofing for 2025
|
|
11
|
+
const spoofWebRTC = () => {
|
|
12
|
+
// Override RTCPeerConnection
|
|
13
|
+
const OriginalRTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
|
|
14
|
+
|
|
15
|
+
if (OriginalRTCPeerConnection) {
|
|
16
|
+
window.RTCPeerConnection = window.webkitRTCPeerConnection = window.mozRTCPeerConnection = new Proxy(OriginalRTCPeerConnection, {
|
|
17
|
+
construct(target, args) {
|
|
18
|
+
const config = args[0] || {};
|
|
19
|
+
|
|
20
|
+
// Modify ICE servers to prevent IP leaks
|
|
21
|
+
if (config.iceServers) {
|
|
22
|
+
config.iceServers = config.iceServers.filter(server => {
|
|
23
|
+
// Remove STUN servers that might leak IP
|
|
24
|
+
if (server.urls) {
|
|
25
|
+
if (Array.isArray(server.urls)) {
|
|
26
|
+
server.urls = server.urls.filter(url => !url.includes('stun:'));
|
|
27
|
+
} else if (typeof server.urls === 'string' && server.urls.includes('stun:')) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const pc = Reflect.construct(target, [config, ...args.slice(1)]);
|
|
36
|
+
|
|
37
|
+
// Override createDataChannel to prevent fingerprinting
|
|
38
|
+
const originalCreateDataChannel = pc.createDataChannel;
|
|
39
|
+
pc.createDataChannel = function(label, options) {
|
|
40
|
+
// Add random ID to make fingerprinting harder
|
|
41
|
+
const modifiedLabel = label + '_' + Math.random().toString(36).substr(2, 9);
|
|
42
|
+
return originalCreateDataChannel.call(this, modifiedLabel, options);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Override getStats to provide fake statistics
|
|
46
|
+
const originalGetStats = pc.getStats;
|
|
47
|
+
pc.getStats = function() {
|
|
48
|
+
return originalGetStats.apply(this, arguments).then(stats => {
|
|
49
|
+
// Modify stats to hide identifying information
|
|
50
|
+
const modifiedStats = new Map();
|
|
51
|
+
stats.forEach((stat, key) => {
|
|
52
|
+
const modifiedStat = Object.assign({}, stat);
|
|
53
|
+
|
|
54
|
+
// Randomize some values
|
|
55
|
+
if ('bytesReceived' in modifiedStat) {
|
|
56
|
+
modifiedStat.bytesReceived = Math.floor(modifiedStat.bytesReceived * (0.9 + Math.random() * 0.2));
|
|
57
|
+
}
|
|
58
|
+
if ('bytesSent' in modifiedStat) {
|
|
59
|
+
modifiedStat.bytesSent = Math.floor(modifiedStat.bytesSent * (0.9 + Math.random() * 0.2));
|
|
60
|
+
}
|
|
61
|
+
if ('jitter' in modifiedStat) {
|
|
62
|
+
modifiedStat.jitter = modifiedStat.jitter * (0.9 + Math.random() * 0.2);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
modifiedStats.set(key, modifiedStat);
|
|
66
|
+
});
|
|
67
|
+
return modifiedStats;
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
return pc;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Override MediaDevices.enumerateDevices
|
|
77
|
+
if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
|
|
78
|
+
const originalEnumerateDevices = navigator.mediaDevices.enumerateDevices;
|
|
79
|
+
navigator.mediaDevices.enumerateDevices = function() {
|
|
80
|
+
return originalEnumerateDevices.apply(this, arguments).then(devices => {
|
|
81
|
+
// Provide fake but consistent device IDs
|
|
82
|
+
return devices.map((device, index) => ({
|
|
83
|
+
deviceId: 'device_' + device.kind + '_' + index,
|
|
84
|
+
kind: device.kind,
|
|
85
|
+
label: device.label || '',
|
|
86
|
+
groupId: 'group_' + Math.floor(index / 2),
|
|
87
|
+
}));
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
spoofWebRTC();
|
|
94
|
+
})();`;
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=webrtc-spoofing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webrtc-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAW,EAAE;IACnD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAwFL,CAAC;AACP,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import CDPCrawler from "./crawler.js";
|
|
2
2
|
import CdpPage from "./page.js";
|
|
3
3
|
export default CDPCrawler;
|
|
4
|
-
export { createCDPRouter
|
|
5
|
-
export {
|
|
4
|
+
export { createCDPRouter } from "./crawler.js";
|
|
5
|
+
export type { CDPRouter } from "./crawler.js";
|
|
6
|
+
export type { GotoOptions } from "./page.js";
|
|
6
7
|
export { CdpPage };
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/page.d.ts
CHANGED
|
@@ -79,6 +79,7 @@ export default class CdpPage extends EventEmitter {
|
|
|
79
79
|
getTextContent(selector: string): Promise<string>;
|
|
80
80
|
getHref(selector: string): Promise<string>;
|
|
81
81
|
scrollIntoView(selector: string): Promise<void>;
|
|
82
|
+
setupFetchMetadataHeaders(): Promise<void>;
|
|
82
83
|
blockRequests(urlPatterns: string[]): Promise<void>;
|
|
83
84
|
private getNodeId;
|
|
84
85
|
setCookies(cookies: Cookie[]): Promise<void>;
|
package/dist/page.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"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"}
|
package/dist/page.js
CHANGED
|
@@ -273,7 +273,7 @@ export default class CdpPage extends EventEmitter {
|
|
|
273
273
|
async click(selector) {
|
|
274
274
|
await Promise.all([
|
|
275
275
|
this._enableDomain('DOM'),
|
|
276
|
-
this._enableDomain('Input')
|
|
276
|
+
this._enableDomain('Input'),
|
|
277
277
|
]);
|
|
278
278
|
const { DOM, Input } = this.client;
|
|
279
279
|
await this.waitForSelector(selector);
|
|
@@ -456,6 +456,47 @@ export default class CdpPage extends EventEmitter {
|
|
|
456
456
|
}
|
|
457
457
|
}, selector);
|
|
458
458
|
}
|
|
459
|
+
// Add proper Fetch Metadata headers to avoid CDP detection
|
|
460
|
+
async setupFetchMetadataHeaders() {
|
|
461
|
+
const { Network } = this.client;
|
|
462
|
+
await this._enableDomain('Network');
|
|
463
|
+
await Network.setRequestInterception({ patterns: [{ urlPattern: '*' }] });
|
|
464
|
+
Network.on('requestIntercepted', async (params) => {
|
|
465
|
+
const { request, interceptionId } = params;
|
|
466
|
+
const url = new URL(request.url);
|
|
467
|
+
// Add proper fetch metadata headers
|
|
468
|
+
const headers = { ...request.headers };
|
|
469
|
+
// Set sec-fetch-* headers based on request type and destination
|
|
470
|
+
if (request.method === 'GET' && !headers['sec-fetch-dest']) {
|
|
471
|
+
if (url.pathname.endsWith('.js')) {
|
|
472
|
+
headers['sec-fetch-dest'] = 'script';
|
|
473
|
+
headers['sec-fetch-mode'] = 'no-cors';
|
|
474
|
+
headers['sec-fetch-site'] = url.origin === headers.origin ? 'same-origin' : 'cross-site';
|
|
475
|
+
}
|
|
476
|
+
else if (url.pathname.endsWith('.css')) {
|
|
477
|
+
headers['sec-fetch-dest'] = 'style';
|
|
478
|
+
headers['sec-fetch-mode'] = 'no-cors';
|
|
479
|
+
headers['sec-fetch-site'] = url.origin === headers.origin ? 'same-origin' : 'cross-site';
|
|
480
|
+
}
|
|
481
|
+
else if (url.pathname.match(/\.(png|jpg|jpeg|gif|webp|svg)$/i)) {
|
|
482
|
+
headers['sec-fetch-dest'] = 'image';
|
|
483
|
+
headers['sec-fetch-mode'] = 'no-cors';
|
|
484
|
+
headers['sec-fetch-site'] = url.origin === headers.origin ? 'same-origin' : 'cross-site';
|
|
485
|
+
}
|
|
486
|
+
else if (url.pathname === '/' || !url.pathname.includes('.')) {
|
|
487
|
+
headers['sec-fetch-dest'] = 'document';
|
|
488
|
+
headers['sec-fetch-mode'] = 'navigate';
|
|
489
|
+
headers['sec-fetch-site'] = 'none';
|
|
490
|
+
headers['sec-fetch-user'] = '?1';
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
// Continue the request with modified headers
|
|
494
|
+
await Network.continueInterceptedRequest({
|
|
495
|
+
interceptionId,
|
|
496
|
+
headers,
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
}
|
|
459
500
|
// Block requests matching URL patterns
|
|
460
501
|
async blockRequests(urlPatterns) {
|
|
461
502
|
const { Network } = this.client;
|