v1.1.0
β¨ Added
- Link penetration β get the image the link actually points to: pages full of "thumbnail β full-size" links (the classic Reddit / gallery pattern) no longer stop at the thumbnail. Three layers:
- Direct image links are extracted automatically (free):
<a href="β¦jpg">targets become their own image cards, badged "Linked original", alongside the thumbnail itself β part of every scan, no toggle needed. A visible thumbnail makes its original visible too, so originals survive the default "Visible only" filter. - Right-click any image or image link to send it straight to the panel (free): new context-menu items "Extract image" / "Extract linked image" inject the item directly β no full-page scan. If the panel is closed, the item waits and appears on next open.
- Deep resolve for gallery pages (Pro): when a scan finds thumbnails linking to detail pages, a "Found N gallery links Β· Resolve originals" bar offers to fetch every detail page and pull its
og:imageoriginal in one click. Click the count to expand the full list of candidate links before resolving. Free tier gets 3 resolves per month (server-adjustable); originals arrive badged "From link".
- Direct image links are extracted automatically (free):
π Fixed
-
Resolved/link-image originals no longer disappear under "Visible only": the post-scan visibility re-check looked for each image's DOM element β link targets have none (the URL lives in an
href, not animg src), so freshly extracted originals were wrongly flagged hidden. Link-penetrated items now keep the visibility they inherited from their thumbnail. -
Right-clicked and resolved images survive panel reloads and rescans: items injected via the context menu (or pulled in by "Resolve originals") lived only in the panel's memory β reloading the panel, or any background rescan, silently dropped what the user explicitly extracted (and, for resolves, what the monthly quota paid for). Injected items are now flagged, persisted per-tab, and re-merged after every scan or cache restore; deleting one from the grid also removes it for good.
-
"Resolve originals" bar reappears when two scans race the same tab: when a second scan request arrived while the first was still running, the background's per-tab dedup reused the in-flight result but dropped the second caller's gallery-links callback β the resolve bar never showed on the second panel. Gallery links are now delivered to every concurrent caller.
-
Total resolve failure no longer shows a success toast or burns quota: when every gallery link failed (anti-bot 4xx, timeout, security guard), the panel reported "Added 0 original images" as success and still counted the attempt against the free monthly quota. A total failure now shows the error toast and doesn't consume the quota.
-
Context-menu titles no longer leak raw
__MSG_β¦__placeholders: menu items were registered with the manifest__MSG_*__substitution, which Chrome silently fails to perform on some setups β leaving literal__MSG_contextExtractLinked__in the right-click menu. Titles are now resolved throughchrome.i18n.getMessage()at registration time, with an English fallback for missing keys. -
Right-clicked images are no longer invisible ghosts under active filters: injected items arrive with unknown metadata (0Γ0 size, "unknown" format) until their real dimensions load β any active size/format filter silently swallowed them right after the "added" toast, so the count never moved. Explicitly injected items now bypass content filters (the user's explicit request outranks filtering), and re-right-clicking an image that's already in the results says "Already in the results" instead of silence.
-
Link-sourced images explain themselves: the "Resolved" badge told users nothing about where an image came from β renamed to "From link" (direct-link originals: "Linked original"), both with tooltips spelling out the source. Ticking such a card now shows "This image came from a link and isn't displayed on the page itself" instead of failing to highlight with no explanation. The gallery-links bar shows what it will actually do, and the found count expands to the candidate link list.
π§ͺ Test Coverage
- 70 new tests (unit suite now 1620):
isDirectImageUrlURL matrix, the link-image extraction stage (visibility inheritance, dedup, gallery-candidate collection), the background og:image resolver (meta ladder, security guards, timeouts), the linkResolve monthly quota, injected-item persistence/restore lifecycle, concurrent-scan gallery-links fan-out, and i18n-driven context-menu registration incl. the missing-key fallback. Three new e2e specs (link-image grid behavior, gallery-resolve bar incl. link-list expansion and the failure path, context-menu injection live + queue fallback) bring the browser suite to 124. - e2e now runs headless: the suite used to open a visible Chromium window per test (stealing focus on every test start); it now uses the new headless mode (full Chromium kernel, Playwright β₯1.49), which supports MV3 extensions and service workers β CI no longer needs xvfb, and the full run is ~2Γ faster (7.7m vs 16m).
npm run test:e2e:headedbrings the window back when debugging.