A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本)
This report summarizes scanner evidence for fishjar/kiss-translator, a JavaScript project with 13,111 GitHub stars. SynthScan examined 377,755 lines of code across 1136 source files, recording 244 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 1.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 163 finding(s).
Are imports declared and package/API names verified? 30 finding(s).
Are wrappers, guards, and repeated structures necessary? 175 finding(s).
Which changes need focused human review? 244 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 244 distinct pattern matches across 5 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/fileTranslation/bridgeRecovery.test.js | 53 | browser.scripting.executeScript.mock.calls.map(([args]) => args) | CODE |
| CRITICAL | src/fileTranslation/pipelineCore.test.js | 724 | HTMLCanvasElement.prototype.getContext.mock.results.map(({ value }) => | CODE |
| CRITICAL | src/providers/fallback.test.js | 87 | ctx.http.request.mock.calls.at(-1)[0].body[ | CODE |
| CRITICAL | src/libs/translatorManager.test.js | 622 | browser.runtime.onMessage.addListener.mock.calls.at(-1)[0]( | CODE |
| CRITICAL | src/libs/translatorManager.test.js | 653 | browser.runtime.onMessage.addListener.mock.calls.at(-1)[0]( | CODE |
| CRITICAL | src/libs/translatorManager.test.js | 2072 | const handler = browser.runtime.onMessage.addListener.mock.calls.at(-1)[0]; | CODE |
| CRITICAL | src/libs/storage.gm-compatibility.test.js | 153 | expect(globalThis.GM.setValue.mock.calls.map(([key]) => key)).toEqual([ | CODE |
| CRITICAL | src/libs/localAiBackground.test.js | 19 | global.chrome.storage.local.get.mockResolvedValue({ | CODE |
| CRITICAL | src/libs/localAiBackground.test.js | 35 | global.chrome.storage.local.set.mockRejectedValue(Error("storage failed")); | CODE |
| CRITICAL | src/libs/storage.gm-destination.regression.test.js | 344 | expect(globalThis.GM.setValue.mock.calls.map(([key]) => key)).toEqual( | CODE |
| CRITICAL | src/subtitle/youtubeAcquisition.test.js | 158 | f.bridge.request.mock.calls.some(([action]) => action === "fetch") | CODE |
| CRITICAL | src/subtitle/youtubeAcquisition.test.js | 179 | f.bridge.request.mock.calls.some(([action]) => action === "metadata") | CODE |
| CRITICAL | src/subtitle/youtubeAcquisition.test.js | 248 | f.bridge.request.mock.calls.filter(([action]) => action === "refresh") | CODE |
| CRITICAL | src/subtitle/youtubeAcquisition.test.js | 261 | f.bridge.request.mock.calls.filter(([action]) => action === "fetch") | CODE |
| CRITICAL | src/subtitle/youtubeAcquisition.test.js | 279 | f.bridge.request.mock.calls.filter(([action]) => action === "fetch") | CODE |
| CRITICAL | src/subtitle/youtubeAcquisition.test.js | 282 | f.bridge.request.mock.calls.filter(([action]) => action === "refresh") | CODE |
| CRITICAL | src/subtitle/youtubeAcquisition.test.js | 301 | f.bridge.request.mock.calls.filter(([action]) => action === "metadata") | CODE |
| CRITICAL | src/subtitle/asr/videoSession.test.js | 551 | middle.textProcessor.translate.mock.calls.map(([cues]) => cues[0].start) | CODE |
| CRITICAL | src/subtitle/asr/downloadManager.test.js | 214 | expect(test.bridge.open.mock.calls.map((call) => call[2])).toEqual([0, 1000]); | CODE |
| CRITICAL | src/subtitle/asr/downloadManager.test.js | 424 | expect(test.cache.getAudio.mock.calls.map(([, index]) => index)).toEqual([ | CODE |
| CRITICAL | src/subtitle/asr/downloadManager.test.js | 475 | expect(test.bridge.open.mock.calls.map(([, , position]) => position)).toEqual( | CODE |
| CRITICAL | src/views/Options/Diagnostics.test.js | 249 | expect(navigator.clipboard.writeText.mock.calls.at(-1)[0]).not.toContain( | CODE |
| CRITICAL | src/views/Options/Diagnostics.test.js | 254 | expect(navigator.clipboard.writeText.mock.calls.at(-1)[0]).toContain( | CODE |
| CRITICAL | src/views/Options/startup.integration.test.js | 593 | browser.storage.local.set.mock.calls.filter( | CODE |
| CRITICAL | src/views/Options/startup.integration.test.js | 598 | const normalizedCall = browser.storage.local.set.mock.calls.find( | CODE |
| CRITICAL | src/views/Options/startup.integration.test.js | 639 | browser.storage.local.set.mock.calls.filter( | CODE |
| CRITICAL | src/views/Selection/FavBtn.storage.test.js | 70 | const wordWrites = browser.storage.local.set.mock.calls.filter( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/config/locales/terminologyPlayground.js | 143 | // ── _delivery_*:四态 Chip 与实际值包装 ───────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 199 | // ── _channel_*:注入通道描述 ──────────────────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 237 | // ── _prompt_*:提示词标签 ─────────────────────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 302 | // ── _alert_*:Snackbar 与错误弹窗文案 ────────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 579 | // ── _api_*:接口选择器区 ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 644 | // ── _local_*:本地术语区按钮与标签 ────────────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 701 | // ── _terms_*:AI 专业术语输入区 ───────────────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 896 | // ── _result_*:测试结果区(含发送/接收面板) ──────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 1068 | // ── _check_*:术语表贡献与生效检测表 ──────────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 1196 | // ── _truncated:截断提示 ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/config/locales/terminologyPlayground.js | 1207 | // ── 诊断提示多语言(Task 5:替换 terms.js 内部硬编码中文直出)──────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.js | 14 | // ─── 确定性字符串 hash(djb2)─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.js | 26 | // ─── 内置自然语境模板库 ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.js | 118 | // ─── 冲突检测 ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.js | 280 | // ─── 测试文本生成 ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.js | 452 | // ─── 结构化断言 ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.js | 909 | // ─── 固定诊断样例 ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.js | 927 | // ─── 开发态故意失败样例 ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.js | 1005 | // ─── UI 展示规模控制 ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 13 | // ─── hashKey ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 45 | // ─── detectTermConflicts ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 126 | // ─── generateTermTestText ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 293 | // ─── generateTermTestText 严格字面量 $ 样例完整性 ──────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 343 | // ─── generateTermTestText 显式 seed 轮换(Task 11) ────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 405 | // ─── joinIntoParagraph ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 425 | // ─── assertTermReplacements ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 545 | // ─── 构造错误场景:验证断言能正确检测问题 ───────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 724 | // ─── 转义 key 冲突对(span 口径对称性)──────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 836 | // ─── generateTermTestText treatKeysAsLiteral(AI 术语字面样例)─────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 894 | // ─── detectTermConflicts treatKeysAsLiteral(AI 字面冲突语义)──────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 931 | // ─── 冲突对字面样例含占位符字面量(单 pass 插值)───────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 957 | // ─── M2/M6:零宽转义样例 + 冲突对去重分隔符 ───────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 988 | // ─── getDiagnosticSampleTerms ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 1037 | // ─── getDeliberateFailureFixtures ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 1088 | // ─── selectDisplayedResults ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 1169 | // ─── 冲突分析记忆化与 conflicts 复用(统一计划 20260829 Task 4)────────────── | COMMENT |
| MEDIUM | src/libs/termTestUtils.test.js | 1255 | // ─── 零宽断言样例回验与空样例守卫 ─────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/terms.test.js | 408 | // ─── Task 14:点号字面量与正则语义 ────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/terms.test.js | 492 | // ─── P1:分支识别上下文丢失导致的正文丢失 ──────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/terms.test.js | 599 | // ─── 零宽防护与 flags 继承(统一计划 20260829 Task 2)──────────────────────── | COMMENT |
| MEDIUM | src/libs/terms.test.js | 747 | // ─── matcher 缓存与 naive 缓存(统一计划 20260829 Task 3)──────────────────── | COMMENT |
| MEDIUM | src/libs/terms.test.js | 965 | // ─── Task 2:fast/full 解析契约与生产热路径性能解耦 ────────────────────────── | COMMENT |
| MEDIUM | src/libs/terms.test.js | 1052 | // ─── Task 10:严格非法输入诊断 ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/libs/terms.test.js | 1217 | // ─── v4:hasErrors 不等于 terms 为空,合法条目逐条保留 ───────────────────── | COMMENT |
| MEDIUM | src/libs/terms.test.js | 1264 | // ─── 术语冲突分析引擎加固(统一计划 20260829 Task 4)───────────────────────── | COMMENT |
| MEDIUM | src/libs/rules.test.js | 365 | // ─── 术语规则链路集成测试 ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/scripts/test-term-replace.js | 25 | // ─── 内置固定用例(覆盖冲突矩阵 4 类场景)──────────────────────────────── | COMMENT |
| MEDIUM | src/scripts/test-term-replace.js | 32 | // ─── 参数解析 ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/scripts/test-term-replace.js | 52 | // ─── 格式化输出 ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/scripts/test-term-replace.js | 62 | // ─── 主逻辑 ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/Selection/TranForm.js | 72 | // ─── 接口多选本地持久化(可选)─────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/background.js | 356 | function cacheSeparateWindowBounds(win) { | CODE |
| LOW | src/background.js | 390 | async function persistSeparateWindowBounds(bounds) { | CODE |
| LOW | src/background.js | 405 | async function openSeparateWindowWithSavedBounds() { | CODE |
| LOW | src/common.js | 213 | function hasIframeTranslatableText() { | CODE |
| LOW | src/common.js | 237 | async function waitForIframeTranslatableText() { | CODE |
| LOW | src/common.test.js | 91 | function expectNoNormalUserscriptStartup() { | CODE |
| LOW | src/apis/trans.translate.test.js | 1686 | async function runNonStreamContextRounds(apiType, responses, update = {}) { | CODE |
| LOW | src/apis/index.js | 121 | function getTranslatePromptCacheScope(apiSetting = {}) { | CODE |
| LOW | src/apis/vision.js | 40 | export async function recognizeNativeNetworkImage(file, api, prompt, signal) { | CODE |
| LOW | src/apis/trans.js | 1790 | async function handleSubtitleStreamInternal( | CODE |
| LOW | src/fileTranslation/pipelineCore.js | 622 | async function executeImagePipelineInternal({ | CODE |
| LOW | src/fileTranslation/bridgeRecovery.js | 5 | export async function restoreFileTranslationBridges() { | CODE |
| LOW | src/fileTranslation/backend.js | 951 | export function installFileTranslationBackend() { | CODE |
| LOW | src/builtin-plugins/responses.js | 227 | function parseCloudflareaiResponse(res) { | CODE |
| LOW | src/builtin-plugins/textResponses.js | 27 | export function parseNativeDictionaryResponse(res, apiType) { | CODE |
| LOW | src/builtin-plugins/textResponses.js | 59 | export function parseNativeSummaryResponse(res, apiType) { | CODE |
| LOW | src/builtin-plugins/textResponses.js | 96 | export async function parseNativeSubtitleResponse( | CODE |
| LOW | src/builtin-plugins/fields.js | 116 | export function validateBuiltinSettingChanges(previous = {}, next = {}) { | CODE |
| LOW | src/builtin-plugins/capabilities.js | 7 | export function resolveBuiltinCapabilities(api) { | CODE |
| LOW | src/config/prompt.js | 342 | function findPromptBySlugOrDefault(userPrompts, promptSlug, defaultPromptSlug) { | CODE |
| LOW | src/config/prompt.js | 411 | function findPresetPromptByContent(sourcePrompt) { | CODE |
| LOW | src/config/prompt.js | 451 | function getAvailableMigratedPromptSlug(promptBySlug, sourcePrompt, baseSlug) { | CODE |
| LOW | src/config/prompt.js | 492 | export function getPromptCategoryDisplayName(category, i18n) { | CODE |
| LOW | src/config/prompt.js | 553 | export function getAllTranslationPromptOptions(prompts = [], api) { | CODE |
| LOW | src/config/prompt.js | 572 | export function getTranslationPromptDisplayName(prompt = {}, i18n) { | CODE |
| LOW | src/config/prompt.js | 600 | export function getDictionaryPromptOptions(prompts = []) { | CODE |
| LOW | src/config/prompt.js | 697 | function createLegacyApiPromptSource(apiSetting, migration) { | CODE |
| LOW | src/config/prompt.js | 727 | function isStoredPromptListNormalized(sourcePrompts = [], normalizedPrompts) { | CODE |
| LOW | src/config/prompt.js | 753 | function removeLegacySubtitlePromptId(subtitleSetting) { | CODE |
| LOW | src/config/prompt.js | 763 | function removeApiPromptTextFields(apiSetting, migration) { | CODE |
| LOW | src/config/api.js | 177 | function createEnglishDictionaryPrompt({ | CODE |
| LOW | src/config/api.js | 460 | export function fillDefaultApiModelListUrl(apiSetting) { | CODE |
| LOW | src/config/api.js | 488 | export function normalizeApiModelListUrls(transApis = []) { | CODE |
| LOW | src/localAi/core/paddleOcrVlOnnx.ts | 156 | export function splicePaddleOcrVlImageEmbeds( | CODE |
| LOW | src/localAi/core/senseVoice.ts | 196 | export function extractSenseVoiceFeatures( | CODE |
| LOW | src/localAi/workers/llm-worker.ts | 118 | async function downscaleImageForCpuIfNeeded( | CODE |
| LOW | src/localAi/workers/ortOpfsBridge.ts | 56 | export function initTransformersOpfsBridge(): void { | CODE |
| LOW | src/localAi/workers/llm-onnx-worker.ts | 112 | async function createOrtSessionWithFallback( | CODE |
| LOW | src/providers/instances.js | 114 | export function validateFieldCapabilities(service, fields, permissions = {}) { | CODE |
| LOW | src/providers/upgrade.js | 39 | export function isServiceUpgradeAvailable(api, pack) { | CODE |
| LOW | src/providers/timeout.js | 29 | export function registerInvocationDeadline(signal, deadlineAt) { | CODE |
| LOW | src/providers/compatibility.js | 21 | export function validatePluginCompatibilityFields(definition) { | CODE |
| LOW | src/providers/compatibility.js | 49 | export function assertPluginCompatibility( | CODE |
| LOW | src/providers/compatibility.js | 77 | export function pluginCompatibilityFields(definition) { | CODE |
| LOW | src/providers/packageStore.js | 12 | export function subscribeProviderPackageChanges(listener) { | CODE |
| LOW | src/providers/capabilities.js | 23 | export function getSupportedCapabilityDescriptor(instance, capability) { | CODE |
| LOW | src/providers/capabilities.js | 57 | export function validateEnabledCapabilities(instance, enabled) { | CODE |
| LOW | src/providers/capabilities.js | 71 | export function reconcileEnabledCapabilities(previous, supported) { | CODE |
| LOW | src/providers/capabilities.js | 78 | export function supportsProviderCapability( | CODE |
| LOW | src/providers/pluginDirectory.js | 100 | export function validateOfficialDirectory(data) { | CODE |
| LOW | src/providers/pluginDirectory.js | 141 | export function validateCommunityDirectory(data) { | CODE |
| LOW | src/providers/sdk/audio.js | 12 | export function buildTranscriptionRequest({ | CODE |
| LOW | src/providers/sdk/translation.js | 159 | export async function createTranslationStreamParser(options, ParserClass) { | CODE |
| LOW | src/libs/termTestUtils.js | 948 | export function getDeliberateFailureFixtures() { | CODE |
| LOW | src/libs/storageEvents.js | 104 | export function subscribeStorageInvalidation(key, listener) { | CODE |
| LOW | src/libs/stream.js | 164 | export function createStreamingJsonParser() { | CODE |
| LOW | src/libs/stream.js | 257 | export function createStreamingSubtitleParser( | CODE |
| LOW | src/libs/stream.js | 471 | export function createRealtimeStreamParser() { | CODE |
| LOW | src/libs/storageCoordination.js | 252 | export function installStorageCoordinator() { | CODE |
| LOW | src/libs/tranboxPosition.js | 13 | function getTranBoxViewportElement() { | CODE |
| 64 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | config-overrides.js | 221 | // @description A simple bilingual translation extension & Greasemonkey script (一个简约的双语对照翻译扩展 & 油猴脚本) | COMMENT |
| LOW | config-overrides.js | 241 | // @grant GM.addValueChangeListener | COMMENT |
| LOW | config-overrides.js | 261 | // @connect workers.dev | COMMENT |
| LOW | config-overrides.js | 281 | // @connect translate.yandex.net | COMMENT |
| LOW | src/config/api.js | 141 | // "text": "string", // Full sentence with correct punctuation | COMMENT |
| LOW | src/localAi/patchOpencvCsp.ts | 1 | import type { Plugin } from "vite"; | COMMENT |
| LOW | src/localAi/patchOpencvCsp.ts | 21 | // —— 语义同 new Function(...names)(...values),但参数/函数体分离,旧 B 类 | COMMENT |
| LOW | src/libs/tranboxPosition.js | 1 | // Combined width of the left and right resize grips (8px on each side). | COMMENT |
| LOW | src/libs/terms.js | 1 | // 专业术语(terms)解析与替换纯函数模块 | COMMENT |
| LOW | src/libs/translator.js | 381 | COMMENT | |
| LOW | src/libs/translator.js | 401 | #combinedSkipsRegex; // 跳过文本正则表达式 | COMMENT |
| LOW | src/libs/translator.js | 421 | COMMENT | |
| LOW | src/libs/translator.js | 521 | this.#touchPending.delete(node); | COMMENT |
| LOW | src/libs/translator.js | 541 | #mouseHoldSuppressContextMenu = false; // 本次右键按住翻译成功后是否屏蔽原生右键菜单 | COMMENT |
| LOW | src/libs/translator.js | 561 | #favoriteHoverTimer = null; | COMMENT |
| LOW | src/libs/translator.js | 1401 | this.#termMatcher = buildTermsMatcher(terms); | COMMENT |
| LOW | src/libs/translator.js | 1421 | COMMENT | |
| LOW | src/libs/translatorManager.js | 61 | * 因为 SPA 页面可能替换 body/html,运行期子模块必须能被销毁并重建。 | COMMENT |
| LOW | src/libs/translatorManager.js | 81 | #documentToken = null; | COMMENT |
| LOW | src/libs/browser.js | 41 | COMMENT | |
| LOW | src/libs/inputTranslate.js | 241 | const div = document.getElementById(loadingId); | COMMENT |
| LOW | src/libs/imageTranslate/screenshotOverlay.js | 21 | import ImageLayoutOverlay from "../../views/ImageTranslate/ImageLayoutOverlay"; | COMMENT |
| LOW | src/libs/imageTranslate/screenshotOverlay.js | 41 | #selection = null; // { x, y, w, h } | COMMENT |
| LOW | src/libs/imageTranslate/imageHoverDetector.js | 21 | } from "../../config/serviceSelection"; | COMMENT |
| LOW | src/libs/imageTranslate/imageHoverDetector.js | 41 | #managedLayout = false; | COMMENT |
| LOW | src/libs/imageTranslate/imageTranslateManager.js | 21 | import ImageTranslate from "../../views/ImageTranslate"; | COMMENT |
| LOW | src/libs/imageTranslate/imageTranslateManager.js | 41 | #screenshotSession = 0; | COMMENT |
| LOW | src/components/TextareaResizeGrip.js | 1 | import { useCallback, useLayoutEffect, useRef, useState } from "react"; | COMMENT |
| LOW | src/components/TextareaResizeGrip.js | 481 | // resize。置于全部 hooks 之后满足 Rules of Hooks——hidden ↔ 其他样式 | COMMENT |
| LOW | src/components/TextareaResizeGrip.js | 701 | onResize(clampHeight(candidate)); | COMMENT |
| LOW | src/hooks/useTextareaHeightLock.js | 121 | const remembered = sessionHeightMap.get(lockKey); | COMMENT |
| LOW | src/subtitle/youtubePlayerUi.js | 41 | childList: true, | COMMENT |
| LOW | src/subtitle/YouTubeCaptionProvider.js | 61 | #captionFinalCues = new Map(); | COMMENT |
| LOW | src/subtitle/YouTubeCaptionProvider.js | 81 | #watchTimer; | COMMENT |
| LOW | src/subtitle/YouTubeCaptionProvider.js | 101 | #terminologyLoading = null; | COMMENT |
| LOW | src/subtitle/YouTubeCaptionProvider.js | 121 | // 当前正在处理的字幕轨唯一标识 Key | COMMENT |
| LOW | src/subtitle/BilingualSubtitleManager.js | 21 | * @description 负责控制在 YouTube 原生视频播放器上悬浮渲染双语字幕,以及对字幕进行预翻译缓存管理的核心逻辑类 | COMMENT |
| LOW | src/scripts/test-term-replace.js | 1 | // 免打包专业术语 CLI 验证脚本 | COMMENT |
| LOW | src/views/Options/TerminologyPlayground.js | 1361 | inputGlossary[key] !== undefined | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/builtin-plugins/fields.js | 8 | "placeholder", | CODE |
| LOW | src/builtin-plugins/fields.js | 53 | "placeholder", | CODE |
| LOW | src/views/Options/Apis.js | 1510 | name="placeholder" | CODE |