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 TwitterEmbedder extending AbstractEmbedder
  • Register in AssetEmbedder
  • Remove TwitterPlugin from 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/123 or https://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)

Merge request reports

Loading