jumpy-lion 0.1.1 → 0.1.3

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.
Files changed (234) hide show
  1. package/dist/browser-controller.d.ts +22 -3
  2. package/dist/browser-controller.d.ts.map +1 -1
  3. package/dist/browser-controller.js +316 -71
  4. package/dist/browser-controller.js.map +1 -1
  5. package/dist/browser-plugin.d.ts +56 -7
  6. package/dist/browser-plugin.d.ts.map +1 -1
  7. package/dist/browser-plugin.js +268 -56
  8. package/dist/browser-plugin.js.map +1 -1
  9. package/dist/browser-process/browser.d.ts +39 -0
  10. package/dist/browser-process/browser.d.ts.map +1 -1
  11. package/dist/browser-process/browser.js +127 -16
  12. package/dist/browser-process/browser.js.map +1 -1
  13. package/dist/browser-process/process.d.ts +9 -0
  14. package/dist/browser-process/process.d.ts.map +1 -1
  15. package/dist/browser-process/process.js +100 -6
  16. package/dist/browser-process/process.js.map +1 -1
  17. package/dist/browser-profiles/chrome/default.d.ts +116 -0
  18. package/dist/browser-profiles/chrome/default.d.ts.map +1 -1
  19. package/dist/browser-profiles/chrome/default.js +118 -1
  20. package/dist/browser-profiles/chrome/default.js.map +1 -1
  21. package/dist/browser-profiles/chrome/populate-profile.d.ts +76 -0
  22. package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -0
  23. package/dist/browser-profiles/chrome/populate-profile.js +300 -0
  24. package/dist/browser-profiles/chrome/populate-profile.js.map +1 -0
  25. package/dist/browser-profiles/index.d.ts +1 -0
  26. package/dist/browser-profiles/index.d.ts.map +1 -1
  27. package/dist/browser-profiles/index.js +2 -0
  28. package/dist/browser-profiles/index.js.map +1 -1
  29. package/dist/crawler.d.ts +81 -9
  30. package/dist/crawler.d.ts.map +1 -1
  31. package/dist/crawler.js +26 -10
  32. package/dist/crawler.js.map +1 -1
  33. package/dist/fingerprinting/all-fingerprint-defender/_locales/en/messages.json +95 -0
  34. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts +2 -0
  35. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts.map +1 -0
  36. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js +1 -0
  37. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js.map +1 -0
  38. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts +2 -0
  39. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts.map +1 -0
  40. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js +1 -0
  41. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js.map +1 -0
  42. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts +83 -0
  43. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts.map +1 -0
  44. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js +1 -0
  45. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js.map +1 -0
  46. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts +2 -0
  47. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts.map +1 -0
  48. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js +1 -0
  49. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js.map +1 -0
  50. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts +2 -0
  51. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts.map +1 -0
  52. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js +1 -0
  53. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js.map +1 -0
  54. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts +2 -0
  55. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts.map +1 -0
  56. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js +1 -0
  57. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js.map +1 -0
  58. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts +2 -0
  59. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts.map +1 -0
  60. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js +1 -0
  61. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js.map +1 -0
  62. package/dist/fingerprinting/all-fingerprint-defender/assets/debounce-09920c81.css +1 -0
  63. package/dist/fingerprinting/all-fingerprint-defender/assets/options-fe2fb5aa.css +1 -0
  64. package/dist/fingerprinting/all-fingerprint-defender/assets/popup-1886d2ef.css +1 -0
  65. package/dist/fingerprinting/all-fingerprint-defender/img/icon-128.png +0 -0
  66. package/dist/fingerprinting/all-fingerprint-defender/img/icon-16.png +0 -0
  67. package/dist/fingerprinting/all-fingerprint-defender/img/icon-24.png +0 -0
  68. package/dist/fingerprinting/all-fingerprint-defender/img/icon-32-disabled.png +0 -0
  69. package/dist/fingerprinting/all-fingerprint-defender/img/icon-32.png +0 -0
  70. package/dist/fingerprinting/all-fingerprint-defender/img/icon-48.png +0 -0
  71. package/dist/fingerprinting/all-fingerprint-defender/manifest.json +83 -0
  72. package/dist/fingerprinting/all-fingerprint-defender/options.html +17 -0
  73. package/dist/fingerprinting/all-fingerprint-defender/popup.html +23 -0
  74. package/dist/fingerprinting/anti-webgpu/background.d.ts +2 -0
  75. package/dist/fingerprinting/anti-webgpu/background.d.ts.map +1 -0
  76. package/dist/fingerprinting/anti-webgpu/background.js +4 -0
  77. package/dist/fingerprinting/anti-webgpu/background.js.map +1 -0
  78. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts +2 -0
  79. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts.map +1 -0
  80. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js +50 -0
  81. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js.map +1 -0
  82. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts +2 -0
  83. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts.map +1 -0
  84. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js +172 -0
  85. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js.map +1 -0
  86. package/dist/fingerprinting/anti-webgpu/data/icons/128.png +0 -0
  87. package/dist/fingerprinting/anti-webgpu/data/icons/16.png +0 -0
  88. package/dist/fingerprinting/anti-webgpu/data/icons/32.png +0 -0
  89. package/dist/fingerprinting/anti-webgpu/data/icons/48.png +0 -0
  90. package/dist/fingerprinting/anti-webgpu/data/icons/64.png +0 -0
  91. package/dist/fingerprinting/anti-webgpu/data/popup/popup.css +88 -0
  92. package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts +2 -0
  93. package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts.map +1 -0
  94. package/dist/fingerprinting/anti-webgpu/data/popup/popup.html +58 -0
  95. package/dist/fingerprinting/anti-webgpu/data/popup/popup.js +96 -0
  96. package/dist/fingerprinting/anti-webgpu/data/popup/popup.js.map +1 -0
  97. package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts +2 -0
  98. package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts.map +1 -0
  99. package/dist/fingerprinting/anti-webgpu/lib/chrome.js +249 -0
  100. package/dist/fingerprinting/anti-webgpu/lib/chrome.js.map +1 -0
  101. package/dist/fingerprinting/anti-webgpu/lib/common.d.ts +2 -0
  102. package/dist/fingerprinting/anti-webgpu/lib/common.d.ts.map +1 -0
  103. package/dist/fingerprinting/anti-webgpu/lib/common.js +86 -0
  104. package/dist/fingerprinting/anti-webgpu/lib/common.js.map +1 -0
  105. package/dist/fingerprinting/anti-webgpu/lib/config.d.ts +2 -0
  106. package/dist/fingerprinting/anti-webgpu/lib/config.d.ts.map +1 -0
  107. package/dist/fingerprinting/anti-webgpu/lib/config.js +14 -0
  108. package/dist/fingerprinting/anti-webgpu/lib/config.js.map +1 -0
  109. package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts +2 -0
  110. package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts.map +1 -0
  111. package/dist/fingerprinting/anti-webgpu/lib/runtime.js +107 -0
  112. package/dist/fingerprinting/anti-webgpu/lib/runtime.js.map +1 -0
  113. package/dist/fingerprinting/anti-webgpu/manifest.json +58 -0
  114. package/dist/fingerprinting/custom-fingerprint-injector.d.ts +87 -0
  115. package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +1 -0
  116. package/dist/fingerprinting/custom-fingerprint-injector.js +342 -0
  117. package/dist/fingerprinting/custom-fingerprint-injector.js.map +1 -0
  118. package/dist/fingerprinting/fingerprint-injector.d.ts +163 -0
  119. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -0
  120. package/dist/fingerprinting/fingerprint-injector.js +697 -0
  121. package/dist/fingerprinting/fingerprint-injector.js.map +1 -0
  122. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts +6 -0
  123. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -0
  124. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +119 -0
  125. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -0
  126. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts +6 -0
  127. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -0
  128. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +149 -0
  129. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -0
  130. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts +14 -0
  131. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts.map +1 -0
  132. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js +763 -0
  133. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -0
  134. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts +6 -0
  135. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -0
  136. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +195 -0
  137. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -0
  138. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts +10 -0
  139. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts.map +1 -0
  140. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js +195 -0
  141. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js.map +1 -0
  142. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +28 -0
  143. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -0
  144. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +1181 -0
  145. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -0
  146. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts +7 -0
  147. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -0
  148. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +171 -0
  149. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -0
  150. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +37 -0
  151. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -0
  152. package/dist/fingerprinting/fingerprint-overrides/index.js +41 -0
  153. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -0
  154. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +45 -0
  155. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts.map +1 -0
  156. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +268 -0
  157. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -0
  158. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts +6 -0
  159. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -0
  160. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +301 -0
  161. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -0
  162. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts +14 -0
  163. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts.map +1 -0
  164. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js +160 -0
  165. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js.map +1 -0
  166. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +7 -0
  167. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -0
  168. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +58 -0
  169. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -0
  170. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts +6 -0
  171. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -0
  172. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +249 -0
  173. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -0
  174. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +33 -0
  175. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -0
  176. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +620 -0
  177. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -0
  178. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts +13 -0
  179. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts.map +1 -0
  180. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js +356 -0
  181. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js.map +1 -0
  182. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +18 -0
  183. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -0
  184. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +171 -0
  185. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -0
  186. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +55 -0
  187. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts.map +1 -0
  188. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +244 -0
  189. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -0
  190. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +14 -0
  191. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -0
  192. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +983 -0
  193. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -0
  194. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts +13 -0
  195. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts.map +1 -0
  196. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js +346 -0
  197. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js.map +1 -0
  198. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts +13 -0
  199. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts.map +1 -0
  200. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js +264 -0
  201. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -0
  202. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +27 -0
  203. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -0
  204. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +213 -0
  205. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -0
  206. package/dist/fingerprinting/fingerprint-overrides/utils.d.ts +12 -0
  207. package/dist/fingerprinting/fingerprint-overrides/utils.d.ts.map +1 -0
  208. package/dist/fingerprinting/fingerprint-overrides/utils.js +517 -0
  209. package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -0
  210. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts +12 -0
  211. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -0
  212. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +215 -0
  213. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -0
  214. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts +6 -0
  215. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -0
  216. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +202 -0
  217. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -0
  218. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts +6 -0
  219. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -0
  220. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +188 -0
  221. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -0
  222. package/dist/index.d.ts +4 -0
  223. package/dist/index.d.ts.map +1 -1
  224. package/dist/index.js +2 -0
  225. package/dist/index.js.map +1 -1
  226. package/dist/launcher-wrap.d.ts +2 -2
  227. package/dist/launcher-wrap.d.ts.map +1 -1
  228. package/dist/launcher-wrap.js.map +1 -1
  229. package/dist/page.d.ts +160 -13
  230. package/dist/page.d.ts.map +1 -1
  231. package/dist/page.js +1027 -42
  232. package/dist/page.js.map +1 -1
  233. package/dist/tsconfig.build.tsbuildinfo +1 -1
  234. package/package.json +8 -4
@@ -0,0 +1,763 @@
1
+ /**
2
+ * CDP Detection Bypass
3
+ * Comprehensive CDP and automation detection bypass for 2024-2025
4
+ *
5
+ * Handles:
6
+ * - Iframe contentWindow access hiding
7
+ * - Puppeteer/Playwright evaluation script traces
8
+ * - Error.captureStackTrace patching
9
+ * - Storage access API spoofing
10
+ * - SourceURL/SourceMap hiding
11
+ * - Chrome DevTools property removal
12
+ */
13
+ export const createCDPDetectionBypassScript = () => {
14
+ return `
15
+ (() => {
16
+ 'use strict';
17
+
18
+ // CDP Detection Bypass for 2025
19
+ const bypassCDPDetection = () => {
20
+
21
+ // 1. Remove Chrome DevTools / Selenium / Puppeteer specific properties
22
+ const removeAutomationProperties = () => {
23
+ const cdcProperties = Object.getOwnPropertyNames(window).filter(prop =>
24
+ prop.startsWith('cdc_') ||
25
+ prop.startsWith('$cdc_') ||
26
+ prop.includes('webdriver') ||
27
+ prop.includes('selenium') ||
28
+ prop.includes('puppeteer') ||
29
+ prop.includes('playwright')
30
+ );
31
+
32
+ cdcProperties.forEach(prop => {
33
+ try {
34
+ delete window[prop];
35
+ } catch (e) {
36
+ try {
37
+ Object.defineProperty(window, prop, {
38
+ get: () => undefined,
39
+ configurable: true
40
+ });
41
+ } catch (e2) {}
42
+ }
43
+ });
44
+
45
+ // Remove from document as well
46
+ const docProperties = Object.getOwnPropertyNames(document).filter(prop =>
47
+ prop.startsWith('$') ||
48
+ prop.includes('webdriver') ||
49
+ prop.includes('selenium')
50
+ );
51
+
52
+ docProperties.forEach(prop => {
53
+ try {
54
+ delete document[prop];
55
+ } catch (e) {}
56
+ });
57
+ };
58
+
59
+ // Cache parent window fingerprint values for cross-context consistency
60
+ const parentFingerprintCache = {
61
+ navigator: {
62
+ userAgent: navigator.userAgent,
63
+ platform: navigator.platform,
64
+ vendor: navigator.vendor,
65
+ language: navigator.language,
66
+ languages: navigator.languages ? [...navigator.languages] : ['en-US'],
67
+ hardwareConcurrency: navigator.hardwareConcurrency,
68
+ deviceMemory: navigator.deviceMemory,
69
+ maxTouchPoints: navigator.maxTouchPoints,
70
+ cookieEnabled: navigator.cookieEnabled,
71
+ onLine: navigator.onLine,
72
+ appVersion: navigator.appVersion,
73
+ appName: navigator.appName,
74
+ appCodeName: navigator.appCodeName,
75
+ product: navigator.product,
76
+ productSub: navigator.productSub,
77
+ vendorSub: navigator.vendorSub,
78
+ webdriver: false, // Always false
79
+ },
80
+ screen: {
81
+ width: screen.width,
82
+ height: screen.height,
83
+ availWidth: screen.availWidth,
84
+ availHeight: screen.availHeight,
85
+ colorDepth: screen.colorDepth,
86
+ pixelDepth: screen.pixelDepth,
87
+ }
88
+ };
89
+
90
+ // 2. Override HTMLIFrameElement.prototype.contentWindow to hide CDP access AND ensure consistency
91
+ const protectIframeContentWindow = () => {
92
+ const originalContentWindowDescriptor = Object.getOwnPropertyDescriptor(
93
+ HTMLIFrameElement.prototype,
94
+ 'contentWindow'
95
+ );
96
+
97
+ if (originalContentWindowDescriptor) {
98
+ Object.defineProperty(HTMLIFrameElement.prototype, 'contentWindow', {
99
+ get() {
100
+ const contentWindow = originalContentWindowDescriptor.get.call(this);
101
+
102
+ if (!contentWindow) return contentWindow;
103
+
104
+ // Check if the iframe is same-origin
105
+ try {
106
+ // Access a property to check if we have access
107
+ const _ = contentWindow.document;
108
+
109
+ // Create a navigator proxy that returns parent values for consistency
110
+ const createConsistentNavigatorProxy = (iframeNavigator) => {
111
+ return new Proxy(iframeNavigator, {
112
+ get(target, prop) {
113
+ // Return parent window values for fingerprint-sensitive properties
114
+ if (prop in parentFingerprintCache.navigator) {
115
+ return parentFingerprintCache.navigator[prop];
116
+ }
117
+ const value = target[prop];
118
+ if (typeof value === 'function') {
119
+ return value.bind(target);
120
+ }
121
+ return value;
122
+ }
123
+ });
124
+ };
125
+
126
+ // Create a screen proxy that returns parent values
127
+ const createConsistentScreenProxy = (iframeScreen) => {
128
+ return new Proxy(iframeScreen, {
129
+ get(target, prop) {
130
+ if (prop in parentFingerprintCache.screen) {
131
+ return parentFingerprintCache.screen[prop];
132
+ }
133
+ const value = target[prop];
134
+ if (typeof value === 'function') {
135
+ return value.bind(target);
136
+ }
137
+ return value;
138
+ }
139
+ });
140
+ };
141
+
142
+ // If accessible, wrap it to hide automation traces AND ensure consistency
143
+ return new Proxy(contentWindow, {
144
+ get(target, prop) {
145
+ // Hide automation-related properties
146
+ if (prop === 'webdriver' ||
147
+ prop === '__webdriver_evaluate' ||
148
+ prop === '__selenium_evaluate' ||
149
+ prop === '__driver_evaluate' ||
150
+ prop === '__webdriver_script_function' ||
151
+ prop === '__webdriver_script_fn' ||
152
+ prop === '__fxdriver_evaluate' ||
153
+ prop === '__webdriver_unwrapped' ||
154
+ String(prop).startsWith('cdc_') ||
155
+ String(prop).startsWith('$cdc_')) {
156
+ return undefined;
157
+ }
158
+
159
+ // Return consistent navigator
160
+ if (prop === 'navigator') {
161
+ return createConsistentNavigatorProxy(target.navigator);
162
+ }
163
+
164
+ // Return consistent screen
165
+ if (prop === 'screen') {
166
+ return createConsistentScreenProxy(target.screen);
167
+ }
168
+
169
+ const value = target[prop];
170
+ if (typeof value === 'function') {
171
+ return value.bind(target);
172
+ }
173
+ return value;
174
+ },
175
+ has(target, prop) {
176
+ if (String(prop).startsWith('cdc_') ||
177
+ String(prop).startsWith('$cdc_') ||
178
+ prop === 'webdriver') {
179
+ return false;
180
+ }
181
+ return prop in target;
182
+ }
183
+ });
184
+ } catch (e) {
185
+ // Cross-origin, return as-is
186
+ return contentWindow;
187
+ }
188
+ },
189
+ configurable: true,
190
+ enumerable: true
191
+ });
192
+ }
193
+ };
194
+
195
+ // 2b. Intercept iframe creation to ensure overrides apply to dynamically created iframes
196
+ const interceptIframeCreation = () => {
197
+ const originalCreateElement = document.createElement.bind(document);
198
+
199
+ document.createElement = function(tagName, options) {
200
+ const element = originalCreateElement(tagName, options);
201
+
202
+ if (tagName.toLowerCase() === 'iframe') {
203
+ // Monitor iframe load to apply overrides
204
+ element.addEventListener('load', function iframeLoadHandler() {
205
+ try {
206
+ const iframeWindow = element.contentWindow;
207
+ if (iframeWindow) {
208
+ // Apply automation property removal to iframe
209
+ const cdcProps = Object.getOwnPropertyNames(iframeWindow).filter(p =>
210
+ p.startsWith('cdc_') || p.startsWith('$cdc_') ||
211
+ p.includes('webdriver') || p.includes('selenium')
212
+ );
213
+ cdcProps.forEach(prop => {
214
+ try { delete iframeWindow[prop]; } catch (e) {}
215
+ });
216
+
217
+ // Ensure navigator.webdriver is undefined in iframe
218
+ try {
219
+ Object.defineProperty(iframeWindow.navigator, 'webdriver', {
220
+ get: () => undefined,
221
+ configurable: true
222
+ });
223
+ } catch (e) {}
224
+ }
225
+ } catch (e) {
226
+ // Cross-origin iframe, cannot access
227
+ }
228
+ });
229
+ }
230
+
231
+ return element;
232
+ };
233
+
234
+ // Register with stealth utils for consistent toString masking
235
+ const _s2 = typeof __stealth !== 'undefined' ? __stealth : {};
236
+ if (_s2.utils) {
237
+ _s2.utils.registerNativeFunction(document.createElement, 'createElement');
238
+ }
239
+ };
240
+
241
+ // 3. Patch Error.captureStackTrace to hide automation stack frames
242
+ const patchErrorCaptureStackTrace = () => {
243
+ if (Error.captureStackTrace) {
244
+ const originalCaptureStackTrace = Error.captureStackTrace;
245
+
246
+ Error.captureStackTrace = function(targetObject, constructorOpt) {
247
+ originalCaptureStackTrace.call(this, targetObject, constructorOpt);
248
+
249
+ // Clean the stack trace of automation markers
250
+ if (targetObject.stack) {
251
+ const cleanStack = targetObject.stack
252
+ .split('\\n')
253
+ .filter(line => {
254
+ const lowerLine = line.toLowerCase();
255
+ return !lowerLine.includes('puppeteer') &&
256
+ !lowerLine.includes('playwright') &&
257
+ !lowerLine.includes('selenium') &&
258
+ !lowerLine.includes('webdriver') &&
259
+ !lowerLine.includes('__puppeteer_evaluation_script__') &&
260
+ !lowerLine.includes('__playwright_evaluation_script__') &&
261
+ !lowerLine.includes('evaluateonNewDocument') &&
262
+ !lowerLine.includes('pptr:') &&
263
+ !lowerLine.includes('devtools://');
264
+ })
265
+ .join('\\n');
266
+
267
+ Object.defineProperty(targetObject, 'stack', {
268
+ value: cleanStack,
269
+ writable: true,
270
+ configurable: true
271
+ });
272
+ }
273
+ };
274
+ }
275
+ };
276
+
277
+ // 4. Override Function constructor to hide sourceURL
278
+ const protectFunctionConstructor = () => {
279
+ const OriginalFunction = Function;
280
+
281
+ const FunctionProxy = new Proxy(OriginalFunction, {
282
+ construct(target, args) {
283
+ // Remove sourceURL comments from function body
284
+ if (args.length > 0) {
285
+ const lastArg = args[args.length - 1];
286
+ if (typeof lastArg === 'string') {
287
+ args[args.length - 1] = lastArg
288
+ .replace(/\\/\\/# sourceURL=[^\\n]*/g, '')
289
+ .replace(/\\/\\/# sourceMappingURL=[^\\n]*/g, '')
290
+ .replace(/__puppeteer_evaluation_script__/g, 'anonymous')
291
+ .replace(/__playwright_evaluation_script__/g, 'anonymous')
292
+ .replace(/pptr:[^\\n]*/g, '');
293
+ }
294
+ }
295
+
296
+ return Reflect.construct(target, args);
297
+ },
298
+ apply(target, thisArg, args) {
299
+ if (args.length > 0) {
300
+ const lastArg = args[args.length - 1];
301
+ if (typeof lastArg === 'string') {
302
+ args[args.length - 1] = lastArg
303
+ .replace(/\\/\\/# sourceURL=[^\\n]*/g, '')
304
+ .replace(/\\/\\/# sourceMappingURL=[^\\n]*/g, '')
305
+ .replace(/__puppeteer_evaluation_script__/g, 'anonymous')
306
+ .replace(/__playwright_evaluation_script__/g, 'anonymous');
307
+ }
308
+ }
309
+
310
+ return Reflect.apply(target, thisArg, args);
311
+ },
312
+ get(target, prop) {
313
+ // Return the original prototype when accessing .prototype
314
+ if (prop === 'prototype') {
315
+ return OriginalFunction.prototype;
316
+ }
317
+ return Reflect.get(target, prop);
318
+ },
319
+ set(target, prop, value) {
320
+ // Prevent setting prototype or other frozen properties
321
+ if (prop === 'prototype') {
322
+ return true; // Silently ignore
323
+ }
324
+ return Reflect.set(target, prop, value);
325
+ }
326
+ });
327
+
328
+ // Use defineProperty to replace Function without modifying frozen prototype
329
+ try {
330
+ Object.defineProperty(window, 'Function', {
331
+ value: FunctionProxy,
332
+ writable: true,
333
+ enumerable: false,
334
+ configurable: true
335
+ });
336
+ } catch (e) {
337
+ // If we can't redefine, just assign
338
+ window.Function = FunctionProxy;
339
+ }
340
+ };
341
+
342
+ // 5. Override eval to hide sourceURL
343
+ const protectEval = () => {
344
+ const originalEval = window.eval;
345
+
346
+ window.eval = function(code) {
347
+ if (typeof code === 'string') {
348
+ code = code
349
+ .replace(/\\/\\/# sourceURL=[^\\n]*/g, '')
350
+ .replace(/\\/\\/# sourceMappingURL=[^\\n]*/g, '')
351
+ .replace(/__puppeteer_evaluation_script__/g, 'anonymous')
352
+ .replace(/__playwright_evaluation_script__/g, 'anonymous')
353
+ .replace(/pptr:[^)\\n]*/g, 'eval');
354
+ }
355
+
356
+ return originalEval.call(this, code);
357
+ };
358
+
359
+ // Register with stealth utils for consistent toString masking
360
+ const _s3 = typeof __stealth !== 'undefined' ? __stealth : {};
361
+ if (_s3.utils) {
362
+ _s3.utils.registerNativeFunction(window.eval, 'eval');
363
+ }
364
+ };
365
+
366
+ // 6. Override document.hasStorageAccess for sandbox detection
367
+ const protectStorageAccess = () => {
368
+ if (document.hasStorageAccess) {
369
+ const originalHasStorageAccess = document.hasStorageAccess;
370
+
371
+ document.hasStorageAccess = function() {
372
+ // Always return a promise that resolves to true for same-origin
373
+ return Promise.resolve(true);
374
+ };
375
+
376
+ const _s4 = typeof __stealth !== 'undefined' ? __stealth : {};
377
+ if (_s4.utils) _s4.utils.registerNativeFunction(document.hasStorageAccess, 'hasStorageAccess');
378
+ }
379
+
380
+ if (document.requestStorageAccess) {
381
+ document.requestStorageAccess = function() {
382
+ return Promise.resolve();
383
+ };
384
+ }
385
+ };
386
+
387
+ // 7. Protect window.name from automation markers
388
+ const protectWindowName = () => {
389
+ let windowName = window.name;
390
+
391
+ Object.defineProperty(window, 'name', {
392
+ get() {
393
+ // Filter out automation-related markers from window name
394
+ if (windowName && typeof windowName === 'string') {
395
+ if (windowName.includes('puppeteer') ||
396
+ windowName.includes('playwright') ||
397
+ windowName.includes('selenium') ||
398
+ windowName.includes('webdriver')) {
399
+ return '';
400
+ }
401
+ }
402
+ return windowName;
403
+ },
404
+ set(value) {
405
+ windowName = value;
406
+ },
407
+ configurable: true,
408
+ enumerable: true
409
+ });
410
+ };
411
+
412
+ // 8. Override Object.getOwnPropertyDescriptor to hide automation properties
413
+ // AND make overridden properties appear native (configurable: false)
414
+ const protectPropertyDescriptor = () => {
415
+ const originalGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
416
+
417
+ // Properties that should appear as native (configurable: false)
418
+ const nativeNavigatorProps = new Set([
419
+ 'userAgent', 'platform', 'vendor', 'vendorSub', 'productSub',
420
+ 'hardwareConcurrency', 'deviceMemory', 'maxTouchPoints',
421
+ 'language', 'languages', 'cookieEnabled', 'onLine', 'webdriver',
422
+ 'plugins', 'mimeTypes', 'userAgentData', 'connection',
423
+ 'pdfViewerEnabled', 'doNotTrack', 'appCodeName', 'appName',
424
+ 'appVersion', 'product', 'oscpu'
425
+ ]);
426
+
427
+ const nativeScreenProps = new Set([
428
+ 'width', 'height', 'availWidth', 'availHeight', 'colorDepth',
429
+ 'pixelDepth', 'availLeft', 'availTop', 'orientation'
430
+ ]);
431
+
432
+ const nativeWindowProps = new Set([
433
+ 'devicePixelRatio', 'innerWidth', 'innerHeight', 'outerWidth',
434
+ 'outerHeight', 'screenX', 'screenY', 'screenLeft', 'screenTop'
435
+ ]);
436
+
437
+ Object.getOwnPropertyDescriptor = function(obj, prop) {
438
+ // Hide automation-related properties
439
+ if (obj === navigator && prop === 'webdriver') {
440
+ return undefined;
441
+ }
442
+
443
+ if (typeof prop === 'string' &&
444
+ (prop.startsWith('cdc_') ||
445
+ prop.startsWith('$cdc_') ||
446
+ prop.includes('__webdriver') ||
447
+ prop.includes('__selenium') ||
448
+ prop.includes('__puppeteer') ||
449
+ prop.includes('__playwright'))) {
450
+ return undefined;
451
+ }
452
+
453
+ // Get the real descriptor
454
+ const descriptor = originalGetOwnPropertyDescriptor.call(this, obj, prop);
455
+
456
+ if (!descriptor) return descriptor;
457
+
458
+ // Make navigator properties appear native
459
+ if (obj === navigator && nativeNavigatorProps.has(prop)) {
460
+ return {
461
+ ...descriptor,
462
+ configurable: false,
463
+ enumerable: true
464
+ };
465
+ }
466
+
467
+ // Make screen properties appear native
468
+ if (obj === screen && nativeScreenProps.has(prop)) {
469
+ return {
470
+ ...descriptor,
471
+ configurable: false,
472
+ enumerable: true
473
+ };
474
+ }
475
+
476
+ // Make window properties appear native
477
+ if (obj === window && nativeWindowProps.has(prop)) {
478
+ return {
479
+ ...descriptor,
480
+ configurable: false,
481
+ enumerable: true
482
+ };
483
+ }
484
+
485
+ // Check prototype integrity module for fake descriptors
486
+ const _s = typeof __stealth !== 'undefined' ? __stealth : {};
487
+ if (_s.integrity) {
488
+ const protoIntegrity = _s.integrity;
489
+ if (protoIntegrity.isOverridden && protoIntegrity.isOverridden(obj, prop)) {
490
+ const fakeDesc = protoIntegrity.createNativeDescriptor(obj, prop, descriptor);
491
+ if (fakeDesc) return fakeDesc;
492
+ }
493
+ }
494
+
495
+ return descriptor;
496
+ };
497
+
498
+ // Also patch Reflect.getOwnPropertyDescriptor
499
+ if (typeof Reflect !== 'undefined' && Reflect.getOwnPropertyDescriptor) {
500
+ const originalReflectGetOwnPropertyDescriptor = Reflect.getOwnPropertyDescriptor;
501
+
502
+ Reflect.getOwnPropertyDescriptor = function(obj, prop) {
503
+ // Use our patched Object.getOwnPropertyDescriptor
504
+ return Object.getOwnPropertyDescriptor(obj, prop);
505
+ };
506
+ }
507
+ };
508
+
509
+ // 8b. Protect Object.getPrototypeOf from revealing automation
510
+ const protectGetPrototypeOf = () => {
511
+ const originalGetPrototypeOf = Object.getPrototypeOf;
512
+ const originalReflectGetPrototypeOf = typeof Reflect !== 'undefined' ? Reflect.getPrototypeOf : null;
513
+
514
+ // Cache expected prototypes
515
+ const expectedPrototypes = new Map();
516
+ expectedPrototypes.set(navigator, Navigator.prototype);
517
+ expectedPrototypes.set(screen, Screen.prototype);
518
+ expectedPrototypes.set(window, Window.prototype);
519
+ expectedPrototypes.set(document, HTMLDocument.prototype);
520
+
521
+ Object.getPrototypeOf = function(obj) {
522
+ const proto = originalGetPrototypeOf.call(this, obj);
523
+
524
+ // Ensure navigator returns Navigator.prototype
525
+ if (obj === navigator) {
526
+ return Navigator.prototype;
527
+ }
528
+
529
+ // Ensure screen returns Screen.prototype
530
+ if (obj === screen) {
531
+ return Screen.prototype;
532
+ }
533
+
534
+ return proto;
535
+ };
536
+
537
+ if (originalReflectGetPrototypeOf) {
538
+ Reflect.getPrototypeOf = function(obj) {
539
+ return Object.getPrototypeOf(obj);
540
+ };
541
+ }
542
+ };
543
+
544
+ // 9. Override Object.getOwnPropertyNames to hide automation properties
545
+ const protectPropertyNames = () => {
546
+ const originalGetOwnPropertyNames = Object.getOwnPropertyNames;
547
+
548
+ Object.getOwnPropertyNames = function(obj) {
549
+ const names = originalGetOwnPropertyNames.call(this, obj);
550
+
551
+ return names.filter(name => {
552
+ const lowerName = name.toLowerCase();
553
+ return !name.startsWith('cdc_') &&
554
+ !name.startsWith('$cdc_') &&
555
+ !lowerName.includes('webdriver') &&
556
+ !lowerName.includes('selenium') &&
557
+ !lowerName.includes('puppeteer') &&
558
+ !lowerName.includes('playwright') &&
559
+ !name.startsWith('__driver') &&
560
+ !name.startsWith('__selenium') &&
561
+ !name.startsWith('__webdriver');
562
+ });
563
+ };
564
+ };
565
+
566
+ // 10. Override Object.keys similarly
567
+ const protectObjectKeys = () => {
568
+ const originalKeys = Object.keys;
569
+
570
+ Object.keys = function(obj) {
571
+ const keys = originalKeys.call(this, obj);
572
+
573
+ return keys.filter(key => {
574
+ const lowerKey = key.toLowerCase();
575
+ return !key.startsWith('cdc_') &&
576
+ !key.startsWith('$cdc_') &&
577
+ !lowerKey.includes('webdriver') &&
578
+ !lowerKey.includes('selenium') &&
579
+ !lowerKey.includes('puppeteer');
580
+ });
581
+ };
582
+ };
583
+
584
+ // 11. Protect against Reflect.ownKeys detection
585
+ const protectReflectOwnKeys = () => {
586
+ const originalOwnKeys = Reflect.ownKeys;
587
+
588
+ Reflect.ownKeys = function(obj) {
589
+ const keys = originalOwnKeys.call(this, obj);
590
+
591
+ return keys.filter(key => {
592
+ const keyStr = String(key).toLowerCase();
593
+ return !keyStr.startsWith('cdc_') &&
594
+ !keyStr.startsWith('$cdc_') &&
595
+ !keyStr.includes('webdriver') &&
596
+ !keyStr.includes('selenium') &&
597
+ !keyStr.includes('puppeteer');
598
+ });
599
+ };
600
+ };
601
+
602
+ // 12. Protect navigator.permissions.query for automation detection
603
+ const protectPermissionsQuery = () => {
604
+ if (navigator.permissions && navigator.permissions.query) {
605
+ const originalQuery = navigator.permissions.query;
606
+
607
+ navigator.permissions.query = function(descriptor) {
608
+ // Handle notifications permission specifically
609
+ if (descriptor && descriptor.name === 'notifications') {
610
+ return Promise.resolve({
611
+ state: 'prompt',
612
+ name: 'notifications',
613
+ onchange: null,
614
+ addEventListener: () => {},
615
+ removeEventListener: () => {},
616
+ dispatchEvent: () => true
617
+ });
618
+ }
619
+
620
+ return originalQuery.apply(this, arguments);
621
+ };
622
+ }
623
+ };
624
+
625
+ // 13. Protect MediaSession API
626
+ const protectMediaSession = () => {
627
+ if (navigator.mediaSession) {
628
+ // Ensure mediaSession appears properly configured
629
+ try {
630
+ Object.defineProperty(navigator.mediaSession, 'playbackState', {
631
+ get: () => 'none',
632
+ configurable: true
633
+ });
634
+ } catch (e) {}
635
+ }
636
+ };
637
+
638
+ // 14. Protect against CDP Runtime detection via timing
639
+ // NOTE: Previously enforced 1ms minimum gap between Date.now() calls,
640
+ // but this itself is detectable (real browsers can return same ms value).
641
+ // Removed artificial gap - just pass through to native Date.now.
642
+ const protectRuntimeTiming = () => {
643
+ // No-op: Date.now should behave naturally
644
+ };
645
+
646
+ // 15. Protect native constructor toString (DataDome checks these)
647
+ const protectConstructorToString = () => {
648
+ // List of constructors that DataDome checks
649
+ const constructorsToProtect = [
650
+ { name: 'CompressionStream', ctor: typeof CompressionStream !== 'undefined' ? CompressionStream : null },
651
+ { name: 'MutationObserver', ctor: typeof MutationObserver !== 'undefined' ? MutationObserver : null },
652
+ { name: 'Date', ctor: Date },
653
+ { name: 'Worker', ctor: typeof Worker !== 'undefined' ? Worker : null },
654
+ { name: 'Error', ctor: Error },
655
+ { name: 'Promise', ctor: Promise },
656
+ { name: 'Proxy', ctor: typeof Proxy !== 'undefined' ? Proxy : null },
657
+ { name: 'Reflect', ctor: typeof Reflect !== 'undefined' ? Reflect : null },
658
+ { name: 'Map', ctor: Map },
659
+ { name: 'Set', ctor: Set },
660
+ { name: 'WeakMap', ctor: WeakMap },
661
+ { name: 'WeakSet', ctor: WeakSet },
662
+ { name: 'Symbol', ctor: Symbol },
663
+ { name: 'ArrayBuffer', ctor: ArrayBuffer },
664
+ { name: 'DataView', ctor: DataView },
665
+ { name: 'Intl', ctor: typeof Intl !== 'undefined' ? Intl : null }
666
+ ];
667
+
668
+ constructorsToProtect.forEach(({ name, ctor }) => {
669
+ if (!ctor) return;
670
+
671
+ try {
672
+ // Make the constructor's toString return native code
673
+ const nativeString = \`function \${name}() { [native code] }\`;
674
+
675
+ Object.defineProperty(ctor, 'toString', {
676
+ value: function() { return nativeString; },
677
+ writable: true,
678
+ configurable: true
679
+ });
680
+
681
+ // Also protect the prototype.constructor if it exists
682
+ if (ctor.prototype && ctor.prototype.constructor) {
683
+ Object.defineProperty(ctor.prototype.constructor, 'toString', {
684
+ value: function() { return nativeString; },
685
+ writable: true,
686
+ configurable: true
687
+ });
688
+ }
689
+ } catch (e) {
690
+ // Some constructors may be frozen, skip them
691
+ }
692
+ });
693
+ };
694
+
695
+ // 16. Clean up any existing automation markers in the DOM
696
+ const cleanDOMAutomationMarkers = () => {
697
+ // Remove data attributes that might indicate automation
698
+ const elements = document.querySelectorAll('[data-webdriver], [data-selenium], [data-puppeteer]');
699
+ elements.forEach(el => {
700
+ el.removeAttribute('data-webdriver');
701
+ el.removeAttribute('data-selenium');
702
+ el.removeAttribute('data-puppeteer');
703
+ });
704
+
705
+ // Clean script tags with automation-related src
706
+ const scripts = document.querySelectorAll('script');
707
+ scripts.forEach(script => {
708
+ if (script.src && (
709
+ script.src.includes('puppeteer') ||
710
+ script.src.includes('playwright') ||
711
+ script.src.includes('selenium')
712
+ )) {
713
+ script.remove();
714
+ }
715
+ });
716
+ };
717
+
718
+ // Initialize all protections
719
+ try {
720
+ removeAutomationProperties();
721
+ protectIframeContentWindow();
722
+ interceptIframeCreation(); // Ensure dynamic iframes get overrides
723
+ patchErrorCaptureStackTrace();
724
+ protectFunctionConstructor();
725
+ protectEval();
726
+ protectStorageAccess();
727
+ protectWindowName();
728
+ protectPropertyDescriptor();
729
+ protectGetPrototypeOf(); // NEW: Protect Object.getPrototypeOf
730
+ protectPropertyNames();
731
+ protectObjectKeys();
732
+ protectReflectOwnKeys();
733
+ protectPermissionsQuery();
734
+ protectMediaSession();
735
+ protectRuntimeTiming();
736
+ protectConstructorToString(); // DataDome checks constructor.toString()
737
+
738
+ // Clean DOM after a short delay to catch dynamically added elements
739
+ if (document.readyState === 'loading') {
740
+ document.addEventListener('DOMContentLoaded', cleanDOMAutomationMarkers);
741
+ } else {
742
+ cleanDOMAutomationMarkers();
743
+ }
744
+ } catch (e) {
745
+ console.error('[CDP-DETECTION-BYPASS] Failed to apply CDP detection bypass:', e);
746
+ throw e; // Rethrow to make errors visible
747
+ }
748
+ };
749
+
750
+ const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
751
+ const ERROR_PREFIX = '[CDP-FP-ERROR]';
752
+
753
+ try {
754
+ console.log(DEBUG_PREFIX, 'Starting CDP detection bypass...');
755
+ bypassCDPDetection();
756
+ console.log(DEBUG_PREFIX, '✓ CDP detection bypass applied');
757
+ } catch (e) {
758
+ console.error(ERROR_PREFIX, '✗ Failed to apply CDP detection bypass:', e);
759
+ throw e;
760
+ }
761
+ })();`;
762
+ };
763
+ //# sourceMappingURL=cdp-detection-bypass.js.map