### Eclipse Workspace Patch 1.0
#P drupal_test_7
Index: modules/field/modules/text/text.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.test,v
retrieving revision 1.1
diff -u -r1.1 text.test
--- modules/field/modules/text/text.test	3 Feb 2009 17:30:12 -0000	1.1
+++ modules/field/modules/text/text.test	24 Mar 2009 11:57:15 -0000
@@ -14,6 +14,9 @@
 
   function setUp() {
     parent::setUp('field', 'text', 'field_test');
+
+    $web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content'));
+    $this->drupalLogin($web_user);
   }
 
   // Test widgets.
@@ -32,6 +35,69 @@
    * Test textarea widget.
    */
 
+
+  /**
+   * Test 'formatted_text' setting.
+   */
+  function testTextfieldFormattedForm() {
+    $entity_type = 'test_entity';
+
+    $this->field_name = drupal_strtolower($this->randomName(). '_field_name');
+    $this->field = array('field_name' => $this->field_name, 'type' => 'text', );
+    field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'bundle' => FIELD_TEST_BUNDLE,
+      'label' => $this->randomName(). '_label',
+      'settings' => array(
+        'text_processing' => TRUE,
+      ),
+      'widget' => array(
+        'type' => 'text_textfield',
+      )
+    );
+    field_create_instance($this->instance);
+
+    // Allow the user to use the 'Full HTML' format.
+    db_update('filter_format')->fields(array('roles' => ',2,'))->condition('format', 2)->execute();
+
+    // Display creation form.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName($this->field_name . '[0][value]', '', t('Widget is displayed'));
+    $this->assertFieldByName($this->field_name . '[0][value_format]', '1', t('Format selector is displayed'));
+
+    // Submit with data that should be filtered.
+    $value = $this->randomName() . '<br />' . $this->randomName();
+    $edit = array(
+      $this->field_name . '[0][value]' => $value,
+      $this->field_name . '[0][value_format]' => 1,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), t('Entity was created'));
+
+    // Display the object.
+    $entity = field_test_entity_load($id);
+    $entity->content = field_attach_view($entity_type, $entity);
+    $this->content = drupal_render($entity->content);
+    $this->assertNoRaw($value, 'Filtered tags are not displayed');
+    $this->assertRaw(str_replace('<br />', '', $value), t('Filtered value is displayed correctly'));
+
+    // Edit and change the format to 'Full HTML'.
+    $edit = array(
+      $this->field_name . '[0][value_format]' => 2,
+    );
+    $this->drupalPost('test-entity/' . $id . '/edit', $edit, t('Save'));
+    $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)), t('Entity was updated'));
+
+    // Display the object.
+    $entity = field_test_entity_load($id);
+    $entity->content = field_attach_view($entity_type, $entity);
+    $this->content = drupal_render($entity->content);
+    $this->assertRaw($value, t('Value is displayed unfiltered'));
+  }
+
   // Test formatters.
   /**
    *
Index: modules/field/modules/text/text.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.module,v
retrieving revision 1.4
diff -u -r1.4 text.module
--- modules/field/modules/text/text.module	10 Mar 2009 09:45:31 -0000	1.4
+++ modules/field/modules/text/text.module	24 Mar 2009 11:57:15 -0000
@@ -103,13 +103,16 @@
   }
 }
 
+/**
+ * Implementation of hook_field_sanitize().
+ */
 function text_field_sanitize($obj_type, $object, $field, $instance, &$items) {
   global $language;
   foreach ($items as $delta => $item) {
     // TODO D7 : this code is really node-related.
     if (!empty($instance['settings']['text_processing'])) {
       $check = is_null($object) || (isset($object->build_mode) && $object->build_mode == NODE_BUILD_PREVIEW);
-      $text = isset($item['value']) ? check_markup($item['value'], $item['format'], isset($object->language) ? $object->language : $language, $check) : '';
+      $text = isset($item['value']) ? check_markup($item['value'], $item['format'], isset($object->language) ? $object->language : $language->language, $check) : '';
     }
     else {
       $text = check_plain($item['value']);
@@ -233,13 +236,12 @@
       '#columns' => array('value'), '#delta' => 0,
       '#process' => array('text_textfield_process'),
       '#autocomplete_path' => FALSE,
-      ),
+    ),
     'text_textarea' => array(
       '#input' => TRUE,
       '#columns' => array('value', 'format'), '#delta' => 0,
       '#process' => array('text_textarea_process'),
-      '#filter_value' => FILTER_FORMAT_DEFAULT,
-      ),
+    ),
   );
 }
 
@@ -322,10 +324,10 @@
   $element[$field_key]['#maxlength'] = !empty($field['settings']['max_length']) ? $field['settings']['max_length'] : NULL;
 
   if (!empty($instance['settings']['text_processing'])) {
-    $filter_key = $element['#columns'][1];
+    $filter_key = (count($element['#columns']) == 2) ? $element['#columns'][1] : 'format';
     $format = isset($element['#value'][$filter_key]) ? $element['#value'][$filter_key] : FILTER_FORMAT_DEFAULT;
-    $parents = array_merge($element['#parents'] , array($filter_key));
-    $element[$filter_key] = filter_form($format, 1, $parents);
+    $element[$field_key]['#text_format'] = $format;
+    $element['#element_validate'][] = 'text_field_widget_validate';
   }
 
   // Used so that hook_field('validate') knows where to flag an error.
@@ -368,10 +370,10 @@
   );
 
   if (!empty($instance['settings']['text_processing'])) {
-    $filter_key  = (count($element['#columns']) == 2) ? $element['#columns'][1] : 'format';
+    $filter_key = (count($element['#columns']) == 2) ? $element['#columns'][1] : 'format';
     $format = isset($element['#value'][$filter_key]) ? $element['#value'][$filter_key] : FILTER_FORMAT_DEFAULT;
-    $parents = array_merge($element['#parents'] , array($filter_key));
-    $element[$filter_key] = filter_form($format, 1, $parents);
+    $element[$field_key]['#text_format'] = $format;
+    $element['#element_validate'][] = 'text_field_widget_validate';
   }
 
   // Used so that hook_field('validate') knows where to flag an error.
@@ -383,6 +385,29 @@
 }
 
 /**
+ * FAPI validation of an individual text widget.
+ *
+ * The text format comes in as '[column 0]_format' in form values, we need it
+ * in '[column 1]'. We use a validate callback, because the format selector
+ * being added at process time makes a 'value_callback' unsuitable.
+ *
+ * TODO: remove this when http://drupal.org/node/412016 lands.
+ */
+function text_field_widget_validate($element, &$form_state) {
+  $field_key = $element['#columns'][0];
+  $filter_key = (count($element['#columns']) == 2) ? $element['#columns'][1] : 'format';
+
+  // If only one format is available, filter_form() sets it as a 'value' form
+  // element, which doesn't bubble up to this $element's #value, so we need
+  // to dig it from where it's nested.
+  $element['#value'][$filter_key] = $element[$field_key]['format']['format']['#value'];
+  // Remove the redundant '[column 0]_format' key is present.
+  unset($element['#value'][$field_key . '_format']);
+
+  form_set_value($element, $element['#value'], $form_state);
+}
+
+/**
  * FAPI theme for an individual text elements.
  *
  * The textfield or textarea is already rendered by the
