Skip to content

Commit 6d61ea1

Browse files
authored
fix: convert null signal value to blank in bindText (#22915)
* fix: convert null signal value to blank in bindText Element.setText(String) already converts null to blank. This change makes bindText to work in the same way with null signal value. Fixes: #22898 * formatting
1 parent 7979347 commit 6d61ea1

File tree

2 files changed

+46
-9
lines changed

2 files changed

+46
-9
lines changed

flow-server/src/main/java/com/vaadin/flow/dom/Element.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,16 +1286,16 @@ public Element setText(String textContent) {
12861286
"setText is not allowed while a binding for text exists.");
12871287
}
12881288

1289-
if (textContent == null) {
1290-
// Browsers work this way
1291-
textContent = "";
1292-
}
12931289
setTextContent(textContent);
12941290

12951291
return this;
12961292
}
12971293

12981294
private void setTextContent(String textContent) {
1295+
if (textContent == null) {
1296+
// Browsers work this way
1297+
textContent = "";
1298+
}
12991299
if (isTextNode()) {
13001300
getStateProvider().setTextContent(getNode(), textContent);
13011301
} else {

flow-server/src/test/java/com/vaadin/flow/dom/ElementBindTextTest.java

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
*/
1616
package com.vaadin.flow.dom;
1717

18+
import java.util.LinkedList;
19+
1820
import org.junit.After;
1921
import org.junit.AfterClass;
22+
import org.junit.Assert;
2023
import org.junit.Before;
2124
import org.junit.BeforeClass;
2225
import org.junit.Test;
@@ -25,10 +28,10 @@
2528
import com.vaadin.experimental.FeatureFlags;
2629
import com.vaadin.flow.component.UI;
2730
import com.vaadin.flow.internal.CurrentInstance;
31+
import com.vaadin.flow.server.ErrorEvent;
2832
import com.vaadin.flow.server.MockVaadinServletService;
2933
import com.vaadin.flow.server.MockVaadinSession;
3034
import com.vaadin.flow.server.VaadinService;
31-
import com.vaadin.flow.server.VaadinSession;
3235
import com.vaadin.signals.BindingActiveException;
3336
import com.vaadin.signals.Signal;
3437
import com.vaadin.signals.ValueSignal;
@@ -47,6 +50,8 @@ public class ElementBindTextTest {
4750

4851
private MockedStatic<FeatureFlags> featureFlagStaticMock;
4952

53+
private LinkedList<ErrorEvent> events;
54+
5055
@BeforeClass
5156
public static void init() {
5257
var featureFlagStaticMock = mockStatic(FeatureFlags.class);
@@ -65,15 +70,13 @@ public static void clean() {
6570
public void before() {
6671
featureFlagStaticMock = mockStatic(FeatureFlags.class);
6772
featureFlagEnabled(featureFlagStaticMock);
68-
VaadinService.setCurrent(service);
69-
VaadinSession session = new MockVaadinSession(service);
70-
session.lock();
71-
new MockUI(session);
73+
events = mockLockedSessionWithErrorHandler();
7274
}
7375

7476
@After
7577
public void after() {
7678
close(featureFlagStaticMock);
79+
events = null;
7780
}
7881

7982
private static void featureFlagEnabled(
@@ -91,6 +94,19 @@ private static void close(
9194
featureFlagStaticMock.close();
9295
}
9396

97+
private LinkedList<ErrorEvent> mockLockedSessionWithErrorHandler() {
98+
VaadinService.setCurrent(service);
99+
100+
var session = new MockVaadinSession(service);
101+
session.lock();
102+
103+
var ui = new MockUI(session);
104+
var events = new LinkedList<ErrorEvent>();
105+
session.setErrorHandler(events::add);
106+
107+
return events;
108+
}
109+
94110
@Test
95111
public void bindTextComputedSignal_getText_returnsCorrectValue() {
96112
Element element = new Element("span");
@@ -154,6 +170,27 @@ public void bindText_setTextWithExistingInactiveBinding_throws() {
154170
() -> element.setText("text2"));
155171
}
156172

173+
@Test
174+
public void bindText_initialNullSignalValue_treatAsBlank() {
175+
Element element = new Element("span");
176+
UI.getCurrent().getElement().appendChild(element);
177+
ValueSignal<String> signal = new ValueSignal<>(String.class);
178+
element.bindText(signal);
179+
assertEquals("", element.getText());
180+
Assert.assertTrue(events.isEmpty());
181+
}
182+
183+
@Test
184+
public void bindText_setNullSignalValue_treatAsBlank() {
185+
Element element = new Element("span");
186+
UI.getCurrent().getElement().appendChild(element);
187+
ValueSignal<String> signal = new ValueSignal<>("text");
188+
element.bindText(signal);
189+
signal.value(null);
190+
Assert.assertTrue(events.isEmpty());
191+
assertEquals("", element.getText());
192+
}
193+
157194
@Test
158195
public void bindText_bindTextWithExistingActiveBinding_throws() {
159196
Element element = new Element("span");

0 commit comments

Comments
 (0)