Switch Twitter embeds to iframe-only approach
Summary
Replace TwitterPlugin (which loads external widgets.js script) with TwitterEmbedder that generates iframes directly, following the same pattern as YouTube, Vimeo, and 3speak.
Changes
- Add
TwitterEmbedderextendingAbstractEmbedder - Register in
AssetEmbedder - Remove
TwitterPluginfrom blog renderer plugins - Add test coverage
Benefits
| Aspect | Before (Plugin) | After (Embedder) |
|---|---|---|
| External scripts |
widgets.js loaded |
None |
| CSP required | script-src + frame-src | frame-src only |
| Eager loading | Yes (issue #786 (closed)) | No |
| Consistency | Different from YouTube/Vimeo | Same pattern |
Twitter/X Rebrand Handling
Both twitter.com and x.com URLs are supported:
- Input:
https://twitter.com/user/status/123orhttps://x.com/user/status/123 - Output:
https://platform.twitter.com/embed/Tweet.html?id=123
The platform.twitter.com domain remains stable regardless of the rebrand.
Embed Output
<div class="twitterWrapper">
<iframe src="https://platform.twitter.com/embed/Tweet.html?id=TWEET_ID" ...></iframe>
</div>
Testing
- Unit tests added for TwitterEmbedder
- Manual testing recommended with posts containing Twitter/X links
Relates to #786 (closed)