diff options
author | Leif Åstrand <leif@vaadin.com> | 2015-06-14 15:36:33 +0300 |
---|---|---|
committer | Henri Sara <hesara@vaadin.com> | 2015-07-04 10:46:56 +0300 |
commit | aa104e4c06c726d2c26e00d7955d2e9bc7c0fdd7 (patch) | |
tree | c527405b2d226d409e86999a8c2077656882d196 /server/src/com | |
parent | eaaf1447610feee7343926959f73afb55aa2fcca (diff) | |
download | vaadin-framework-aa104e4c06c726d2c26e00d7955d2e9bc7c0fdd7.tar.gz vaadin-framework-aa104e4c06c726d2c26e00d7955d2e9bc7c0fdd7.zip |
Allow beforeClientResponse to change hierarchy or dirtyness (#18268)
Change-Id: I861c1514bab121955d6bfd525779c8204cdf4fa3
Diffstat (limited to 'server/src/com')
-rw-r--r-- | server/src/com/vaadin/server/ClientConnector.java | 4 | ||||
-rw-r--r-- | server/src/com/vaadin/server/communication/UidlWriter.java | 38 |
2 files changed, 29 insertions, 13 deletions
diff --git a/server/src/com/vaadin/server/ClientConnector.java b/server/src/com/vaadin/server/ClientConnector.java index b784aa5d35..63483bc254 100644 --- a/server/src/com/vaadin/server/ClientConnector.java +++ b/server/src/com/vaadin/server/ClientConnector.java @@ -256,10 +256,6 @@ public interface ClientConnector extends Connector { * client. Gives the connector an opportunity to set computed/dynamic state * values or to invoke last minute RPC methods depending on other component * features. - * <p> - * This method must not alter the component hierarchy in any way. Calling - * {@link #markAsDirty()} from this method will have no effect. - * </p> * * @param initial * <code>true</code> if the client-side connector will be created diff --git a/server/src/com/vaadin/server/communication/UidlWriter.java b/server/src/com/vaadin/server/communication/UidlWriter.java index 3b2caba55b..00a65d3877 100644 --- a/server/src/com/vaadin/server/communication/UidlWriter.java +++ b/server/src/com/vaadin/server/communication/UidlWriter.java @@ -23,7 +23,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -81,22 +83,40 @@ public class UidlWriter implements Serializable { // to write out service.runPendingAccessTasks(session); - ArrayList<ClientConnector> dirtyVisibleConnectors = ui - .getConnectorTracker().getDirtyVisibleConnectors(); + Set<ClientConnector> processedConnectors = new HashSet<ClientConnector>(); + LegacyCommunicationManager manager = session.getCommunicationManager(); // Paints components ConnectorTracker uiConnectorTracker = ui.getConnectorTracker(); getLogger().log(Level.FINE, "* Creating response to client"); + while (true) { + ArrayList<ClientConnector> connectorsToProcess = new ArrayList<ClientConnector>(); + for (ClientConnector c : uiConnectorTracker.getDirtyConnectors()) { + if (!processedConnectors.contains(c) + && LegacyCommunicationManager + .isConnectorVisibleToClient(c)) { + connectorsToProcess.add(c); + } + } + + if (connectorsToProcess.isEmpty()) { + break; + } + + for (ClientConnector connector : connectorsToProcess) { + boolean initialized = uiConnectorTracker + .isClientSideInitialized(connector); + processedConnectors.add(connector); + + connector.beforeClientResponse(!initialized); + } + } + getLogger().log( Level.FINE, - "Found " + dirtyVisibleConnectors.size() + "Found " + processedConnectors.size() + " dirty connectors to paint"); - for (ClientConnector connector : dirtyVisibleConnectors) { - boolean initialized = uiConnectorTracker - .isClientSideInitialized(connector); - connector.beforeClientResponse(!initialized); - } uiConnectorTracker.setWritingResponse(true); try { @@ -292,7 +312,7 @@ public class UidlWriter implements Serializable { session.getDragAndDropService().printJSONResponse(writer); - for (ClientConnector connector : dirtyVisibleConnectors) { + for (ClientConnector connector : processedConnectors) { uiConnectorTracker.markClientSideInitialized(connector); } |