summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeemu Suo-Anttila <teemusa@vaadin.com>2016-07-05 13:37:07 +0300
committerTeemu Suo-Anttila <teemusa@vaadin.com>2016-07-06 10:23:33 +0300
commit9bb15290835800f5cf64ba536aaedf7ea35dd0ca (patch)
tree49cd48dc105fc0d36b9e58cb0fa816bac27b662e
parent5cdc0c1bb2c02864065f63173a2918e9d9015de4 (diff)
downloadvaadin-framework-9bb15290835800f5cf64ba536aaedf7ea35dd0ca.tar.gz
vaadin-framework-9bb15290835800f5cf64ba536aaedf7ea35dd0ca.zip
Fix navigation to same view with different parameters (#20029)
Change-Id: I0ecc18f0ee5aecac42cfc6c9422932e2e308ab83
-rw-r--r--server/src/main/java/com/vaadin/navigator/Navigator.java37
-rw-r--r--uitest/src/test/java/com/vaadin/tests/navigator/NavigationTest.java54
2 files changed, 74 insertions, 17 deletions
diff --git a/server/src/main/java/com/vaadin/navigator/Navigator.java b/server/src/main/java/com/vaadin/navigator/Navigator.java
index 390e252906..9aa3bc468c 100644
--- a/server/src/main/java/com/vaadin/navigator/Navigator.java
+++ b/server/src/main/java/com/vaadin/navigator/Navigator.java
@@ -558,27 +558,30 @@ public class Navigator implements Serializable {
longestViewName = errorProvider.getViewName(navigationState);
viewWithLongestName = errorProvider.getView(longestViewName);
}
- if (viewWithLongestName != null) {
- String parameters = "";
- if (navigationState.length() > longestViewName.length() + 1) {
- parameters = navigationState
- .substring(longestViewName.length() + 1);
- }
- if (getCurrentView() == null
- || !SharedUtil
- .equals(getCurrentView(), viewWithLongestName)) {
- navigateTo(viewWithLongestName, longestViewName, parameters);
- } else {
- updateNavigationState(new ViewChangeEvent(this,
- getCurrentView(), viewWithLongestName, longestViewName,
- parameters));
- }
- } else {
+
+ if (viewWithLongestName == null) {
throw new IllegalArgumentException(
"Trying to navigate to an unknown state '"
+ navigationState
+ "' and an error view provider not present");
}
+
+ String parameters = "";
+ if (navigationState.length() > longestViewName.length() + 1) {
+ parameters = navigationState
+ .substring(longestViewName.length() + 1);
+ } else if (navigationState.endsWith("/")) {
+ navigationState = navigationState.substring(0,
+ navigationState.length() - 1);
+ }
+ if (getCurrentView() == null
+ || !SharedUtil.equals(getCurrentView(), viewWithLongestName)
+ || !SharedUtil.equals(currentNavigationState, navigationState)) {
+ navigateTo(viewWithLongestName, longestViewName, parameters);
+ } else {
+ updateNavigationState(new ViewChangeEvent(this, getCurrentView(),
+ viewWithLongestName, longestViewName, parameters));
+ }
}
/**
@@ -677,8 +680,8 @@ public class Navigator implements Serializable {
}
if (!navigationState.equals(getStateManager().getState())) {
getStateManager().setState(navigationState);
- currentNavigationState = navigationState;
}
+ currentNavigationState = navigationState;
}
}
diff --git a/uitest/src/test/java/com/vaadin/tests/navigator/NavigationTest.java b/uitest/src/test/java/com/vaadin/tests/navigator/NavigationTest.java
new file mode 100644
index 0000000000..59f71f3724
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/navigator/NavigationTest.java
@@ -0,0 +1,54 @@
+package com.vaadin.tests.navigator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.TableElement;
+import com.vaadin.testbench.elements.TableRowElement;
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class NavigationTest extends SingleBrowserTest {
+
+ @Override
+ protected Class<?> getUIClass() {
+ return NavigatorTest.class;
+ }
+
+ @Test
+ public void testNavigateToSameViewWithDifferentParameters() {
+ openTestURL();
+
+ ButtonElement listButton = $(ButtonElement.class).caption(
+ "Navigate to list").first();
+ listButton.click();
+
+ TableElement table = $(TableElement.class).first();
+ assertEquals("Unexpected navigation message",
+ "2. Navigated to ListView without params", getLogRow(0));
+
+ assertFalse("Table should not have contents",
+ table.isElementPresent(By.vaadin("#row[0]")));
+
+ listButton.click();
+ assertEquals("Should not navigate to same view again.",
+ "2. Navigated to ListView without params", getLogRow(0));
+
+ $(TextFieldElement.class).first().sendKeys("foo=1");
+ listButton.click();
+
+ assertEquals("Should not navigate to same view again.",
+ "3. Navigated to ListView with params foo=1", getLogRow(0));
+
+ assertTrue("Table should have content",
+ table.isElementPresent(By.vaadin("#row[0]")));
+ TableRowElement row = table.getRow(0);
+ assertEquals("Unexpected row content", "foo", row.getCell(0).getText());
+ assertEquals("Unexpected row content", "1", row.getCell(1).getText());
+ }
+}