Skip to content
Snippets Groups Projects
Commit 1d683cf8 authored by Luke Leber's avatar Luke Leber
Browse files

Issue #3253964 by Luke.Leber: Add a css pre-render event dispatch

parent 291adf88
No related branches found
No related tags found
1 merge request!1Issue #3253964: Add a css pre-render event dispatch
...@@ -5,3 +5,4 @@ services: ...@@ -5,3 +5,4 @@ services:
decorates: asset.css.collection_renderer decorates: asset.css.collection_renderer
arguments: arguments:
- '@file_system' - '@file_system'
- '@event_dispatcher'
...@@ -5,6 +5,8 @@ namespace Drupal\inline_all_css\Asset; ...@@ -5,6 +5,8 @@ namespace Drupal\inline_all_css\Asset;
use Drupal\Core\Asset\AssetCollectionRendererInterface; use Drupal\Core\Asset\AssetCollectionRendererInterface;
use Drupal\Core\File\FileSystemInterface; use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Render\Markup; use Drupal\Core\Render\Markup;
use Drupal\inline_all_css\Event\CssPreRenderEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use function file_get_contents; use function file_get_contents;
/** /**
...@@ -21,14 +23,24 @@ class CriticalCssCollectionRenderer implements AssetCollectionRendererInterface ...@@ -21,14 +23,24 @@ class CriticalCssCollectionRenderer implements AssetCollectionRendererInterface
*/ */
protected $fileSystem; protected $fileSystem;
/**
* The event dispatcher service.
*
* @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
*/
protected $eventDispatcher;
/** /**
* Constructs a CriticalCssCollectionRenderer. * Constructs a CriticalCssCollectionRenderer.
* *
* @param \Drupal\Core\File\FileSystemInterface $file_system * @param \Drupal\Core\File\FileSystemInterface $file_system
* The file system service. * 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->fileSystem = $file_system;
$this->eventDispatcher = $event_dispatcher;
} }
/** /**
...@@ -41,6 +53,11 @@ class CriticalCssCollectionRenderer implements AssetCollectionRendererInterface ...@@ -41,6 +53,11 @@ class CriticalCssCollectionRenderer implements AssetCollectionRendererInterface
$css .= file_get_contents($file); $css .= file_get_contents($file);
} }
$event = new CssPreRenderEvent($css);
/* @noinspection PhpMethodParametersCountMismatchInspection */
$this->eventDispatcher->dispatch($event, CssPreRenderEvent::EVENT_NAME);
$css = $event->getCss();
return [ return [
[ [
'#type' => 'html_tag', '#type' => 'html_tag',
......
<?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;
}
}
...@@ -5,7 +5,9 @@ namespace Drupal\Tests\inline_all_css\Unit; ...@@ -5,7 +5,9 @@ namespace Drupal\Tests\inline_all_css\Unit;
use Drupal\Core\File\FileSystemInterface; use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Render\Markup; use Drupal\Core\Render\Markup;
use Drupal\inline_all_css\Asset\CriticalCssCollectionRenderer; use Drupal\inline_all_css\Asset\CriticalCssCollectionRenderer;
use Drupal\inline_all_css\Event\CssPreRenderEvent;
use Drupal\Tests\UnitTestCase; use Drupal\Tests\UnitTestCase;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/** /**
* Test cases for the critical css collection renderer. * Test cases for the critical css collection renderer.
...@@ -37,7 +39,23 @@ class CssCollectionRendererTest extends UnitTestCase { ...@@ -37,7 +39,23 @@ class CssCollectionRendererTest extends UnitTestCase {
['public://test-2.css', __DIR__ . '/../../fixtures/test-2.css'], ['public://test-2.css', __DIR__ . '/../../fixtures/test-2.css'],
['public://test-3.css', __DIR__ . '/../../fixtures/test-3.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 { ...@@ -64,7 +82,9 @@ html {
body { body {
color: blue; color: blue;
} }
.event {
color: gray;
}
CSS), CSS),
], ],
]; ];
......
<?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());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment