diff --git a/core/modules/image/image.install b/core/modules/image/image.install index fd14d03..7e82f62 100644 --- a/core/modules/image/image.install +++ b/core/modules/image/image.install @@ -61,3 +61,25 @@ function image_requirements($phase) { return $requirements; } + +/** + * Add allowed attributes to existing html filters. + */ +function image_update_8001() { + $config_factory = \Drupal::configFactory(); + foreach ($config_factory->listAll('filter.format') as $name) { + $config = $config_factory->getEditable($name); + if (!$config->get('filters.image_style.status')) { + continue; + } + $allowed_html = $config->get('filters.filter_html.settings.allowed_html'); + $matches = []; + if (!empty($allowed_html) && preg_match('/]*)>/', $allowed_html, $matches)) { + $new_attributes = array_filter(explode(' ', $matches[1])); + $new_attributes[] = 'data-image-style'; + $allowed_html = preg_replace('/]*)>/', '', $allowed_html); + $config->set('filters.filter_html.settings.allowed_html', $allowed_html); + $config->save(); + } + } +} diff --git a/core/modules/image/js/plugins/drupalimagestyle/plugin.js b/core/modules/image/js/plugins/drupalimagestyle/plugin.js index fd75f4b..8de686f 100644 --- a/core/modules/image/js/plugins/drupalimagestyle/plugin.js +++ b/core/modules/image/js/plugins/drupalimagestyle/plugin.js @@ -58,11 +58,13 @@ else if (element.attributes['data-cke-realelement']) { return; } - element = originalUpcast.call(this, element, data); // Parse the data-image-style attribute. data['data-image-style'] = element.attributes['data-image-style']; + // Upcast after parsing so correct element attributes are parsed. + element = originalUpcast.call(this, element, data); + return element; }; diff --git a/core/modules/image/src/Plugin/CKEditorPlugin/DrupalImageStyle.php b/core/modules/image/src/Plugin/CKEditorPlugin/DrupalImageStyle.php index 79f23c0..a2e0652 100644 --- a/core/modules/image/src/Plugin/CKEditorPlugin/DrupalImageStyle.php +++ b/core/modules/image/src/Plugin/CKEditorPlugin/DrupalImageStyle.php @@ -12,7 +12,7 @@ * * @CKEditorPlugin( * id = "drupalimagestyle", - * label = @Translation("Drupal image style"), + * label = @Translation("Image style"), * module = "ckeditor" * ) */ diff --git a/core/modules/image/src/Plugin/Filter/FilterImageStyle.php b/core/modules/image/src/Plugin/Filter/FilterImageStyle.php index 7de068f..fac9f80 100644 --- a/core/modules/image/src/Plugin/Filter/FilterImageStyle.php +++ b/core/modules/image/src/Plugin/Filter/FilterImageStyle.php @@ -20,7 +20,7 @@ * Provides a filter to render inline images as image styles. * * @Filter( - * id = "filter_imagestyle", + * id = "image_style", * module = "image", * title = @Translation("Display image styles"), * description = @Translation("Uses the data-image-style attribute on <img> tags to display image styles."), @@ -52,7 +52,7 @@ class FilterImageStyle extends FilterBase implements ContainerFactoryPluginInter protected $renderer; /** - * Constructs a Drupal\Component\Plugin\PluginBase object. + * Constructs a Drupal\image\Plugin\Filter\FilterImageStyle object. * * @param array $configuration * A configuration array containing information about the plugin instance. @@ -184,14 +184,17 @@ protected function getImageInfo($file_uuid) { * The attributes array. */ protected function prepareImageAttributes(\DOMElement $dom_element) { - // Make sure all non-regenerated attributes are retained. + // Remove attributes that are no longer needed. $dom_element->removeAttribute('data-entity-type'); $dom_element->removeAttribute('data-entity-uuid'); $dom_element->removeAttribute('data-image-style'); + + // Remove attributes that are generated by the image style. $dom_element->removeAttribute('width'); $dom_element->removeAttribute('height'); $dom_element->removeAttribute('src'); + // Make sure all non-regenerated attributes are retained. $attributes = []; for ($i = 0; $i < $dom_element->attributes->length; $i++) { $attr = $dom_element->attributes->item($i); @@ -216,9 +219,6 @@ protected function prepareImageAttributes(\DOMElement $dom_element) { */ protected function getImageStyleHtml($file_uuid, $image_style_id, \DOMElement $dom_element) { $image_info = $this->getImageInfo($file_uuid); - $image_uri = $image_info['uri']; - $image_width = $image_info['width']; - $image_height = $image_info['height']; // Remove attributes that will be generated by the image style. $attributes = $this->prepareImageAttributes($dom_element); @@ -227,9 +227,9 @@ protected function getImageStyleHtml($file_uuid, $image_style_id, \DOMElement $d $image = [ '#theme' => 'image_style', '#style_name' => $image_style_id, - '#uri' => $image_uri, - '#width' => $image_width, - '#height' => $image_height, + '#uri' => $image_info['uri'], + '#width' => $image_info['width'], + '#height' => $image_info['height'], '#attributes' => $attributes, ]; diff --git a/core/modules/image/tests/src/Unit/FilterImageStyleTest.php b/core/modules/image/tests/src/Unit/FilterImageStyleTest.php index b6af52f..622bb29 100644 --- a/core/modules/image/tests/src/Unit/FilterImageStyleTest.php +++ b/core/modules/image/tests/src/Unit/FilterImageStyleTest.php @@ -80,12 +80,12 @@ public function testProcessWithImage() { $original_img = '' . $original_alt .''; $original_text = '

' . $original_img . '

'; - $generated_src = 'styles/medium/public/inline-images/image.png'; - $generated_width = '200'; - $generated_height = '150'; + $expected_src = 'styles/medium/public/inline-images/image.png'; + $expected_width = '200'; + $expected_height = '150'; - $generated_img = '' . $original_alt .''; - $generated_text = '

' . $generated_img . '

'; + $expected_img = '' . $original_alt .''; + $expected_text = '

' . $expected_img . '

'; $this->filterImageStyle ->method('loadImageStyles') @@ -102,9 +102,9 @@ public function testProcessWithImage() { $this->equalTo($original_image_style), $this->anything() ) - ->willReturn($generated_img); + ->willReturn($expected_img); $output = $this->filterImageStyle->process($original_text, 'en'); - $this->assertEquals($generated_text, $output); + $this->assertEquals($expected_text, $output); } } diff --git a/core/modules/responsive_image/js/plugins/drupalresponsiveimagestyle/plugin.js b/core/modules/responsive_image/js/plugins/drupalresponsiveimagestyle/plugin.js index 8d44b39..0f3bba3 100644 --- a/core/modules/responsive_image/js/plugins/drupalresponsiveimagestyle/plugin.js +++ b/core/modules/responsive_image/js/plugins/drupalresponsiveimagestyle/plugin.js @@ -58,11 +58,13 @@ else if (element.attributes['data-cke-realelement']) { return; } - element = originalUpcast.call(this, element, data); // Parse the data-responsive-image-style attribute. data['data-responsive-image-style'] = element.attributes['data-responsive-image-style']; + // Upcast after parsing so correct element attributes are parsed. + element = originalUpcast.call(this, element, data); + return element; }; diff --git a/core/modules/responsive_image/responsive_image.install b/core/modules/responsive_image/responsive_image.install index 1a64048..062c45c 100644 --- a/core/modules/responsive_image/responsive_image.install +++ b/core/modules/responsive_image/responsive_image.install @@ -11,7 +11,7 @@ function responsive_image_update_8001() { $config_factory = \Drupal::configFactory(); foreach ($config_factory->listAll('filter.format') as $name) { $config = $config_factory->getEditable($name); - if (!$config->get('filters.filter_responsive_image_style.status')) { + if (!$config->get('filters.responsive_image_style.status')) { continue; } $allowed_html = $config->get('filters.filter_html.settings.allowed_html'); diff --git a/core/modules/responsive_image/src/Plugin/CKEditorPlugin/DrupalResponsiveImageStyle.php b/core/modules/responsive_image/src/Plugin/CKEditorPlugin/DrupalResponsiveImageStyle.php index 80fc8f9..e782427 100644 --- a/core/modules/responsive_image/src/Plugin/CKEditorPlugin/DrupalResponsiveImageStyle.php +++ b/core/modules/responsive_image/src/Plugin/CKEditorPlugin/DrupalResponsiveImageStyle.php @@ -1,10 +1,5 @@ removeAttribute('data-entity-type'); $dom_element->removeAttribute('data-entity-uuid'); $dom_element->removeAttribute('data-responsive-image-style'); + + // Remove attributes that are generated by the image style. $dom_element->removeAttribute('width'); $dom_element->removeAttribute('height'); $dom_element->removeAttribute('src'); // Responsive image styles should override image styles. - if ($dom_element->hasAttribute('data-image-style')) { - $dom_element->removeAttribute('data-image-style'); + if ($dom_element->hasAttribute('data-responsive-image-style')) { + $dom_element->removeAttribute('data-responsive-image-style'); } + // Make sure all non-regenerated attributes are retained. $attributes = []; for ($i = 0; $i < $dom_element->attributes->length; $i++) { $attr = $dom_element->attributes->item($i); @@ -226,9 +224,6 @@ protected function prepareResponsiveImageAttributes(\DOMElement $dom_element) { */ protected function getResponsiveImageStyleHtml($file_uuid, $responsive_image_style_id, \DOMElement $dom_element) { $image_info = $this->getImageInfo($file_uuid); - $image_uri = $image_info['uri']; - $image_width = $image_info['width']; - $image_height = $image_info['height']; // Remove attributes that will be generated by the image style. $attributes = $this->prepareResponsiveImageAttributes($dom_element); @@ -237,9 +232,9 @@ protected function getResponsiveImageStyleHtml($file_uuid, $responsive_image_sty $responsive_image = [ '#theme' => 'responsive_image', '#responsive_image_style_id' => $responsive_image_style_id, - '#uri' => $image_uri, - '#width' => $image_width, - '#height' => $image_height, + '#uri' => $image_info['uri'], + '#width' => $image_info['width'], + '#height' => $image_info['height'], '#attributes' => $attributes, ]; diff --git a/core/modules/responsive_image/tests/src/Unit/FilterResponsiveImageStyleTest.php b/core/modules/responsive_image/tests/src/Unit/FilterResponsiveImageStyleTest.php index a01c8ac..b6f8932 100644 --- a/core/modules/responsive_image/tests/src/Unit/FilterResponsiveImageStyleTest.php +++ b/core/modules/responsive_image/tests/src/Unit/FilterResponsiveImageStyleTest.php @@ -81,12 +81,12 @@ public function testProcessWithImage() { $original_img = '' . $original_alt .''; $original_text = '

' . $original_img . '

'; - $generated_src = 'styles/max_325x325/public/inline-images/image.png'; - $generated_srcset = 'styles/max_325x325/public/inline-images/image.png 325w, styles/max_650x650/public/inline-images/image.png 650w, styles/max_1300x1300/public/inline-images/image.png 1300w'; - $generated_sizes = '(min-width: 1290px) 325px, (min-width: 851px) 25vw, (min-width: 560px) 50vw, 100vw'; + $expected_src = 'styles/max_325x325/public/inline-images/image.png'; + $expected_srcset = 'styles/max_325x325/public/inline-images/image.png 325w, styles/max_650x650/public/inline-images/image.png 650w, styles/max_1300x1300/public/inline-images/image.png 1300w'; + $expected_sizes = '(min-width: 1290px) 325px, (min-width: 851px) 25vw, (min-width: 560px) 50vw, 100vw'; - $generated_img = '' . $original_alt .''; - $generated_text = '

' . $generated_img . '

'; + $expected_img = '' . $original_alt .''; + $expected_text = '

' . $expected_img . '

'; $this->filterResponsiveImageStyle ->method('loadResponsiveImageStyles') @@ -102,9 +102,9 @@ public function testProcessWithImage() { $this->equalTo($original_image_style), $this->anything() ) - ->willReturn($generated_img); + ->willReturn($expected_img); $output = $this->filterResponsiveImageStyle->process($original_text, 'en'); - $this->assertEquals($generated_text, $output); + $this->assertEquals($expected_text, $output); } } diff --git a/core/modules/system/system.install b/core/modules/system/system.install index e9a34de..b3a0ec1 100644 --- a/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -1645,27 +1645,5 @@ function system_update_8014() { } /** - * Add allowed attributes to existing html filters. - */ -function system_update_8015() { - $config_factory = \Drupal::configFactory(); - foreach ($config_factory->listAll('filter.format') as $name) { - $config = $config_factory->getEditable($name); - if (!$config->get('filters.filter_imagestyle.status')) { - continue; - } - $allowed_html = $config->get('filters.filter_html.settings.allowed_html'); - $matches = []; - if (!empty($allowed_html) && preg_match('/]*)>/', $allowed_html, $matches)) { - $new_attributes = array_filter(explode(' ', $matches[1])); - $new_attributes[] = 'data-image-style'; - $allowed_html = preg_replace('/]*)>/', '', $allowed_html); - $config->set('filters.filter_html.settings.allowed_html', $allowed_html); - $config->save(); - } - } -} - -/** * @} End of "addtogroup updates-8.0.0-rc". */