getEntityTypeId() === 'file') {
- $values['url'] = file_create_url($entity->getFileUri());
+ elseif ($entity instanceof FileInterface) {
+ $values['url'] = $entity->createFileUrl(FALSE);
}
}
diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestDisabledElementsForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestDisabledElementsForm.php
index a756dc50b66..eef9efae5c8 100644
--- a/core/modules/system/tests/modules/form_test/src/Form/FormTestDisabledElementsForm.php
+++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestDisabledElementsForm.php
@@ -209,6 +209,7 @@ class FormTestDisabledElementsForm extends FormBase {
$form['image_button'] = [
'#type' => 'image_button',
'#value' => 'Image button',
+ '#src' => '',
'#disabled' => TRUE,
];
$form['button'] = [
diff --git a/core/modules/system/tests/src/Functional/System/RetrieveFileTest.php b/core/modules/system/tests/src/Functional/System/RetrieveFileTest.php
index baf49a5b256..95fab4c5c8a 100644
--- a/core/modules/system/tests/src/Functional/System/RetrieveFileTest.php
+++ b/core/modules/system/tests/src/Functional/System/RetrieveFileTest.php
@@ -26,7 +26,7 @@ class RetrieveFileTest extends BrowserTestBase {
$file_system->mkdir($sourcedir = 'public://' . $this->randomMachineName());
// cSpell:disable-next-line
$filename = 'Файл для тестирования ' . $this->randomMachineName();
- $url = file_create_url($sourcedir . '/' . $filename);
+ $url = \Drupal::service('file_url_generator')->generateAbsoluteString($sourcedir . '/' . $filename);
$retrieved_file = system_retrieve_file($url);
$this->assertFalse($retrieved_file, 'Non-existent file not fetched.');
diff --git a/core/modules/system/tests/src/Functional/System/ThemeTest.php b/core/modules/system/tests/src/Functional/System/ThemeTest.php
index b5173cbe26e..e46d7133a3f 100644
--- a/core/modules/system/tests/src/Functional/System/ThemeTest.php
+++ b/core/modules/system/tests/src/Functional/System/ThemeTest.php
@@ -75,21 +75,23 @@ class ThemeTest extends BrowserTestBase {
$file_relative = strtr($file->uri, ['public:/' => PublicStream::basePath()]);
$default_theme_path = 'core/themes/classy';
+ /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */
+ $file_url_generator = \Drupal::service('file_url_generator');
$supported_paths = [
// Raw stream wrapper URI.
$file->uri => [
'form' => StreamWrapperManager::getTarget($file->uri),
- 'src' => file_url_transform_relative(file_create_url($file->uri)),
+ 'src' => $file_url_generator->generateString($file->uri),
],
// Relative path within the public filesystem.
StreamWrapperManager::getTarget($file->uri) => [
'form' => StreamWrapperManager::getTarget($file->uri),
- 'src' => file_url_transform_relative(file_create_url($file->uri)),
+ 'src' => $file_url_generator->generateString($file->uri),
],
// Relative path to a public file.
$file_relative => [
'form' => $file_relative,
- 'src' => file_url_transform_relative(file_create_url($file->uri)),
+ 'src' => $file_url_generator->generateString($file->uri),
],
// Relative path to an arbitrary file.
'core/misc/druplicon.png' => [
@@ -198,7 +200,7 @@ class ThemeTest extends BrowserTestBase {
':rel' => 'home',
]
);
- $this->assertEquals(file_url_transform_relative(file_create_url($uploaded_filename)), $elements[0]->getAttribute('src'));
+ $this->assertEquals($file_url_generator->generateString($uploaded_filename), $elements[0]->getAttribute('src'));
$this->container->get('theme_installer')->install(['bartik']);
diff --git a/core/modules/system/tests/src/Functional/Theme/EngineTwigTest.php b/core/modules/system/tests/src/Functional/Theme/EngineTwigTest.php
index 470c28aab55..fbe9819474b 100644
--- a/core/modules/system/tests/src/Functional/Theme/EngineTwigTest.php
+++ b/core/modules/system/tests/src/Functional/Theme/EngineTwigTest.php
@@ -133,7 +133,9 @@ class EngineTwigTest extends BrowserTestBase {
*/
public function testTwigFileUrls() {
$this->drupalGet('/twig-theme-test/file-url');
- $filepath = file_url_transform_relative(file_create_url('core/modules/system/tests/modules/twig_theme_test/twig_theme_test.js'));
+ /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */
+ $file_url_generator = \Drupal::service('file_url_generator');
+ $filepath = $file_url_generator->generateString('core/modules/system/tests/modules/twig_theme_test/twig_theme_test.js');
$this->assertRaw('file_url: ' . $filepath . '
');
}
diff --git a/core/modules/taxonomy/tests/src/Functional/TaxonomyImageTest.php b/core/modules/taxonomy/tests/src/Functional/TaxonomyImageTest.php
index adfa53364cc..38f5be61cf6 100644
--- a/core/modules/taxonomy/tests/src/Functional/TaxonomyImageTest.php
+++ b/core/modules/taxonomy/tests/src/Functional/TaxonomyImageTest.php
@@ -106,13 +106,13 @@ class TaxonomyImageTest extends TaxonomyTestBase {
// Ensure a user that should be able to access the file can access it.
$this->drupalLogin($access_user);
- $this->drupalGet(file_create_url($image->getFileUri()));
+ $this->drupalGet($image->createFileUrl(FALSE));
$this->assertSession()->statusCodeEquals(200);
// Ensure a user that should not be able to access the file cannot access
// it.
$this->drupalLogin($no_access_user);
- $this->drupalGet(file_create_url($image->getFileUri()));
+ $this->drupalGet($image->createFileUrl(FALSE));
$this->assertSession()->statusCodeEquals(403);
}
diff --git a/core/modules/user/tests/src/Functional/UserPictureTest.php b/core/modules/user/tests/src/Functional/UserPictureTest.php
index b20c9b4c7eb..e83d2a214df 100644
--- a/core/modules/user/tests/src/Functional/UserPictureTest.php
+++ b/core/modules/user/tests/src/Functional/UserPictureTest.php
@@ -116,7 +116,7 @@ class UserPictureTest extends BrowserTestBase {
$image_style_id = $this->config('core.entity_view_display.user.user.compact')->get('content.user_picture.settings.image_style');
$style = ImageStyle::load($image_style_id);
- $image_url = file_url_transform_relative($style->buildUrl($file->getfileUri()));
+ $image_url = \Drupal::service('file_url_generator')->transformRelative($style->buildUrl($file->getfileUri()));
$alt_text = 'Profile picture for user ' . $this->webUser->getAccountName();
// Verify that the image is displayed on the node page.
diff --git a/core/tests/Drupal/KernelTests/Core/Asset/AttachedAssetsTest.php b/core/tests/Drupal/KernelTests/Core/Asset/AttachedAssetsTest.php
index 1c5a92affdf..221de328ca7 100644
--- a/core/tests/Drupal/KernelTests/Core/Asset/AttachedAssetsTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Asset/AttachedAssetsTest.php
@@ -35,6 +35,13 @@ class AttachedAssetsTest extends KernelTestBase {
*/
protected $renderer;
+ /**
+ * The file URL generator.
+ *
+ * @var \Drupal\Core\File\FileUrlGeneratorInterface
+ */
+ protected $fileUrlGenerator;
+
/**
* {@inheritdoc}
*/
@@ -48,6 +55,7 @@ class AttachedAssetsTest extends KernelTestBase {
$this->assetResolver = $this->container->get('asset.resolver');
$this->renderer = $this->container->get('renderer');
+ $this->fileUrlGenerator = $this->container->get('file_url_generator');
}
/**
@@ -88,8 +96,8 @@ class AttachedAssetsTest extends KernelTestBase {
$rendered_css = $this->renderer->renderPlain($css_render_array);
$rendered_js = $this->renderer->renderPlain($js_render_array);
$query_string = $this->container->get('state')->get('system.css_js_query_string') ?: '0';
- $this->assertStringContainsString('', $rendered_css, 'Rendering an external CSS file.');
- $this->assertStringContainsString('', $rendered_js, 'Rendering an external JavaScript file.');
+ $this->assertStringContainsString('', $rendered_css, 'Rendering an external CSS file.');
+ $this->assertStringContainsString('', $rendered_js, 'Rendering an external JavaScript file.');
}
/**
@@ -142,7 +150,7 @@ class AttachedAssetsTest extends KernelTestBase {
$js_render_array = \Drupal::service('asset.js.collection_renderer')->render($js);
$rendered_js = $this->renderer->renderPlain($js_render_array);
$expected_1 = '';
- $expected_2 = '';
+ $expected_2 = '';
$this->assertStringContainsString($expected_1, $rendered_js, 'Rendered external JavaScript with correct defer and random attributes.');
$this->assertStringContainsString($expected_2, $rendered_js, 'Rendered internal JavaScript with correct defer and random attributes.');
}
@@ -158,7 +166,7 @@ class AttachedAssetsTest extends KernelTestBase {
$js_render_array = \Drupal::service('asset.js.collection_renderer')->render($js);
$rendered_js = $this->renderer->renderPlain($js_render_array);
$expected_1 = '';
- $expected_2 = '';
+ $expected_2 = '';
$this->assertStringContainsString($expected_1, $rendered_js, 'Rendered external JavaScript with correct defer and random attributes.');
$this->assertStringContainsString($expected_2, $rendered_js, 'Rendered internal JavaScript with correct defer and random attributes.');
}
@@ -232,9 +240,9 @@ class AttachedAssetsTest extends KernelTestBase {
$js_render_array = \Drupal::service('asset.js.collection_renderer')->render($js);
$rendered_js = $this->renderer->renderPlain($js_render_array);
$query_string = $this->container->get('state')->get('system.css_js_query_string') ?: '0';
- $this->assertStringContainsString('', $rendered_js, 'The JS asset in common_test/js-header appears in the header.');
- $this->assertStringContainsString('', $rendered_js, 'The JS asset in common_test/js-header appears in the header.');
+ $this->assertStringContainsString('' . "\n";
- $expected_2 = "\n" . '' . "\n";
+ $expected_1 = "";
+ $expected_2 = "\n" . '' . "\n";
$this->assertStringContainsString($expected_1, $rendered_js, 'Rendered JavaScript within downlevel-hidden conditional comments.');
$this->assertStringContainsString($expected_2, $rendered_js, 'Rendered JavaScript within downlevel-revealed conditional comments.');
@@ -475,8 +483,8 @@ class AttachedAssetsTest extends KernelTestBase {
$js_render_array = \Drupal::service('asset.js.collection_renderer')->render($js);
$rendered_js = $this->renderer->renderPlain($js_render_array);
$query_string = $this->container->get('state')->get('system.css_js_query_string') ?: '0';
- $this->assertStringContainsString('', $rendered_css, 'CSS file with query string gets version query string correctly appended..');
- $this->assertStringContainsString('', $rendered_js, 'JavaScript file with query string gets version query string correctly appended.');
+ $this->assertStringContainsString('', $rendered_css, 'CSS file with query string gets version query string correctly appended..');
+ $this->assertStringContainsString('', $rendered_js, 'JavaScript file with query string gets version query string correctly appended.');
}
}
diff --git a/core/tests/Drupal/KernelTests/Core/File/FileSystemDeprecationTest.php b/core/tests/Drupal/KernelTests/Core/File/FileSystemDeprecationTest.php
new file mode 100644
index 00000000000..c383b0ab592
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/File/FileSystemDeprecationTest.php
@@ -0,0 +1,26 @@
+expectDeprecation('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');
+ $this->expectDeprecation('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');
+ $filepath = 'core/assets/vendor/jquery/jquery.min.js';
+ $url = file_url_transform_relative(file_create_url($filepath));
+ $this->assertNotEmpty($url);
+ }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/File/FileUrlGeneratorTest.php b/core/tests/Drupal/KernelTests/Core/File/FileUrlGeneratorTest.php
new file mode 100644
index 00000000000..af8e25e9b52
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/File/FileUrlGeneratorTest.php
@@ -0,0 +1,257 @@
+fileUrlGenerator = $this->container->get('file_url_generator');
+ }
+
+ /**
+ * Tests missing stream handler.
+ *
+ * @covers ::generate
+ */
+ public function testGenerateMissingStreamWrapper() {
+ $this->expectException(InvalidStreamWrapperException::class);
+ $result = $this->fileUrlGenerator->generate("foo://bar");
+ }
+
+ /**
+ * Tests missing stream handler.
+ *
+ * @covers ::generateString
+ */
+ public function testGenerateStringMissingStreamWrapper() {
+ $this->expectException(InvalidStreamWrapperException::class);
+ $result = $this->fileUrlGenerator->generateString("foo://bar");
+ }
+
+ /**
+ * Tests missing stream handler.
+ *
+ * @covers ::generateAbsoluteString
+ */
+ public function testGenerateAbsoluteStringMissingStreamWrapper() {
+ $this->expectException(InvalidStreamWrapperException::class);
+ $result = $this->fileUrlGenerator->generateAbsoluteString("foo://bar");
+ }
+
+ /**
+ * Tests the rewriting of shipped file URLs by hook_file_url_alter().
+ *
+ * @covers ::generateAbsoluteString
+ */
+ public function testShippedFileURL() {
+ // Test generating a URL to a shipped file (i.e. a file that is part of
+ // Drupal core, a module or a theme, for example a JavaScript file).
+
+ // Test alteration of file URLs to use a CDN.
+ \Drupal::state()->set('file_test.hook_file_url_alter', 'cdn');
+ $filepath = 'core/assets/vendor/jquery/jquery.min.js';
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath);
+ $this->assertEquals(FILE_URL_TEST_CDN_1 . '/' . $filepath, $url, 'Correctly generated a CDN URL for a shipped file.');
+ $filepath = 'core/misc/favicon.ico';
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath);
+ $this->assertEquals(FILE_URL_TEST_CDN_2 . '/' . $filepath, $url, 'Correctly generated a CDN URL for a shipped file.');
+
+ // Test alteration of file URLs to use root-relative URLs.
+ \Drupal::state()->set('file_test.hook_file_url_alter', 'root-relative');
+ $filepath = 'core/assets/vendor/jquery/jquery.min.js';
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath);
+ $this->assertEquals(base_path() . '/' . $filepath, $url, 'Correctly generated a root-relative URL for a shipped file.');
+ $filepath = 'core/misc/favicon.ico';
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath);
+ $this->assertEquals(base_path() . '/' . $filepath, $url, 'Correctly generated a root-relative URL for a shipped file.');
+
+ // Test alteration of file URLs to use protocol-relative URLs.
+ \Drupal::state()->set('file_test.hook_file_url_alter', 'protocol-relative');
+ $filepath = 'core/assets/vendor/jquery/jquery.min.js';
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath);
+ $this->assertEquals('/' . base_path() . '/' . $filepath, $url, 'Correctly generated a protocol-relative URL for a shipped file.');
+ $filepath = 'core/misc/favicon.ico';
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath);
+ $this->assertEquals('/' . base_path() . '/' . $filepath, $url, 'Correctly generated a protocol-relative URL for a shipped file.');
+
+ // Test alteration of file URLs with query strings and/or fragment.
+ \Drupal::state()->delete('file_test.hook_file_url_alter');
+ $filepath = 'core/misc/favicon.ico';
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath . '?foo');
+ $this->assertEquals($GLOBALS['base_url'] . '/' . $filepath . '?foo=', $url, 'Correctly generated URL. The query string is present.');
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath . '?foo=bar');
+ $this->assertEquals($GLOBALS['base_url'] . '/' . $filepath . '?foo=bar', $url, 'Correctly generated URL. The query string is present.');
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath . '#v1.2');
+ $this->assertEquals($GLOBALS['base_url'] . '/' . $filepath . '#v1.2', $url, 'Correctly generated URL. The fragment is present.');
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath . '?foo=bar#v1.2');
+ $this->assertEquals($GLOBALS['base_url'] . '/' . $filepath . '?foo=bar#v1.2', $url, 'Correctly generated URL. The query string amd fragment is present.');
+ }
+
+ /**
+ * Tests the rewriting of public managed file URLs by hook_file_url_alter().
+ *
+ * @covers ::generateAbsoluteString
+ */
+ public function testPublicManagedFileURL() {
+ // Test generating a URL to a managed file.
+
+ // Test alteration of file URLs to use a CDN.
+ \Drupal::state()->set('file_test.hook_file_url_alter', 'cdn');
+ $uri = $this->createUri();
+ $url = $this->fileUrlGenerator->generateAbsoluteString($uri);
+ $public_directory_path = \Drupal::service('stream_wrapper_manager')
+ ->getViaScheme('public')
+ ->getDirectoryPath();
+ /** @var \Drupal\Core\File\FileSystemInterface $file_system */
+ $file_system = \Drupal::service('file_system');
+ $this->assertEquals(FILE_URL_TEST_CDN_2 . '/' . $public_directory_path . '/' . $file_system->basename($uri), $url, 'Correctly generated a CDN URL for a created file.');
+
+ // Test alteration of file URLs to use root-relative URLs.
+ \Drupal::state()->set('file_test.hook_file_url_alter', 'root-relative');
+ $uri = $this->createUri();
+ $url = $this->fileUrlGenerator->generateAbsoluteString($uri);
+ $this->assertEquals(base_path() . '/' . $public_directory_path . '/' . $file_system->basename($uri), $url, 'Correctly generated a root-relative URL for a created file.');
+
+ // Test alteration of file URLs to use a protocol-relative URLs.
+ \Drupal::state()->set('file_test.hook_file_url_alter', 'protocol-relative');
+ $uri = $this->createUri();
+ $url = $this->fileUrlGenerator->generateAbsoluteString($uri);
+ $this->assertEquals('/' . base_path() . '/' . $public_directory_path . '/' . $file_system->basename($uri), $url, 'Correctly generated a protocol-relative URL for a created file.');
+ }
+
+ /**
+ * Tests generate absolute string with relative URL.
+ *
+ * @covers ::generateAbsoluteString
+ */
+ public function testRelativeFileURL() {
+ // Disable file_test.module's hook_file_url_alter() implementation.
+ \Drupal::state()->set('file_test.hook_file_url_alter', NULL);
+
+ // Create a mock Request for transformRelative().
+ $request = Request::create($GLOBALS['base_url']);
+ $this->container->get('request_stack')->push($request);
+ \Drupal::setContainer($this->container);
+
+ // Shipped file.
+ $filepath = 'core/assets/vendor/jquery/jquery.min.js';
+ $url = $this->fileUrlGenerator->generateAbsoluteString($filepath);
+ $this->assertSame(base_path() . $filepath, $this->fileUrlGenerator->transformRelative($url));
+
+ // Managed file.
+ $uri = $this->createUri();
+ $url = $this->fileUrlGenerator->generateAbsoluteString($uri);
+ $public_directory_path = \Drupal::service('stream_wrapper_manager')
+ ->getViaScheme('public')
+ ->getDirectoryPath();
+ $this->assertSame(base_path() . $public_directory_path . '/' . rawurlencode(\Drupal::service('file_system')
+ ->basename($uri)), $this->fileUrlGenerator->transformRelative($url));
+ }
+
+ /**
+ * @covers ::generate
+ *
+ * @dataProvider providerGenerateURI
+ */
+ public function testGenerateURI($filepath, $expected) {
+ // Disable file_test.module's hook_file_url_alter() implementation.
+ \Drupal::state()->set('file_test.hook_file_url_alter', NULL);
+
+ // Create a mock Request for transformRelative().
+ $request = Request::create($GLOBALS['base_url']);
+ $this->container->get('request_stack')->push($request);
+ \Drupal::setContainer($this->container);
+
+ // No schema file.
+ $url = $this->fileUrlGenerator->generate($filepath);
+ $this->assertEquals($expected, $url->getUri());
+ }
+
+ /**
+ * @covers ::generate
+ */
+ public function testGenerateURIWithSchema() {
+ // Disable file_test.module's hook_file_url_alter() implementation.
+ \Drupal::state()->set('file_test.hook_file_url_alter', NULL);
+
+ // Create a mock Request for transformRelative().
+ $request = Request::create($GLOBALS['base_url']);
+ $this->container->get('request_stack')->push($request);
+ \Drupal::setContainer($this->container);
+
+ $public_directory_path = \Drupal::service('stream_wrapper_manager')
+ ->getViaScheme('public')
+ ->getDirectoryPath();
+
+ $url = $this->fileUrlGenerator->generate('public://path/to/file.png');
+ $this->assertEquals('base:/' . $public_directory_path . '/path/to/file.png', $url->getUri());
+ }
+
+ /**
+ * Data provider.
+ */
+ public function providerGenerateURI() {
+ return [
+ 'schemaless' =>
+ [
+ '//core/assets/vendor/jquery/jquery.min.js',
+ '//core/assets/vendor/jquery/jquery.min.js',
+ ],
+ 'query string' =>
+ [
+ '//core/assets/vendor/jquery/jquery.min.js?foo',
+ '//core/assets/vendor/jquery/jquery.min.js?foo',
+ ],
+ 'query string and hashes' =>
+ [
+ '//core/assets/vendor/jquery/jquery.min.js?foo=bar#whizz',
+ '//core/assets/vendor/jquery/jquery.min.js?foo=bar#whizz',
+ ],
+ 'hashes' =>
+ [
+ '//core/assets/vendor/jquery/jquery.min.js#whizz',
+ '//core/assets/vendor/jquery/jquery.min.js#whizz',
+ ],
+ 'root-relative' =>
+ [
+ '/core/assets/vendor/jquery/jquery.min.js',
+ 'base:/core/assets/vendor/jquery/jquery.min.js',
+ ],
+ 'relative' =>
+ [
+ 'core/assets/vendor/jquery/jquery.min.js',
+ 'base:core/assets/vendor/jquery/jquery.min.js',
+ ],
+ 'external' =>
+ [
+ 'https://www.example.com/core/assets/vendor/jquery/jquery.min.js',
+ 'https://www.example.com/core/assets/vendor/jquery/jquery.min.js',
+ ],
+ ];
+ }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/File/StreamWrapperTest.php b/core/tests/Drupal/KernelTests/Core/File/StreamWrapperTest.php
index 845cebef9f3..6576c72c060 100644
--- a/core/tests/Drupal/KernelTests/Core/File/StreamWrapperTest.php
+++ b/core/tests/Drupal/KernelTests/Core/File/StreamWrapperTest.php
@@ -4,6 +4,7 @@ namespace Drupal\KernelTests\Core\File;
use Drupal\Core\DrupalKernel;
use Drupal\Core\File\FileSystemInterface;
+use Drupal\Core\File\FileUrlGeneratorInterface;
use Drupal\Core\Site\Settings;
use Drupal\Core\StreamWrapper\PublicStream;
use Symfony\Component\HttpFoundation\Request;
@@ -98,12 +99,14 @@ class StreamWrapperTest extends FileTestBase {
$config->set('default_scheme', 'private')->save();
$this->assertEquals('private://foo/bar.txt', file_build_uri('foo/bar.txt'), 'Got a valid URI from foo/bar.txt.');
- // Test file_create_url()
+ // Test FileUrlGeneratorInterface::generateString()
// TemporaryStream::getExternalUrl() uses Url::fromRoute(), which needs
// route information to work.
- $this->assertStringContainsString('system/temporary?file=test.txt', file_create_url('temporary://test.txt'), 'Temporary external URL correctly built.');
- $this->assertStringContainsString(Settings::get('file_public_path') . '/test.txt', file_create_url('public://test.txt'), 'Public external URL correctly built.');
- $this->assertStringContainsString('system/files/test.txt', file_create_url('private://test.txt'), 'Private external URL correctly built.');
+ $file_url_generator = $this->container->get('file_url_generator');
+ assert($file_url_generator instanceof FileUrlGeneratorInterface);
+ $this->assertStringContainsString('system/temporary?file=test.txt', $file_url_generator->generateString('temporary://test.txt'), 'Temporary external URL correctly built.');
+ $this->assertStringContainsString(Settings::get('file_public_path') . '/test.txt', $file_url_generator->generateString('public://test.txt'), 'Public external URL correctly built.');
+ $this->assertStringContainsString('system/files/test.txt', $file_url_generator->generateString('private://test.txt'), 'Private external URL correctly built.');
}
/**
diff --git a/core/tests/Drupal/KernelTests/Core/File/UrlRewritingTest.php b/core/tests/Drupal/KernelTests/Core/File/UrlRewritingTest.php
deleted file mode 100644
index fdabb1a3f83..00000000000
--- a/core/tests/Drupal/KernelTests/Core/File/UrlRewritingTest.php
+++ /dev/null
@@ -1,120 +0,0 @@
-set('file_test.hook_file_url_alter', 'cdn');
- $filepath = 'core/assets/vendor/jquery/jquery.min.js';
- $url = file_create_url($filepath);
- $this->assertEquals(FILE_URL_TEST_CDN_1 . '/' . $filepath, $url, 'Correctly generated a CDN URL for a shipped file.');
- $filepath = 'core/misc/favicon.ico';
- $url = file_create_url($filepath);
- $this->assertEquals(FILE_URL_TEST_CDN_2 . '/' . $filepath, $url, 'Correctly generated a CDN URL for a shipped file.');
-
- // Test alteration of file URLs to use root-relative URLs.
- \Drupal::state()->set('file_test.hook_file_url_alter', 'root-relative');
- $filepath = 'core/assets/vendor/jquery/jquery.min.js';
- $url = file_create_url($filepath);
- $this->assertEquals(base_path() . '/' . $filepath, $url, 'Correctly generated a root-relative URL for a shipped file.');
- $filepath = 'core/misc/favicon.ico';
- $url = file_create_url($filepath);
- $this->assertEquals(base_path() . '/' . $filepath, $url, 'Correctly generated a root-relative URL for a shipped file.');
-
- // Test alteration of file URLs to use protocol-relative URLs.
- \Drupal::state()->set('file_test.hook_file_url_alter', 'protocol-relative');
- $filepath = 'core/assets/vendor/jquery/jquery.min.js';
- $url = file_create_url($filepath);
- $this->assertEquals('/' . base_path() . '/' . $filepath, $url, 'Correctly generated a protocol-relative URL for a shipped file.');
- $filepath = 'core/misc/favicon.ico';
- $url = file_create_url($filepath);
- $this->assertEquals('/' . base_path() . '/' . $filepath, $url, 'Correctly generated a protocol-relative URL for a shipped file.');
-
- // Test alteration of file URLs with query strings and/or fragment.
- \Drupal::state()->delete('file_test.hook_file_url_alter');
- $filepath = 'core/misc/favicon.ico';
- $url = file_create_url($filepath . '?foo');
- $this->assertEquals($GLOBALS['base_url'] . '/' . $filepath . '?foo=', $url, 'Correctly generated URL. The query string is present.');
- $url = file_create_url($filepath . '?foo=bar');
- $this->assertEquals($GLOBALS['base_url'] . '/' . $filepath . '?foo=bar', $url, 'Correctly generated URL. The query string is present.');
- $url = file_create_url($filepath . '#v1.2');
- $this->assertEquals($GLOBALS['base_url'] . '/' . $filepath . '#v1.2', $url, 'Correctly generated URL. The fragment is present.');
- $url = file_create_url($filepath . '?foo=bar#v1.2');
- $this->assertEquals($GLOBALS['base_url'] . '/' . $filepath . '?foo=bar#v1.2', $url, 'Correctly generated URL. The query string amd fragment is present.');
- }
-
- /**
- * Tests the rewriting of public managed file URLs by hook_file_url_alter().
- */
- public function testPublicManagedFileURL() {
- // Test generating a URL to a managed file.
-
- // Test alteration of file URLs to use a CDN.
- \Drupal::state()->set('file_test.hook_file_url_alter', 'cdn');
- $uri = $this->createUri();
- $url = file_create_url($uri);
- $public_directory_path = \Drupal::service('stream_wrapper_manager')->getViaScheme('public')->getDirectoryPath();
- /** @var \Drupal\Core\File\FileSystemInterface $file_system */
- $file_system = \Drupal::service('file_system');
- $this->assertEquals(FILE_URL_TEST_CDN_2 . '/' . $public_directory_path . '/' . $file_system->basename($uri), $url, 'Correctly generated a CDN URL for a created file.');
-
- // Test alteration of file URLs to use root-relative URLs.
- \Drupal::state()->set('file_test.hook_file_url_alter', 'root-relative');
- $uri = $this->createUri();
- $url = file_create_url($uri);
- $this->assertEquals(base_path() . '/' . $public_directory_path . '/' . $file_system->basename($uri), $url, 'Correctly generated a root-relative URL for a created file.');
-
- // Test alteration of file URLs to use a protocol-relative URLs.
- \Drupal::state()->set('file_test.hook_file_url_alter', 'protocol-relative');
- $uri = $this->createUri();
- $url = file_create_url($uri);
- $this->assertEquals('/' . base_path() . '/' . $public_directory_path . '/' . $file_system->basename($uri), $url, 'Correctly generated a protocol-relative URL for a created file.');
- }
-
- /**
- * Tests file_url_transform_relative().
- */
- public function testRelativeFileURL() {
- // Disable file_test.module's hook_file_url_alter() implementation.
- \Drupal::state()->set('file_test.hook_file_url_alter', NULL);
-
- // Create a mock Request for file_url_transform_relative().
- $request = Request::create($GLOBALS['base_url']);
- $this->container->get('request_stack')->push($request);
- \Drupal::setContainer($this->container);
-
- // Shipped file.
- $filepath = 'core/assets/vendor/jquery/jquery.min.js';
- $url = file_create_url($filepath);
- $this->assertSame(base_path() . $filepath, file_url_transform_relative($url));
-
- // Managed file.
- $uri = $this->createUri();
- $url = file_create_url($uri);
- $public_directory_path = \Drupal::service('stream_wrapper_manager')->getViaScheme('public')->getDirectoryPath();
- $this->assertSame(base_path() . $public_directory_path . '/' . rawurlencode(\Drupal::service('file_system')->basename($uri)), file_url_transform_relative($url));
- }
-
-}
diff --git a/core/tests/Drupal/KernelTests/Core/File/UrlTransformRelativeTest.php b/core/tests/Drupal/KernelTests/Core/File/UrlTransformRelativeTest.php
index 1b2153b1da1..d6f2d00dc18 100644
--- a/core/tests/Drupal/KernelTests/Core/File/UrlTransformRelativeTest.php
+++ b/core/tests/Drupal/KernelTests/Core/File/UrlTransformRelativeTest.php
@@ -15,7 +15,7 @@ class UrlTransformRelativeTest extends KernelTestBase {
protected static $modules = ['file_test'];
/**
- * Tests file_url_transform_relative function.
+ * Tests transformRelative() function.
*
* @dataProvider providerFileUrlTransformRelative
*/
@@ -37,7 +37,7 @@ class UrlTransformRelativeTest extends KernelTestBase {
$request = Request::createFromGlobals();
\Drupal::requestStack()->push($request);
- $this->assertSame($expected, file_url_transform_relative($url));
+ $this->assertSame($expected, \Drupal::service('file_url_generator')->transformRelative($url));
}
public function providerFileUrlTransformRelative() {
diff --git a/core/tests/Drupal/KernelTests/Core/Theme/ImageTest.php b/core/tests/Drupal/KernelTests/Core/Theme/ImageTest.php
index 6e69db87331..ecbf860228a 100644
--- a/core/tests/Drupal/KernelTests/Core/Theme/ImageTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Theme/ImageTest.php
@@ -19,6 +19,13 @@ class ImageTest extends KernelTestBase {
*/
protected static $modules = ['system'];
+ /**
+ * The file URL generator.
+ *
+ * @var \Drupal\Core\File\FileUrlGeneratorInterface
+ */
+ protected $fileUrlGenerator;
+
/**
* The images to test with.
*
@@ -29,13 +36,15 @@ class ImageTest extends KernelTestBase {
protected function setUp(): void {
parent::setUp();
- // The code under test uses file_url_transform_relative(), which relies on
+ // The code under test uses transformRelative(), which relies on
// the Request containing the correct hostname. KernelTestBase doesn't set
// it, so push another request onto the stack to ensure it's correct.
$request = Request::create('/', 'GET', [], [], [], $_SERVER);
$this->container = \Drupal::service('kernel')->getContainer();
$this->container->get('request_stack')->push($request);
+ $this->fileUrlGenerator = $this->container->get('file_url_generator');
+
$this->testImages = [
'core/misc/druplicon.png',
'core/misc/loading.gif',
@@ -79,7 +88,9 @@ class ImageTest extends KernelTestBase {
$this->render($image);
// Make sure the src attribute has the correct value.
- $this->assertRaw(file_url_transform_relative(file_create_url($image['#uri'])), 'Correct output for an image with the src attribute.');
+ /** @var \Drupal\Core\File\FileUrlGeneratorInterface $this->fileUrlGenerator */
+ $this->fileUrlGenerator = $this->fileUrlGenerator;
+ $this->assertRaw($this->fileUrlGenerator->generateString($image['#uri']), 'Correct output for an image with the src attribute.');
}
/**
@@ -107,7 +118,7 @@ class ImageTest extends KernelTestBase {
$this->render($image);
// Make sure the srcset attribute has the correct value.
- $this->assertRaw(file_url_transform_relative(file_create_url($this->testImages[0])) . ' 1x, ' . file_url_transform_relative(file_create_url($this->testImages[1])) . ' 2x', 'Correct output for image with srcset attribute and multipliers.');
+ $this->assertRaw($this->fileUrlGenerator->transformRelative($this->fileUrlGenerator->generateString($this->testImages[0])) . ' 1x, ' . $this->fileUrlGenerator->transformRelative($this->fileUrlGenerator->generateString($this->testImages[1])) . ' 2x', 'Correct output for image with srcset attribute and multipliers.');
}
/**
@@ -139,7 +150,7 @@ class ImageTest extends KernelTestBase {
$this->render($image);
// Make sure the srcset attribute has the correct value.
- $this->assertRaw(file_url_transform_relative(file_create_url($this->testImages[0])) . ' ' . $widths[0] . ', ' . file_url_transform_relative(file_create_url($this->testImages[1])) . ' ' . $widths[1], 'Correct output for image with srcset attribute and width descriptors.');
+ $this->assertRaw($this->fileUrlGenerator->generateString($this->testImages[0]) . ' ' . $widths[0] . ', ' . $this->fileUrlGenerator->transformRelative($this->fileUrlGenerator->generateString($this->testImages[1])) . ' ' . $widths[1], 'Correct output for image with srcset attribute and width descriptors.');
}
}
diff --git a/core/tests/Drupal/KernelTests/Core/Theme/ThemeSettingsTest.php b/core/tests/Drupal/KernelTests/Core/Theme/ThemeSettingsTest.php
index 924005304d3..f5ce5cfec56 100644
--- a/core/tests/Drupal/KernelTests/Core/Theme/ThemeSettingsTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Theme/ThemeSettingsTest.php
@@ -85,7 +85,9 @@ class ThemeSettingsTest extends KernelTestBase {
theme_settings_convert_to_config($values, $config)->save();
// Tests logo path with scheme.
- $expected = file_url_transform_relative(file_create_url('public://logo_with_scheme.png'));
+ /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */
+ $file_url_generator = \Drupal::service('file_url_generator');
+ $expected = $file_url_generator->generateString('public://logo_with_scheme.png');
$this->assertEquals($expected, theme_get_setting('logo.url', 'stark'));
$values = [
diff --git a/core/tests/Drupal/Tests/BrowserHtmlDebugTrait.php b/core/tests/Drupal/Tests/BrowserHtmlDebugTrait.php
index b95164fc17a..4288598a592 100644
--- a/core/tests/Drupal/Tests/BrowserHtmlDebugTrait.php
+++ b/core/tests/Drupal/Tests/BrowserHtmlDebugTrait.php
@@ -123,8 +123,8 @@ trait BrowserHtmlDebugTrait {
$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 = $this->htmlOutputBaseUrl . '/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 39d65bfa4e9..cd1d6687962 100644
--- a/core/tests/Drupal/Tests/Core/Asset/CssCollectionRendererUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Asset/CssCollectionRendererUnitTest.php
@@ -3,6 +3,7 @@
namespace Drupal\Tests\Core\Asset;
use Drupal\Core\Asset\CssCollectionRenderer;
+use Drupal\Core\File\FileUrlGeneratorInterface;
use Drupal\Tests\UnitTestCase;
use Drupal\Core\State\StateInterface;
@@ -33,8 +34,15 @@ class CssCollectionRendererUnitTest extends UnitTestCase {
protected function setUp(): void {
parent::setUp();
$state = $this->prophesize(StateInterface::class);
+ $file_url_generator = $this->createMock(FileUrlGeneratorInterface::class);
+ $file_url_generator->expects($this->any())
+ ->method('generateString')
+ ->with($this->isType('string'))
+ ->willReturnCallback(function ($uri) {
+ return 'generated-relative-url:' . $uri;
+ });
$state->get('system.css_js_query_string', '0')->shouldBeCalledOnce()->willReturn(NULL);
- $this->renderer = new CssCollectionRenderer($state->reveal());
+ $this->renderer = new CssCollectionRenderer($state->reveal(), $file_url_generator);
$this->fileCssGroup = [
'group' => -100,
'type' => 'file',
@@ -110,7 +118,7 @@ class CssCollectionRendererUnitTest extends UnitTestCase {
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')) . '?', 'all'),
+ 0 => $create_link_element('generated-relative-url:public://css/file-all' . '?', 'all'),
],
],
// Single file CSS asset with custom attributes.
@@ -119,7 +127,7 @@ class CssCollectionRendererUnitTest extends UnitTestCase {
0 => ['group' => 0, 'type' => 'file', 'media' => 'all', 'preprocess' => TRUE, 'data' => 'public://css/file-all', 'browsers' => [], 'attributes' => $custom_attributes],
],
[
- 0 => $create_link_element(file_url_transform_relative(file_create_url('public://css/file-all')) . '?', 'all', [], $custom_attributes),
+ 0 => $create_link_element('generated-relative-url:public://css/file-all' . '?', 'all', [], $custom_attributes),
],
],
// 31 file CSS assets: expect 31 link elements.
@@ -158,37 +166,37 @@ class CssCollectionRendererUnitTest extends UnitTestCase {
30 => $create_file_css_asset('public://css/31.css'),
],
[
- 0 => $create_link_element(file_url_transform_relative(file_create_url('public://css/1.css')) . '?'),
- 1 => $create_link_element(file_url_transform_relative(file_create_url('public://css/2.css')) . '?'),
- 2 => $create_link_element(file_url_transform_relative(file_create_url('public://css/3.css')) . '?'),
- 3 => $create_link_element(file_url_transform_relative(file_create_url('public://css/4.css')) . '?'),
- 4 => $create_link_element(file_url_transform_relative(file_create_url('public://css/5.css')) . '?'),
- 5 => $create_link_element(file_url_transform_relative(file_create_url('public://css/6.css')) . '?'),
- 6 => $create_link_element(file_url_transform_relative(file_create_url('public://css/7.css')) . '?'),
- 7 => $create_link_element(file_url_transform_relative(file_create_url('public://css/8.css')) . '?'),
- 8 => $create_link_element(file_url_transform_relative(file_create_url('public://css/9.css')) . '?'),
- 9 => $create_link_element(file_url_transform_relative(file_create_url('public://css/10.css')) . '?'),
- 10 => $create_link_element(file_url_transform_relative(file_create_url('public://css/11.css')) . '?'),
- 11 => $create_link_element(file_url_transform_relative(file_create_url('public://css/12.css')) . '?'),
- 12 => $create_link_element(file_url_transform_relative(file_create_url('public://css/13.css')) . '?'),
- 13 => $create_link_element(file_url_transform_relative(file_create_url('public://css/14.css')) . '?'),
- 14 => $create_link_element(file_url_transform_relative(file_create_url('public://css/15.css')) . '?'),
- 15 => $create_link_element(file_url_transform_relative(file_create_url('public://css/16.css')) . '?'),
- 16 => $create_link_element(file_url_transform_relative(file_create_url('public://css/17.css')) . '?'),
- 17 => $create_link_element(file_url_transform_relative(file_create_url('public://css/18.css')) . '?'),
- 18 => $create_link_element(file_url_transform_relative(file_create_url('public://css/19.css')) . '?'),
- 19 => $create_link_element(file_url_transform_relative(file_create_url('public://css/20.css')) . '?'),
- 20 => $create_link_element(file_url_transform_relative(file_create_url('public://css/21.css')) . '?'),
- 21 => $create_link_element(file_url_transform_relative(file_create_url('public://css/22.css')) . '?'),
- 22 => $create_link_element(file_url_transform_relative(file_create_url('public://css/23.css')) . '?'),
- 23 => $create_link_element(file_url_transform_relative(file_create_url('public://css/24.css')) . '?'),
- 24 => $create_link_element(file_url_transform_relative(file_create_url('public://css/25.css')) . '?'),
- 25 => $create_link_element(file_url_transform_relative(file_create_url('public://css/26.css')) . '?'),
- 26 => $create_link_element(file_url_transform_relative(file_create_url('public://css/27.css')) . '?'),
- 27 => $create_link_element(file_url_transform_relative(file_create_url('public://css/28.css')) . '?'),
- 28 => $create_link_element(file_url_transform_relative(file_create_url('public://css/29.css')) . '?'),
- 29 => $create_link_element(file_url_transform_relative(file_create_url('public://css/30.css')) . '?'),
- 30 => $create_link_element(file_url_transform_relative(file_create_url('public://css/31.css')) . '?'),
+ 0 => $create_link_element('generated-relative-url:public://css/1.css' . '?'),
+ 1 => $create_link_element('generated-relative-url:public://css/2.css' . '?'),
+ 2 => $create_link_element('generated-relative-url:public://css/3.css' . '?'),
+ 3 => $create_link_element('generated-relative-url:public://css/4.css' . '?'),
+ 4 => $create_link_element('generated-relative-url:public://css/5.css' . '?'),
+ 5 => $create_link_element('generated-relative-url:public://css/6.css' . '?'),
+ 6 => $create_link_element('generated-relative-url:public://css/7.css' . '?'),
+ 7 => $create_link_element('generated-relative-url:public://css/8.css' . '?'),
+ 8 => $create_link_element('generated-relative-url:public://css/9.css' . '?'),
+ 9 => $create_link_element('generated-relative-url:public://css/10.css' . '?'),
+ 10 => $create_link_element('generated-relative-url:public://css/11.css' . '?'),
+ 11 => $create_link_element('generated-relative-url:public://css/12.css' . '?'),
+ 12 => $create_link_element('generated-relative-url:public://css/13.css' . '?'),
+ 13 => $create_link_element('generated-relative-url:public://css/14.css' . '?'),
+ 14 => $create_link_element('generated-relative-url:public://css/15.css' . '?'),
+ 15 => $create_link_element('generated-relative-url:public://css/16.css' . '?'),
+ 16 => $create_link_element('generated-relative-url:public://css/17.css' . '?'),
+ 17 => $create_link_element('generated-relative-url:public://css/18.css' . '?'),
+ 18 => $create_link_element('generated-relative-url:public://css/19.css' . '?'),
+ 19 => $create_link_element('generated-relative-url:public://css/20.css' . '?'),
+ 20 => $create_link_element('generated-relative-url:public://css/21.css' . '?'),
+ 21 => $create_link_element('generated-relative-url:public://css/22.css' . '?'),
+ 22 => $create_link_element('generated-relative-url:public://css/23.css' . '?'),
+ 23 => $create_link_element('generated-relative-url:public://css/24.css' . '?'),
+ 24 => $create_link_element('generated-relative-url:public://css/25.css' . '?'),
+ 25 => $create_link_element('generated-relative-url:public://css/26.css' . '?'),
+ 26 => $create_link_element('generated-relative-url:public://css/27.css' . '?'),
+ 27 => $create_link_element('generated-relative-url:public://css/28.css' . '?'),
+ 28 => $create_link_element('generated-relative-url:public://css/29.css' . '?'),
+ 29 => $create_link_element('generated-relative-url:public://css/30.css' . '?'),
+ 30 => $create_link_element('generated-relative-url:public://css/31.css' . '?'),
],
],
// 32 file CSS assets with the same properties, except for the 10th and
@@ -229,38 +237,38 @@ class CssCollectionRendererUnitTest extends UnitTestCase {
31 => $create_file_css_asset('public://css/32.css'),
],
[
- 0 => $create_link_element(file_url_transform_relative(file_create_url('public://css/1.css')) . '?'),
- 1 => $create_link_element(file_url_transform_relative(file_create_url('public://css/2.css')) . '?'),
- 2 => $create_link_element(file_url_transform_relative(file_create_url('public://css/3.css')) . '?'),
- 3 => $create_link_element(file_url_transform_relative(file_create_url('public://css/4.css')) . '?'),
- 4 => $create_link_element(file_url_transform_relative(file_create_url('public://css/5.css')) . '?'),
- 5 => $create_link_element(file_url_transform_relative(file_create_url('public://css/6.css')) . '?'),
- 6 => $create_link_element(file_url_transform_relative(file_create_url('public://css/7.css')) . '?'),
- 7 => $create_link_element(file_url_transform_relative(file_create_url('public://css/8.css')) . '?'),
- 8 => $create_link_element(file_url_transform_relative(file_create_url('public://css/9.css')) . '?'),
- 9 => $create_link_element(file_url_transform_relative(file_create_url('public://css/10.css')) . '?', 'screen'),
- 10 => $create_link_element(file_url_transform_relative(file_create_url('public://css/11.css')) . '?'),
- 11 => $create_link_element(file_url_transform_relative(file_create_url('public://css/12.css')) . '?'),
- 12 => $create_link_element(file_url_transform_relative(file_create_url('public://css/13.css')) . '?'),
- 13 => $create_link_element(file_url_transform_relative(file_create_url('public://css/14.css')) . '?'),
- 14 => $create_link_element(file_url_transform_relative(file_create_url('public://css/15.css')) . '?'),
- 15 => $create_link_element(file_url_transform_relative(file_create_url('public://css/16.css')) . '?'),
- 16 => $create_link_element(file_url_transform_relative(file_create_url('public://css/17.css')) . '?'),
- 17 => $create_link_element(file_url_transform_relative(file_create_url('public://css/18.css')) . '?'),
- 18 => $create_link_element(file_url_transform_relative(file_create_url('public://css/19.css')) . '?'),
- 19 => $create_link_element(file_url_transform_relative(file_create_url('public://css/20.css')) . '?', 'print'),
- 20 => $create_link_element(file_url_transform_relative(file_create_url('public://css/21.css')) . '?'),
- 21 => $create_link_element(file_url_transform_relative(file_create_url('public://css/22.css')) . '?'),
- 22 => $create_link_element(file_url_transform_relative(file_create_url('public://css/23.css')) . '?'),
- 23 => $create_link_element(file_url_transform_relative(file_create_url('public://css/24.css')) . '?'),
- 24 => $create_link_element(file_url_transform_relative(file_create_url('public://css/25.css')) . '?'),
- 25 => $create_link_element(file_url_transform_relative(file_create_url('public://css/26.css')) . '?'),
- 26 => $create_link_element(file_url_transform_relative(file_create_url('public://css/27.css')) . '?'),
- 27 => $create_link_element(file_url_transform_relative(file_create_url('public://css/28.css')) . '?'),
- 28 => $create_link_element(file_url_transform_relative(file_create_url('public://css/29.css')) . '?'),
- 29 => $create_link_element(file_url_transform_relative(file_create_url('public://css/30.css')) . '?'),
- 30 => $create_link_element(file_url_transform_relative(file_create_url('public://css/31.css')) . '?'),
- 31 => $create_link_element(file_url_transform_relative(file_create_url('public://css/32.css')) . '?'),
+ 0 => $create_link_element('generated-relative-url:public://css/1.css' . '?'),
+ 1 => $create_link_element('generated-relative-url:public://css/2.css' . '?'),
+ 2 => $create_link_element('generated-relative-url:public://css/3.css' . '?'),
+ 3 => $create_link_element('generated-relative-url:public://css/4.css' . '?'),
+ 4 => $create_link_element('generated-relative-url:public://css/5.css' . '?'),
+ 5 => $create_link_element('generated-relative-url:public://css/6.css' . '?'),
+ 6 => $create_link_element('generated-relative-url:public://css/7.css' . '?'),
+ 7 => $create_link_element('generated-relative-url:public://css/8.css' . '?'),
+ 8 => $create_link_element('generated-relative-url:public://css/9.css' . '?'),
+ 9 => $create_link_element('generated-relative-url:public://css/10.css' . '?', 'screen'),
+ 10 => $create_link_element('generated-relative-url:public://css/11.css' . '?'),
+ 11 => $create_link_element('generated-relative-url:public://css/12.css' . '?'),
+ 12 => $create_link_element('generated-relative-url:public://css/13.css' . '?'),
+ 13 => $create_link_element('generated-relative-url:public://css/14.css' . '?'),
+ 14 => $create_link_element('generated-relative-url:public://css/15.css' . '?'),
+ 15 => $create_link_element('generated-relative-url:public://css/16.css' . '?'),
+ 16 => $create_link_element('generated-relative-url:public://css/17.css' . '?'),
+ 17 => $create_link_element('generated-relative-url:public://css/18.css' . '?'),
+ 18 => $create_link_element('generated-relative-url:public://css/19.css' . '?'),
+ 19 => $create_link_element('generated-relative-url:public://css/20.css' . '?', 'print'),
+ 20 => $create_link_element('generated-relative-url:public://css/21.css' . '?'),
+ 21 => $create_link_element('generated-relative-url:public://css/22.css' . '?'),
+ 22 => $create_link_element('generated-relative-url:public://css/23.css' . '?'),
+ 23 => $create_link_element('generated-relative-url:public://css/24.css' . '?'),
+ 24 => $create_link_element('generated-relative-url:public://css/25.css' . '?'),
+ 25 => $create_link_element('generated-relative-url:public://css/26.css' . '?'),
+ 26 => $create_link_element('generated-relative-url:public://css/27.css' . '?'),
+ 27 => $create_link_element('generated-relative-url:public://css/28.css' . '?'),
+ 28 => $create_link_element('generated-relative-url:public://css/29.css' . '?'),
+ 29 => $create_link_element('generated-relative-url:public://css/30.css' . '?'),
+ 30 => $create_link_element('generated-relative-url:public://css/31.css' . '?'),
+ 31 => $create_link_element('generated-relative-url:public://css/32.css' . '?'),
],
],
];
@@ -294,57 +302,3 @@ class CssCollectionRendererUnitTest extends UnitTestCase {
}
}
-
-/**
- * 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 dba9fc2ad2b..782f3cd3839 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,23 @@ 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(): void {
parent::setUp();
-
- $this->optimizer = new CssOptimizer();
+ $this->fileUrlGenerator = $this->createMock(FileUrlGeneratorInterface::class);
+ $this->fileUrlGenerator->expects($this->any())
+ ->method('generateString')
+ ->with($this->isType('string'))
+ ->willReturnCallback(function ($uri) {
+ return 'generated-relative-url:' . $uri;
+ });
+ $this->optimizer = new CssOptimizer($this->fileUrlGenerator);
}
/**
@@ -58,7 +72,8 @@ class CssOptimizerUnitTest extends UnitTestCase {
// - 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 +87,7 @@ class CssOptimizerUnitTest extends UnitTestCase {
'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 +119,7 @@ class CssOptimizerUnitTest extends UnitTestCase {
'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
@@ -267,58 +282,10 @@ class CssOptimizerUnitTest extends UnitTestCase {
}
/**
- * 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) {
diff --git a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
index cd367d128b7..a4c2c5b68b5 100644
--- a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
+++ b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
@@ -2,6 +2,7 @@
namespace Drupal\Tests\Core\Template;
+use Drupal\Core\File\FileUrlGeneratorInterface;
use Drupal\Core\GeneratedLink;
use Drupal\Core\Render\RenderableInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
@@ -60,6 +61,13 @@ class TwigExtensionTest extends UnitTestCase {
*/
protected $systemUnderTest;
+ /**
+ * The file URL generator mock.
+ *
+ * @var \Drupal\Core\File\FileUrlGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+ */
+ protected $fileUrlGenerator;
+
/**
* {@inheritdoc}
*/
@@ -70,8 +78,9 @@ class TwigExtensionTest extends UnitTestCase {
$this->urlGenerator = $this->createMock('\Drupal\Core\Routing\UrlGeneratorInterface');
$this->themeManager = $this->createMock('\Drupal\Core\Theme\ThemeManagerInterface');
$this->dateFormatter = $this->createMock('\Drupal\Core\Datetime\DateFormatterInterface');
+ $this->fileUrlGenerator = $this->createMock(FileUrlGeneratorInterface::class);
- $this->systemUnderTest = new TwigExtension($this->renderer, $this->urlGenerator, $this->themeManager, $this->dateFormatter);
+ $this->systemUnderTest = new TwigExtension($this->renderer, $this->urlGenerator, $this->themeManager, $this->dateFormatter, $this->fileUrlGenerator);
}
/**
@@ -167,6 +176,22 @@ class TwigExtensionTest extends UnitTestCase {
$this->assertEquals('1978-11-19', $result);
}
+ /**
+ * Tests the file_url filter.
+ */
+ public function testFileUrl() {
+ $this->fileUrlGenerator->expects($this->once())
+ ->method('generateString')
+ ->with('public://picture.jpg')
+ ->willReturn('sites/default/files/picture.jpg');
+
+ $loader = new StringLoader();
+ $twig = new Environment($loader);
+ $twig->addExtension($this->systemUnderTest);
+ $result = $twig->render('{{ file_url(file) }}', ['file' => 'public://picture.jpg']);
+ $this->assertEquals('sites/default/files/picture.jpg', $result);
+ }
+
/**
* Tests the active_theme_path function.
*/