diff --git a/core/core.services.yml b/core/core.services.yml index c4c75937bcb7f481b87c51ea840a62071ebadfc8..10d512169036b0f368cc508ad5f5b405e6b1672d 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -1168,6 +1168,7 @@ services: alias: plugin.manager.element_info file.mime_type.guesser: class: Drupal\Core\File\MimeType\MimeTypeGuesser + arguments: ['@stream_wrapper_manager'] tags: - { name: service_collector, tag: mime_type_guesser, call: addGuesser } file.mime_type.guesser.extension: @@ -1175,6 +1176,14 @@ services: arguments: ['@module_handler'] tags: - { name: mime_type_guesser } + file.mime_type.guesser.fileinfo: + class: Symfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser + tags: + - { name: mime_type_guesser, priority: 64 } + file.mime_type.guesser.filebinary: + class: Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser + tags: + - { name: mime_type_guesser, priority: 32 } renderer: class: Drupal\Core\Render\Renderer arguments: ['@controller_resolver', '@theme.manager', '@plugin.manager.element_info', '@request_stack', '@cache_factory', '@cache_contexts'] diff --git a/core/includes/file.inc b/core/includes/file.inc index d47fbc44f054c1930a4ae6311c39b155c1bc9a6e..066f0bd2acbbf8cb2067aad1dd2a41788d33e46c 100644 --- a/core/includes/file.inc +++ b/core/includes/file.inc @@ -1150,32 +1150,6 @@ function file_upload_max_size() { return $max_size; } -/** - * Determines an Internet Media Type or MIME type from a filename. - * - * @param $uri - * A string containing the URI, path, or filename. - * @param $mapping - * An optional map of extensions to their mimetypes, in the form: - * - 'mimetypes': a list of mimetypes, keyed by an identifier, - * - 'extensions': the mapping itself, an associative array in which the key - * is the extension (lowercase) and the value is the mimetype identifier. - * - * @return - * The internet media type registered for the extension or - * application/octet-stream for unknown extensions. - * - * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0. Calls are - * passed on to a new file.mime_type.guesser service, and the $mapping - * parameter is ignored. Use - * \Drupal::service('file.mime_type.guesser')->guess($uri). - * - * @see \Drupal\Core\File\MimeType\ExtensionMimeTypeGuesser::guess() - */ -function file_get_mimetype($uri, $mapping = NULL) { - return \Drupal::service('file.mime_type.guesser')->guess($uri); -} - /** * Sets the permissions on a file or directory. * diff --git a/core/lib/Drupal/Core/File/MimeType/ExtensionMimeTypeGuesser.php b/core/lib/Drupal/Core/File/MimeType/ExtensionMimeTypeGuesser.php index 53712cae10085d35dcf4f0adc87a422040886f13..dda1c4e9312bfb00beb8338d995190c431ced3e9 100644 --- a/core/lib/Drupal/Core/File/MimeType/ExtensionMimeTypeGuesser.php +++ b/core/lib/Drupal/Core/File/MimeType/ExtensionMimeTypeGuesser.php @@ -16,12 +16,12 @@ class ExtensionMimeTypeGuesser implements MimeTypeGuesserInterface { /** - * Default MIME extension mapping. + * MIME extension mappings. * * @var array * Array of mimetypes correlated to the extensions that relate to them. */ - protected $defaultMapping = array( + protected $mapping = array( 'mimetypes' => array( 0 => 'application/andrew-inset', 1 => 'application/atom', @@ -864,41 +864,10 @@ class ExtensionMimeTypeGuesser implements MimeTypeGuesserInterface { ), ); - /** - * The MIME types mapping array after going through the module handler. - * - * @var array - */ - protected $mapping; - - /** - * The module handler. - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - - /** - * Constructs a new ExtensionMimeTypeGuesser. - * - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler. - */ - public function __construct(ModuleHandlerInterface $module_handler) { - $this->moduleHandler = $module_handler; - } - /** * {@inheritdoc} */ public function guess($path) { - if ($this->mapping === NULL) { - $mapping = $this->defaultMapping; - // Allow modules to alter the default mapping. - $this->moduleHandler->alter('file_mimetype_mapping', $mapping); - $this->mapping = $mapping; - } - $extension = ''; $file_parts = explode('.', drupal_basename($path)); @@ -920,14 +889,4 @@ public function guess($path) { return 'application/octet-stream'; } - /** - * Sets the mimetypes/extension mapping to use when guessing mimetype. - * - * @param array|null $mapping - * Passing a NULL mapping will cause guess() to use self::$defaultMapping. - */ - public function setMapping(array $mapping = NULL) { - $this->mapping = $mapping; - } - } diff --git a/core/lib/Drupal/Core/File/MimeType/MimeTypeGuesser.php b/core/lib/Drupal/Core/File/MimeType/MimeTypeGuesser.php index 20544638a090e335e9ebab9b0d0c6a48af5d79ea..ee3bc7defe1e6b7061aed33a6c4edacaa07ae448 100644 --- a/core/lib/Drupal/Core/File/MimeType/MimeTypeGuesser.php +++ b/core/lib/Drupal/Core/File/MimeType/MimeTypeGuesser.php @@ -7,6 +7,7 @@ namespace Drupal\Core\File\MimeType; +use Drupal\Core\StreamWrapper\StreamWrapperManager; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser as SymfonyMimeTypeGuesser; use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface; @@ -16,6 +17,13 @@ */ class MimeTypeGuesser implements MimeTypeGuesserInterface { + /** + * The stream wrapper manager. + * + * @var \Drupal\Core\StreamWrapper\StreamWrapperManager + */ + protected $streamWrapperManager; + /** * An array of arrays of registered guessers keyed by priority. * @@ -35,11 +43,21 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface { */ protected $sortedGuessers = NULL; + /** + * Constructs the mime type guesser service. + * + * @param \Drupal\Core\StreamWrapper\StreamWrapperManager $stream_wrapper_manager + * The stream wrapper manager. + */ + public function __construct(StreamWrapperManager $stream_wrapper_manager) { + $this->streamWrapperManager = $stream_wrapper_manager; + } + /** * {@inheritdoc} */ public function guess($path) { - if ($wrapper = file_stream_wrapper_get_instance_by_uri($path)) { + if ($wrapper = $this->streamWrapperManager->getViaUri($path)) { // Get the real path from the stream wrapper. $path = $wrapper->realpath(); } @@ -68,9 +86,15 @@ public function guess($path) { * @return $this */ public function addGuesser(MimeTypeGuesserInterface $guesser, $priority = 0) { - $this->guessers[$priority][] = $guesser; - // Mark sorted guessers for rebuild. - $this->sortedGuessers = NULL; + // Only add guessers which are supported. + // @see \Symfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser + // @see \Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser + $supported = method_exists($guesser, 'isSupported') ? $guesser->isSupported() : TRUE; + if ($supported) { + $this->guessers[$priority][] = $guesser; + // Mark sorted guessers for rebuild. + $this->sortedGuessers = NULL; + } return $this; } diff --git a/core/modules/file/file.module b/core/modules/file/file.module index 654530165cf340fc246736360864737153198b62..e572585ddf9516e96a911631cb8ac79b0284a53b 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -756,7 +756,7 @@ function file_save_upload($form_field_name, $validators = array(), $destination 'uri' => $file_info->getRealPath(), 'filesize' => $file_info->getSize(), ); - $values['filemime'] = file_get_mimetype($values['filename']); + $values['filemime'] = \Drupal::service('file.mime_type.guesser')->guess($values['uri']); $file = entity_create('file', $values); $extensions = ''; diff --git a/core/modules/file/src/Entity/File.php b/core/modules/file/src/Entity/File.php index 7cf5058b237ae42382bcf044f49a91d63c4d5d88..2dbbf31aa9260750a29b5372906287cc847eab3a 100644 --- a/core/modules/file/src/Entity/File.php +++ b/core/modules/file/src/Entity/File.php @@ -185,7 +185,7 @@ public static function preCreate(EntityStorageInterface $storage, array &$values // Automatically detect filemime if not set. if (!isset($values['filemime']) && isset($values['uri'])) { - $values['filemime'] = file_get_mimetype($values['uri']); + $values['filemime'] = \Drupal::service('file.mime_type.guesser')->guess($values['uri']); } } diff --git a/core/modules/file/src/Tests/FileManagedUnitTestBase.php b/core/modules/file/src/Tests/FileManagedUnitTestBase.php index 00448c515f6d734aa98fdbb556498dd6017a9201..d822aeaa60795dbb6e9f4a92cee482fd86dc9b3c 100644 --- a/core/modules/file/src/Tests/FileManagedUnitTestBase.php +++ b/core/modules/file/src/Tests/FileManagedUnitTestBase.php @@ -151,7 +151,8 @@ function assertSameFile(FileInterface $file1, FileInterface $file2) { * * @param $filepath * Optional string specifying the file path. If none is provided then a - * randomly named file will be created in the site's files directory. + * randomly named file with the extension .txt will be created in the site's + * files directory. * @param $contents * Optional contents to save into the file. If a NULL value is provided an * arbitrary string will be used. @@ -182,7 +183,8 @@ function createFile($filepath = NULL, $contents = NULL, $scheme = NULL) { * * @param string $filepath * Optional string specifying the file path. If none is provided then a - * randomly named file will be created in the site's files directory. + * randomly named file with the extension .txt will be created in the site's + * files directory. * @param string $contents * Optional contents to save into the file. If a NULL value is provided an * arbitrary string will be used. @@ -202,7 +204,7 @@ function createUri($filepath = NULL, $contents = NULL, $scheme = NULL) { if (!isset($scheme)) { $scheme = file_default_scheme(); } - $filepath = $scheme . '://' . $filepath; + $filepath = $scheme . '://' . $filepath . '.txt'; if (!isset($contents)) { $contents = "file_put_contents() doesn't seem to appreciate empty strings so let's put in some data."; diff --git a/core/modules/file/src/Tests/SaveDataTest.php b/core/modules/file/src/Tests/SaveDataTest.php index 8368e0b33ce1497896d1a2e4591eee3f3ae73f04..bf1255fe38ffff65cba17050008d67e9393b26f3 100644 --- a/core/modules/file/src/Tests/SaveDataTest.php +++ b/core/modules/file/src/Tests/SaveDataTest.php @@ -25,7 +25,7 @@ function testWithoutFilename() { $this->assertEqual(file_default_scheme(), file_uri_scheme($result->getFileUri()), "File was placed in Drupal's files directory."); $this->assertEqual($result->getFilename(), drupal_basename($result->getFileUri()), "Filename was set to the file's basename."); $this->assertEqual($contents, file_get_contents($result->getFileUri()), 'Contents of the file are correct.'); - $this->assertEqual($result->getMimeType(), 'application/octet-stream', 'A MIME type was set.'); + $this->assertEqual($result->getMimeType(), 'text/plain', 'A MIME type was set.'); $this->assertTrue($result->isPermanent(), "The file's status was set to permanent."); // Check that the correct hooks were called. @@ -74,7 +74,7 @@ function testExistingRename() { $this->assertEqual('public', file_uri_scheme($result->getFileUri()), "File was placed in Drupal's files directory."); $this->assertEqual($result->getFilename(), $existing->getFilename(), 'Filename was set to the basename of the source, rather than that of the renamed file.'); $this->assertEqual($contents, file_get_contents($result->getFileUri()), 'Contents of the file are correct.'); - $this->assertEqual($result->getMimeType(), 'application/octet-stream', 'A MIME type was set.'); + $this->assertEqual($result->getMimeType(), 'text/plain', 'A MIME type was set.'); $this->assertTrue($result->isPermanent(), "The file's status was set to permanent."); // Check that the correct hooks were called. @@ -102,7 +102,7 @@ function testExistingReplace() { $this->assertEqual('public', file_uri_scheme($result->getFileUri()), "File was placed in Drupal's files directory."); $this->assertEqual($result->getFilename(), $existing->getFilename(), 'Filename was set to the basename of the existing file, rather than preserving the original name.'); $this->assertEqual($contents, file_get_contents($result->getFileUri()), 'Contents of the file are correct.'); - $this->assertEqual($result->getMimeType(), 'application/octet-stream', 'A MIME type was set.'); + $this->assertEqual($result->getMimeType(), 'text/plain', 'A MIME type was set.'); $this->assertTrue($result->isPermanent(), "The file's status was set to permanent."); // Check that the correct hooks were called. diff --git a/core/modules/file/tests/file_test/file_test.module b/core/modules/file/tests/file_test/file_test.module index 6ee2ecc32170fccdce9c72c0de05012d02377567..8c12c563cbb38175d0aa14c14d6b20b7eb3a3ff3 100644 --- a/core/modules/file/tests/file_test/file_test.module +++ b/core/modules/file/tests/file_test/file_test.module @@ -283,21 +283,6 @@ function file_test_file_url_alter(&$uri) { } } -/** - * Implements hook_file_mimetype_mapping_alter(). - */ -function file_test_file_mimetype_mapping_alter(&$mapping) { - // Add new mappings. - $mapping['mimetypes']['file_test_mimetype_1'] = 'madeup/file_test_1'; - $mapping['mimetypes']['file_test_mimetype_2'] = 'madeup/file_test_2'; - $mapping['mimetypes']['file_test_mimetype_3'] = 'madeup/doc'; - $mapping['extensions']['file_test_1'] = 'file_test_mimetype_1'; - $mapping['extensions']['file_test_2'] = 'file_test_mimetype_2'; - $mapping['extensions']['file_test_3'] = 'file_test_mimetype_2'; - // Override existing mapping. - $mapping['extensions']['doc'] = 'file_test_mimetype_3'; -} - /** * Helper validator that returns the $errors parameter. */ diff --git a/core/modules/system/file.api.php b/core/modules/system/file.api.php index a4fd8e4c6106d905173e03c6f39257db31527877..21b62b3f78ba9a62022e24dba175aaed603bcf90 100644 --- a/core/modules/system/file.api.php +++ b/core/modules/system/file.api.php @@ -99,30 +99,6 @@ function hook_file_url_alter(&$uri) { } } -/** - * Alter MIME type mappings used to determine MIME type from a file extension. - * - * Invoked by \Drupal\Core\File\MimeType\ExtensionMimeTypeGuesser::guess(). It - * is used to allow modules to add to or modify the default mapping from - * \Drupal\Core\File\MimeType\ExtensionMimeTypeGuesser::$defaultMapping. - * - * @param $mapping - * An array of mimetypes correlated to the extensions that relate to them. - * The array has 'mimetypes' and 'extensions' elements, each of which is an - * array. - * - * @see \Drupal\Core\File\MimeType\ExtensionMimeTypeGuesser::guess() - * @see \Drupal\Core\File\MimeType\ExtensionMimeTypeGuesser::$defaultMapping - */ -function hook_file_mimetype_mapping_alter(&$mapping) { - // Add new MIME type 'drupal/info'. - $mapping['mimetypes']['example_info'] = 'drupal/info'; - // Add new extension '.info.yml' and map it to the 'drupal/info' MIME type. - $mapping['extensions']['info'] = 'example_info'; - // Override existing extension mapping for '.ogg' files. - $mapping['extensions']['ogg'] = 189; -} - /** * Alter archiver information declared by other modules. * diff --git a/core/modules/system/src/Form/ThemeSettingsForm.php b/core/modules/system/src/Form/ThemeSettingsForm.php index 79cf30505d40682c499c143b09efbe745dd10148..1e40d85848cee6decfaa7e0ffd2db2cb0a7ff5d9 100644 --- a/core/modules/system/src/Form/ThemeSettingsForm.php +++ b/core/modules/system/src/Form/ThemeSettingsForm.php @@ -12,6 +12,7 @@ use Drupal\Core\Render\Element; use Drupal\Core\StreamWrapper\PublicStream; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Drupal\Core\Cache\Cache; use Drupal\Core\Config\ConfigFactoryInterface; @@ -44,6 +45,13 @@ class ThemeSettingsForm extends ConfigFormBase { */ protected $editableConfig = []; + /** + * The mime type guesser. + * + * @var \Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface + */ + protected $mimeTypeGuesser; + /** * Constructs a ThemeSettingsForm object. * @@ -53,12 +61,15 @@ class ThemeSettingsForm extends ConfigFormBase { * The module handler instance to use. * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler * The theme handler. + * @param \Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface $mime_type_guesser + * The mime type guesser. */ - public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler) { + public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler, MimeTypeGuesserInterface $mime_type_guesser) { parent::__construct($config_factory); $this->moduleHandler = $module_handler; $this->themeHandler = $theme_handler; + $this->mimeTypeGuesser = $mime_type_guesser; } /** @@ -68,7 +79,8 @@ public static function create(ContainerInterface $container) { return new static( $container->get('config.factory'), $container->get('module_handler'), - $container->get('theme_handler') + $container->get('theme_handler'), + $container->get('file.mime_type.guesser') ); } @@ -446,7 +458,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { } if (empty($values['default_favicon']) && !empty($values['favicon_path'])) { - $values['favicon_mimetype'] = file_get_mimetype($values['favicon_path']); + $values['favicon_mimetype'] = $this->mimeTypeGuesser->guess($values['favicon_path']); } } diff --git a/core/modules/system/src/Tests/File/MimeTypeTest.php b/core/modules/system/src/Tests/File/MimeTypeTest.php deleted file mode 100644 index f09b60dd845fa325086e72d9b17cca0cdbe871df..0000000000000000000000000000000000000000 --- a/core/modules/system/src/Tests/File/MimeTypeTest.php +++ /dev/null @@ -1,94 +0,0 @@ - 'application/java-archive', - 'test.jpeg' => 'image/jpeg', - 'test.JPEG' => 'image/jpeg', - 'test.jpg' => 'image/jpeg', - 'test.jar.jpg' => 'image/jpeg', - 'test.jpg.jar' => 'application/java-archive', - 'test.pcf.Z' => 'application/x-font', - 'pcf.z' => 'application/octet-stream', - 'jar' => 'application/octet-stream', - 'some.junk' => 'application/octet-stream', - 'foo.file_test_1' => 'madeup/file_test_1', - 'foo.file_test_2' => 'madeup/file_test_2', - 'foo.doc' => 'madeup/doc', - 'test.ogg' => 'audio/ogg', - ); - - $guesser = $this->container->get('file.mime_type.guesser'); - // Test using default mappings. - foreach ($test_case as $input => $expected) { - // Test stream [URI]. - $output = $guesser->guess($prefix . $input); - $this->assertIdentical($output, $expected, format_string('Mimetype for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected))); - - // Test normal path equivalent - $output = $guesser->guess($input); - $this->assertIdentical($output, $expected, format_string('Mimetype (using default mappings) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected))); - } - - // Now test the extension gusser by passing in a custom mapping. - $mapping = array( - 'mimetypes' => array( - 0 => 'application/java-archive', - 1 => 'image/jpeg', - ), - 'extensions' => array( - 'jar' => 0, - 'jpg' => 1, - ) - ); - - $test_case = array( - 'test.jar' => 'application/java-archive', - 'test.jpeg' => 'application/octet-stream', - 'test.jpg' => 'image/jpeg', - 'test.jar.jpg' => 'image/jpeg', - 'test.jpg.jar' => 'application/java-archive', - 'test.pcf.z' => 'application/octet-stream', - 'pcf.z' => 'application/octet-stream', - 'jar' => 'application/octet-stream', - 'some.junk' => 'application/octet-stream', - 'foo.file_test_1' => 'application/octet-stream', - 'foo.file_test_2' => 'application/octet-stream', - 'foo.doc' => 'application/octet-stream', - 'test.ogg' => 'application/octet-stream', - ); - $extension_guesser = $this->container->get('file.mime_type.guesser.extension'); - $extension_guesser->setMapping($mapping); - - foreach ($test_case as $input => $expected) { - $output = $extension_guesser->guess($input); - $this->assertIdentical($output, $expected, format_string('Mimetype (using passed-in mappings) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected))); - } - } -} diff --git a/core/tests/Drupal/Tests/Core/File/ExtensionMimeTypeGuesserTest.php b/core/tests/Drupal/Tests/Core/File/ExtensionMimeTypeGuesserTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b1160de29664a3098f576dc3eb4c131333beadce --- /dev/null +++ b/core/tests/Drupal/Tests/Core/File/ExtensionMimeTypeGuesserTest.php @@ -0,0 +1,59 @@ +assertEquals($mime_type, $guesser->guess($path)); + } + + /** + * Provides data for ExtensionMimeTypeGuesserTest::testGuesser(). + */ + public function guesserDataProvider() { + return [ + ['test.jar', 'application/java-archive'], + ['test.jpeg', 'image/jpeg'], + ['test.JPEG', 'image/jpeg'], + ['test.jpg', 'image/jpeg'], + ['test.jar.jpg', 'image/jpeg'], + ['test.jpg.jar', 'application/java-archive'], + ['test.pcf.Z', 'application/x-font'], + ['pcf.z', 'application/octet-stream'], + ['jar', 'application/octet-stream'], + ['some.junk', 'application/octet-stream'], + ['foo.file_test_1', 'application/octet-stream'], + ['foo.file_test_2', 'application/octet-stream'], + ['foo.doc', 'application/msword'], + ['test.ogg', 'audio/ogg'], + ]; + } + +} + +} +namespace { + if (!function_exists('drupal_basename')) { + function drupal_basename($uri, $suffix = NULL) { + return basename($uri, $suffix); + } + } +} diff --git a/core/tests/Drupal/Tests/Core/File/MimeTypeGuesserTest.php b/core/tests/Drupal/Tests/Core/File/MimeTypeGuesserTest.php index a1bf9c2327cbaab93fe2fc6fcc591d6db3db4c65..87729bd59d86bf26f8342b4aa14240d3b69f7f6d 100644 --- a/core/tests/Drupal/Tests/Core/File/MimeTypeGuesserTest.php +++ b/core/tests/Drupal/Tests/Core/File/MimeTypeGuesserTest.php @@ -14,10 +14,39 @@ /** * @coversDefaultClass \Drupal\Core\File\MimeType\MimeTypeGuesser - * @group DrupalKernel + * @group File */ class MimeTypeGuesserTest extends UnitTestCase { + /** + * @covers ::guess + * @covers ::addGuesser + * @covers ::sortGuessers + */ + public function testGuess() { + $stream_wrapper_manager = $this->getMockBuilder('Drupal\Core\StreamWrapper\StreamWrapperManager') + ->disableOriginalConstructor() + ->getMock(); + $stream_wrapper_manager->expects($this->any()) + ->method('getViaUri') + ->willReturn(NULL); + $mime_guesser_service = new MimeTypeGuesser($stream_wrapper_manager); + $guesser_1 = $this->getMock('Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface'); + $guesser_1->expects($this->once()) + ->method('guess') + ->with('file.txt') + ->willReturn('text/plain'); + $mime_guesser_service->addGuesser($guesser_1); + $this->assertEquals('text/plain', $mime_guesser_service->guess('file.txt')); + $guesser_2 = $this->getMock('Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface'); + $guesser_2->expects($this->once()) + ->method('guess') + ->with('file.txt') + ->willReturn('text/x-diff'); + $mime_guesser_service->addGuesser($guesser_2, 10); + $this->assertEquals('text/x-diff', $mime_guesser_service->guess('file.txt')); + } + /** * @covers ::registerWithSymfonyGuesser * @@ -33,8 +62,11 @@ public function testSymfonyGuesserRegistration() { if (count($guessers)) { $this->assertNotInstanceOf('Drupal\Core\File\MimeType\MimeTypeGuesser', $guessers[0]); } + $stream_wrapper_manager = $this->getMockBuilder('Drupal\Core\StreamWrapper\StreamWrapperManager') + ->disableOriginalConstructor() + ->getMock(); $container = new ContainerBuilder(); - $container->set('file.mime_type.guesser', new MimeTypeGuesser()); + $container->set('file.mime_type.guesser', new MimeTypeGuesser($stream_wrapper_manager)); MimeTypeGuesser::registerWithSymfonyGuesser($container); $guessers = $this->readAttribute($symfony_guesser, 'guessers'); $this->assertInstanceOf('Drupal\Core\File\MimeType\MimeTypeGuesser', $guessers[0]);