(url)
| 513 | // ============================================================================ |
| 514 | |
| 515 | async function shouldScanUrl(url) { |
| 516 | if (url.startsWith('chrome://') || url.startsWith('chrome-extension://') || |
| 517 | url.startsWith('about:') || url.startsWith('file://')) { |
| 518 | return false; |
| 519 | } |
| 520 | |
| 521 | const settings = await getSettings(); |
| 522 | const { hostname } = new URL(url); |
| 523 | |
| 524 | // Check whitelist |
| 525 | for (const pattern of settings.whitelist) { |
| 526 | const parts = pattern.split('.').reverse(); |
| 527 | const hostParts = hostname.split('.').reverse(); |
| 528 | let match = true; |
| 529 | for (let i = 0; i < parts.length && match; i++) { |
| 530 | if (parts[i] !== '*' && parts[i] !== hostParts[i]) match = false; |
| 531 | } |
| 532 | if (match) return false; |
| 533 | } |
| 534 | |
| 535 | // Check interval |
| 536 | const result = await chrome.storage.local.get(['checkedUrls']); |
| 537 | const checked = result.checkedUrls || {}; |
| 538 | const lastChecked = checked[url]; |
| 539 | |
| 540 | if (lastChecked && (Date.now() - lastChecked < settings.checkInterval)) { |
| 541 | return false; |
| 542 | } |
| 543 | |
| 544 | checked[url] = Date.now(); |
| 545 | await chrome.storage.local.set({ checkedUrls: checked }); |
| 546 | return true; |
| 547 | } |
| 548 | |
| 549 | function isSoft404(text) { |
| 550 | const lower = text.toLowerCase(); |
no test coverage detected