Issue #2295129 by alexpott, tim.plunkett: Fixed Filter formats should not save plugin data when the plugin configuration matches defaults.

8.0.x
Nathaniel Catchpole 2014-07-30 11:27:11 +01:00
parent 9b274e1a26
commit 2ecdf8ceaa
6 changed files with 76 additions and 15 deletions

View File

@ -97,7 +97,7 @@ class FilterFormat extends ConfigEntityBase implements FilterFormatInterface, En
*
* An associative array of filters assigned to the text format, keyed by the
* instance ID of each filter and using the properties:
* - plugin_id: The plugin ID of the filter plugin instance.
* - id: The plugin ID of the filter plugin instance.
* - module: The name of the module providing the filter.
* - status: (optional) A Boolean indicating whether the filter is
* enabled in the text format. Defaults to FALSE.
@ -193,9 +193,6 @@ class FilterFormat extends ConfigEntityBase implements FilterFormatInterface, En
parent::preSave($storage);
$this->name = trim($this->label());
// @todo Do not save disabled filters whose properties are identical to
// all default properties.
}
/**

View File

@ -107,4 +107,26 @@ class FilterBag extends DefaultPluginBag {
return parent::sortHelper($aID, $bID);
}
/**
* {@inheritdoc}
*/
public function getConfiguration() {
$configuration = parent::getConfiguration();
// Remove configuration if it matches the defaults. In self::getAll(), we
// load all available filters, in addition to the enabled filters stored in
// configuration. In order to prevent those from bleeding through to the
// stored configuration, remove all filters that match the default values.
// Because filters are disabled by default, this will never remove the
// configuration of an enabled filter.
foreach ($configuration as $instance_id => $instance_config) {
$default_config = array();
$default_config['id'] = $instance_id;
$default_config += $this->get($instance_id)->defaultConfiguration();
if ($default_config === $instance_config) {
unset($configuration[$instance_id]);
}
}
return $configuration;
}
}

View File

@ -107,7 +107,12 @@ abstract class FilterBase extends PluginBase implements FilterInterface {
* {@inheritdoc}
*/
public function defaultConfiguration() {
return array();
return array(
'provider' => $this->pluginDefinition['provider'],
'status' => FALSE,
'weight' => $this->pluginDefinition['weight'] ?: 0,
'settings' => $this->pluginDefinition['settings'],
);
}
/**

View File

@ -328,6 +328,50 @@ class FilterAPITest extends EntityUnitTestBase {
$this->assertEqual($allowed_options, $expected_allowed_options);
}
/**
* Tests that FilterFormat::preSave() only saves customized plugins.
*/
public function testFilterFormatPreSave() {
/** @var \Drupal\filter\FilterFormatInterface $crazy_format */
$crazy_format = entity_create('filter_format', array(
'format' => 'crazy',
'name' => 'Crazy',
'weight' => 1,
'filters' => array(
'filter_html_escape' => array(
'weight' => 10,
'status' => 1,
),
'filter_html' => array(
'weight' => -10,
'status' => 1,
'settings' => array(
'allowed_html' => '<p>',
),
),
)
));
$crazy_format->save();
// Use config to directly load the configuration and check that only enabled
// or customized plugins are saved to configuration.
$filters = \Drupal::config('filter.format.crazy')->get('filters');
$this->assertEqual(array('filter_html_escape', 'filter_html'), array_keys($filters));
// Disable a plugin to ensure that disabled plugins with custom settings are
// stored in configuration.
$crazy_format->setFilterConfig('filter_html_escape', array('status' => FALSE));
$crazy_format->save();
$filters = \Drupal::config('filter.format.crazy')->get('filters');
$this->assertEqual(array('filter_html_escape', 'filter_html'), array_keys($filters));
// Set the settings as per default to ensure that disable plugins in this
// state are not stored in configuration.
$crazy_format->setFilterConfig('filter_html_escape', array('weight' => -10));
$crazy_format->save();
$filters = \Drupal::config('filter.format.crazy')->get('filters');
$this->assertEqual(array('filter_html'), array_keys($filters));
}
/**
* Checks if an expected violation exists in the given violations.
*

View File

@ -50,9 +50,9 @@ class MigrateFilterFormatTest extends MigrateDrupalTestBase {
$this->assertTrue($filters['filter_html']['status']);
// These should be false by default.
$this->assertFalse($filters['filter_html_escape']['status']);
$this->assertFalse($filters['filter_caption']['status']);
$this->assertFalse($filters['filter_html_image_secure']['status']);
$this->assertFalse(isset($filters['filter_html_escape']));
$this->assertFalse(isset($filters['filter_caption']));
$this->assertFalse(isset($filters['filter_html_image_secure']));
// Check variables migrated into filter.
$this->assertIdentical($filters['filter_html']['settings']['allowed_html'], '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>');

View File

@ -78,11 +78,4 @@ function standard_install() {
// Enable the admin theme.
\Drupal::config('node.settings')->set('use_admin_theme', '1')->save();
// @todo Remove in https://www.drupal.org/node/2295129.
// Resave the plain_text formatter so that default filter plugins and
// dependencies are calculated correctly. This resolves an issue caused by the
// fact that filter is installed before editor but the standard profile also
// enables the file module.
entity_load('filter_format', 'plain_text')->save();
}