summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeemu Pòˆntelin <teemu@vaadin.com>2014-06-12 19:34:49 +0300
committerVaadin Code Review <review@vaadin.com>2014-06-17 10:40:55 +0000
commit8b0846967af04070bf692d444f7d684499410d24 (patch)
treef6622248e1e6c301a1c5eddfcfa5a49d999b0bec
parent89eea17f571bce2ab99625dfeda90d59c101a337 (diff)
downloadvaadin-framework-8b0846967af04070bf692d444f7d684499410d24.tar.gz
vaadin-framework-8b0846967af04070bf692d444f7d684499410d24.zip
Fix for unnecessary RPC request when clicking on CheckBox label (#8259)
Change-Id: I7efb8b10a0d1b19ffdc9eb1d29db1f00b45f17aa
-rw-r--r--client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java22
-rw-r--r--uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCount.java62
-rw-r--r--uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCountTest.java50
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());
+ }
+}