From 1746dff124c644f4348ccf3ecf55d250a8869d75 Mon Sep 17 00:00:00 2001 From: Pekka Hyvönen Date: Mon, 5 Nov 2012 14:00:21 +0200 Subject: 10030 Button.DisableOnClick not working properly Change-Id: I0514bc4da186360a84d9cdb48140245108847115 --- .../vaadin/client/ui/button/ButtonConnector.java | 8 +- server/src/com/vaadin/ui/Button.java | 15 ++- .../button/ButtonDisableEnableOnClick.html | 128 +++++++++++++++++++++ .../vaadin/tests/components/button/Buttons3.java | 16 +++ 4 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/components/button/ButtonDisableEnableOnClick.html create mode 100644 uitest/src/com/vaadin/tests/components/button/Buttons3.java diff --git a/client/src/com/vaadin/client/ui/button/ButtonConnector.java b/client/src/com/vaadin/client/ui/button/ButtonConnector.java index 546bdecb61..c3aa66b285 100644 --- a/client/src/com/vaadin/client/ui/button/ButtonConnector.java +++ b/client/src/com/vaadin/client/ui/button/ButtonConnector.java @@ -156,7 +156,13 @@ public class ButtonConnector extends AbstractComponentConnector implements @Override public void onClick(ClickEvent event) { if (getState().disableOnClick) { - getWidget().setEnabled(false); + // Simulate getting disabled from the server without waiting for the + // round trip. The server-side RPC handler takes care of updating + // the server-side state in a similar way to ensure subsequent + // changes are properly propagated. Changing state on client is not + // generally supported. + getState().enabled = false; + super.updateEnabledState(false); rpc.disableOnClick(); } diff --git a/server/src/com/vaadin/ui/Button.java b/server/src/com/vaadin/ui/Button.java index d248efd570..b4b7bf64be 100644 --- a/server/src/com/vaadin/ui/Button.java +++ b/server/src/com/vaadin/ui/Button.java @@ -19,6 +19,8 @@ package com.vaadin.ui; import java.io.Serializable; import java.lang.reflect.Method; +import org.json.JSONException; + import com.vaadin.event.Action; import com.vaadin.event.FieldEvents; import com.vaadin.event.FieldEvents.BlurEvent; @@ -55,10 +57,17 @@ public class Button extends AbstractComponent implements } @Override - public void disableOnClick() { - // Could be optimized so the button is not repainted because of - // this (client side has already disabled the button) + public void disableOnClick() throws RuntimeException { setEnabled(false); + // Makes sure the enabled=false state is noticed at once - otherwise + // a following setEnabled(true) call might have no effect. see + // ticket #10030 + try { + getUI().getConnectorTracker().getDiffState(Button.this) + .put("enabled", false); + } catch (JSONException e) { + throw new RuntimeException(e); + } } }; diff --git a/uitest/src/com/vaadin/tests/components/button/ButtonDisableEnableOnClick.html b/uitest/src/com/vaadin/tests/components/button/ButtonDisableEnableOnClick.html new file mode 100644 index 0000000000..a3cdb64aec --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/button/ButtonDisableEnableOnClick.html @@ -0,0 +1,128 @@ + + + + + + +ButtonDisableEnableOnClick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ButtonDisableEnableOnClick
open/run/com.vaadin.tests.components.button.Buttons3?restartApplication
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_Smenu#item017,12
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::Root/VOverlay[0]/VMenuBar[0]#item419,10
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::Root/VOverlay[1]/VMenuBar[0]#item024,8
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_Smenu#item038,8
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::Root/VOverlay[0]/VMenuBar[0]#item318,10
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::Root/VOverlay[1]/VMenuBar[0]#item237,11
clickvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_StestComponent/domChild[0]/domChild[0]
assertTextid=Log_row_02. ClickEvent
assertNotCSSClassvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_StestComponentv-disabled
clickvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_StestComponent/domChild[0]/domChild[0]
assertTextid=Log_row_03. ClickEvent
assertNotCSSClassvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_StestComponentv-disabled
clickvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_StestComponent/domChild[0]/domChild[0]
assertTextid=Log_row_04. ClickEvent
assertNotCSSClassvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_StestComponentv-disabled
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_Smenu#item029,7
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::Root/VOverlay[0]/VMenuBar[0]#item320,8
mouseClickvaadin=runcomvaadintestscomponentsbuttonButtons3::Root/VOverlay[1]/VMenuBar[0]#item226,6
clickvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_StestComponent/domChild[0]/domChild[0]
assertCSSClassvaadin=runcomvaadintestscomponentsbuttonButtons3::PID_StestComponentv-disabled
+ + diff --git a/uitest/src/com/vaadin/tests/components/button/Buttons3.java b/uitest/src/com/vaadin/tests/components/button/Buttons3.java new file mode 100644 index 0000000000..b20effad97 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/button/Buttons3.java @@ -0,0 +1,16 @@ +package com.vaadin.tests.components.button; + +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; + +public class Buttons3 extends Buttons2 implements + ClickListener { + + @Override + public void buttonClick(ClickEvent event) { + event.getButton().setEnabled(true); + super.buttonClick(event); + } + +} -- cgit v1.2.3