The no-mention-of-pornhub branch stopped finding plain <video> elements on
pages like thisvid.com. Two site-agnostic causes, both fixed without any
site-specific references:
1. Predicate over-rejection: isValidManifestUrl (and the nested isManifestUrl
in m3u8DeepProbeFn) ran the placeholder/`%`/trailing-slash rejections
BEFORE the concrete media signals. thisvid serves its direct MP4 WITH a
trailing slash (.../14644093.mp4/?rnd=...), so `path.endsWith('/')`
rejected a real, fetchable source. Concrete media signals (.mp4/.webm/.ogv/
.mpd/.m4s/.m3u8/.hlsvod//hls/) now win outright, so a coincidental '%' or
trailing slash never sinks a real source — while genuine route templates
(/playlists/, /playlist/%1%/, /videos/{id}/) are still rejected.
2. Runtime cause on ad-iframe-heavy pages: scrapeTab ran only a MAIN-world
scrape. A MAIN-world + allFrames injection can reject on pages with
sandboxed/opaque-origin ad iframes, returning 0 videos even when a <video>
is visible. scrapeTab now falls back to an isolated-world scrape (no `world`
key — always permitted) when the MAIN-world run finds nothing. The per-frame
reduction was extracted into a shared reduceScrapeFrames helper.
Adds __tests__/simple_video.test.mjs: a thisvid isValidManifestUrl battery
(trailing-slash MP4 accepted, templates still rejected, %2B/%2F tokens
preserved) plus a structural guard that scrapeTab keeps both a MAIN-world
primary and an isolated-world fallback.
Co-Authored-By: Claude <noreply@anthropic.com>
Address robot's review on PR #5:
- [Blocking] 'goon_referers' is a host-keyed GLOBAL store and must outlive
its capture tab; it was wrongly added to the per-tab onRemoved cleanup, so
closing any tab wiped referers captured by still-open source tabs (-> 412).
It is no longer removed on tab close. Stale referers are now pruned
opportunistically in persistReferer via a per-host timestamp + TTL.
- [Should-fix] the DNR referer rule used a single shared REFERER_RULE_ID with
a non-atomic check+update, so concurrent proxy fetches for two hosts could
interleave and leave the wrong host's referer live. Each host now gets its
own stable rule id (refererRuleIdFor) and the install+record is serialized
per host via an async lock (refererRuleLocks).
- [Coverage] add __tests__/referer_proxy.test.mjs exercising the new
referer-capture / proxy-host / onRemoved paths: closing a tab preserves
goon_referers, two hosts proxied concurrently keep distinct per-host rules,
and same-host proxy is idempotent.