diff options
-rw-r--r-- | server/src/main/java/com/vaadin/server/communication/UidlWriter.java | 27 |
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 { |