diff --git a/inline_all_css.services.yml b/inline_all_css.services.yml index e714e73e8e18dda5f4a39ff0aabbb6a59f06cab7..8cd9cb6f10b124ecedc176f41aaf43d6522fa87a 100644 --- a/inline_all_css.services.yml +++ b/inline_all_css.services.yml @@ -5,3 +5,4 @@ services: decorates: asset.css.collection_renderer arguments: - '@file_system' + - '@event_dispatcher' diff --git a/src/Asset/CriticalCssCollectionRenderer.php b/src/Asset/CriticalCssCollectionRenderer.php index 9afca72f3981ccbfcb4becd2b8b4bf62ca9502ea..33900ea78e8487a4760ef04955e4e4d1e7eb9b00 100644 --- a/src/Asset/CriticalCssCollectionRenderer.php +++ b/src/Asset/CriticalCssCollectionRenderer.php @@ -5,6 +5,8 @@ namespace Drupal\inline_all_css\Asset; use Drupal\Core\Asset\AssetCollectionRendererInterface; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Render\Markup; +use Drupal\inline_all_css\Event\CssPreRenderEvent; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; use function file_get_contents; /** @@ -21,14 +23,24 @@ class CriticalCssCollectionRenderer implements AssetCollectionRendererInterface */ protected $fileSystem; + /** + * The event dispatcher service. + * + * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface + */ + protected $eventDispatcher; + /** * Constructs a CriticalCssCollectionRenderer. * * @param \Drupal\Core\File\FileSystemInterface $file_system * The file system service. + * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher + * The event dispatcher service. */ - public function __construct(FileSystemInterface $file_system) { + public function __construct(FileSystemInterface $file_system, EventDispatcherInterface $event_dispatcher) { $this->fileSystem = $file_system; + $this->eventDispatcher = $event_dispatcher; } /** @@ -41,6 +53,11 @@ class CriticalCssCollectionRenderer implements AssetCollectionRendererInterface $css .= file_get_contents($file); } + $event = new CssPreRenderEvent($css); + /* @noinspection PhpMethodParametersCountMismatchInspection */ + $this->eventDispatcher->dispatch($event, CssPreRenderEvent::EVENT_NAME); + $css = $event->getCss(); + return [ [ '#type' => 'html_tag', diff --git a/src/Event/CssPreRenderEvent.php b/src/Event/CssPreRenderEvent.php new file mode 100644 index 0000000000000000000000000000000000000000..a5de3c2f72cc41360f993eb52082514391d7eb0c --- /dev/null +++ b/src/Event/CssPreRenderEvent.php @@ -0,0 +1,51 @@ +<?php + +namespace Drupal\inline_all_css\Event; + +use Drupal\Component\EventDispatcher\Event; + +/** + * Event that is fired before css is rendered. + */ +class CssPreRenderEvent extends Event { + + public const EVENT_NAME = 'inline_all_css_css_pre_render'; + + /** + * The css string that is about to be rendered. + * + * @var string + */ + protected $css; + + /** + * Creates a new css pre-render event. + * + * @param string $css + * The initial css of the event. + */ + public function __construct($css) { + $this->css = $css; + } + + /** + * Gets the css string for this event. + * + * @return string + * The css string for this event. + */ + public function getCss() { + return $this->css; + } + + /** + * Sets the css string for this event. + * + * @param string $css + * The CSS string to set. + */ + public function setCss($css) { + $this->css = $css; + } + +} diff --git a/tests/src/Unit/CssCollectionRendererTest.php b/tests/src/Unit/CssCollectionRendererTest.php index 7f2f632bb0a2458a32dd0afbb8a1d7fdfded2230..c27c00c4b626d516b371a0d20b0a247d2dadee56 100644 --- a/tests/src/Unit/CssCollectionRendererTest.php +++ b/tests/src/Unit/CssCollectionRendererTest.php @@ -5,7 +5,9 @@ namespace Drupal\Tests\inline_all_css\Unit; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Render\Markup; use Drupal\inline_all_css\Asset\CriticalCssCollectionRenderer; +use Drupal\inline_all_css\Event\CssPreRenderEvent; use Drupal\Tests\UnitTestCase; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** * Test cases for the critical css collection renderer. @@ -37,7 +39,23 @@ class CssCollectionRendererTest extends UnitTestCase { ['public://test-2.css', __DIR__ . '/../../fixtures/test-2.css'], ['public://test-3.css', __DIR__ . '/../../fixtures/test-3.css'], ]); - $this->instance = new CriticalCssCollectionRenderer($filesystem); + + $eventDispatcher = $this->getMockBuilder(EventDispatcherInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $eventDispatcher->method('dispatch') + ->willReturnCallback(static function (CssPreRenderEvent $event) { + $css = $event->getCss(); + $css .= <<<CSS +.event { + color: gray; +} +CSS; + $event->setCss($css); + }); + + $this->instance = new CriticalCssCollectionRenderer($filesystem, $eventDispatcher); } /** @@ -64,7 +82,9 @@ html { body { color: blue; } - +.event { + color: gray; +} CSS), ], ]; diff --git a/tests/src/Unit/CssPreRenderEventTest.php b/tests/src/Unit/CssPreRenderEventTest.php new file mode 100644 index 0000000000000000000000000000000000000000..35436eccd0339512fcf222ac7323632f7aae5495 --- /dev/null +++ b/tests/src/Unit/CssPreRenderEventTest.php @@ -0,0 +1,27 @@ +<?php + +namespace Drupal\Tests\inline_all_css\Unit; + +use Drupal\inline_all_css\Event\CssPreRenderEvent; +use Drupal\Tests\UnitTestCase; + +/** + * Test cases for the css pre-render event. + * + * @group inline_all_css + */ +class CssPreRenderEventTest extends UnitTestCase { + + /** + * Test case for the css pre-render event. + */ + public function testCssPreRenderEvent() { + $event = new CssPreRenderEvent('* { color: red; }'); + static::assertSame('* { color: red; }', $event->getCss()); + + $new_css = 'html { color: green; }'; + $event->setCss($new_css); + static::assertSame($new_css, $event->getCss()); + } + +}