From 627d776ddc2736910f071a7d87f9c08a05462361 Mon Sep 17 00:00:00 2001
From: chriskinch <kinchie@gmail.com>
Date: Thu, 15 Dec 2016 12:23:25 +0000
Subject: [PATCH] Adding inline CSS support to core

---
 core/lib/Drupal/Core/Asset/CssCollectionGrouper.php |  2 ++
 .../Drupal/Core/Asset/CssCollectionOptimizer.php    |  2 ++
 .../lib/Drupal/Core/Asset/CssCollectionRenderer.php | 21 +++++++++++++++++++++
 core/lib/Drupal/Core/Asset/CssOptimizer.php         |  2 +-
 4 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/core/lib/Drupal/Core/Asset/CssCollectionGrouper.php b/core/lib/Drupal/Core/Asset/CssCollectionGrouper.php
index 2c4122d..270e996 100644
--- a/core/lib/Drupal/Core/Asset/CssCollectionGrouper.php
+++ b/core/lib/Drupal/Core/Asset/CssCollectionGrouper.php
@@ -48,6 +48,8 @@ public function group(array $css_assets) {
       // items in the group must share the same information that would need to
       // be part of that HTML tag.
       switch ($item['type']) {
+        case 'inline':
+          // Group inline type along the same way as files.
         case 'file':
           // Group file items if their 'preprocess' flag is TRUE.
           // Help ensure maximum reuse of aggregate files by only grouping
diff --git a/core/lib/Drupal/Core/Asset/CssCollectionOptimizer.php b/core/lib/Drupal/Core/Asset/CssCollectionOptimizer.php
index eb47cb2..1d2c849 100644
--- a/core/lib/Drupal/Core/Asset/CssCollectionOptimizer.php
+++ b/core/lib/Drupal/Core/Asset/CssCollectionOptimizer.php
@@ -90,6 +90,8 @@ public function optimize(array $css_assets) {
       unset($css_assets[$order]['items']);

       switch ($css_group['type']) {
+        case 'inline':
+          // Optimize inline type along with files.
         case 'file':
           // No preprocessing, single CSS asset: just use the existing URI.
           if (!$css_group['preprocess']) {
diff --git a/core/lib/Drupal/Core/Asset/CssCollectionRenderer.php b/core/lib/Drupal/Core/Asset/CssCollectionRenderer.php
index 63721e6..0cbed26 100644
--- a/core/lib/Drupal/Core/Asset/CssCollectionRenderer.php
+++ b/core/lib/Drupal/Core/Asset/CssCollectionRenderer.php
@@ -207,6 +207,15 @@ public function render(array $css_assets) {
           $elements[] = $element;
           break;

+        case 'inline':
+            // Render inline element.
+            $element = $style_element_defaults;
+            $element['#value'] = $this->getCssFileContents($css_asset['data']);
+            $element['#attributes']['media'] = $css_asset['media'];
+            $element['#browsers'] = $css_asset['browsers'];
+            $elements[] = $element;
+          break;
+
         default:
           throw new \Exception('Invalid CSS asset type.');
       }
@@ -215,4 +224,16 @@ public function render(array $css_assets) {
     return $elements;
   }

+  /**
+   * Get CSS file contents.
+   *
+   * @param string $path
+   */
+  protected function getCssFileContents($path) {
+    if (!file_exists($path)) {
+      throw new \Exception('Invalid CSS asset path: ' . $path);
+    }
+    return file_get_contents($path);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Asset/CssOptimizer.php b/core/lib/Drupal/Core/Asset/CssOptimizer.php
index 87575e0..31af6f2 100644
--- a/core/lib/Drupal/Core/Asset/CssOptimizer.php
+++ b/core/lib/Drupal/Core/Asset/CssOptimizer.php
@@ -20,7 +20,7 @@ class CssOptimizer implements AssetOptimizerInterface {
    * {@inheritdoc}
    */
   public function optimize(array $css_asset) {
-    if ($css_asset['type'] != 'file') {
+    if (!in_array($css_asset['type'], ['file', 'inline'])) {
       throw new \Exception('Only file and inline CSS assets can be optimized.');
     }
     if (!$css_asset['preprocess']) {
--
2.4.5
