aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Signell <artur.signell@itmill.com>2012-09-04 08:18:53 +0000
committerArtur Signell <artur.signell@itmill.com>2012-09-04 08:18:53 +0000
commit079a5cbd4b98c457756d26f693c20bd2b8f7ccec (patch)
tree1b828a2b68c8af471202ff4e9f4de57ae6a8116d
parentffb36a03ad29fc947fd65e50eda75fcba5a88517 (diff)
downloadvaadin-framework-079a5cbd4b98c457756d26f693c20bd2b8f7ccec.tar.gz
vaadin-framework-079a5cbd4b98c457756d26f693c20bd2b8f7ccec.zip
Avoid fragment change events when the fragment has not changed (#8916)
svn changeset:24298/svn branch:6.8
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VUriFragmentUtility.java6
-rw-r--r--tests/testbench/com/vaadin/tests/components/urifragmentutilty/FragmentChangeLoop.html97
-rw-r--r--tests/testbench/com/vaadin/tests/components/urifragmentutilty/FragmentChangeLoop.java72
3 files changed, 175 insertions, 0 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VUriFragmentUtility.java b/src/com/vaadin/terminal/gwt/client/ui/VUriFragmentUtility.java
index db01699383..209cb6913c 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VUriFragmentUtility.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VUriFragmentUtility.java
@@ -76,7 +76,13 @@ public class VUriFragmentUtility extends Widget implements Paintable,
public void onValueChange(ValueChangeEvent<String> event) {
String historyToken = event.getValue();
+ if (fragment != null && fragment.equals(historyToken)) {
+ // Do nothing if the fragment has not changed. This can at least
+ // happen when detaching and attaching a UriFragmentUtility.
+ return;
+ }
fragment = historyToken;
+
if (client != null) {
client.updateVariable(paintableId, "fragment", fragment, immediate);
}
diff --git a/tests/testbench/com/vaadin/tests/components/urifragmentutilty/FragmentChangeLoop.html b/tests/testbench/com/vaadin/tests/components/urifragmentutilty/FragmentChangeLoop.html
new file mode 100644
index 0000000000..7e67f72a7f
--- /dev/null
+++ b/tests/testbench/com/vaadin/tests/components/urifragmentutilty/FragmentChangeLoop.html
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://localhost:9999/" />
+<title>New Test</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">New Test</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.urifragmentutilty.FragmentChangeLoop?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[2]/div/div</td>
+ <td>0 fragment events</td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[3]/div/div/span/span</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertLocation</td>
+ <td>http://*/run/com.vaadin.tests.components.urifragmentutilty.FragmentChangeLoop?restartApplication#F</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[2]/div/div</td>
+ <td>1 fragment events</td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[4]/div/div/span/span</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertLocation</td>
+ <td>http://*/run/com.vaadin.tests.components.urifragmentutilty.FragmentChangeLoop?restartApplication#F1</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[2]/div/div</td>
+ <td>2 fragment events</td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[4]/div/div/span/span</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertLocation</td>
+ <td>http://*/run/com.vaadin.tests.components.urifragmentutilty.FragmentChangeLoop?restartApplication#F11</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[2]/div/div</td>
+ <td>3 fragment events</td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[3]/div/div/span/span</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertLocation</td>
+ <td>http://*/run/com.vaadin.tests.components.urifragmentutilty.FragmentChangeLoop?restartApplication#F</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[2]/div/div</td>
+ <td>4 fragment events</td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[3]/div/div/span/span</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>//div[@id='runcomvaadintestscomponentsurifragmentutiltyFragmentChangeLoop-95852473']/div/div[2]/div/div[2]/div/div/div/div[2]/div/div</td>
+ <td>4 fragment events</td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/tests/testbench/com/vaadin/tests/components/urifragmentutilty/FragmentChangeLoop.java b/tests/testbench/com/vaadin/tests/components/urifragmentutilty/FragmentChangeLoop.java
new file mode 100644
index 0000000000..ecd3461d3c
--- /dev/null
+++ b/tests/testbench/com/vaadin/tests/components/urifragmentutilty/FragmentChangeLoop.java
@@ -0,0 +1,72 @@
+package com.vaadin.tests.components.urifragmentutilty;
+
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.UriFragmentUtility;
+import com.vaadin.ui.UriFragmentUtility.FragmentChangedEvent;
+import com.vaadin.ui.UriFragmentUtility.FragmentChangedListener;
+import com.vaadin.ui.VerticalLayout;
+
+public class FragmentChangeLoop extends TestBase {
+ VerticalLayout layout1 = new VerticalLayout();
+ VerticalLayout layout2 = new VerticalLayout();
+ VerticalLayout layoutCurrent = null;
+ UriFragmentUtility uriFragmentUtility = new UriFragmentUtility();
+ Integer i = 0;
+ private Label status;
+ private Button setToF;
+ private Button addOne;
+
+ @Override
+ protected void setup() {
+ uriFragmentUtility.addListener(new FragmentChangedListener() {
+
+ public void fragmentChanged(FragmentChangedEvent source) {
+ status.setValue(++i + " fragment events");
+ VerticalLayout layoutNew = (layoutCurrent == layout1 ? layout2
+ : layout1);
+ replaceComponent(layoutCurrent, layoutNew);
+ layoutCurrent = layoutNew;
+
+ }
+ });
+
+ layout1.setCaption("Layout 1");
+ layout2.setCaption("Layout 2");
+ addComponent(layout1);
+ layoutCurrent = layout1;
+ status = new Label("0 fragment events");
+ setToF = new Button("Set fragment to F", new Button.ClickListener() {
+ public void buttonClick(ClickEvent event) {
+ uriFragmentUtility.setFragment("F");
+ }
+ });
+ addOne = new Button("Append '1' to fragment",
+ new Button.ClickListener() {
+ public void buttonClick(ClickEvent event) {
+ uriFragmentUtility.setFragment(uriFragmentUtility
+ .getFragment() + "1");
+ }
+ });
+ addComponent(status);
+ addComponent(setToF);
+ addComponent(addOne);
+
+ addComponent(uriFragmentUtility);
+
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Click the button to set the fragment to F. "
+ + "This should cause the counter on the button to increase by one (unless the fragment is already F in case it should do nothing).";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 8916;
+ }
+
+}