|
69 | 69 | // retryCodes is an array of status codes that should be retried
|
70 | 70 | const retryCodes =
|
71 | 71 | retryConfig.retry_codes &&
|
72 |
| - Array.isArray(retryConfig.retry_codes) && |
73 |
| - retryConfig.retry_codes.length > 0 && |
74 |
| - retryConfig.retry_codes.every( |
75 |
| - (code) => |
76 |
| - typeof code === "number" && |
77 |
| - Number.isInteger(code) && |
78 |
| - validStatusCodes.has(code) |
79 |
| - ) |
| 72 | + Array.isArray(retryConfig.retry_codes) && |
| 73 | + retryConfig.retry_codes.length > 0 && |
| 74 | + retryConfig.retry_codes.every( |
| 75 | + (code) => |
| 76 | + typeof code === "number" && |
| 77 | + Number.isInteger(code) && |
| 78 | + validStatusCodes.has(code) |
| 79 | + ) |
80 | 80 | ? retryConfig.retry_codes
|
81 | 81 | : [];
|
82 | 82 |
|
83 | 83 | // maxRetries is the maximum number of retries for a request
|
84 | 84 | const maxRetries =
|
85 | 85 | retryConfig.max_retries &&
|
86 |
| - typeof retryConfig.max_retries === "number" && |
87 |
| - retryConfig.max_retries >= 0 && |
88 |
| - Number.isInteger(retryConfig.max_retries) |
| 86 | + typeof retryConfig.max_retries === "number" && |
| 87 | + retryConfig.max_retries >= 0 && |
| 88 | + Number.isInteger(retryConfig.max_retries) |
89 | 89 | ? retryConfig.max_retries
|
90 | 90 | : 0;
|
91 | 91 |
|
92 | 92 | // retryDelay is the delay between retries in milliseconds
|
93 | 93 | const retryDelay =
|
94 | 94 | retryConfig.retry_delay &&
|
95 |
| - typeof retryConfig.retry_delay === "number" && |
96 |
| - retryConfig.retry_delay >= 0 |
| 95 | + typeof retryConfig.retry_delay === "number" && |
| 96 | + retryConfig.retry_delay >= 0 |
97 | 97 | ? retryConfig.retry_delay
|
98 | 98 | : 0;
|
99 | 99 |
|
|
248 | 248 | mutation.addedNodes.forEach((node) => {
|
249 | 249 | if (node.nodeType === Node.ELEMENT_NODE) {
|
250 | 250 | processNode(node);
|
251 |
| - node.querySelectorAll("*").forEach(processNode); |
| 251 | + try { |
| 252 | + const elements = node.querySelectorAll("*"); |
| 253 | + elements.forEach(processNode); |
| 254 | + } catch (e) { |
| 255 | + console.debug("Error processing node children:", e); |
| 256 | + } |
252 | 257 | }
|
253 | 258 | });
|
254 | 259 | });
|
255 | 260 | });
|
256 | 261 |
|
257 | 262 | // Process existing content
|
258 |
| - document.querySelectorAll("*").forEach(processNode); |
| 263 | + const processExistingContent = () => { |
| 264 | + try { |
| 265 | + const elements = document.querySelectorAll("*"); |
| 266 | + elements.forEach(processNode); |
| 267 | + } catch (e) { |
| 268 | + console.debug("Error processing existing content:", e); |
| 269 | + } |
| 270 | + }; |
259 | 271 |
|
260 |
| - // Observe future changes |
261 |
| - observer.observe(document.documentElement, { |
262 |
| - childList: true, |
263 |
| - subtree: true, |
264 |
| - }); |
| 272 | + // Wait for DOM to be ready |
| 273 | + if (document.readyState === "loading") { |
| 274 | + document.addEventListener("DOMContentLoaded", () => { |
| 275 | + processExistingContent(); |
| 276 | + // Observe future changes |
| 277 | + observer.observe(document.documentElement, { |
| 278 | + childList: true, |
| 279 | + subtree: true, |
| 280 | + }); |
| 281 | + }); |
| 282 | + } else { |
| 283 | + processExistingContent(); |
| 284 | + // Observe future changes |
| 285 | + observer.observe(document.documentElement, { |
| 286 | + childList: true, |
| 287 | + subtree: true, |
| 288 | + }); |
| 289 | + } |
265 | 290 |
|
266 | 291 | // Handle dynamic XHR/Fetch requests
|
267 | 292 | const originalFetch = window.fetch;
|
|
0 commit comments