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
Branches
Tags 1.0.0-rc2
1 merge request!1Issue #3253964: Add a css pre-render event dispatch
......@@ -5,3 +5,4 @@ services:
decorates: asset.css.collection_renderer
arguments:
- '@file_system'
- '@event_dispatcher'
......@@ -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',
......
<?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;
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),
],
];
......
<?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