diff --git a/core/modules/filter/src/Entity/FilterFormat.php b/core/modules/filter/src/Entity/FilterFormat.php index 4b00af1..edb9661 100644 --- a/core/modules/filter/src/Entity/FilterFormat.php +++ b/core/modules/filter/src/Entity/FilterFormat.php @@ -387,4 +387,29 @@ public function getHtmlRestrictions() { } } + /** + * {@inheritdoc} + */ + public function removeFilter($instance_id) { + unset($this->filters[$instance_id]); + $this->filterCollection->removeInstanceId($instance_id); + } + + /** + * {@inheritdoc} + */ + public function onDependencyRemoval(array $dependencies) { + $changed = FALSE; + $filters = $this->filters(); + foreach ($filters as $filter) { + if (in_array($filter->provider, $dependencies['module'])) { + $this->removeFilter($filter->getPluginId()); + $changed = TRUE; + } + } + if ($changed) { + $this->save(); + } + } + } diff --git a/core/modules/filter/src/FilterFormatInterface.php b/core/modules/filter/src/FilterFormatInterface.php index b5e75ce..b9c558b 100644 --- a/core/modules/filter/src/FilterFormatInterface.php +++ b/core/modules/filter/src/FilterFormatInterface.php @@ -84,4 +84,12 @@ public function getFilterTypes(); */ public function getHtmlRestrictions(); + /** + * Removes a filter. + * + * @param string $instance_id + * The ID of a filter plugin to be removed. + */ + public function removeFilter($instance_id); + } diff --git a/core/modules/filter/src/Tests/FilterAPITest.php b/core/modules/filter/src/Tests/FilterAPITest.php index 588546e..cda9971 100644 --- a/core/modules/filter/src/Tests/FilterAPITest.php +++ b/core/modules/filter/src/Tests/FilterAPITest.php @@ -386,4 +386,23 @@ public function assertFilterFormatViolation(ConstraintViolationListInterface $vi } $this->assertTrue($filter_format_violation_found, format_string('Validation violation for invalid value "%invalid_value" found', array('%invalid_value' => $invalid_value))); } + + /** + * Tests that dependency removal works. + * + * Uninstalling a module that provides a filter should not remove a filter + * format that uses the filter. + */ + public function testDependencyRemoval() { + $filter_format = entity_load('filter_format', 'filtered_html'); + $filter_config = array( + 'weight' => 10, + 'status' => 1, + ); + $filter_format->setFilterConfig('filter_test_restrict_tags_and_attributes', $filter_config); + $filter_format->save(); + $this->uninstallModule('filter_test'); + $filter_format = entity_load('filter_format', 'filtered_html'); + $this->assertEqual('Drupal\filter\Entity\FilterFormat', get_class($filter_format)); + } }