Thanks Damiano, the frame-ancestors pairing is a great addition: Permissions-Policy limits what my embeds can do, frame-ancestors limits who can embed me, and clickjacking lives entirely in the second one. One nuance on the top-document point: a deny-all like camera=() does apply to the top document too, so even a tag-manager script running in your origin gets a policy error on getUserMedia. Where you're right is the moment you allow (self): that script runs as you, so the header can't tell it apart from your own code. At that point script governance (strict CSP script-src, SRI, keeping third parties off your origin) is the only real control. Two headers, two threat models, plus script hygiene for whatever you allow as self.
