Index: modules/rdf/rdf.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/rdf/rdf.module,v
retrieving revision 1.17
diff -u -p -r1.17 rdf.module
--- modules/rdf/rdf.module	4 Jan 2010 18:03:12 -0000	1.17
+++ modules/rdf/rdf.module	8 Jan 2010 19:54:39 -0000
@@ -453,6 +453,14 @@ function rdf_preprocess_field(&$variable
   if (!empty($mapping) && !empty($mapping[$field_name])) {
     foreach ($element['#items'] as $delta => $item) {
       $variables['item_attributes_array'][$delta] = rdf_rdfa_attributes($mapping[$field_name], $item);
+      // If this field is an image, RDFa will not output correctly when the
+      // image is in a containing 'a' tag. If the field is a file, RDFa will
+      // not output correctly if the filetype icon comes before the link to
+      // the file. We correct this by adding a resource attribute to the div if
+      // this field has a File ID.
+      if (isset($item['fid'])) {
+        $variables['item_attributes_array'][$delta]['resource'] = file_create_url($item['uri']);
+      }
     }
   }
 }
Index: modules/rdf/rdf.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/rdf/rdf.test,v
retrieving revision 1.5
diff -u -p -r1.5 rdf.test
--- modules/rdf/rdf.test	8 Jan 2010 07:04:09 -0000	1.5
+++ modules/rdf/rdf.test	8 Jan 2010 19:54:39 -0000
@@ -75,6 +75,64 @@ class RdfMarkupTestCase extends DrupalWe
     $this->assertEqual($expected_value, $attributes['content']);
   }
 
+  /**
+   * Ensure that file fields have the correct resource as the object in RDFa
+   * when displayed as a teaser.
+   */
+  function testAttributesInMarkupFile() {
+    // Create a user to post the image.
+    $admin_user = $this->drupalCreateUser(array('edit own article content', 'revert revisions', 'administer content types'));
+    $this->drupalLogin($admin_user);
+        
+    $langcode = LANGUAGE_NONE;
+    $bundle_name = "article";
+    
+    // Create file field.
+    $file_field = 'file_test';
+    $edit = array(
+      '_add_new_field[label]' => $file_field,
+      '_add_new_field[field_name]' => $file_field,
+      '_add_new_field[type]' => 'file',
+      '_add_new_field[widget_type]' => 'file_generic',
+    );
+    $this->drupalPost('admin/structure/types/manage/' . $bundle_name . '/fields',  $edit, t('Save'));
+    // Set the RDF mapping for the new field.
+    $rdf_mapping = rdf_mapping_load('node', $bundle_name);
+    $rdf_mapping += array('field_' . $file_field => array('predicates' => array('rdfs:seeAlso'), 'type' => 'rel'));
+    $rdf_mapping_save = array('mapping' => $rdf_mapping, 'type' => 'node', 'bundle' => $bundle_name);
+    rdf_mapping_save($rdf_mapping_save);
+    
+    // Get the test file that simpletest provides.
+    $file = current($this->drupalGetTestFiles('text'));
+
+    // Prepare image variables.
+    $image_field = "field_image";
+    // Get the test image that simpletest provides.
+    $image = current($this->drupalGetTestFiles('image'));
+    
+    // Create an array for drupalPost with the field names as the keys and
+    // the uris for the test files as the values.
+    $edit = array("files[field_" . $file_field . "_" . $langcode . "_0]" => drupal_realpath($file->uri),
+                  "files[" . $image_field . "_" . $langcode . "_0]" => drupal_realpath($image->uri));
+    
+    // Create node and save, then edit node to upload files.
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    
+    // Get filenames and nid for comparison with HTML output.
+    $file_filename = $file->filename;
+    $image_filename = $image->filename;
+    $nid = $node->nid;
+    // Navigate to front page, where node is displayed in teaser form.
+    $this->drupalGet('node');
+    
+    // We only check to make sure that the resource attribute contains '.txt'
+    // instead of the full file name because the filename is altered on upload.
+    $file_rel = $this->xpath("//div[contains(@about, 'node/$nid')]//div[contains(@rel, 'rdfs:seeAlso') and contains(@resource, '.txt')]");
+    $this->assertTrue(!empty($file_rel), t('Attribute \'rel\' set on file field. Attribute \'resource\' is also set.'));
+    $image_rel = $this->xpath("//div[contains(@about, 'node/$nid')]//div[contains(@rel, 'rdfs:seeAlso') and contains(@resource, '$image_filename')]//img");
+    $this->assertTrue(!empty($image_rel), t('Attribute \'rel\' set on image field. Attribute \'resource\' is also set.'));
+  }
 }
 
 class RdfCrudTestCase extends DrupalWebTestCase {
