()
| 1578 | * @returns {Promise<Worker|null>} |
| 1579 | */ |
| 1580 | let _getWorkerInstance = async function() { |
| 1581 | if (workerInstance) { |
| 1582 | return workerInstance; |
| 1583 | } |
| 1584 | |
| 1585 | // 如果已经检测到CSP限制,直接返回null,避免重复尝试 |
| 1586 | if (cspRestricted) { |
| 1587 | return null; |
| 1588 | } |
| 1589 | |
| 1590 | // 检查基本环境限制(沙盒、协议等) |
| 1591 | if (_checkBasicRestrictions()) { |
| 1592 | cspRestricted = true; |
| 1593 | return null; |
| 1594 | } |
| 1595 | |
| 1596 | // 在非chrome-extension协议下,使用Blob URL方式创建Worker可能会触发CSP错误 |
| 1597 | // 为了避免控制台报错,直接使用同步模式 |
| 1598 | // 只有在chrome-extension协议下才使用Worker(不会有CSP限制) |
| 1599 | if (location.protocol !== 'chrome-extension:') { |
| 1600 | // 静默标记为受限,直接使用同步模式,避免触发CSP错误 |
| 1601 | cspRestricted = true; |
| 1602 | return null; |
| 1603 | } |
| 1604 | |
| 1605 | // 只在chrome-extension协议下创建Worker |
| 1606 | let workerUrl = chrome.runtime.getURL('json-format/json-worker.js'); |
| 1607 | // 判断是否为Firefox |
| 1608 | const isFirefox = typeof InstallTrigger !== 'undefined' || navigator.userAgent.includes('Firefox'); |
| 1609 | try { |
| 1610 | if (isFirefox) { |
| 1611 | try { |
| 1612 | workerInstance = new Worker(workerUrl); |
| 1613 | return workerInstance; |
| 1614 | } catch (e) { |
| 1615 | // Firefox下创建Worker失败,静默处理 |
| 1616 | cspRestricted = true; |
| 1617 | return null; |
| 1618 | } |
| 1619 | } else { |
| 1620 | // Chrome/Edge在chrome-extension协议下,可以直接使用Worker URL,不需要Blob |
| 1621 | try { |
| 1622 | workerInstance = new Worker(workerUrl); |
| 1623 | return workerInstance; |
| 1624 | } catch (e) { |
| 1625 | // 创建Worker失败,静默处理 |
| 1626 | cspRestricted = true; |
| 1627 | return null; |
| 1628 | } |
| 1629 | } |
| 1630 | } catch (e) { |
| 1631 | // 任何其他错误,静默标记为CSP受限并回退 |
| 1632 | cspRestricted = true; |
| 1633 | workerInstance = null; |
| 1634 | return null; |
| 1635 | } |
| 1636 | }; |
| 1637 |
no test coverage detected