The worker was refused before a single byte was fetched
Extraction stopped instantly, with four CSP errors and a progress bar that never
moved. The cause: a blob worker inherits the creating page's CSP, and the module
imports it then makes are checked against that policy — not against the policy
of wherever the worker's source came from. The page allowed unpkg.com in
script-src and connect-src, but not in
worker-src. Adding it fixed the tool. What made this worth writing down is
how it was confirmed: by building the same blob-worker shape against a local stand-in
CDN and watching it be refused without the origin and load with it — not by reading the
specification and believing it.
The next-step controls existed before there was a result
The player and both follow-on buttons were on screen from page load. The
hidden attribute was set correctly the whole time — but
hidden is a user-agent rule, and any author rule that sets
display outranks it. #out{display:flex} quietly won. The fix
is one line; the lesson is the test that now guards it, which asks the browser what it
paints rather than what attribute we set. The first version of that test
consulted .hidden and passed against the broken page.
Both are the same shape, and it is the shape most
of this project's bugs have had: asserting the thing that was supposed to cause an
effect, instead of the effect. A CSP directive is not a loaded worker; an attribute
is not a painted pixel.