Commit 79a9a4f3 authored by Dries's avatar Dries

- Patch #582378 by sun, David_Rothstein: fixes for the filter system and additional tests.

parent ba790924
...@@ -393,7 +393,7 @@ function text_summary($text, $format = NULL, $size = NULL) { ...@@ -393,7 +393,7 @@ function text_summary($text, $format = NULL, $size = NULL) {
// parse errors. // parse errors.
if (isset($format)) { if (isset($format)) {
$filters = filter_list_format($format); $filters = filter_list_format($format);
if (isset($filters['php_code']) && strpos($text, '<?') !== FALSE) { if (isset($filters['php_code']) && $filters['php_code']->status && strpos($text, '<?') !== FALSE) {
return $text; return $text;
} }
} }
......
...@@ -135,7 +135,7 @@ function filter_admin_format_form($form, &$form_state, $format) { ...@@ -135,7 +135,7 @@ function filter_admin_format_form($form, &$form_state, $format) {
} }
// Table with filters // Table with filters
$filter_info = filter_get_filters(); $filter_info = filter_get_filters();
$filters = filter_list_format($format->format, TRUE); $filters = filter_list_format($format->format);
$form['filters'] = array('#type' => 'fieldset', $form['filters'] = array('#type' => 'fieldset',
'#title' => t('Filters'), '#title' => t('Filters'),
...@@ -260,12 +260,12 @@ function filter_admin_configure($form, &$form_state, $format) { ...@@ -260,12 +260,12 @@ function filter_admin_configure($form, &$form_state, $format) {
$form['#format'] = $format; $form['#format'] = $format;
foreach ($filters as $name => $filter) { foreach ($filters as $name => $filter) {
if (isset($filter_info[$name]['settings callback']) && function_exists($filter_info[$name]['settings callback'])) { if ($filter->status && isset($filter_info[$name]['settings callback']) && function_exists($filter_info[$name]['settings callback'])) {
// Pass along stored filter settings and default settings, but also the // Pass along stored filter settings and default settings, but also the
// format object and all filters to allow for complex implementations. // format object and all filters to allow for complex implementations.
$defaults = (isset($filter_info[$name]['default settings']) ? $filter_info[$name]['default settings'] : array()); $defaults = (isset($filter_info[$name]['default settings']) ? $filter_info[$name]['default settings'] : array());
$settings_form = $filter_info[$name]['settings callback']($form, $form_state, $filters[$name], $defaults, $format, $filters); $settings_form = $filter_info[$name]['settings callback']($form, $form_state, $filters[$name], $defaults, $format, $filters);
if (isset($settings_form) && is_array($settings_form)) { if (!empty($settings_form)) {
$form['settings'][$name] = array( $form['settings'][$name] = array(
'#type' => 'fieldset', '#type' => 'fieldset',
'#title' => check_plain($filter->title), '#title' => check_plain($filter->title),
...@@ -330,8 +330,10 @@ function filter_admin_order($form, &$form_state, $format = NULL) { ...@@ -330,8 +330,10 @@ function filter_admin_order($form, &$form_state, $format = NULL) {
$form['weights'] = array('#tree' => TRUE); $form['weights'] = array('#tree' => TRUE);
foreach ($filters as $id => $filter) { foreach ($filters as $id => $filter) {
$form['names'][$id] = array('#markup' => $filter->title); if ($filter->status) {
$form['weights'][$id] = array('#type' => 'weight', '#default_value' => $filter->weight); $form['names'][$id] = array('#markup' => $filter->title);
$form['weights'][$id] = array('#type' => 'weight', '#default_value' => $filter->weight);
}
} }
$form['format'] = array('#type' => 'hidden', '#value' => $format->format); $form['format'] = array('#type' => 'hidden', '#value' => $format->format);
$form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration')); $form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
......
...@@ -92,12 +92,12 @@ ...@@ -92,12 +92,12 @@
* *
* @code * @code
* function mymodule_filter_settings($form, &$form_state, $filter, $defaults) { * function mymodule_filter_settings($form, &$form_state, $filter, $defaults) {
* $form['mymodule_url_length'] = array( * $settings['mymodule_url_length'] = array(
* '#type' => 'textfield', * '#type' => 'textfield',
* '#title' => t('Maximum link text length'), * '#title' => t('Maximum link text length'),
* '#default_value' => isset($filter->settings['mymodule_url_length']) ? $filter->settings['mymodule_url_length'] : $defaults['mymodule_url_length'], * '#default_value' => isset($filter->settings['mymodule_url_length']) ? $filter->settings['mymodule_url_length'] : $defaults['mymodule_url_length'],
* ); * );
* return $form; * return $settings;
* } * }
* @endcode * @endcode
* *
......
...@@ -191,9 +191,8 @@ function filter_format_save(&$format) { ...@@ -191,9 +191,8 @@ function filter_format_save(&$format) {
$return = drupal_write_record('filter_format', $format, 'format'); $return = drupal_write_record('filter_format', $format, 'format');
} }
// Get the filters currently active in the format, to add new filters // Get the current filters in the format, to add new filters to the bottom.
// to the bottom. $current = filter_list_format($format->format);
$current = filter_list_format($format->format, TRUE);
$filter_info = filter_get_filters(); $filter_info = filter_get_filters();
if (!isset($format->filters)) { if (!isset($format->filters)) {
$format->filters = array(); $format->filters = array();
...@@ -506,11 +505,17 @@ function filter_format_allowcache($format_id) { ...@@ -506,11 +505,17 @@ function filter_format_allowcache($format_id) {
/** /**
* Retrieve a list of filters for a given text format. * Retrieve a list of filters for a given text format.
* *
* Note that this function returns all associated filters regardless of whether
* they are enabled or disabled. All functions working with the filter
* information outside of filter administration should test for $filter->status
* before performing actions with the filter.
*
* @param $format_id * @param $format_id
* The format ID. * The format ID to retrieve filters for.
* *
* @return * @return
* An array of filter objects assosiated to the given format. * An array of filter objects associated to the given text format, keyed by
* filter name.
*/ */
function filter_list_format($format_id) { function filter_list_format($format_id) {
$filters = &drupal_static(__FUNCTION__, array()); $filters = &drupal_static(__FUNCTION__, array());
...@@ -730,7 +735,7 @@ function _filter_tips($format_id, $long = FALSE) { ...@@ -730,7 +735,7 @@ function _filter_tips($format_id, $long = FALSE) {
$filters = filter_list_format($format->format); $filters = filter_list_format($format->format);
$tips[$format->name] = array(); $tips[$format->name] = array();
foreach ($filters as $name => $filter) { foreach ($filters as $name => $filter) {
if (isset($filter_info[$name]['tips callback']) && function_exists($filter_info[$name]['tips callback'])) { if ($filter->status && isset($filter_info[$name]['tips callback']) && function_exists($filter_info[$name]['tips callback'])) {
$tip = $filter_info[$name]['tips callback']($filter, $format, $long); $tip = $filter_info[$name]['tips callback']($filter, $format, $long);
$tips[$format->name][$name] = array('tip' => $tip, 'id' => $name); $tips[$format->name][$name] = array('tip' => $tip, 'id' => $name);
} }
...@@ -866,7 +871,7 @@ function filter_filter_info() { ...@@ -866,7 +871,7 @@ function filter_filter_info() {
* Settings callback for the HTML filter. * Settings callback for the HTML filter.
*/ */
function _filter_html_settings($form, &$form_state, $filter, $defaults) { function _filter_html_settings($form, &$form_state, $filter, $defaults) {
$form['allowed_html'] = array( $settings['allowed_html'] = array(
'#type' => 'textfield', '#type' => 'textfield',
'#title' => t('Allowed HTML tags'), '#title' => t('Allowed HTML tags'),
'#default_value' => isset($filter->settings['allowed_html']) ? $filter->settings['allowed_html'] : $defaults['allowed_html'], '#default_value' => isset($filter->settings['allowed_html']) ? $filter->settings['allowed_html'] : $defaults['allowed_html'],
...@@ -874,19 +879,19 @@ function _filter_html_settings($form, &$form_state, $filter, $defaults) { ...@@ -874,19 +879,19 @@ function _filter_html_settings($form, &$form_state, $filter, $defaults) {
'#maxlength' => 1024, '#maxlength' => 1024,
'#description' => t('Specify a list of tags which should not be stripped. (Note that JavaScript event attributes are always stripped.)'), '#description' => t('Specify a list of tags which should not be stripped. (Note that JavaScript event attributes are always stripped.)'),
); );
$form['filter_html_help'] = array( $settings['filter_html_help'] = array(
'#type' => 'checkbox', '#type' => 'checkbox',
'#title' => t('Display HTML help'), '#title' => t('Display HTML help'),
'#default_value' => isset($filter->settings['filter_html_help']) ? $filter->settings['filter_html_help'] : $defaults['filter_html_help'], '#default_value' => isset($filter->settings['filter_html_help']) ? $filter->settings['filter_html_help'] : $defaults['filter_html_help'],
'#description' => t('If enabled, Drupal will display some basic HTML help in the long filter tips.'), '#description' => t('If enabled, Drupal will display some basic HTML help in the long filter tips.'),
); );
$form['filter_html_nofollow'] = array( $settings['filter_html_nofollow'] = array(
'#type' => 'checkbox', '#type' => 'checkbox',
'#title' => t('Spam link deterrent'), '#title' => t('Spam link deterrent'),
'#default_value' => isset($filter->settings['filter_html_nofollow']) ? $filter->settings['filter_html_nofollow'] : $defaults['filter_html_nofollow'], '#default_value' => isset($filter->settings['filter_html_nofollow']) ? $filter->settings['filter_html_nofollow'] : $defaults['filter_html_nofollow'],
'#description' => t('If enabled, Drupal will add rel="nofollow" to all links, as a measure to reduce the effectiveness of spam links. Note: this will also prevent valid links from being followed by search engines, therefore it is likely most effective when enabled for anonymous users.'), '#description' => t('If enabled, Drupal will add rel="nofollow" to all links, as a measure to reduce the effectiveness of spam links. Note: this will also prevent valid links from being followed by search engines, therefore it is likely most effective when enabled for anonymous users.'),
); );
return $form; return $settings;
} }
/** /**
...@@ -1012,14 +1017,14 @@ function _filter_html_tips($filter, $format, $long = FALSE) { ...@@ -1012,14 +1017,14 @@ function _filter_html_tips($filter, $format, $long = FALSE) {
* Settings callback for URL filter. * Settings callback for URL filter.
*/ */
function _filter_url_settings($form, &$form_state, $filter, $defaults) { function _filter_url_settings($form, &$form_state, $filter, $defaults) {
$form['filter_url_length'] = array( $settings['filter_url_length'] = array(
'#type' => 'textfield', '#type' => 'textfield',
'#title' => t('Maximum link text length'), '#title' => t('Maximum link text length'),
'#default_value' => isset($filter->settings['filter_url_length']) ? $filter->settings['filter_url_length'] : $defaults['filter_url_length'], '#default_value' => isset($filter->settings['filter_url_length']) ? $filter->settings['filter_url_length'] : $defaults['filter_url_length'],
'#maxlength' => 4, '#maxlength' => 4,
'#description' => t('URLs longer than this number of characters will be truncated to prevent long strings that break formatting. The link itself will be retained; just the text portion of the link will be truncated.'), '#description' => t('URLs longer than this number of characters will be truncated to prevent long strings that break formatting. The link itself will be retained; just the text portion of the link will be truncated.'),
); );
return $form; return $settings;
} }
/** /**
......
...@@ -111,7 +111,7 @@ class FilterCRUDTestCase extends DrupalWebTestCase { ...@@ -111,7 +111,7 @@ class FilterCRUDTestCase extends DrupalWebTestCase {
$this->assertTrue(empty($format_filters), t('Database contains values for all filters in the saved format.')); $this->assertTrue(empty($format_filters), t('Database contains values for all filters in the saved format.'));
// Verify filter_list_format(). // Verify filter_list_format().
$filters = filter_list_format($format->format, TRUE); $filters = filter_list_format($format->format);
$format_filters = $format->filters; $format_filters = $format->filters;
foreach ($filters as $name => $filter) { foreach ($filters as $name => $filter) {
$t_args = array('%format' => $format->name, '%filter' => $name); $t_args = array('%format' => $format->name, '%filter' => $name);
...@@ -204,6 +204,22 @@ class FilterAdminTestCase extends DrupalWebTestCase { ...@@ -204,6 +204,22 @@ class FilterAdminTestCase extends DrupalWebTestCase {
$this->assertTrue(filter_access(filter_format_load($full), $this->admin_user), t('Admin user may use Full HTML.')); $this->assertTrue(filter_access(filter_format_load($full), $this->admin_user), t('Admin user may use Full HTML.'));
$this->assertFalse(filter_access(filter_format_load($full), $this->web_user), t('Web user may not use Full HTML.')); $this->assertFalse(filter_access(filter_format_load($full), $this->web_user), t('Web user may not use Full HTML.'));
// Verify that disabled filters are not displayed.
$edit = array();
$edit['filters[filter_url][status]'] = FALSE;
$this->drupalPost('admin/config/content/formats/' . $filtered, $edit, t('Save configuration'));
$this->drupalGet('admin/config/content/formats/' . $filtered . '/configure');
$this->assertNoText(t('Convert URLs into links'), t('Disabled URL filter cannot be configured.'));
$this->drupalGet('admin/config/content/formats/' . $filtered . '/order');
$this->assertNoText(t('Convert URLs into links'), t('Disabled URL filter cannot be re-ordered.'));
$edit = array();
$edit['filters[filter_url][status]'] = 1;
$this->drupalPost('admin/config/content/formats/' . $filtered, $edit, t('Save configuration'));
$this->drupalGet('admin/config/content/formats/' . $filtered . '/configure');
$this->assertText(t('Convert URLs into links'), t('Enabled URL filter can be configured.'));
$this->drupalGet('admin/config/content/formats/' . $filtered . '/order');
$this->assertText(t('Convert URLs into links'), t('Enabled URL filter can be re-ordered.'));
// Add an additional tag. // Add an additional tag.
$edit = array(); $edit = array();
$edit['settings[filter_html][allowed_html]'] = '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <quote>'; $edit['settings[filter_html][allowed_html]'] = '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <quote>';
...@@ -243,15 +259,13 @@ class FilterAdminTestCase extends DrupalWebTestCase { ...@@ -243,15 +259,13 @@ class FilterAdminTestCase extends DrupalWebTestCase {
$format = $this->getFormat($edit['name']); $format = $this->getFormat($edit['name']);
$this->assertNotNull($format, t('Format found in database.')); $this->assertNotNull($format, t('Format found in database.'));
if ($format !== NULL) { $this->assertFieldByName('roles[2]', '', t('Role found.'));
$this->assertFieldByName('roles[2]', '', t('Role found.')); $this->assertFieldByName('filters[' . $second_filter . '][status]', '', t('Line break filter found.'));
$this->assertFieldByName('filters[' . $second_filter . '][status]', '', t('Line break filter found.')); $this->assertFieldByName('filters[' . $first_filter . '][status]', '', t('Url filter found.'));
$this->assertFieldByName('filters[' . $first_filter . '][status]', '', t('Url filter found.'));
// Delete new filter. // Delete new filter.
$this->drupalPost('admin/config/content/formats/' . $format->format . '/delete', array(), t('Delete')); $this->drupalPost('admin/config/content/formats/' . $format->format . '/delete', array(), t('Delete'));
$this->assertRaw(t('Deleted text format %format.', array('%format' => $edit['name'])), t('Format successfully deleted.')); $this->assertRaw(t('Deleted text format %format.', array('%format' => $edit['name'])), t('Format successfully deleted.'));
}
// Allow authenticated users on full HTML. // Allow authenticated users on full HTML.
$format = filter_format_load($full); $format = filter_format_load($full);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment