]> source.dussan.org Git - vaadin-framework.git/commitdiff
fixes #2898, value updates now deferred to help FF optimizations
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Tue, 3 Nov 2009 16:17:17 +0000 (16:17 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Tue, 3 Nov 2009 16:17:17 +0000 (16:17 +0000)
svn changeset:9606/svn branch:6.2

src/com/vaadin/terminal/gwt/client/ui/VTextField.java

index 4403aede359bcc67ce018e59097bdba536a75339..cccb0a26bebc861eb2262dc6ff5b1036f5e9ccbd 100644 (file)
@@ -10,7 +10,9 @@ import com.google.gwt.event.dom.client.ChangeEvent;
 import com.google.gwt.event.dom.client.ChangeHandler;
 import com.google.gwt.event.dom.client.FocusEvent;
 import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.TextBoxBase;
@@ -110,13 +112,32 @@ public class VTextField extends TextBoxBase implements Paintable, Field,
                 : null;
         setPrompting(inputPrompt != null && focusedTextField != this
                 && (text == null || text.equals("")));
+
+        final String fieldValue;
         if (prompting) {
-            setText(inputPrompt);
+            fieldValue = inputPrompt;
             addStyleDependentName(CLASSNAME_PROMPT);
         } else {
-            setText(text);
+            fieldValue = text;
             removeStyleDependentName(CLASSNAME_PROMPT);
         }
+        if (BrowserInfo.get().isGecko()) {
+            /*
+             * Gecko is really sluggish when updating input attached to dom.
+             * Some optimizations seems to work much better in Gecko if we
+             * update the actual content lazily when the rest of the DOM has
+             * stabilized. In tests, about ten times better performance is
+             * achieved with this optimization. See for eg. #2898
+             */
+            DeferredCommand.addCommand(new Command() {
+                public void execute() {
+                    setText(fieldValue);
+                }
+            });
+        } else {
+            setText(fieldValue);
+        }
+
         valueBeforeEdit = uidl.getStringVariable("text");
     }