diff --git a/core/modules/filter/src/Entity/FilterFormat.php b/core/modules/filter/src/Entity/FilterFormat.php index 944d5c7..6f2be4d 100644 --- a/core/modules/filter/src/Entity/FilterFormat.php +++ b/core/modules/filter/src/Entity/FilterFormat.php @@ -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 @@ public function preSave(EntityStorageInterface $storage) { parent::preSave($storage); $this->name = trim($this->label()); - - // @todo Do not save disabled filters whose properties are identical to - // all default properties. } /** diff --git a/core/modules/filter/src/FilterBag.php b/core/modules/filter/src/FilterBag.php index 970e7e8..1837a0c 100644 --- a/core/modules/filter/src/FilterBag.php +++ b/core/modules/filter/src/FilterBag.php @@ -107,4 +107,21 @@ public function sortHelper($aID, $bID) { return parent::sortHelper($aID, $bID); } + /** + * {@inheritdoc} + */ + public function getConfiguration() { + $configuration = parent::getConfiguration(); + // Remove configuration if it matches the defaults. + 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; + } + } diff --git a/core/modules/filter/src/Plugin/FilterBase.php b/core/modules/filter/src/Plugin/FilterBase.php index cfed8ac..5314ad7 100644 --- a/core/modules/filter/src/Plugin/FilterBase.php +++ b/core/modules/filter/src/Plugin/FilterBase.php @@ -107,7 +107,12 @@ public function getConfiguration() { * {@inheritdoc} */ public function defaultConfiguration() { - return array(); + return array( + 'provider' => $this->pluginDefinition['provider'], + 'status' => FALSE, + 'weight' => $this->pluginDefinition['weight'] ?: 0, + 'settings' => $this->pluginDefinition['settings'], + ); } /** diff --git a/core/modules/filter/src/Tests/FilterAPITest.php b/core/modules/filter/src/Tests/FilterAPITest.php index 9e52420..f575ec3 100644 --- a/core/modules/filter/src/Tests/FilterAPITest.php +++ b/core/modules/filter/src/Tests/FilterAPITest.php @@ -329,6 +329,50 @@ function testTypedDataAPI() { } /** + * 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' => '

', + ), + ), + ) + )); + $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. * * @param \Symfony\Component\Validator\ConstraintViolationListInterface $violations diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateFilterFormatTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateFilterFormatTest.php index c1529b8..807e4f5 100644 --- a/core/modules/migrate_drupal/src/Tests/d6/MigrateFilterFormatTest.php +++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateFilterFormatTest.php @@ -50,9 +50,9 @@ public function testFilterFormat() { $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'], '