aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/src/main/java/com/vaadin/server/communication/UidlWriter.java27
1 files changed, 21 insertions, 6 deletions
diff --git a/server/src/main/java/com/vaadin/server/communication/UidlWriter.java b/server/src/main/java/com/vaadin/server/communication/UidlWriter.java
index c6c2d77fcb..d27fc3f0ae 100644
--- a/server/src/main/java/com/vaadin/server/communication/UidlWriter.java
+++ b/server/src/main/java/com/vaadin/server/communication/UidlWriter.java
@@ -90,10 +90,9 @@ public class UidlWriter implements Serializable {
while (true) {
ArrayList<ClientConnector> connectorsToProcess = new ArrayList<>();
- for (ClientConnector c : uiConnectorTracker.getDirtyConnectors()) {
- if (!processedConnectors.contains(c)
- && LegacyCommunicationManager
- .isConnectorVisibleToClient(c)) {
+ for (ClientConnector c : uiConnectorTracker
+ .getDirtyVisibleConnectors()) {
+ if (!processedConnectors.contains(c)) {
connectorsToProcess.add(c);
}
}
@@ -102,9 +101,25 @@ public class UidlWriter implements Serializable {
break;
}
+ // process parents before children
+ Collections.sort(connectorsToProcess,
+ Comparator.comparingInt(conn -> {
+ int depth = 0;
+ ClientConnector connector = conn;
+ // this is a very fast operation, even for 100+ levels
+ while (connector.getParent() != null) {
+ ++depth;
+ connector = connector.getParent();
+ }
+ return depth;
+ }));
+
for (ClientConnector connector : connectorsToProcess) {
- boolean initialized = uiConnectorTracker
- .isClientSideInitialized(connector);
+ // call isDirty() to find out if ConnectorTracker knows the
+ // connector
+ boolean initialized = uiConnectorTracker.isDirty(connector)
+ && uiConnectorTracker
+ .isClientSideInitialized(connector);
processedConnectors.add(connector);
try {