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