? sites/default/files
? sites/default/settings.php
Index: CHANGELOG.txt
===================================================================
RCS file: /cvs/drupal/drupal/CHANGELOG.txt,v
retrieving revision 1.320
diff -u -p -r1.320 CHANGELOG.txt
--- CHANGELOG.txt	28 Jul 2009 12:13:46 -0000	1.320
+++ CHANGELOG.txt	28 Jul 2009 18:36:43 -0000
@@ -108,6 +108,9 @@ Drupal 7.0, xxxx-xx-xx (development vers
     * Rewrote file handling to use PHP stream wrappers to enable support for 
       both public and private files and to support pluggable storage mechanisms
       and access to remote resources (e.g. S3 storage or Flickr photos).
+    * The mime_extension_mapping variable has been removed. Modules that need to
+      alter the default MIME type extension mappings should implement
+      hook_file_mimetype_mapping_alter().
 - Image handling:
     * Improved image handling, including better support for add-on image
       libraries.
Index: includes/file.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/file.inc,v
retrieving revision 1.178
diff -u -p -r1.178 file.inc
--- includes/file.inc	27 Jul 2009 19:53:17 -0000	1.178
+++ includes/file.inc	28 Jul 2009 18:36:43 -0000
@@ -1776,13 +1776,12 @@ function file_upload_max_size() {
  *   file_default_mimetype_mapping()
  */
 function file_get_mimetype($filename, $mapping = NULL) {
-  if (!isset($mapping)) {
-    $mapping = variable_get('mime_extension_mapping', NULL);
-    if (!isset($mapping) && drupal_function_exists('file_default_mimetype_mapping')) {
-      // The default file map, defined in file.mimetypes.inc is quite big.
-      // We only load it when necessary.
-      $mapping = file_default_mimetype_mapping();
-    }
+  if (!isset($mapping) && drupal_function_exists('file_default_mimetype_mapping')) {
+    // The default file map, defined in file.mimetypes.inc is quite big.
+    // We only load it when necessary.
+    $mapping = file_default_mimetype_mapping();
+    // Allow modules to alter the default mapping.
+    drupal_alter('file_mimetype_mapping', $mapping);
   }
 
   $extension = '';
Index: modules/simpletest/tests/file.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/file.test,v
retrieving revision 1.37
diff -u -p -r1.37 file.test
--- modules/simpletest/tests/file.test	27 Jul 2009 19:53:18 -0000	1.37
+++ modules/simpletest/tests/file.test	28 Jul 2009 18:36:43 -0000
@@ -575,6 +575,8 @@ class FileSaveUploadTest extends FileHoo
     $this->assertTrue($max_fid_after > $this->maxFidBefore, t('A new file was created.'));
     $file1 = file_load($max_fid_after);
     $this->assertTrue($file1, t('Loaded the file.'));
+    // MIME type of the uploaded image may be either image/jpeg or image/png.
+    $this->assertEqual(substr($file1->filemime, 0, 5), 'image', t('A MIME type was set.'));
 
     // Reset the hook counters to get rid of the 'load' we just called.
     file_test_reset();
@@ -593,6 +595,8 @@ class FileSaveUploadTest extends FileHoo
 
     $file2 = file_load($max_fid_after);
     $this->assertTrue($file2);
+    // MIME type of the uploaded image may be either image/jpeg or image/png.
+    $this->assertEqual(substr($file2->filemime, 0, 5), 'image', t('A MIME type was set.'));
 
     // Load both files using file_load_multiple().
     $files = file_load_multiple(array($file1->fid, $file2->fid));
@@ -2007,6 +2011,10 @@ class FileNameMungingTest extends FileTe
  * Tests for file_get_mimetype().
  */
 class FileMimeTypeTest extends DrupalWebTestCase {
+  function setUp() {
+    parent::setUp('file_test');
+  }
+
   public static function getInfo() {
     return array(
       'name' => 'File mimetypes',
@@ -2030,16 +2038,17 @@ class FileMimeTypeTest extends DrupalWeb
       '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 using default mappings (not using 'mime_extension_mapping').
-    variable_del('mime_extension_mapping');
     foreach ($test_case as $input => $expected) {
       $output = file_get_mimetype($input);
       $this->assertIdentical($output, $expected, t('Mimetype (using default mappings) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
     }
 
-    // Now test using mappings from the mime_extension_mapping variable.
+    // Now test passing in the map.
     $mapping = array(
       'mimetypes' => array(
         0 => 'application/java-archive',
@@ -2061,16 +2070,11 @@ class FileMimeTypeTest extends DrupalWeb
       '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',
     );
 
-    variable_set('mime_extension_mapping', $mapping);
-    foreach ($test_case as $input => $expected) {
-      $output = file_get_mimetype($input);
-      $this->assertIdentical($output, $expected, t('Mimetype (using mappings from variable) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
-    }
-
-    // Now test the same when passing in the map.
-    variable_del('mime_extension_mapping');
     foreach ($test_case as $input => $expected) {
       $output = file_get_mimetype($input, $mapping);
       $this->assertIdentical($output, $expected, t('Mimetype (using passed-in mappings) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
Index: modules/simpletest/tests/file_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/file_test.module,v
retrieving revision 1.11
diff -u -p -r1.11 file_test.module
--- modules/simpletest/tests/file_test.module	27 Jul 2009 19:53:18 -0000	1.11
+++ modules/simpletest/tests/file_test.module	28 Jul 2009 18:36:43 -0000
@@ -253,6 +253,21 @@ function file_test_file_delete($file) {
 }
 
 /**
+ * Implementation of 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 class for testing the stream wrapper registry.
  *
  * Dummy stream wrapper implementation (dummy://).
Index: modules/system/system.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v
retrieving revision 1.53
diff -u -p -r1.53 system.api.php
--- modules/system/system.api.php	28 Jul 2009 12:13:47 -0000	1.53
+++ modules/system/system.api.php	28 Jul 2009 18:36:43 -0000
@@ -2043,5 +2043,21 @@ function hook_profile_tasks() {
 }
 
 /**
+ * Alter the default MIME type extension mappings.
+ *
+ * @param $mapping
+ *   An array of MIME type extension mappings.
+ * @see file_default_mimetype_mapping()
+ */
+function hook_file_mimetype_mapping_alter(&$mapping) {
+  // Add new MIME type 'drupal/info'.
+  $mapping['mimetypes']['example_info'] = 'drupal/info';
+  // Add new extension '.info' 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;
+}
+
+/**
  * @} End of "addtogroup hooks".
  */
Index: modules/upload/upload.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/upload/upload.test,v
retrieving revision 1.21
diff -u -p -r1.21 upload.test
--- modules/upload/upload.test	13 Jul 2009 21:51:42 -0000	1.21
+++ modules/upload/upload.test	28 Jul 2009 18:36:43 -0000
@@ -205,12 +205,11 @@ class UploadTestCase extends DrupalWebTe
    * @param string $filename Name of file to verify.
    */
   function checkUploadedFile($filename) {
-    global $base_url;
     $file = file_directory_path() . '/' . $filename;
     $this->drupalGet(file_create_url($file), array('external' => TRUE));
-    $this->assertResponse(array(200), 'Uploaded ' . $filename . ' is accessible.');
+    $this->assertResponse(array(200), t('Uploaded %filename is accessible.', array('%filename' => $filename)));
     $this->assertTrue(strpos($this->drupalGetHeader('Content-Type'), 'text/plain') === 0, t('MIME type is text/plain.'));
-    $this->assertEqual(file_get_contents($file), $this->drupalGetContent(), 'Uploaded contents of ' . $filename . ' verified.');
+    $this->assertEqual(file_get_contents($file), $this->drupalGetContent(), t('Uploaded contents of %filename verified.', array('%filename' => $filename)));
     // Verify file actually is readable and writeable by PHP.
     $this->assertTrue(is_readable($file), t('Uploaded file is readable.'));
     $this->assertTrue(is_writeable($file), t('Uploaded file is writeable.'));
