]> source.dussan.org Git - vaadin-framework.git/commitdiff
Flush the active connector before closing a browser window/tab
authorArtur Signell <artur@vaadin.com>
Wed, 17 Aug 2016 10:50:28 +0000 (13:50 +0300)
committerVaadin Code Review <review@vaadin.com>
Wed, 17 Aug 2016 11:36:23 +0000 (11:36 +0000)
Change-Id: I116ec752153e8e86724b542234e4d6af46caeb09

client/src/main/java/com/vaadin/client/ui/VUI.java

index 87ebc53d640a59e999626bdcb8a033143698ee6e..bcb3804cec97704e54c7abb75b1c9bb095e79ff5 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * 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
@@ -43,7 +43,6 @@ import com.vaadin.client.LayoutManager;
 import com.vaadin.client.Profiler;
 import com.vaadin.client.VConsole;
 import com.vaadin.client.WidgetUtil;
-import com.vaadin.client.legacy.ui.VLegacyTextField;
 import com.vaadin.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner;
 import com.vaadin.client.ui.TouchScrollDelegate.TouchScrollHandler;
 import com.vaadin.client.ui.ui.UIConnector;
@@ -51,7 +50,7 @@ import com.vaadin.shared.ApplicationConstants;
 import com.vaadin.shared.ui.ui.UIConstants;
 
 /**
- * 
+ *
  */
 public class VUI extends SimplePanel implements ResizeHandler,
         Window.ClosingHandler, ShortcutActionHandlerOwner, Focusable,
@@ -86,7 +85,7 @@ public class VUI extends SimplePanel implements ResizeHandler,
 
     /**
      * Keep track of possible parent size changes when an embedded application.
-     * 
+     *
      * Uses {@link #parentWidth} and {@link #parentHeight} as an optimization to
      * keep track of when there is a real change.
      */
@@ -132,14 +131,13 @@ public class VUI extends SimplePanel implements ResizeHandler,
                 /*
                  * Ensure the fragment is properly encoded in all browsers
                  * (#10769)
-                 * 
+                 *
                  * createUrlBuilder does not properly pass an empty fragment to
                  * UrlBuilder on Webkit browsers so do it manually (#11686)
                  */
-                String location = Window.Location
-                        .createUrlBuilder()
-                        .setHash(
-                                URL.decodeQueryString(Window.Location.getHash()))
+                String location = Window.Location.createUrlBuilder()
+                        .setHash(URL
+                                .decodeQueryString(Window.Location.getHash()))
                         .buildString();
 
                 currentFragment = newFragment;
@@ -222,7 +220,7 @@ public class VUI extends SimplePanel implements ResizeHandler,
 
     /**
      * Called when the window or parent div might have been resized.
-     * 
+     *
      * This immediately checks the sizes of the window and the parent div (if
      * monitoring it) and triggers layout recalculation if they have changed.
      */
@@ -233,15 +231,15 @@ public class VUI extends SimplePanel implements ResizeHandler,
 
     /**
      * Called when the window or parent div might have been resized.
-     * 
+     *
      * This immediately checks the sizes of the window and the parent div (if
      * monitoring it) and triggers layout recalculation if they have changed.
-     * 
+     *
      * @param newWindowWidth
      *            The new width of the window
      * @param newWindowHeight
      *            The new height of the window
-     * 
+     *
      * @deprecated use {@link #performSizeCheck()}
      */
     @Deprecated
@@ -294,7 +292,8 @@ public class VUI extends SimplePanel implements ResizeHandler,
              * should shrink as the content's size is fixed and would thus not
              * automatically shrink.)
              */
-            VConsole.log("Running layout functions due to window or parent resize");
+            VConsole.log(
+                    "Running layout functions due to window or parent resize");
 
             // update size to avoid (most) redundant re-layout passes
             // there can still be an extra layout recalculation if webkit
@@ -329,7 +328,7 @@ public class VUI extends SimplePanel implements ResizeHandler,
      * Returns true if the body is NOT generated, i.e if someone else has made
      * the page that we're running in. Otherwise we're in charge of the whole
      * page.
-     * 
+     *
      * @return true if we're running embedded
      */
     public boolean isEmbedded() {
@@ -340,7 +339,7 @@ public class VUI extends SimplePanel implements ResizeHandler,
     /**
      * Returns true if the size of the parent should be checked periodically and
      * the application should react to its changes.
-     * 
+     *
      * @return true if size of parent should be tracked
      */
     protected boolean isMonitoringParentSize() {
@@ -350,7 +349,7 @@ public class VUI extends SimplePanel implements ResizeHandler,
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see
      * com.google.gwt.event.logical.shared.ResizeHandler#onResize(com.google
      * .gwt.event.logical.shared.ResizeEvent)
@@ -363,7 +362,7 @@ public class VUI extends SimplePanel implements ResizeHandler,
 
     /**
      * Called when a resize event is received.
-     * 
+     *
      * This may trigger a lazy refresh or perform the size check immediately
      * depending on the browser used and whether the server side requests
      * resizes to be lazy.
@@ -374,7 +373,7 @@ public class VUI extends SimplePanel implements ResizeHandler,
          * problems with scrollbars. Firefox 3 might also produce some extra
          * events. We postpone both the re-layouting and the server side event
          * for a while to deal with these issues.
-         * 
+         *
          * We may also postpone these events to avoid slowness when resizing the
          * browser window. Constantly recalculating the layout causes the resize
          * operation to be really slow with complex layouts.
@@ -410,13 +409,10 @@ public class VUI extends SimplePanel implements ResizeHandler,
 
     @Override
     public void onWindowClosing(Window.ClosingEvent event) {
-        // Change focus on this window in order to ensure that all state is
-        // collected from textfields
-        // TODO this is a naive hack, that only works with text fields and may
-        // cause some odd issues. Should be replaced with a decent solution, see
-        // also related BeforeShortcutActionListener interface. Same interface
-        // might be usable here.
-        VLegacyTextField.flushChangesFromFocusedTextField();
+        // Ensure that any change in the currently focused component is noted
+        // before refreshing. Ensures that e.g. text in the focused text field
+        // does not disappear on refresh (when preserve on refresh is enabled)
+        connection.flushActiveConnector();
     }
 
     private native static void loadAppIdListFromDOM(ArrayList<String> list)
@@ -482,10 +478,10 @@ public class VUI extends SimplePanel implements ResizeHandler,
 
     /**
      * Allows to store the currently focused Element.
-     * 
+     *
      * Current use case is to store the focus when a Window is opened. Does
      * currently handle only a single value. Needs to be extended for #12158
-     * 
+     *
      * @param focusedElement
      */
     public void storeFocus() {
@@ -494,10 +490,10 @@ public class VUI extends SimplePanel implements ResizeHandler,
 
     /**
      * Restores the previously stored focus Element.
-     * 
+     *
      * Current use case is to restore the focus when a Window is closed. Does
      * currently handle only a single value. Needs to be extended for #12158
-     * 
+     *
      * @return the lastFocusElementBeforeDialogOpened
      */
     public void focusStoredElement() {