summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTatu Lund <tatu@vaadin.com>2021-02-16 13:16:49 +0200
committerGitHub <noreply@github.com>2021-02-16 13:16:49 +0200
commitb3d80da9b422360ad99e4a29c3dc1d9ad4ce7d1c (patch)
tree80d6c3fbb415897626eaa4118736d170d5bf8542
parentf46362a731ce459d4afa7d79f60468ec72fda4ba (diff)
downloadvaadin-framework-b3d80da9b422360ad99e4a29c3dc1d9ad4ce7d1c.tar.gz
vaadin-framework-b3d80da9b422360ad99e4a29c3dc1d9ad4ce7d1c.zip
fix: Focus-activated shortcut listener in compatibility TextField (#12203)
-rw-r--r--client/src/main/java/com/vaadin/client/ui/ShortcutActionHandler.java28
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/textfield/CompatibilityTextFieldShortcut.java49
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/textfield/CompatibilityTextFieldShortcutTest.java35
3 files changed, 107 insertions, 5 deletions
diff --git a/client/src/main/java/com/vaadin/client/ui/ShortcutActionHandler.java b/client/src/main/java/com/vaadin/client/ui/ShortcutActionHandler.java
index 1c03a2719d..92c26d2b70 100644
--- a/client/src/main/java/com/vaadin/client/ui/ShortcutActionHandler.java
+++ b/client/src/main/java/com/vaadin/client/ui/ShortcutActionHandler.java
@@ -127,30 +127,48 @@ public class ShortcutActionHandler {
}
final ComponentConnector finalTarget = target;
event.preventDefault();
+
/*
* The focused component might have unpublished changes, try to
* synchronize them before firing shortcut action.
*/
- client.flushActiveConnector();
- /*
- * Legacy components don't have built-in logic for flushing, they need a
- * workaround with blur and focus to trigger the value change.
- */
+ boolean flushed = false;
ComponentConnector activeConnector = getActiveConnector(client);
+
if (activeConnector != null) {
Class<?> clz = activeConnector.getClass();
while (clz != null) {
if (clz.getName().equals(
+ "com.vaadin.v7.client.ui.textfield.TextFieldConnector")) {
+ /*
+ * Legacy textfields support modern flushing.
+ */
+ client.flushActiveConnector();
+ flushed = true;
+ break;
+ }
+ if (clz.getName().equals(
"com.vaadin.v7.client.ui.AbstractLegacyComponentConnector")) {
+ /*
+ * Most of the legacy components don't have built-in logic
+ * for flushing, they need a workaround with blur and focus
+ * to trigger the value change.
+ */
shakeTarget(et);
Scheduler.get().scheduleDeferred(() -> {
shakeTarget(et);
});
+ flushed = true;
break;
}
clz = clz.getSuperclass();
}
}
+ if (!flushed) {
+ // Use V8 style flushing for the rest.
+ client.flushActiveConnector();
+ }
+
Scheduler.get().scheduleDeferred(() -> {
if (finalTarget != null) {
client.updateVariable(paintableId, "actiontarget", finalTarget,
diff --git a/uitest/src/main/java/com/vaadin/tests/components/textfield/CompatibilityTextFieldShortcut.java b/uitest/src/main/java/com/vaadin/tests/components/textfield/CompatibilityTextFieldShortcut.java
new file mode 100644
index 0000000000..9ad6fbd264
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/textfield/CompatibilityTextFieldShortcut.java
@@ -0,0 +1,49 @@
+package com.vaadin.tests.components.textfield;
+
+import com.vaadin.event.ShortcutAction;
+import com.vaadin.event.ShortcutListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.Registration;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Notification;
+import com.vaadin.v7.ui.TextField;
+
+@SuppressWarnings("deprecation")
+public class CompatibilityTextFieldShortcut extends AbstractTestUI {
+
+ Registration listenerRegistration;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ TextField textField = new TextField("F8 shortcut when focused");
+ ShortcutListener c = new ShortcutListener("ShortcutForMAMedRemarks",
+ ShortcutAction.KeyCode.F8, null) {
+
+ @Override
+ public void handleAction(Object sender, Object target) {
+ Notification.show("Received F8: " + textField.getValue());
+ }
+ };
+
+ textField.addFocusListener(e -> {
+ listenerRegistration = textField.addShortcutListener(c);
+ Label label = new Label("Focused");
+ label.addStyleName("focus-label");
+ addComponent(label);
+ });
+
+ textField.addBlurListener(e -> {
+ listenerRegistration.remove();
+ });
+
+ Label label = new Label(
+ "F8 will have an effect only if the following component is focused.");
+ Button button = new Button("focus");
+ button.addClickListener(event -> {
+ textField.focus();
+ });
+ addComponents(label, textField, button);
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/textfield/CompatibilityTextFieldShortcutTest.java b/uitest/src/test/java/com/vaadin/tests/components/textfield/CompatibilityTextFieldShortcutTest.java
new file mode 100644
index 0000000000..5c5d277272
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/textfield/CompatibilityTextFieldShortcutTest.java
@@ -0,0 +1,35 @@
+package com.vaadin.tests.components.textfield;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.NotificationElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class CompatibilityTextFieldShortcutTest extends SingleBrowserTest {
+
+ private static final String TEXTFIELD_VALUE = "input";
+ private static final String NOTIFICATION = "Received F8: "
+ + TEXTFIELD_VALUE;
+
+ @Test
+ public void focusAndPressF8() {
+ openTestURL();
+
+ WebElement textFieldText = findElement(By.tagName("input"));
+ $(ButtonElement.class).first().click();
+
+ waitForElementVisible(By.className("focus-label"));
+ textFieldText.sendKeys(TEXTFIELD_VALUE);
+
+ textFieldText.sendKeys(Keys.F8);
+
+ assertEquals(NOTIFICATION,
+ $(NotificationElement.class).first().getCaption());
+ }
+}