From 570bdb6aae3ec22513a5c480c3fc0ce722380113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Dorado?= <victor.dorado.asensio@gmail.com> Date: Sun, 15 Dec 2024 20:53:15 +0100 Subject: [PATCH 1/4] Apply patch from #25 --- core/modules/responsive_image/responsive_image.module | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/modules/responsive_image/responsive_image.module b/core/modules/responsive_image/responsive_image.module index 90b1fb26b012..e88064bc0967 100644 --- a/core/modules/responsive_image/responsive_image.module +++ b/core/modules/responsive_image/responsive_image.module @@ -368,7 +368,9 @@ function _responsive_image_build_source_attributes(array $variables, BreakpointI $source_attributes = new Attribute([ 'srcset' => implode(', ', array_unique($srcset)), ]); - $media_query = trim($breakpoint->getMediaQuery()); + if (!empty($breakpoint->getMediaQuery())) { + $media_query = trim((string) $breakpoint->getMediaQuery()); + } if (!empty($media_query)) { $source_attributes->setAttribute('media', $media_query); } -- GitLab From 7ca78c6b1ff05f98e4f05c574c0b993e8d63ae5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Dorado?= <victor.dorado.asensio@gmail.com> Date: Sun, 15 Dec 2024 20:54:34 +0100 Subject: [PATCH 2/4] Make Breakpoint::getMediaQuery() always return a trimmed string (proposed in #18) --- core/modules/breakpoint/src/Breakpoint.php | 5 ++++- core/modules/responsive_image/responsive_image.module | 4 +--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/modules/breakpoint/src/Breakpoint.php b/core/modules/breakpoint/src/Breakpoint.php index d66c96be3b38..1890d6de6a54 100644 --- a/core/modules/breakpoint/src/Breakpoint.php +++ b/core/modules/breakpoint/src/Breakpoint.php @@ -32,7 +32,10 @@ public function getWeight() { * {@inheritdoc} */ public function getMediaQuery() { - return $this->pluginDefinition['mediaQuery']; + if (!empty($this->pluginDefinition['mediaQuery'])) { + return trim((string) $this->pluginDefinition['mediaQuery']); + } + return ''; } /** diff --git a/core/modules/responsive_image/responsive_image.module b/core/modules/responsive_image/responsive_image.module index e88064bc0967..8b887ae28617 100644 --- a/core/modules/responsive_image/responsive_image.module +++ b/core/modules/responsive_image/responsive_image.module @@ -368,9 +368,7 @@ function _responsive_image_build_source_attributes(array $variables, BreakpointI $source_attributes = new Attribute([ 'srcset' => implode(', ', array_unique($srcset)), ]); - if (!empty($breakpoint->getMediaQuery())) { - $media_query = trim((string) $breakpoint->getMediaQuery()); - } + $media_query = $breakpoint->getMediaQuery(); if (!empty($media_query)) { $source_attributes->setAttribute('media', $media_query); } -- GitLab From b49859fc207731525d21013e0b3c47899e98342f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Dorado?= <victor.dorado.asensio@gmail.com> Date: Sun, 15 Dec 2024 21:07:00 +0100 Subject: [PATCH 3/4] Add tests --- .../tests/src/Unit/BreakpointTest.php | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/core/modules/breakpoint/tests/src/Unit/BreakpointTest.php b/core/modules/breakpoint/tests/src/Unit/BreakpointTest.php index af58e8aa1c8c..18604d414225 100644 --- a/core/modules/breakpoint/tests/src/Unit/BreakpointTest.php +++ b/core/modules/breakpoint/tests/src/Unit/BreakpointTest.php @@ -89,6 +89,39 @@ public function testGetMediaQuery(): void { $this->assertEquals('only screen and (min-width: 1220px)', $this->breakpoint->getMediaQuery()); } + /** + * @covers ::getMediaQuery + * @dataProvider providerGetMediaQueryReturnsTrimmedString + */ + public function testGetMediaQueryReturnsTrimmedString($defined, $expected): void { + $this->pluginDefinition['mediaQuery'] = $defined; + $this->setupBreakpoint(); + $this->assertEquals($expected, $this->breakpoint->getMediaQuery()); + } + + /** + * Test cases for ::testGetMediaQueryReturnsTrimmedString. + */ + public static function providerGetMediaQueryReturnsTrimmedString(): array { + $mediaQuery = 'only screen and (min-width: 1220px)'; + return [ + [$mediaQuery, $mediaQuery], + [" $mediaQuery", $mediaQuery], + ["$mediaQuery ", $mediaQuery], + [" $mediaQuery ", $mediaQuery], + [" $mediaQuery ", $mediaQuery], + ]; + } + + /** + * @covers ::getMediaQuery + */ + public function testGetMediaQueryReturnsStringWhenUndefined(): void { + $this->pluginDefinition['mediaQuery'] = NULL; + $this->setupBreakpoint(); + $this->assertSame('', $this->breakpoint->getMediaQuery()); + } + /** * @covers ::getMultipliers */ -- GitLab From 62ae848a2858fc6f5d48b2423c1f5dc2318e53b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Dorado?= <victor.dorado.asensio@gmail.com> Date: Sun, 2 Feb 2025 19:55:47 +0100 Subject: [PATCH 4/4] Improve the public interface of the Breakpoint class by adding a hasMediaQuery() method to it This way, class consumers won't have to check for `if(empty($breakpoint->getMediaQuery()))` --- core/modules/breakpoint/src/Breakpoint.php | 9 +++++++- .../breakpoint/src/BreakpointInterface.php | 8 +++++++ .../tests/src/Unit/BreakpointTest.php | 23 +++++++++++++++++++ .../responsive_image/responsive_image.module | 5 ++-- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/core/modules/breakpoint/src/Breakpoint.php b/core/modules/breakpoint/src/Breakpoint.php index 1890d6de6a54..843f6f77e0b8 100644 --- a/core/modules/breakpoint/src/Breakpoint.php +++ b/core/modules/breakpoint/src/Breakpoint.php @@ -32,12 +32,19 @@ public function getWeight() { * {@inheritdoc} */ public function getMediaQuery() { - if (!empty($this->pluginDefinition['mediaQuery'])) { + if ($this->hasMediaQuery()) { return trim((string) $this->pluginDefinition['mediaQuery']); } return ''; } + /** + * {@inheritdoc} + */ + public function hasMediaQuery(): bool { + return isset($this->pluginDefinition['mediaQuery']) && '' !== $this->pluginDefinition['mediaQuery']; + } + /** * {@inheritdoc} */ diff --git a/core/modules/breakpoint/src/BreakpointInterface.php b/core/modules/breakpoint/src/BreakpointInterface.php index 876e6357abae..8bd5e8de0ea5 100644 --- a/core/modules/breakpoint/src/BreakpointInterface.php +++ b/core/modules/breakpoint/src/BreakpointInterface.php @@ -31,6 +31,14 @@ public function getWeight(); */ public function getMediaQuery(); + /** + * Checks if the breakpoint has a media query. + * + * @return bool + * TRUE if the breakpoint has a media query, FALSE otherwise. + */ + public function hasMediaQuery(): bool; + /** * Returns the multipliers. * diff --git a/core/modules/breakpoint/tests/src/Unit/BreakpointTest.php b/core/modules/breakpoint/tests/src/Unit/BreakpointTest.php index 18604d414225..f20ff18fe631 100644 --- a/core/modules/breakpoint/tests/src/Unit/BreakpointTest.php +++ b/core/modules/breakpoint/tests/src/Unit/BreakpointTest.php @@ -89,6 +89,29 @@ public function testGetMediaQuery(): void { $this->assertEquals('only screen and (min-width: 1220px)', $this->breakpoint->getMediaQuery()); } + /** + * @covers ::hasMediaQuery + * @dataProvider providerHasMediaQuery + */ + public function testHasMediaQuery(?string $mediaQuery, bool $expectedValue): void { + $this->pluginDefinition['mediaQuery'] = $mediaQuery; + $this->setupBreakpoint(); + $this->assertEquals($expectedValue, $this->breakpoint->hasMediaQuery()); + } + + /** + * Test cases for ::testHasMediaQuery. + */ + public static function providerHasMediaQuery(): array { + return [ + 'Empty string' => ['', FALSE], + 'NULL' => [NULL, FALSE], + 'Not empty string' => ['not empty string', TRUE], + 'Not empty but "0" falsy string' => ['0', TRUE], + 'Not empty but "FALSE" falsy string' => ['FALSE', TRUE], + ]; + } + /** * @covers ::getMediaQuery * @dataProvider providerGetMediaQueryReturnsTrimmedString diff --git a/core/modules/responsive_image/responsive_image.module b/core/modules/responsive_image/responsive_image.module index 8b887ae28617..b8c2ca4dad7b 100644 --- a/core/modules/responsive_image/responsive_image.module +++ b/core/modules/responsive_image/responsive_image.module @@ -368,9 +368,8 @@ function _responsive_image_build_source_attributes(array $variables, BreakpointI $source_attributes = new Attribute([ 'srcset' => implode(', ', array_unique($srcset)), ]); - $media_query = $breakpoint->getMediaQuery(); - if (!empty($media_query)) { - $source_attributes->setAttribute('media', $media_query); + if ($breakpoint->hasMediaQuery()) { + $source_attributes->setAttribute('media', $breakpoint->getMediaQuery()); } if (count(array_unique($derivative_mime_types)) == 1) { $source_attributes->setAttribute('type', $derivative_mime_types[0]); -- GitLab