Commit 159f80a5 authored by Conrad Lara's avatar Conrad Lara
Browse files

Issue #3253414 by stevenlafl, darvanen: Incompatibility with Drupal 9.3 -- Followup.

This is the followup to use the new file_Url_generator service when avaliable.
parent 40acad1a
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ namespace Drupal\s3fs\Asset;

use Drupal\Core\Asset\CssOptimizer;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\File\FileUrlGeneratorInterface;

/**
 * Optimizes a CSS asset.
@@ -22,10 +23,12 @@ class S3fsCssOptimizer extends CssOptimizer {
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
   *   Drupal service config.factory.
   * @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator
   *   The file URL generator service.
   */
  public function __construct(ConfigFactoryInterface $configFactory) {
    if (method_exists(CssOptimizer::class, '__construct')) {
      parent::__construct();
  public function __construct(ConfigFactoryInterface $configFactory, FileUrlGeneratorInterface $file_url_generator = NULL) {
    if ($file_url_generator !== NULL) {
      parent::__construct($file_url_generator);
    }
    $this->configFactory = $configFactory;
  }
@@ -56,7 +59,12 @@ class S3fsCssOptimizer extends CssOptimizer {
      $path = preg_replace('`(^|/)(?!\.\./)([^/]+)/\.\./`', '$1', $path);
    }

    if (property_exists($this, 'fileUrlGenerator') && $this->fileUrlGenerator != NULL) {
      $url = $this->fileUrlGenerator->generateAbsoluteString($path);
    }
    else {
      $url = file_create_url($path);
    }

    if ($useCssjsHost && !empty($cssjsHost)) {
      global $base_url;
+20 −2
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ namespace Drupal\s3fs\EventSubscriber;

use Drupal\advagg\Asset\AssetOptimizationEvent;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\File\FileUrlGeneratorInterface;
use Drupal\s3fs\Asset\S3fsCssOptimizer;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

@@ -26,14 +27,26 @@ class S3fsAdvAggSubscriber implements EventSubscriberInterface {
   */
  protected $rewriteFileURIBasePath;

  /**
   * The file_url_generator service.
   *
   * @var \Drupal\Core\File\FileUrlGeneratorInterface|null
   */
  protected $fileUrlGenerator = NULL;

  /**
   * Construct the optimizer instance.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
   *   The optimizer.
   * @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator
   *   The file URL generator service.
   */
  public function __construct(ConfigFactoryInterface $configFactory) {
  public function __construct(ConfigFactoryInterface $configFactory, FileUrlGeneratorInterface $file_url_generator = NULL) {
    $this->configFactory = $configFactory;
    if ($file_url_generator !== NULL) {
      $this->fileUrlGenerator = $file_url_generator;
    }
  }

  /**
@@ -95,7 +108,12 @@ class S3fsAdvAggSubscriber implements EventSubscriberInterface {
// phpcs:disable
  public function rewriteFileURI($matches) {
// phpcs:enable
    $reWriter = new S3fsCssOptimizer($this->configFactory);
    if ($this->fileUrlGenerator !== NULL) {
      $reWriter = new S3fsCssOptimizer($this->configFactory, $this->fileUrlGenerator);
    }
    else {
      $reWriter = new S3fsCssOptimizer($this->configFactory, NULL);
    }
    $reWriter->rewriteFileURIBasePath = $this->rewriteFileURIBasePath;
    return $reWriter->rewriteFileURI($matches);
  }
+13 −0
Original line number Diff line number Diff line
@@ -33,12 +33,19 @@ class S3fsServiceProvider extends ServiceProviderBase {
        ->setArguments([
          new Reference('config.factory'),
        ]);

      if ($container->hasDefinition('file_url_generator')) {
        // @todo Move up to setArguments above when D9.3 is minimally supported version.
        $container->getDefinition('asset.css.optimizer')
          ->addArgument(new Reference('file_url_generator'));
      }
    }

    if (Settings::get('s3fs.use_s3_for_private') && $container->hasDefinition('stream_wrapper.private')) {
      // Replace the private stream wrapper with S3fsStream.
      $container->getDefinition('stream_wrapper.private')
        ->setClass('Drupal\s3fs\StreamWrapper\PrivateS3fsStream');

    }
  }

@@ -54,6 +61,12 @@ class S3fsServiceProvider extends ServiceProviderBase {
        ->register('s3fs.advagg.css_subscriber', 'Drupal\s3fs\EventSubscriber\S3fsAdvAggSubscriber')
        ->addTag('event_subscriber')
        ->setArguments([new Reference('config.factory')]);

      if ($container->hasDefinition('file_url_generator')) {
        // @todo Move to setArguments above when D9.3 is minimally supported versions.
        $container->getDefinition('s3fs.advagg.css_subscriber')
          ->addArgument(new Reference('file_url_generator'));
      }
    }
  }

+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ if (!function_exists('file_create_url')) {
   *
   * @return string
   *   file_create_url mocked.
   *
   * @todo Remove when D9.3 becomes minimum supported version.
   */
  function file_create_url($path) {
    global $base_url;
+38 −12
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@

namespace Drupal\Tests\s3fs\Unit;

use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Tests\UnitTestCase;
use Drupal\s3fs\Asset\S3fsCssOptimizer;

@@ -15,25 +14,31 @@ require_once __DIR__ . '/../../fixtures/S3fsCssOptimizerMock.php';
 */
class S3fsCssOptimizerTest extends UnitTestCase {

  /**
   * D9.3+ file_url_generator service mock.
   *
   * @var \Drupal\Core\File\FileUrlGeneratorInterface|\PHPUnit\Framework\MockObject\MockObject|null
   */
  protected $fileUrlGeneratorServiceMock = NULL;

  /**
   * {@inheritdoc}
   */
  public function setUp() {
    parent::setUp();

    // D9.3 we need to mock the FileUrlGenerator service.
    if (interface_exists('\Drupal\Core\File\FileUrlGeneratorInterface')) {
      \Drupal::unsetContainer();
      $container = new ContainerBuilder();
      $fileUrlGeneratorServiceMock = $this->getMockBuilder('\Drupal\Core\File\FileUrlGeneratorInterface')
      $this->fileUrlGeneratorServiceMock = $this->getMockBuilder('\Drupal\Core\File\FileUrlGeneratorInterface')
        ->disableOriginalConstructor()
        ->getMock();
      $fileUrlGeneratorServiceMock->expects($this->any())
      $this->fileUrlGeneratorServiceMock->expects($this->any())
        ->method('generateAbsoluteString')
        ->will(
          $this->returnCallback(function ($arg) {
            return $arg;
            return 'http://www.example.org' . $arg;
          })
        );
      $container->set('file_url_generator', $fileUrlGeneratorServiceMock);
      \Drupal::setContainer($container);
    }

  }
@@ -51,7 +56,14 @@ class S3fsCssOptimizerTest extends UnitTestCase {
      ],
    ]);

    $cssOptimizer = new S3fsCssOptimizer($configFactory);
    if ($this->fileUrlGeneratorServiceMock !== NULL) {
      $cssOptimizer = new S3fsCssOptimizer($configFactory, $this->fileUrlGeneratorServiceMock);
    }
    else {
      // @todo Remove when D9.3 is minimally supported version.
      $cssOptimizer = new S3fsCssOptimizer($configFactory, NULL);
    }

    $cssOptimizer->rewriteFileURIBasePath = '';

    $this->assertEquals(
@@ -82,7 +94,14 @@ class S3fsCssOptimizerTest extends UnitTestCase {
      ],
    ]);

    $cssOptimizer = new S3fsCssOptimizer($configFactory);
    if ($this->fileUrlGeneratorServiceMock !== NULL) {
      $cssOptimizer = new S3fsCssOptimizer($configFactory, $this->fileUrlGeneratorServiceMock);
    }
    else {
      // @todo Remove when D9.3 is minimally supported version.
      $cssOptimizer = new S3fsCssOptimizer($configFactory, NULL);
    }

    $cssOptimizer->rewriteFileURIBasePath = '';

    $this->assertEquals(
@@ -104,7 +123,14 @@ class S3fsCssOptimizerTest extends UnitTestCase {
      ],
    ]);

    $cssOptimizer = new S3fsCssOptimizer($configFactory);
    if ($this->fileUrlGeneratorServiceMock !== NULL) {
      $cssOptimizer = new S3fsCssOptimizer($configFactory, $this->fileUrlGeneratorServiceMock);
    }
    else {
      // @todo Remove when D9.3 is minimally supported version.
      $cssOptimizer = new S3fsCssOptimizer($configFactory, NULL);
    }

    $cssOptimizer->rewriteFileURIBasePath = '';

    $this->assertEquals(