You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2017/10/10 22:05:56 UTC
wicket git commit: WICKET-6479 keep window name if the page was not
yet rendered into any window, just keep the window name as is,
instead of changing it
Repository: wicket
Updated Branches:
refs/heads/WICKET-6479-new-window [created] 00e84ea19
WICKET-6479 keep window name
if the page was not yet rendered into any window, just keep the window name as is, instead of changing it
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/00e84ea1
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/00e84ea1
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/00e84ea1
Branch: refs/heads/WICKET-6479-new-window
Commit: 00e84ea1926d38496607780c8b8985cab488b758
Parents: 9eba234
Author: Sven Meier <sv...@apache.org>
Authored: Wed Oct 11 00:05:35 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Wed Oct 11 00:05:35 2017 +0200
----------------------------------------------------------------------
.../ajax/AjaxNewWindowNotifyingBehavior.java | 126 +++++++++----------
.../examples/ajax/builtin/AjaxApplication.java | 15 +++
2 files changed, 71 insertions(+), 70 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/00e84ea1/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxNewWindowNotifyingBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxNewWindowNotifyingBehavior.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxNewWindowNotifyingBehavior.java
index 0dff154..357120a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxNewWindowNotifyingBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxNewWindowNotifyingBehavior.java
@@ -19,137 +19,123 @@ package org.apache.wicket.ajax;
import java.util.UUID;
import org.apache.wicket.Component;
-import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.Page;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.head.OnLoadHeaderItem;
-import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.util.string.Strings;
import org.danekja.java.util.function.serializable.SerializableConsumer;
/**
- * An Ajax behavior that notifies when a new browser window/tab is opened with
- * url to a page instance which is already opened in another window/tab in the same user session.
- *
- * Note: this behavior may be assigned only to an instance of a WebPage class.
+ * An Ajax behavior that notifies when a new browser window/tab is opened with url to a page
+ * instance which is already opened in another window/tab in the same user session.
*
* @since 6.0
* @see #onNewWindow(AjaxRequestTarget)
*/
-public abstract class AjaxNewWindowNotifyingBehavior extends AbstractDefaultAjaxBehavior
+public class AjaxNewWindowNotifyingBehavior extends AbstractDefaultAjaxBehavior
{
private static final long serialVersionUID = 1L;
/**
- * A unique name used for the page window's name
- */
- private final String windowName;
-
- /**
- * The name of the HTTP request parameter that brings the current page window's name.
+ * The name of the HTTP request parameter that transports the current page window's name.
*/
private static final String PARAM_WINDOW_NAME = "windowName";
/**
- * A flag whether this behavior has been rendered at least once.
+ * The name of the window the page is bound to.
*/
- private boolean hasBeenRendered;
+ private String boundName;
/**
- * Constructor.
+ * Overridden to add the current window name to the request.
*/
- public AjaxNewWindowNotifyingBehavior()
- {
- this(UUID.randomUUID().toString());
- }
-
- /**
- * Constructor.
- *
- * @param windowName
- * the custom name to use for the page's window
- */
- public AjaxNewWindowNotifyingBehavior(final String windowName)
- {
- this.windowName = windowName;
- }
-
- @Override
- protected final void onBind()
- {
- super.onBind();
-
- Component component = getComponent();
- if (component instanceof WebPage == false)
- {
- throw new WicketRuntimeException(AjaxNewWindowNotifyingBehavior.class.getName() + " can be assigned only to WebPage instances.");
- }
- }
-
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
{
super.updateAjaxAttributes(attributes);
-
- String uuidParam = "return {'"+ PARAM_WINDOW_NAME +"': window.name}";
- attributes.getDynamicExtraParameters().add(uuidParam);
+
+ String parameter = "return {'" + PARAM_WINDOW_NAME + "': window.name}";
+ attributes.getDynamicExtraParameters().add(parameter);
}
+ /**
+ * Overridden to initiate a request once the page was rendered.
+ */
@Override
public void renderHead(Component component, IHeaderResponse response)
{
super.renderHead(component, response);
- if (hasBeenRendered == false)
- {
- hasBeenRendered = true;
- response.render(OnDomReadyHeaderItem.forScript(String.format("window.name='%s'", windowName)));
- }
- response.render(OnLoadHeaderItem.forScript("setTimeout(function() {" + getCallbackScript().toString() + "}, 30);"));
+ response.render(OnLoadHeaderItem
+ .forScript("setTimeout(function() {" + getCallbackScript().toString() + "}, 30);"));
}
@Override
protected void respond(AjaxRequestTarget target)
{
- StringValue uuidParam = getComponent().getRequest().getRequestParameters().getParameterValue(PARAM_WINDOW_NAME);
+ String windowName = getComponent().getRequest().getRequestParameters()
+ .getParameterValue(PARAM_WINDOW_NAME).toString();
- if (windowName.equals(uuidParam.toString()) == false)
+ if (boundName == null)
+ {
+ // not bound to any window yet
+
+ if (Strings.isEmpty(windowName))
+ {
+ // create new name
+ windowName = newWindowName();
+ target.appendJavaScript(String.format("window.name = '%s';", windowName));
+ }
+
+ // now bound to window
+ boundName = windowName;
+ }
+ else if (boundName.equals(windowName) == false)
{
onNewWindow(target);
}
}
/**
- * A callback method when a new window/tab is opened for a page instance
- * which is already opened in another window/tab.
+ * Create a name for a nameless window, default uses a random {@link UUID}.
+ *
+ * @return window name
+ */
+ protected String newWindowName()
+ {
+ return UUID.randomUUID().toString();
+ }
+
+ /**
+ * A callback method when a new window/tab is opened for a page instance which is already opened
+ * in another window/tab.
+ * <p>
+ * Default implementation redirects to a new page instance with identical page parameters.
*
* @param target
- * the current ajax request handler
+ * the current request handler
*/
- protected abstract void onNewWindow(AjaxRequestTarget target);
+ protected void onNewWindow(AjaxRequestTarget target)
+ {
+ Page page = getComponent().getPage();
+
+ getComponent().setResponsePage(page.getClass(), page.getPageParameters());
+ }
/**
* Creates an {@link AjaxNewWindowNotifyingBehavior} based on lambda expressions
*
- * @param windowName
- * the window name
* @param onNewWindow
* the {@code SerializableConsumer} which accepts the {@link AjaxRequestTarget}
* @return the {@link AjaxNewWindowNotifyingBehavior}
*/
- public static AjaxNewWindowNotifyingBehavior onNewWindow(String windowName, SerializableConsumer<AjaxRequestTarget> onNewWindow)
+ public static AjaxNewWindowNotifyingBehavior onNewWindow(SerializableConsumer<AjaxRequestTarget> onNewWindow)
{
Args.notNull(onNewWindow, "onNewWindow");
- if (Strings.isEmpty(windowName))
- {
- windowName = UUID.randomUUID().toString();
- }
-
- return new AjaxNewWindowNotifyingBehavior(windowName)
+ return new AjaxNewWindowNotifyingBehavior()
{
private static final long serialVersionUID = 1L;
http://git-wip-us.apache.org/repos/asf/wicket/blob/00e84ea1/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
index dd44b56..82caa41 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
@@ -16,9 +16,13 @@
*/
package org.apache.wicket.examples.ajax.builtin;
+import org.apache.wicket.Component;
import org.apache.wicket.Page;
+import org.apache.wicket.ajax.AjaxNewWindowNotifyingBehavior;
+import org.apache.wicket.application.IComponentInitializationListener;
import org.apache.wicket.examples.WicketExampleApplication;
import org.apache.wicket.examples.ajax.builtin.modal.ModalWindowPage;
+import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.response.filter.AjaxServerAndClientTimeFilter;
@@ -39,6 +43,17 @@ public class AjaxApplication extends WicketExampleApplication
getRequestCycleSettings().addResponseFilter(new AjaxServerAndClientTimeFilter());
getDebugSettings().setAjaxDebugModeEnabled(true);
+
+ getComponentInitializationListeners().add(new IComponentInitializationListener()
+ {
+ @Override
+ public void onInitialize(Component component)
+ {
+ if (component instanceof WebPage) {
+ component.add(new AjaxNewWindowNotifyingBehavior());
+ }
+ }
+ });
mountPage("autocomplete", AutoCompletePage.class);
mountPage("choice", ChoicePage.class);