diff --git a/core/core.services.yml b/core/core.services.yml index 66a46c6603..c0349966fb 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -369,6 +369,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: ['@file_system', '@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'] diff --git a/core/includes/file.inc b/core/includes/file.inc index 77a743eab0..126600cdaa 100644 --- a/core/includes/file.inc +++ b/core/includes/file.inc @@ -6,7 +6,6 @@ */ use Drupal\Component\FileSystem\FileSystem as ComponentFileSystem; -use Drupal\Component\Utility\UrlHelper; use Drupal\Component\PhpStorage\FileStorage; use Drupal\Component\Utility\Bytes; use Drupal\Core\File\FileSystem; @@ -184,57 +183,14 @@ function file_stream_wrapper_uri_normalize($uri) { * * @see https://www.drupal.org/node/515192 * @see file_url_transform_relative() + * + * @deprecated in Drupal 8.7.x and will be removed before Drupal 9.0.0. + * Use \Drupal\Core\File\FileUrlGenerator::generate(). + * + * @see https://www.drupal.org/node/2940031 */ 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 = \Drupal::service('file_system')->uriScheme($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; - } - else { - // Attempt to return an external URL using the appropriate wrapper. - if ($wrapper = \Drupal::service('stream_wrapper_manager')->getViaUri($uri)) { - return $wrapper->getExternalUrl(); - } - else { - return FALSE; - } - } + return \Drupal::service('file_url_generator')->generate($uri); } /** @@ -252,23 +208,14 @@ function file_create_url($uri) { * original value of $file_url. * * @see file_create_url() + * + * @deprecated in Drupal 8.7.x and will be removed before Drupal 9.0.0. + * Use \Drupal\Core\File\FileUrlGenerator::transformRelative(). + * + * @see https://www.drupal.org/node/2940031 */ 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; - 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); + return \Drupal::service('file_url_generator')->transformRelative($file_url); } /** diff --git a/core/includes/theme.inc b/core/includes/theme.inc index f5f553ddf4..0d21ef9049 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -342,13 +342,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->generate($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->generate($logo_path)); } // Generate the path to the favicon. @@ -356,14 +359,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->generate($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->generate('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->generate($favicon_path)); } else { $cache[$theme]->set('features.favicon', FALSE); @@ -788,8 +791,12 @@ 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->generate($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 @@ -797,7 +804,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->generate($src['uri']); if (isset($src['width']) && !empty($src['width'])) { $source .= ' ' . $src['width']; } diff --git a/core/lib/Drupal/Core/Asset/CssCollectionRenderer.php b/core/lib/Drupal/Core/Asset/CssCollectionRenderer.php index d042176d09..0e8339d497 100644 --- a/core/lib/Drupal/Core/Asset/CssCollectionRenderer.php +++ b/core/lib/Drupal/Core/Asset/CssCollectionRenderer.php @@ -2,6 +2,7 @@ namespace Drupal\Core\Asset; +use Drupal\Core\File\FileUrlGeneratorInterface; use Drupal\Core\State\StateInterface; /** @@ -16,14 +17,24 @@ 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; + $this->fileUrlGenerator = $file_url_generator ?: \Drupal::service('file_url_generator'); } /** @@ -58,7 +69,7 @@ public function render(array $css_assets) { // The dummy query string needs to be added to the URL to control // browser-caching. $query_string_separator = (strpos($css_asset['data'], '?') !== FALSE) ? '&' : '?'; - $element['#attributes']['href'] = file_url_transform_relative(file_create_url($css_asset['data'])) . $query_string_separator . $query_string; + $element['#attributes']['href'] = $this->fileUrlGenerator->generate($css_asset['data']) . $query_string_separator . $query_string; break; case 'external': diff --git a/core/lib/Drupal/Core/Asset/CssOptimizer.php b/core/lib/Drupal/Core/Asset/CssOptimizer.php index 94c2240abc..d6137ea846 100644 --- a/core/lib/Drupal/Core/Asset/CssOptimizer.php +++ b/core/lib/Drupal/Core/Asset/CssOptimizer.php @@ -3,6 +3,7 @@ namespace Drupal\Core\Asset; use Drupal\Component\Utility\Unicode; +use Drupal\Core\File\FileUrlGeneratorInterface; /** * Optimizes a CSS asset. @@ -16,6 +17,23 @@ 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) { + $this->fileUrlGenerator = $file_url_generator; + } + /** * {@inheritdoc} */ @@ -257,7 +275,23 @@ 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()->generate($path) . ')'; + } + + /** + * Returns the file URL generator. + * + * @return \Drupal\Core\File\FileUrlGeneratorInterface + * The file URL generator. + * + * @internal + */ + protected function getFileUrlGenerator() { + if (!$this->fileUrlGenerator) { + @trigger_error('The file_generator service must be injected into CssOptimizer.'); + $this->fileUrlGenerator = \Drupal::service('file_url_generator'); + } + return $this->fileUrlGenerator; } } diff --git a/core/lib/Drupal/Core/Asset/JsCollectionRenderer.php b/core/lib/Drupal/Core/Asset/JsCollectionRenderer.php index d3a062c942..eda400a31f 100644 --- a/core/lib/Drupal/Core/Asset/JsCollectionRenderer.php +++ b/core/lib/Drupal/Core/Asset/JsCollectionRenderer.php @@ -3,6 +3,7 @@ namespace Drupal\Core\Asset; use Drupal\Component\Serialization\Json; +use Drupal\Core\File\FileUrlGeneratorInterface; use Drupal\Core\State\StateInterface; /** @@ -17,14 +18,24 @@ class JsCollectionRenderer implements AssetCollectionRendererInterface { */ protected $state; + /** + * The file URL generator. + * + * @var \Drupal\Core\File\FileUrlGeneratorInterface + */ + protected $fileUrlGenerator; + /** * Constructs a JsCollectionRenderer. * * @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; + $this->fileUrlGenerator = $file_url_generator ?: \Drupal::service('file_url_generator'); } /** @@ -74,7 +85,7 @@ public function render(array $js_assets) { case 'file': $query_string = $js_asset['version'] == -1 ? $default_query_string : 'v=' . $js_asset['version']; $query_string_separator = (strpos($js_asset['data'], '?') !== FALSE) ? '&' : '?'; - $element['#attributes']['src'] = file_url_transform_relative(file_create_url($js_asset['data'])); + $element['#attributes']['src'] = $this->fileUrlGenerator->generate($js_asset['data']); // Only add the cache-busting query string if this isn't an aggregate // file. if (!isset($js_asset['preprocessed'])) { diff --git a/core/lib/Drupal/Core/File/FileUrlGenerator.php b/core/lib/Drupal/Core/File/FileUrlGenerator.php new file mode 100644 index 0000000000..deecbd8ded --- /dev/null +++ b/core/lib/Drupal/Core/File/FileUrlGenerator.php @@ -0,0 +1,138 @@ +fileSystem = $file_system; + $this->streamWrapperManager = $stream_wrapper_manager; + $this->requestStack = $request_stack; + $this->moduleHandler = $module_handler; + } + + /** + * {@inheritdoc} + */ + public function generate($uri, $relative = FALSE) { + // Allow the URI to be altered, e.g. to serve a file from a CDN or static + // file server. + $this->moduleHandler->alter('file_url', $uri); + + $scheme = $this->fileSystem->uriScheme($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 { + $base_url = $this->requestStack->getCurrentRequest()->getSchemeAndHttpHost() . base_path(); + // 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 = $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. + if ($relative) { + return $this->transformRelative($uri); + } + return $uri; + } + elseif ($wrapper = $this->streamWrapperManager->getViaUri($uri)) { + // Attempt to return an external URL using the appropriate wrapper. + return $wrapper->getExternalUrl(); + } + return FALSE; + } + + /** + * {@inheritdoc} + */ + public function transformRelative($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 = $this->requestStack->getCurrentRequest(); + $host = $request->getHost(); + $scheme = $request->getScheme(); + $port = $request->getPort() ?: 80; + 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); + } + +} diff --git a/core/lib/Drupal/Core/File/FileUrlGeneratorInterface.php b/core/lib/Drupal/Core/File/FileUrlGeneratorInterface.php new file mode 100644 index 0000000000..64742e1e15 --- /dev/null +++ b/core/lib/Drupal/Core/File/FileUrlGeneratorInterface.php @@ -0,0 +1,59 @@ +generate($element['#src']); if (!empty($element['#title'])) { $element['#attributes']['alt'] = $element['#title']; $element['#attributes']['title'] = $element['#title']; diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php index 8f47ed4074..93ef7df7b8 100644 --- a/core/lib/Drupal/Core/Template/TwigExtension.php +++ b/core/lib/Drupal/Core/Template/TwigExtension.php @@ -6,6 +6,7 @@ use Drupal\Component\Render\MarkupInterface; use Drupal\Core\Cache\CacheableDependencyInterface; use Drupal\Core\Datetime\DateFormatterInterface; +use Drupal\Core\File\FileUrlGeneratorInterface; use Drupal\Core\Render\AttachmentsInterface; use Drupal\Core\Render\BubbleableMetadata; use Drupal\Core\Render\Markup; @@ -53,6 +54,13 @@ class TwigExtension extends \Twig_Extension { */ protected $dateFormatter; + /** + * The file URL generator. + * + * @var \Drupal\Core\File\FileUrlGeneratorInterface + */ + protected $fileUrlGenerator; + /** * Constructs \Drupal\Core\Template\TwigExtension. * @@ -63,13 +71,16 @@ class TwigExtension extends \Twig_Extension { * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager * The theme manager. * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter - * The date formatter. + * The date formatter + * @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator + * The file URL generator. */ - public function __construct(RendererInterface $renderer, UrlGeneratorInterface $url_generator, ThemeManagerInterface $theme_manager, DateFormatterInterface $date_formatter) { + public function __construct(RendererInterface $renderer, UrlGeneratorInterface $url_generator, ThemeManagerInterface $theme_manager, DateFormatterInterface $date_formatter, FileUrlGeneratorInterface $file_url_generator) { $this->renderer = $renderer; $this->urlGenerator = $url_generator; $this->themeManager = $theme_manager; $this->dateFormatter = $date_formatter; + $this->fileUrlGenerator = $file_url_generator ?: \Drupal::service('file_url_generator'); } /** @@ -143,9 +154,7 @@ public function getFunctions() { new \Twig_SimpleFunction('url', [$this, 'getUrl'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]), new \Twig_SimpleFunction('path', [$this, 'getPath'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]), new \Twig_SimpleFunction('link', [$this, 'getLink']), - new \Twig_SimpleFunction('file_url', function ($uri) { - return file_url_transform_relative(file_create_url($uri)); - }), + new \Twig_SimpleFunction('file_url', [$this->fileUrlGenerator, 'generate']), new \Twig_SimpleFunction('attach_library', [$this, 'attachLibrary']), new \Twig_SimpleFunction('active_theme_path', [$this, 'getActiveThemePath']), new \Twig_SimpleFunction('active_theme', [$this, 'getActiveTheme']), diff --git a/core/modules/ckeditor/src/Plugin/Editor/CKEditor.php b/core/modules/ckeditor/src/Plugin/Editor/CKEditor.php index a6d6fb5647..5e16cd5711 100644 --- a/core/modules/ckeditor/src/Plugin/Editor/CKEditor.php +++ b/core/modules/ckeditor/src/Plugin/Editor/CKEditor.php @@ -4,6 +4,7 @@ use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\ckeditor\CKEditorPluginManager; +use Drupal\Core\File\FileUrlGeneratorInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Render\Element; @@ -57,6 +58,13 @@ class CKEditor extends EditorBase implements ContainerFactoryPluginInterface { */ protected $renderer; + /** + * The file URL generator. + * + * @var \Drupal\Core\File\FileUrlGeneratorInterface + */ + protected $fileUrlGenerator; + /** * Constructs a \Drupal\ckeditor\Plugin\Editor\CKEditor object. * @@ -74,13 +82,16 @@ class CKEditor extends EditorBase implements ContainerFactoryPluginInterface { * The language manager. * @param \Drupal\Core\Render\RendererInterface $renderer * The renderer. + * @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator + * The file URL generator. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, CKEditorPluginManager $ckeditor_plugin_manager, ModuleHandlerInterface $module_handler, LanguageManagerInterface $language_manager, RendererInterface $renderer) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, CKEditorPluginManager $ckeditor_plugin_manager, ModuleHandlerInterface $module_handler, LanguageManagerInterface $language_manager, RendererInterface $renderer, FileUrlGeneratorInterface $file_url_generator) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->ckeditorPluginManager = $ckeditor_plugin_manager; $this->moduleHandler = $module_handler; $this->languageManager = $language_manager; $this->renderer = $renderer; + $this->fileUrlGenerator = $file_url_generator ?: \Drupal::service('file_url_generator'); } /** @@ -293,11 +304,8 @@ public function getJSSettings(Editor $editor) { ]; // Finally, set Drupal-specific CKEditor settings. - $root_relative_file_url = function ($uri) { - return file_url_transform_relative(file_create_url($uri)); - }; $settings += [ - 'drupalExternalPlugins' => array_map($root_relative_file_url, $external_plugin_files), + 'drupalExternalPlugins' => array_map([$this->fileUrlGenerator, 'generate'], $external_plugin_files), ]; // Parse all CKEditor plugin JavaScript files for translations. diff --git a/core/modules/ckeditor/tests/modules/src/Form/AjaxCssForm.php b/core/modules/ckeditor/tests/modules/src/Form/AjaxCssForm.php index e8c066825a..7149271fc0 100644 --- a/core/modules/ckeditor/tests/modules/src/Form/AjaxCssForm.php +++ b/core/modules/ckeditor/tests/modules/src/Form/AjaxCssForm.php @@ -4,8 +4,10 @@ use Drupal\ckeditor\Ajax\AddStyleSheetCommand; use Drupal\Core\Ajax\AjaxResponse; +use Drupal\Core\File\FileUrlGeneratorInterface; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * A form for testing delivery of CSS to CKEditor via AJAX. @@ -14,6 +16,37 @@ */ class AjaxCssForm extends FormBase { + /** + * The base path used by rewriteFileURI(). + * + * @var string + */ + 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) { + $this->fileUrlGenerator = $file_url_generator; + } + + /** + * @inheritDoc + */ + public static function create(ContainerInterface $container) { + return new static($container->get('file_url_generator')); + } + /** * {@inheritdoc} */ @@ -82,8 +115,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { protected function generateResponse($editor_id) { // Build a URL to the style sheet that will be added. $url = drupal_get_path('module', 'ckeditor_test') . '/css/test.css'; - $url = file_create_url($url); - $url = file_url_transform_relative($url); + $url = $this->fileUrlGenerator->generate($url); $response = new AjaxResponse(); return $response diff --git a/core/modules/color/color.module b/core/modules/color/color.module index a25be981d4..27f98bcc93 100644 --- a/core/modules/color/color.module +++ b/core/modules/color/color.module @@ -127,7 +127,9 @@ function color_block_view_pre_render(array $build) { // Override logo. $logo = $config->get('logo'); if ($logo && $build['content']['site_logo'] && preg_match('!' . $theme_key . '/logo.svg$!', $build['content']['site_logo']['#uri'])) { - $build['content']['site_logo']['#uri'] = file_url_transform_relative(file_create_url($logo)); + /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */ + $file_url_generator = \Drupal::service('file_url_generator'); + $build['content']['site_logo']['#uri'] = $file_url_generator->generate($logo); } return $build; diff --git a/core/modules/file/src/Entity/File.php b/core/modules/file/src/Entity/File.php index f768ab79bc..7091bb1807 100644 --- a/core/modules/file/src/Entity/File.php +++ b/core/modules/file/src/Entity/File.php @@ -78,11 +78,9 @@ public function setFileUri($uri) { * {@inheritdoc} */ public function createFileUrl($relative = TRUE) { - $url = file_create_url($this->getFileUri()); - if ($relative && $url) { - $url = file_url_transform_relative($url); - } - return $url; + /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */ + $file_url_generator = \Drupal::service('file_url_generator'); + return $file_url_generator->generate($this->getFileUri(), $relative); } /** diff --git a/core/modules/file/src/FileInterface.php b/core/modules/file/src/FileInterface.php index dd4ac32af7..0a565e23c9 100644 --- a/core/modules/file/src/FileInterface.php +++ b/core/modules/file/src/FileInterface.php @@ -59,8 +59,7 @@ public function setFileUri($uri); * @return string * A string containing a URL that may be used to access the file. * - * @see file_create_url() - * @see file_url_transform_relative() + * @see \Drupal\Core\File\FileUrlGeneratorInterface */ public function createFileUrl($relative = TRUE); diff --git a/core/modules/image/image.admin.inc b/core/modules/image/image.admin.inc index e43bd48765..25f8ca14c3 100644 --- a/core/modules/image/image.admin.inc +++ b/core/modules/image/image.admin.inc @@ -17,6 +17,10 @@ * - style: \Drupal\image\ImageStyleInterface image style being previewed. */ function template_preprocess_image_style_preview(&$variables) { + + /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */ + $file_url_generator = \Drupal::service('file_url_generator'); + // Style information. $style = $variables['style']; $variables['style_id'] = $style->id(); @@ -34,7 +38,7 @@ function template_preprocess_image_style_preview(&$variables) { $original_path = \Drupal::config('image.settings')->get('preview_image'); $original_image = $image_factory->get($original_path); $variables['original'] = [ - 'url' => file_url_transform_relative(file_create_url($original_path)), + 'url' => $file_url_generator->generate($original_path), 'width' => $original_image->getWidth(), 'height' => $original_image->getHeight(), ]; @@ -55,7 +59,7 @@ function template_preprocess_image_style_preview(&$variables) { } $preview_image = $image_factory->get($preview_file); $variables['derivative'] = [ - 'url' => file_url_transform_relative(file_create_url($preview_file)), + 'url' => $file_url_generator->generate($preview_file), 'width' => $preview_image->getWidth(), 'height' => $preview_image->getHeight(), ]; diff --git a/core/modules/image/src/Entity/ImageStyle.php b/core/modules/image/src/Entity/ImageStyle.php index 7992aea57a..e8c9f2b77a 100644 --- a/core/modules/image/src/Entity/ImageStyle.php +++ b/core/modules/image/src/Entity/ImageStyle.php @@ -236,7 +236,10 @@ public function buildUrl($path, $clean_urls = NULL) { return Url::fromUri('base:' . $directory_path . '/' . file_uri_target($uri), ['absolute' => TRUE, 'query' => $token_query])->toString(); } - $file_url = file_create_url($uri); + /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */ + $file_url_generator = \Drupal::service('file_url_generator'); + + $file_url = $file_url_generator->generate($uri, FALSE); // Append the query string with the token, if necessary. if ($token_query) { $file_url .= (strpos($file_url, '?') !== FALSE ? '&' : '?') . UrlHelper::buildQuery($token_query); diff --git a/core/modules/responsive_image/responsive_image.module b/core/modules/responsive_image/responsive_image.module index d20a9cf44c..0a1204b84b 100644 --- a/core/modules/responsive_image/responsive_image.module +++ b/core/modules/responsive_image/responsive_image.module @@ -537,11 +537,15 @@ function _responsive_image_image_style_url($style_name, $path) { // http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever return 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='; } + + /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */ + $file_url_generator = \Drupal::service('file_url_generator'); + $entity = ImageStyle::load($style_name); if ($entity instanceof ImageStyle) { - return file_url_transform_relative($entity->buildUrl($path)); + return $file_url_generator->transformRelative($entity->buildUrl($path)); } - return file_url_transform_relative(file_create_url($path)); + return $file_url_generator->generate($path); } /** diff --git a/core/tests/Drupal/Tests/BrowserHtmlDebugTrait.php b/core/tests/Drupal/Tests/BrowserHtmlDebugTrait.php index f06a5442f4..e7ea92fdf7 100644 --- a/core/tests/Drupal/Tests/BrowserHtmlDebugTrait.php +++ b/core/tests/Drupal/Tests/BrowserHtmlDebugTrait.php @@ -116,8 +116,8 @@ protected function htmlOutput($message = NULL) { $html_output_filename = $this->htmlOutputClassName . '-' . $this->htmlOutputCounter . '-' . $this->htmlOutputTestId . '.html'; file_put_contents($this->htmlOutputDirectory . '/' . $html_output_filename, $message); file_put_contents($this->htmlOutputCounterStorage, $this->htmlOutputCounter++); - // Do not use file_create_url() as the module_handler service might not be - // available. + // Do not use the file_url_generator service as the module_handler service + // might not be available. $uri = $GLOBALS['base_url'] . '/sites/simpletest/browser_output/' . $html_output_filename; file_put_contents($this->htmlOutputFile, $uri . "\n", FILE_APPEND); } diff --git a/core/tests/Drupal/Tests/Core/Asset/CssCollectionRendererUnitTest.php b/core/tests/Drupal/Tests/Core/Asset/CssCollectionRendererUnitTest.php index 92b4809a0f..6521452808 100644 --- a/core/tests/Drupal/Tests/Core/Asset/CssCollectionRendererUnitTest.php +++ b/core/tests/Drupal/Tests/Core/Asset/CssCollectionRendererUnitTest.php @@ -3,6 +3,8 @@ namespace Drupal\Tests\Core\Asset; use Drupal\Core\Asset\CssCollectionRenderer; +use Drupal\Core\File\FileUrlGeneratorInterface; +use Drupal\Core\State\StateInterface; use Drupal\Tests\UnitTestCase; /** @@ -33,12 +35,20 @@ class CssCollectionRendererUnitTest extends UnitTestCase { */ protected $state; + /** + * The file URL generator mock.. + * + * @var \Drupal\Core\File\FileUrlGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $fileUrlGenerator; + protected function setUp() { parent::setUp(); - $this->state = $this->getMock('Drupal\Core\State\StateInterface'); + $this->state = $this->createMock(StateInterface::class); + $this->fileUrlGenerator = $this->createMock(FileUrlGeneratorInterface::class); - $this->renderer = new CssCollectionRenderer($this->state); + $this->renderer = new CssCollectionRenderer($this->state, $this->fileUrlGenerator ); $this->fileCssGroup = [ 'group' => -100, 'type' => 'file', @@ -111,7 +121,7 @@ public function providerTestRender() { 0 => ['group' => 0, 'type' => 'file', 'media' => 'all', 'preprocess' => TRUE, 'data' => 'public://css/file-all', 'browsers' => []], ], [ - 0 => $create_link_element(file_url_transform_relative(file_create_url('public://css/file-all')) . '?0', 'all'), + 0 => $create_link_element('generated-relative-url:public://css/file-all?0', 'all'), ], ], // 31 file CSS assets: expect 31 link elements. @@ -150,37 +160,37 @@ public function providerTestRender() { 30 => $create_file_css_asset('public://css/31.css'), ], [ - 0 => $create_link_element(file_url_transform_relative(file_create_url('public://css/1.css')) . '?0'), - 1 => $create_link_element(file_url_transform_relative(file_create_url('public://css/2.css')) . '?0'), - 2 => $create_link_element(file_url_transform_relative(file_create_url('public://css/3.css')) . '?0'), - 3 => $create_link_element(file_url_transform_relative(file_create_url('public://css/4.css')) . '?0'), - 4 => $create_link_element(file_url_transform_relative(file_create_url('public://css/5.css')) . '?0'), - 5 => $create_link_element(file_url_transform_relative(file_create_url('public://css/6.css')) . '?0'), - 6 => $create_link_element(file_url_transform_relative(file_create_url('public://css/7.css')) . '?0'), - 7 => $create_link_element(file_url_transform_relative(file_create_url('public://css/8.css')) . '?0'), - 8 => $create_link_element(file_url_transform_relative(file_create_url('public://css/9.css')) . '?0'), - 9 => $create_link_element(file_url_transform_relative(file_create_url('public://css/10.css')) . '?0'), - 10 => $create_link_element(file_url_transform_relative(file_create_url('public://css/11.css')) . '?0'), - 11 => $create_link_element(file_url_transform_relative(file_create_url('public://css/12.css')) . '?0'), - 12 => $create_link_element(file_url_transform_relative(file_create_url('public://css/13.css')) . '?0'), - 13 => $create_link_element(file_url_transform_relative(file_create_url('public://css/14.css')) . '?0'), - 14 => $create_link_element(file_url_transform_relative(file_create_url('public://css/15.css')) . '?0'), - 15 => $create_link_element(file_url_transform_relative(file_create_url('public://css/16.css')) . '?0'), - 16 => $create_link_element(file_url_transform_relative(file_create_url('public://css/17.css')) . '?0'), - 17 => $create_link_element(file_url_transform_relative(file_create_url('public://css/18.css')) . '?0'), - 18 => $create_link_element(file_url_transform_relative(file_create_url('public://css/19.css')) . '?0'), - 19 => $create_link_element(file_url_transform_relative(file_create_url('public://css/20.css')) . '?0'), - 20 => $create_link_element(file_url_transform_relative(file_create_url('public://css/21.css')) . '?0'), - 21 => $create_link_element(file_url_transform_relative(file_create_url('public://css/22.css')) . '?0'), - 22 => $create_link_element(file_url_transform_relative(file_create_url('public://css/23.css')) . '?0'), - 23 => $create_link_element(file_url_transform_relative(file_create_url('public://css/24.css')) . '?0'), - 24 => $create_link_element(file_url_transform_relative(file_create_url('public://css/25.css')) . '?0'), - 25 => $create_link_element(file_url_transform_relative(file_create_url('public://css/26.css')) . '?0'), - 26 => $create_link_element(file_url_transform_relative(file_create_url('public://css/27.css')) . '?0'), - 27 => $create_link_element(file_url_transform_relative(file_create_url('public://css/28.css')) . '?0'), - 28 => $create_link_element(file_url_transform_relative(file_create_url('public://css/29.css')) . '?0'), - 29 => $create_link_element(file_url_transform_relative(file_create_url('public://css/30.css')) . '?0'), - 30 => $create_link_element(file_url_transform_relative(file_create_url('public://css/31.css')) . '?0'), + 0 => $create_link_element('generated-relative-url:public://css/1.css?0'), + 1 => $create_link_element('generated-relative-url:public://css/2.css?0'), + 2 => $create_link_element('generated-relative-url:public://css/3.css?0'), + 3 => $create_link_element('generated-relative-url:public://css/4.css?0'), + 4 => $create_link_element('generated-relative-url:public://css/5.css?0'), + 5 => $create_link_element('generated-relative-url:public://css/6.css?0'), + 6 => $create_link_element('generated-relative-url:public://css/7.css?0'), + 7 => $create_link_element('generated-relative-url:public://css/8.css?0'), + 8 => $create_link_element('generated-relative-url:public://css/9.css?0'), + 9 => $create_link_element('generated-relative-url:public://css/10.css?0'), + 10 => $create_link_element('generated-relative-url:public://css/11.css?0'), + 11 => $create_link_element('generated-relative-url:public://css/12.css?0'), + 12 => $create_link_element('generated-relative-url:public://css/13.css?0'), + 13 => $create_link_element('generated-relative-url:public://css/14.css?0'), + 14 => $create_link_element('generated-relative-url:public://css/15.css?0'), + 15 => $create_link_element('generated-relative-url:public://css/16.css?0'), + 16 => $create_link_element('generated-relative-url:public://css/17.css?0'), + 17 => $create_link_element('generated-relative-url:public://css/18.css?0'), + 18 => $create_link_element('generated-relative-url:public://css/19.css?0'), + 19 => $create_link_element('generated-relative-url:public://css/20.css?0'), + 20 => $create_link_element('generated-relative-url:public://css/21.css?0'), + 21 => $create_link_element('generated-relative-url:public://css/22.css?0'), + 22 => $create_link_element('generated-relative-url:public://css/23.css?0'), + 23 => $create_link_element('generated-relative-url:public://css/24.css?0'), + 24 => $create_link_element('generated-relative-url:public://css/25.css?0'), + 25 => $create_link_element('generated-relative-url:public://css/26.css?0'), + 26 => $create_link_element('generated-relative-url:public://css/27.css?0'), + 27 => $create_link_element('generated-relative-url:public://css/28.css?0'), + 28 => $create_link_element('generated-relative-url:public://css/29.css?0'), + 29 => $create_link_element('generated-relative-url:public://css/30.css?0'), + 30 => $create_link_element('generated-relative-url:public://css/31.css?0'), ], ], // 32 file CSS assets with the same properties, except for the 10th and @@ -221,38 +231,38 @@ public function providerTestRender() { 31 => $create_file_css_asset('public://css/32.css'), ], [ - 0 => $create_link_element(file_url_transform_relative(file_create_url('public://css/1.css')) . '?0'), - 1 => $create_link_element(file_url_transform_relative(file_create_url('public://css/2.css')) . '?0'), - 2 => $create_link_element(file_url_transform_relative(file_create_url('public://css/3.css')) . '?0'), - 3 => $create_link_element(file_url_transform_relative(file_create_url('public://css/4.css')) . '?0'), - 4 => $create_link_element(file_url_transform_relative(file_create_url('public://css/5.css')) . '?0'), - 5 => $create_link_element(file_url_transform_relative(file_create_url('public://css/6.css')) . '?0'), - 6 => $create_link_element(file_url_transform_relative(file_create_url('public://css/7.css')) . '?0'), - 7 => $create_link_element(file_url_transform_relative(file_create_url('public://css/8.css')) . '?0'), - 8 => $create_link_element(file_url_transform_relative(file_create_url('public://css/9.css')) . '?0'), - 9 => $create_link_element(file_url_transform_relative(file_create_url('public://css/10.css')) . '?0', 'screen'), - 10 => $create_link_element(file_url_transform_relative(file_create_url('public://css/11.css')) . '?0'), - 11 => $create_link_element(file_url_transform_relative(file_create_url('public://css/12.css')) . '?0'), - 12 => $create_link_element(file_url_transform_relative(file_create_url('public://css/13.css')) . '?0'), - 13 => $create_link_element(file_url_transform_relative(file_create_url('public://css/14.css')) . '?0'), - 14 => $create_link_element(file_url_transform_relative(file_create_url('public://css/15.css')) . '?0'), - 15 => $create_link_element(file_url_transform_relative(file_create_url('public://css/16.css')) . '?0'), - 16 => $create_link_element(file_url_transform_relative(file_create_url('public://css/17.css')) . '?0'), - 17 => $create_link_element(file_url_transform_relative(file_create_url('public://css/18.css')) . '?0'), - 18 => $create_link_element(file_url_transform_relative(file_create_url('public://css/19.css')) . '?0'), - 19 => $create_link_element(file_url_transform_relative(file_create_url('public://css/20.css')) . '?0', 'print'), - 20 => $create_link_element(file_url_transform_relative(file_create_url('public://css/21.css')) . '?0'), - 21 => $create_link_element(file_url_transform_relative(file_create_url('public://css/22.css')) . '?0'), - 22 => $create_link_element(file_url_transform_relative(file_create_url('public://css/23.css')) . '?0'), - 23 => $create_link_element(file_url_transform_relative(file_create_url('public://css/24.css')) . '?0'), - 24 => $create_link_element(file_url_transform_relative(file_create_url('public://css/25.css')) . '?0'), - 25 => $create_link_element(file_url_transform_relative(file_create_url('public://css/26.css')) . '?0'), - 26 => $create_link_element(file_url_transform_relative(file_create_url('public://css/27.css')) . '?0'), - 27 => $create_link_element(file_url_transform_relative(file_create_url('public://css/28.css')) . '?0'), - 28 => $create_link_element(file_url_transform_relative(file_create_url('public://css/29.css')) . '?0'), - 29 => $create_link_element(file_url_transform_relative(file_create_url('public://css/30.css')) . '?0'), - 30 => $create_link_element(file_url_transform_relative(file_create_url('public://css/31.css')) . '?0'), - 31 => $create_link_element(file_url_transform_relative(file_create_url('public://css/32.css')) . '?0'), + 0 => $create_link_element('generated-relative-url:public://css/1.css?0'), + 1 => $create_link_element('generated-relative-url:public://css/2.css?0'), + 2 => $create_link_element('generated-relative-url:public://css/3.css?0'), + 3 => $create_link_element('generated-relative-url:public://css/4.css?0'), + 4 => $create_link_element('generated-relative-url:public://css/5.css?0'), + 5 => $create_link_element('generated-relative-url:public://css/6.css?0'), + 6 => $create_link_element('generated-relative-url:public://css/7.css?0'), + 7 => $create_link_element('generated-relative-url:public://css/8.css?0'), + 8 => $create_link_element('generated-relative-url:public://css/9.css?0'), + 9 => $create_link_element('generated-relative-url:public://css/10.css?0', 'screen'), + 10 => $create_link_element('generated-relative-url:public://css/11.css?0'), + 11 => $create_link_element('generated-relative-url:public://css/12.css?0'), + 12 => $create_link_element('generated-relative-url:public://css/13.css?0'), + 13 => $create_link_element('generated-relative-url:public://css/14.css?0'), + 14 => $create_link_element('generated-relative-url:public://css/15.css?0'), + 15 => $create_link_element('generated-relative-url:public://css/16.css?0'), + 16 => $create_link_element('generated-relative-url:public://css/17.css?0'), + 17 => $create_link_element('generated-relative-url:public://css/18.css?0'), + 18 => $create_link_element('generated-relative-url:public://css/19.css?0'), + 19 => $create_link_element('generated-relative-url:public://css/20.css?0', 'print'), + 20 => $create_link_element('generated-relative-url:public://css/21.css?0'), + 21 => $create_link_element('generated-relative-url:public://css/22.css?0'), + 22 => $create_link_element('generated-relative-url:public://css/23.css?0'), + 23 => $create_link_element('generated-relative-url:public://css/24.css?0'), + 24 => $create_link_element('generated-relative-url:public://css/25.css?0'), + 25 => $create_link_element('generated-relative-url:public://css/26.css?0'), + 26 => $create_link_element('generated-relative-url:public://css/27.css?0'), + 27 => $create_link_element('generated-relative-url:public://css/28.css?0'), + 28 => $create_link_element('generated-relative-url:public://css/29.css?0'), + 29 => $create_link_element('generated-relative-url:public://css/30.css?0'), + 30 => $create_link_element('generated-relative-url:public://css/31.css?0'), + 31 => $create_link_element('generated-relative-url:public://css/32.css?0'), ], ], ]; @@ -268,6 +278,12 @@ public function testRender(array $css_assets, array $render_elements) { ->method('get') ->with('system.css_js_query_string') ->will($this->returnValue(NULL)); + $this->fileUrlGenerator->expects($this->any()) + ->method('generate') + ->with($this->isType('string'), TRUE) + ->willReturnCallback(function ($uri) { + return 'generated-relative-url:' . $uri; + }); $this->assertSame($render_elements, $this->renderer->render($css_assets)); } @@ -279,6 +295,12 @@ public function testRenderInvalidType() { ->method('get') ->with('system.css_js_query_string') ->will($this->returnValue(NULL)); + $this->fileUrlGenerator->expects($this->any()) + ->method('generate') + ->with($this->isType('string'), TRUE) + ->willReturnCallback(function ($uri) { + return 'generated-relative-url:' . $uri; + }); $this->setExpectedException('Exception', 'Invalid CSS asset type.'); $css_group = [ @@ -293,57 +315,3 @@ public function testRenderInvalidType() { } } - -/** - * Temporary mock for file_create_url(), until that is moved into - * Component/Utility. - */ -if (!function_exists('Drupal\Tests\Core\Asset\file_create_url')) { - - function file_create_url($uri) { - return 'file_create_url:' . $uri; - } - -} - -/** - * Temporary mock of file_url_transform_relative, until that is moved into - * Component/Utility. - */ -if (!function_exists('Drupal\Tests\Core\Asset\file_url_transform_relative')) { - - function file_url_transform_relative($uri) { - return 'file_url_transform_relative:' . $uri; - } - -} - -/** - * CssCollectionRenderer uses file_create_url() & file_url_transform_relative(), - * which *are* available when using the Simpletest test runner, but not when - * using the PHPUnit test runner; hence this hack. - */ -namespace Drupal\Core\Asset; - -if (!function_exists('Drupal\Core\Asset\file_create_url')) { - - /** - * Temporary mock for file_create_url(), until that is moved into - * Component/Utility. - */ - function file_create_url($uri) { - return \Drupal\Tests\Core\Asset\file_create_url($uri); - } - -} -if (!function_exists('Drupal\Core\Asset\file_url_transform_relative')) { - - /** - * Temporary mock of file_url_transform_relative, until that is moved into - * Component/Utility. - */ - function file_url_transform_relative($uri) { - return \Drupal\Tests\Core\Asset\file_url_transform_relative($uri); - } - -} diff --git a/core/tests/Drupal/Tests/Core/Asset/CssOptimizerUnitTest.php b/core/tests/Drupal/Tests/Core/Asset/CssOptimizerUnitTest.php index f39a93862d..415d6c41c4 100644 --- a/core/tests/Drupal/Tests/Core/Asset/CssOptimizerUnitTest.php +++ b/core/tests/Drupal/Tests/Core/Asset/CssOptimizerUnitTest.php @@ -3,6 +3,7 @@ namespace Drupal\Tests\Core\Asset; use Drupal\Core\Asset\CssOptimizer; +use Drupal\Core\File\FileUrlGeneratorInterface; use Drupal\Tests\UnitTestCase; /** @@ -24,10 +25,25 @@ class CssOptimizerUnitTest extends UnitTestCase { */ protected $optimizer; + /** + * The file URL generator mock.. + * + * @var \Drupal\Core\File\FileUrlGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $fileUrlGenerator; + protected function setUp() { parent::setUp(); - $this->optimizer = new CssOptimizer(); + $this->fileUrlGenerator = $this->createMock(FileUrlGeneratorInterface::class); + $this->fileUrlGenerator->expects($this->any()) + ->method('generate') + ->with($this->isType('string'), TRUE) + ->willReturnCallback(function ($uri) { + return 'generated-relative-url:' . $uri; + }); + + $this->optimizer = new CssOptimizer($this->fileUrlGenerator); } /** @@ -58,7 +74,8 @@ public function providerTestOptimize() { // - Proper URLs in imported files. (https://www.drupal.org/node/265719) // - A background image with relative paths, which must be rewritten. // - The rewritten background image path must also be passed through - // file_create_url(). (https://www.drupal.org/node/1961340) + // FileUrlGeneratorInterface::generate(). + // (https://www.drupal.org/node/1961340) // - Imported files that are external (protocol-relative URL or not) // should not be expanded. (https://www.drupal.org/node/2014851) [ @@ -72,7 +89,7 @@ public function providerTestOptimize() { 'browsers' => ['IE' => TRUE, '!IE' => TRUE], 'basename' => 'css_input_with_import.css', ], - str_replace('url(images/icon.png)', 'url(' . file_url_transform_relative(file_create_url($path . 'images/icon.png')) . ')', file_get_contents($absolute_path . 'css_input_with_import.css.optimized.css')), + str_replace('url(images/icon.png)', 'url(generated-relative-url:' . $path . 'images/icon.png)', file_get_contents($absolute_path . 'css_input_with_import.css.optimized.css')), ], // File. Tests: // - Retain comment hacks. @@ -104,7 +121,7 @@ public function providerTestOptimize() { 'browsers' => ['IE' => TRUE, '!IE' => TRUE], 'basename' => 'css_input_with_import.css', ], - str_replace('url(../images/icon.png)', 'url(' . file_url_transform_relative(file_create_url($path . 'images/icon.png')) . ')', file_get_contents($absolute_path . 'css_subfolder/css_input_with_import.css.optimized.css')), + str_replace('url(../images/icon.png)', 'url(generated-relative-url:' . $path . 'images/icon.png)', file_get_contents($absolute_path . 'css_subfolder/css_input_with_import.css.optimized.css')), ], // File. Tests: // - Any @charset declaration at the beginning of a file should be @@ -265,58 +282,10 @@ public function testTypeExternal() { } /** - * Temporary mock for file_create_url(), until that is moved into - * Component/Utility. - */ -if (!function_exists('Drupal\Tests\Core\Asset\file_create_url')) { - - function file_create_url($uri) { - return 'file_create_url:' . $uri; - } - -} - -/** - * Temporary mock of file_url_transform_relative, until that is moved into - * Component/Utility. - */ -if (!function_exists('Drupal\Tests\Core\Asset\file_url_transform_relative')) { - - function file_url_transform_relative($uri) { - return 'file_url_transform_relative:' . $uri; - } - -} - -/** - * CssCollectionRenderer uses file_create_url() & file_url_transform_relative(), - * which *are* available when using the Simpletest test runner, but not when - * using the PHPUnit test runner; hence this hack. + * CssCollectionRenderer uses file_uri_scheme() which need to be mocked. */ namespace Drupal\Core\Asset; -if (!function_exists('Drupal\Core\Asset\file_create_url')) { - - /** - * Temporary mock for file_create_url(), until that is moved into - * Component/Utility. - */ - function file_create_url($uri) { - return \Drupal\Tests\Core\Asset\file_create_url($uri); - } - -} -if (!function_exists('Drupal\Core\Asset\file_url_transform_relative')) { - - /** - * Temporary mock of file_url_transform_relative, until that is moved into - * Component/Utility. - */ - function file_url_transform_relative($uri) { - return \Drupal\Tests\Core\Asset\file_url_transform_relative($uri); - } - -} if (!function_exists('Drupal\Core\Asset\file_uri_scheme')) { function file_uri_scheme($uri) {