diff options
author | Artur Signell <artur.signell@itmill.com> | 2012-09-04 08:18:53 +0000 |
---|---|---|
committer | Artur Signell <artur.signell@itmill.com> | 2012-09-04 08:18:53 +0000 |
commit | 079a5cbd4b98c457756d26f693c20bd2b8f7ccec (patch) | |
tree | 1b828a2b68c8af471202ff4e9f4de57ae6a8116d | |
parent | ffb36a03ad29fc947fd65e50eda75fcba5a88517 (diff) | |
download | vaadin-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
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;
+ }
+
+}
|