diff --git a/core/modules/config/src/Tests/ConfigImportAllTest.php b/core/modules/config/src/Tests/ConfigImportAllTest.php index 0a7216b..4cd4a3c 100644 --- a/core/modules/config/src/Tests/ConfigImportAllTest.php +++ b/core/modules/config/src/Tests/ConfigImportAllTest.php @@ -71,7 +71,6 @@ public function testInstallUninstall() { $fields = \Drupal::entityManager()->getStorage('field_config')->loadMultiple(); \Drupal::entityManager()->getStorage('field_config')->delete($fields); - // Purge the data. field_purge_batch(1000); system_list_reset(); diff --git a/core/modules/filter/src/Entity/FilterFormat.php b/core/modules/filter/src/Entity/FilterFormat.php index 944d5c7..efd0e73 100644 --- a/core/modules/filter/src/Entity/FilterFormat.php +++ b/core/modules/filter/src/Entity/FilterFormat.php @@ -7,6 +7,7 @@ namespace Drupal\filter\Entity; +use Drupal\Component\Utility\DiffArray; use Drupal\Core\Config\Entity\ConfigEntityBase; use Drupal\Core\Entity\EntityWithPluginBagsInterface; use Drupal\Core\Entity\EntityStorageInterface; @@ -97,7 +98,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. @@ -194,8 +195,17 @@ public function preSave(EntityStorageInterface $storage) { $this->name = trim($this->label()); - // @todo Do not save disabled filters whose properties are identical to - // all default properties. + // Remove disabled filters which have default configuration. + $this->filters = array_filter($this->filters, function($filter) { + if (!$filter['status']) { + // Compare the current settings to the default settings. If there are + // any customisations save them to configuration. + $default = \Drupal::service('plugin.manager.filter')->getDefinition($filter['id']); + $diff = DiffArray::diffAssocRecursive($filter, $default); + return !empty($diff); + } + return TRUE; + }); } /** 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'], '