Unverified Commit 3e4b17a7 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar,...

Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
parent fa3995b5
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -392,6 +392,9 @@ services:
  file_system:
    class: Drupal\Core\File\FileSystem
    arguments: ['@stream_wrapper_manager', '@settings', '@logger.channel.file']
  file_url_generator:
    class: Drupal\Core\File\FileUrlGenerator
    arguments: ['@stream_wrapper_manager', '@request_stack', '@module_handler']
  form_builder:
    class: Drupal\Core\Form\FormBuilder
    arguments: ['@form_validator', '@form_submitter', '@form_cache', '@module_handler', '@event_dispatcher', '@request_stack', '@class_resolver', '@element_info', '@theme.manager', '@?csrf_token']
@@ -1580,12 +1583,13 @@ services:
    arguments: ['@settings']
  asset.css.collection_renderer:
    class: Drupal\Core\Asset\CssCollectionRenderer
    arguments: [ '@state' ]
    arguments: [ '@state', '@file_url_generator' ]
  asset.css.collection_optimizer:
    class: Drupal\Core\Asset\CssCollectionOptimizer
    arguments: [ '@asset.css.collection_grouper', '@asset.css.optimizer', '@asset.css.dumper', '@state', '@file_system']
  asset.css.optimizer:
    class: Drupal\Core\Asset\CssOptimizer
    arguments: ['@file_url_generator']
  asset.css.collection_grouper:
    class: Drupal\Core\Asset\CssCollectionGrouper
  asset.css.dumper:
@@ -1593,7 +1597,7 @@ services:
    arguments: ['@file_system']
  asset.js.collection_renderer:
    class: Drupal\Core\Asset\JsCollectionRenderer
    arguments: [ '@state' ]
    arguments: [ '@state', '@file_url_generator' ]
  asset.js.collection_optimizer:
    class: Drupal\Core\Asset\JsCollectionOptimizer
    arguments: [ '@asset.js.collection_grouper', '@asset.js.optimizer', '@asset.js.dumper', '@state', '@file_system']
@@ -1634,7 +1638,7 @@ services:
      - { name: service_collector, tag: 'twig.extension', call: addExtension }
  twig.extension:
    class: Drupal\Core\Template\TwigExtension
    arguments: ['@renderer', '@url_generator', '@theme.manager', '@date.formatter']
    arguments: ['@renderer', '@url_generator', '@theme.manager', '@date.formatter', '@file_url_generator']
    tags:
      - { name: twig.extension, priority: 100 }
  # @todo Figure out what to do about debugging functions.
+24 −74
Original line number Diff line number Diff line
@@ -5,9 +5,8 @@
 * API for handling file uploads and server file management.
 */

use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\File\Exception\InvalidStreamWrapperException;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\StreamWrapper\StreamWrapperManager;

/**
 * @defgroup file File interface
@@ -47,60 +46,26 @@
 *   '/', nothing is done and the same string is returned. If a stream wrapper
 *   could not be found to generate an external URL, then FALSE is returned.
 *
 * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0.
 *   Use the appropriate method on \Drupal\Core\File\FileUrlGeneratorInterface
 *   instead.
 *
 * @see https://www.drupal.org/node/2940031
 * @see https://www.drupal.org/node/515192
 * @see file_url_transform_relative()
 * @see \Drupal\Core\File\FileUrlGeneratorInterface::generate()
 * @see \Drupal\Core\File\FileUrlGeneratorInterface::generateString()
 * @see \Drupal\Core\File\FileUrlGeneratorInterface::generateAbsoluteString()
 * @see \Drupal\Core\File\FileUrlGeneratorInterface::transformRelative()
 */
function file_create_url($uri) {
  // Allow the URI to be altered, e.g. to serve a file from a CDN or static
  // file server.
  \Drupal::moduleHandler()->alter('file_url', $uri);

  $scheme = StreamWrapperManager::getScheme($uri);

  if (!$scheme) {
    // Allow for:
    // - root-relative URIs (e.g. /foo.jpg in http://example.com/foo.jpg)
    // - protocol-relative URIs (e.g. //bar.jpg, which is expanded to
    //   http://example.com/bar.jpg by the browser when viewing a page over
    //   HTTP and to https://example.com/bar.jpg when viewing a HTTPS page)
    // Both types of relative URIs are characterized by a leading slash, hence
    // we can use a single check.
    if (mb_substr($uri, 0, 1) == '/') {
      return $uri;
    }
    else {
      // If this is not a properly formatted stream, then it is a shipped file.
      // Therefore, return the urlencoded URI with the base URL prepended.
      $options = UrlHelper::parse($uri);
      $path = $GLOBALS['base_url'] . '/' . UrlHelper::encodePath($options['path']);
      // Append the query.
      if ($options['query']) {
        $path .= '?' . UrlHelper::buildQuery($options['query']);
      }

      // Append fragment.
      if ($options['fragment']) {
        $path .= '#' . $options['fragment'];
      }

      return $path;
    }
  }
  elseif ($scheme == 'http' || $scheme == 'https' || $scheme == 'data') {
    // Check for HTTP and data URI-encoded URLs so that we don't have to
    // implement getExternalUrl() for the HTTP and data schemes.
    return $uri;
  @trigger_error('file_create_url() is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the appropriate method on \Drupal\Core\File\FileUrlGeneratorInterface instead. See https://www.drupal.org/node/2940031', E_USER_DEPRECATED);
  try {
    return \Drupal::service('file_url_generator')->generateAbsoluteString($uri);
  }
  else {
    // Attempt to return an external URL using the appropriate wrapper.
    if ($wrapper = \Drupal::service('stream_wrapper_manager')->getViaUri($uri)) {
      return $wrapper->getExternalUrl();
    }
    else {
  catch (InvalidStreamWrapperException $e) {
    return FALSE;
  }
}
}

/**
 * Transforms an absolute URL of a local file to a relative URL.
@@ -109,38 +74,23 @@ function file_create_url($uri) {
 * content errors when using HTTPS + HTTP.
 *
 * @param string $file_url
 *   A file URL of a local file as generated by file_create_url().
 *   A file URL of a local file as generated by
 *   FileUrlGeneratorInterface::generateString().
 *
 * @return string
 *   If the file URL indeed pointed to a local file and was indeed absolute,
 *   then the transformed, relative URL to the local file. Otherwise: the
 *   original value of $file_url.
 *
 * @see file_create_url()
 * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0.
 *   Use \Drupal\Core\File\FileUrlGenerator::transformRelative() instead.
 *
 * @see https://www.drupal.org/node/2940031
 * @see \Drupal\Core\File\FileUrlGeneratorInterface::transformRelative()
 */
function file_url_transform_relative($file_url) {
  // Unfortunately, we pretty much have to duplicate Symfony's
  // Request::getHttpHost() method because Request::getPort() may return NULL
  // instead of a port number.
  $request = \Drupal::request();
  $host = $request->getHost();
  $scheme = $request->getScheme();
  $port = $request->getPort() ?: 80;

  // Files may be accessible on a different port than the web request.
  $file_url_port = parse_url($file_url, PHP_URL_PORT) ?? $port;
  if ($file_url_port != $port) {
    return $file_url;
  }

  if (('http' == $scheme && $port == 80) || ('https' == $scheme && $port == 443)) {
    $http_host = $host;
  }
  else {
    $http_host = $host . ':' . $port;
  }

  return preg_replace('|^https?://' . preg_quote($http_host, '|') . '|', '', $file_url);
  @trigger_error('file_url_transform_relative() is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Drupal\Core\File\FileUrlGenerator::transformRelative() instead. See https://www.drupal.org/node/2940031', E_USER_DEPRECATED);
  return \Drupal::service('file_url_generator')->transformRelative($file_url);
}

/**
+13 −7
Original line number Diff line number Diff line
@@ -347,13 +347,16 @@ function theme_get_setting($setting_name, $theme = NULL) {
        }
      }

      /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */
      $file_url_generator = \Drupal::service('file_url_generator');

      // Generate the path to the logo image.
      if ($cache[$theme]->get('logo.use_default')) {
        $logo = \Drupal::service('theme.initialization')->getActiveThemeByName($theme)->getLogo();
        $cache[$theme]->set('logo.url', file_url_transform_relative(file_create_url($logo)));
        $cache[$theme]->set('logo.url', $file_url_generator->generateString($logo));
      }
      elseif ($logo_path = $cache[$theme]->get('logo.path')) {
        $cache[$theme]->set('logo.url', file_url_transform_relative(file_create_url($logo_path)));
        $cache[$theme]->set('logo.url', $file_url_generator->generateString($logo_path));
      }

      // Generate the path to the favicon.
@@ -361,14 +364,14 @@ function theme_get_setting($setting_name, $theme = NULL) {
        $favicon_path = $cache[$theme]->get('favicon.path');
        if ($cache[$theme]->get('favicon.use_default')) {
          if (file_exists($favicon = $theme_object->getPath() . '/favicon.ico')) {
            $cache[$theme]->set('favicon.url', file_url_transform_relative(file_create_url($favicon)));
            $cache[$theme]->set('favicon.url', $file_url_generator->generateString($favicon));
          }
          else {
            $cache[$theme]->set('favicon.url', file_url_transform_relative(file_create_url('core/misc/favicon.ico')));
            $cache[$theme]->set('favicon.url', $file_url_generator->generateString('core/misc/favicon.ico'));
          }
        }
        elseif ($favicon_path) {
          $cache[$theme]->set('favicon.url', file_url_transform_relative(file_create_url($favicon_path)));
          $cache[$theme]->set('favicon.url', $file_url_generator->generateString($favicon_path));
        }
        else {
          $cache[$theme]->set('features.favicon', FALSE);
@@ -820,8 +823,11 @@ function template_preprocess_links(&$variables) {
 *     - http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content.html#introduction-3:viewport-based-selection-2
 */
function template_preprocess_image(&$variables) {
  /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */
  $file_url_generator = \Drupal::service('file_url_generator');

  if (!empty($variables['uri'])) {
    $variables['attributes']['src'] = file_url_transform_relative(file_create_url($variables['uri']));
    $variables['attributes']['src'] = $file_url_generator->generateString($variables['uri']);
  }
  // Generate a srcset attribute conforming to the spec at
  // http://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-srcset
@@ -829,7 +835,7 @@ function template_preprocess_image(&$variables) {
    $srcset = [];
    foreach ($variables['srcset'] as $src) {
      // URI is mandatory.
      $source = file_url_transform_relative(file_create_url($src['uri']));
      $source = $file_url_generator->generateString($src['uri']);
      if (isset($src['width']) && !empty($src['width'])) {
        $source .= ' ' . $src['width'];
      }
+17 −2
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace Drupal\Core\Asset;

use Drupal\Core\File\FileUrlGeneratorInterface;
use Drupal\Core\State\StateInterface;

/**
@@ -16,14 +17,28 @@ class CssCollectionRenderer implements AssetCollectionRendererInterface {
   */
  protected $state;

  /**
   * The file URL generator.
   *
   * @var \Drupal\Core\File\FileUrlGeneratorInterface
   */
  protected $fileUrlGenerator;

  /**
   * Constructs a CssCollectionRenderer.
   *
   * @param \Drupal\Core\State\StateInterface $state
   *   The state key/value store.
   * @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator
   *   The file URL generator.
   */
  public function __construct(StateInterface $state) {
  public function __construct(StateInterface $state, FileUrlGeneratorInterface $file_url_generator = NULL) {
    $this->state = $state;
    if (!$file_url_generator) {
      @trigger_error('Calling CssCollectionRenderer::__construct() without the $file_url_generator argument is deprecated in drupal:9.3.0 and will be required before drupal:10.0.0. See https://www.drupal.org/node/2549139.', E_USER_DEPRECATED);
      $file_url_generator = \Drupal::service('file_url_generator');
    }
    $this->fileUrlGenerator = $file_url_generator;
  }

  /**
@@ -55,7 +70,7 @@ public function render(array $css_assets) {
      switch ($css_asset['type']) {
        // For file items, output a LINK tag for file CSS assets.
        case 'file':
          $element['#attributes']['href'] = file_url_transform_relative(file_create_url($css_asset['data']));
          $element['#attributes']['href'] = $this->fileUrlGenerator->generateString($css_asset['data']);
          // Only add the cache-busting query string if this isn't an aggregate
          // file.
          if (!isset($css_asset['preprocessed'])) {
+43 −1
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@

use Drupal\Component\Utility\Unicode;
use Drupal\Core\StreamWrapper\StreamWrapperManager;
use Drupal\Core\File\FileUrlGeneratorInterface;

/**
 * Optimizes a CSS asset.
@@ -17,6 +18,27 @@ class CssOptimizer implements AssetOptimizerInterface {
   */
  public $rewriteFileURIBasePath;

  /**
   * The file URL generator.
   *
   * @var \Drupal\Core\File\FileUrlGeneratorInterface
   */
  protected $fileUrlGenerator;

  /**
   * Constructs a CssOptimizer.
   *
   * @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator
   *   The file URL generator.
   */
  public function __construct(FileUrlGeneratorInterface $file_url_generator = NULL) {
    if (!$file_url_generator) {
      @trigger_error('Calling CssOptimizer::__construct() without the $file_url_generator argument is deprecated in drupal:9.3.0. The $file_url_generator argument will be required in drupal:10.0.0. See https://www.drupal.org/node/2940031', E_USER_DEPRECATED);
      $file_url_generator = \Drupal::service('file_url_generator');
    }
    $this->fileUrlGenerator = $file_url_generator;
  }

  /**
   * {@inheritdoc}
   */
@@ -258,7 +280,27 @@ public function rewriteFileURI($matches) {
      $last = $path;
      $path = preg_replace('`(^|/)(?!\.\./)([^/]+)/\.\./`', '$1', $path);
    }
    return 'url(' . file_url_transform_relative(file_create_url($path)) . ')';
    return 'url(' . $this->getFileUrlGenerator()->generateString($path) . ')';
  }

  /**
   * Returns the file URL generator.
   *
   * This is provided for BC as sub-classes may not call the parent constructor.
   *
   * @return \Drupal\Core\File\FileUrlGeneratorInterface
   *   The file URL generator.
   *
   * @internal
   *   This can be removed in Drupal 10.0.x when the constructor deprecation is
   *   removed.
   */
  private function getFileUrlGenerator(): FileUrlGeneratorInterface {
    if (!$this->fileUrlGenerator) {
      @trigger_error('Calling CssOptimizer::__construct() without the $file_url_generator argument is deprecated in drupal:9.3.0. The $file_url_generator argument will be required in drupal:10.0.0. See https://www.drupal.org/node/2940031', E_USER_DEPRECATED);
      $this->fileUrlGenerator = \Drupal::service('file_url_generator');
    }
    return $this->fileUrlGenerator;
  }

}
Loading