Browse Source

Flush the active connector before closing a browser window/tab

Change-Id: I116ec752153e8e86724b542234e4d6af46caeb09
tags/8.0.0.alpha1
Artur Signell 7 years ago
parent
commit
7cd6f91f00
1 changed files with 28 additions and 32 deletions
  1. 28
    32
      client/src/main/java/com/vaadin/client/ui/VUI.java

+ 28
- 32
client/src/main/java/com/vaadin/client/ui/VUI.java View File

/* /*
* Copyright 2000-2014 Vaadin Ltd. * Copyright 2000-2014 Vaadin Ltd.
*
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not * 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 * use this file except in compliance with the License. You may obtain a copy of
* the License at * the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
import com.vaadin.client.Profiler; import com.vaadin.client.Profiler;
import com.vaadin.client.VConsole; import com.vaadin.client.VConsole;
import com.vaadin.client.WidgetUtil; import com.vaadin.client.WidgetUtil;
import com.vaadin.client.legacy.ui.VLegacyTextField;
import com.vaadin.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner; import com.vaadin.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner;
import com.vaadin.client.ui.TouchScrollDelegate.TouchScrollHandler; import com.vaadin.client.ui.TouchScrollDelegate.TouchScrollHandler;
import com.vaadin.client.ui.ui.UIConnector; import com.vaadin.client.ui.ui.UIConnector;
import com.vaadin.shared.ui.ui.UIConstants; import com.vaadin.shared.ui.ui.UIConstants;


/** /**
*
*
*/ */
public class VUI extends SimplePanel implements ResizeHandler, public class VUI extends SimplePanel implements ResizeHandler,
Window.ClosingHandler, ShortcutActionHandlerOwner, Focusable, Window.ClosingHandler, ShortcutActionHandlerOwner, Focusable,


/** /**
* Keep track of possible parent size changes when an embedded application. * Keep track of possible parent size changes when an embedded application.
*
*
* Uses {@link #parentWidth} and {@link #parentHeight} as an optimization to * Uses {@link #parentWidth} and {@link #parentHeight} as an optimization to
* keep track of when there is a real change. * keep track of when there is a real change.
*/ */
/* /*
* Ensure the fragment is properly encoded in all browsers * Ensure the fragment is properly encoded in all browsers
* (#10769) * (#10769)
*
*
* createUrlBuilder does not properly pass an empty fragment to * createUrlBuilder does not properly pass an empty fragment to
* UrlBuilder on Webkit browsers so do it manually (#11686) * 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(); .buildString();


currentFragment = newFragment; currentFragment = newFragment;


/** /**
* Called when the window or parent div might have been resized. * Called when the window or parent div might have been resized.
*
*
* This immediately checks the sizes of the window and the parent div (if * This immediately checks the sizes of the window and the parent div (if
* monitoring it) and triggers layout recalculation if they have changed. * monitoring it) and triggers layout recalculation if they have changed.
*/ */


/** /**
* Called when the window or parent div might have been resized. * Called when the window or parent div might have been resized.
*
*
* This immediately checks the sizes of the window and the parent div (if * This immediately checks the sizes of the window and the parent div (if
* monitoring it) and triggers layout recalculation if they have changed. * monitoring it) and triggers layout recalculation if they have changed.
*
*
* @param newWindowWidth * @param newWindowWidth
* The new width of the window * The new width of the window
* @param newWindowHeight * @param newWindowHeight
* The new height of the window * The new height of the window
*
*
* @deprecated use {@link #performSizeCheck()} * @deprecated use {@link #performSizeCheck()}
*/ */
@Deprecated @Deprecated
* should shrink as the content's size is fixed and would thus not * should shrink as the content's size is fixed and would thus not
* automatically shrink.) * 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 // update size to avoid (most) redundant re-layout passes
// there can still be an extra layout recalculation if webkit // there can still be an extra layout recalculation if webkit
* Returns true if the body is NOT generated, i.e if someone else has made * 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 * the page that we're running in. Otherwise we're in charge of the whole
* page. * page.
*
*
* @return true if we're running embedded * @return true if we're running embedded
*/ */
public boolean isEmbedded() { public boolean isEmbedded() {
/** /**
* Returns true if the size of the parent should be checked periodically and * Returns true if the size of the parent should be checked periodically and
* the application should react to its changes. * the application should react to its changes.
*
*
* @return true if size of parent should be tracked * @return true if size of parent should be tracked
*/ */
protected boolean isMonitoringParentSize() { protected boolean isMonitoringParentSize() {


/* /*
* (non-Javadoc) * (non-Javadoc)
*
*
* @see * @see
* com.google.gwt.event.logical.shared.ResizeHandler#onResize(com.google * com.google.gwt.event.logical.shared.ResizeHandler#onResize(com.google
* .gwt.event.logical.shared.ResizeEvent) * .gwt.event.logical.shared.ResizeEvent)


/** /**
* Called when a resize event is received. * Called when a resize event is received.
*
*
* This may trigger a lazy refresh or perform the size check immediately * This may trigger a lazy refresh or perform the size check immediately
* depending on the browser used and whether the server side requests * depending on the browser used and whether the server side requests
* resizes to be lazy. * resizes to be lazy.
* problems with scrollbars. Firefox 3 might also produce some extra * problems with scrollbars. Firefox 3 might also produce some extra
* events. We postpone both the re-layouting and the server side event * events. We postpone both the re-layouting and the server side event
* for a while to deal with these issues. * for a while to deal with these issues.
*
*
* We may also postpone these events to avoid slowness when resizing the * We may also postpone these events to avoid slowness when resizing the
* browser window. Constantly recalculating the layout causes the resize * browser window. Constantly recalculating the layout causes the resize
* operation to be really slow with complex layouts. * operation to be really slow with complex layouts.


@Override @Override
public void onWindowClosing(Window.ClosingEvent event) { 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) private native static void loadAppIdListFromDOM(ArrayList<String> list)


/** /**
* Allows to store the currently focused Element. * Allows to store the currently focused Element.
*
*
* Current use case is to store the focus when a Window is opened. Does * 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 * currently handle only a single value. Needs to be extended for #12158
*
*
* @param focusedElement * @param focusedElement
*/ */
public void storeFocus() { public void storeFocus() {


/** /**
* Restores the previously stored focus Element. * Restores the previously stored focus Element.
*
*
* Current use case is to restore the focus when a Window is closed. Does * 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 * currently handle only a single value. Needs to be extended for #12158
*
*
* @return the lastFocusElementBeforeDialogOpened * @return the lastFocusElementBeforeDialogOpened
*/ */
public void focusStoredElement() { public void focusStoredElement() {

Loading…
Cancel
Save