diff options
author | Teemu Pòˆntelin <teemu@vaadin.com> | 2014-06-12 19:34:49 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2014-06-17 10:40:55 +0000 |
commit | 8b0846967af04070bf692d444f7d684499410d24 (patch) | |
tree | f6622248e1e6c301a1c5eddfcfa5a49d999b0bec | |
parent | 89eea17f571bce2ab99625dfeda90d59c101a337 (diff) | |
download | vaadin-framework-8b0846967af04070bf692d444f7d684499410d24.tar.gz vaadin-framework-8b0846967af04070bf692d444f7d684499410d24.zip |
Fix for unnecessary RPC request when clicking on CheckBox label (#8259)
Change-Id: I7efb8b10a0d1b19ffdc9eb1d29db1f00b45f17aa
3 files changed, 125 insertions, 9 deletions
diff --git a/client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java b/client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java index a72049aa90..28f6beefa6 100644 --- a/client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java +++ b/client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java @@ -144,14 +144,18 @@ public class CheckBoxConnector extends AbstractFieldConnector implements return; } - getState().checked = getWidget().getValue(); - - // Add mouse details - MouseEventDetails details = MouseEventDetailsBuilder - .buildMouseEventDetails(event.getNativeEvent(), getWidget() - .getElement()); - getRpcProxy(CheckBoxServerRpc.class).setChecked(getState().checked, - details); - + // We get click events also from the label text, which do not alter the + // actual value. The server-side is only interested in real changes to + // the state. + if (getState().checked != getWidget().getValue()) { + getState().checked = getWidget().getValue(); + + // Add mouse details + MouseEventDetails details = MouseEventDetailsBuilder + .buildMouseEventDetails(event.getNativeEvent(), getWidget() + .getElement()); + getRpcProxy(CheckBoxServerRpc.class).setChecked(getState().checked, + details); + } } } diff --git a/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCount.java b/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCount.java new file mode 100644 index 0000000000..bd44e8a074 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCount.java @@ -0,0 +1,62 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.checkbox; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.checkbox.CheckBoxServerRpc; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.Label; + +public class CheckBoxRpcCount extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + final Label countLabel = new Label("No RPC calls made yet."); + countLabel.setId("count-label"); + addComponent(countLabel); + + CheckBox cb = new CheckBox("Click me to start counting...") { + { + // Register a new RPC that counts the number of invocations. + registerRpc(new CheckBoxServerRpc() { + private int rpcCount = 0; + + @Override + public void setChecked(boolean checked, + MouseEventDetails mouseEventDetails) { + rpcCount++; + countLabel.setValue(rpcCount + " RPC call(s) made."); + } + + }); + } + }; + addComponent(cb); + } + + @Override + protected String getTestDescription() { + return "Test for verifying that no extra RPC calls are made when clicking on CheckBox label."; + } + + @Override + protected Integer getTicketNumber() { + return 8259; + } + +} diff --git a/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCountTest.java b/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCountTest.java new file mode 100644 index 0000000000..c32051b593 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCountTest.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.checkbox; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class CheckBoxRpcCountTest extends MultiBrowserTest { + + @Test + public void testNumberOfRpcCalls() { + openTestURL(); + + WebElement labelElem = driver.findElement(By + .cssSelector(".v-checkbox label")); + WebElement inputElem = driver.findElement(By + .cssSelector(".v-checkbox input")); + WebElement countElem = driver.findElement(By.id("count-label")); + + // Click on the actual checkbox. + inputElem.click(); + assertEquals("1 RPC call(s) made.", countElem.getText()); + + // Click on the checkbox label. + labelElem.click(); + assertEquals("2 RPC call(s) made.", countElem.getText()); + + // Again on the label. + labelElem.click(); + assertEquals("3 RPC call(s) made.", countElem.getText()); + } +} |