Updated Branches: refs/heads/wicket-6.x 94c0c8415 -> dd5de0e55
WICKET-5435 Ajaxified version of WebSession#getClientInfo should be added Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/90235c1c Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/90235c1c Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/90235c1c Branch: refs/heads/wicket-6.x Commit: 90235c1c2ef7eb6ffa9d5d836ce7d0a398ca2821 Parents: ba2e5ce Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Dec 12 15:51:57 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Dec 12 15:51:57 2013 +0200 ---------------------------------------------------------------------- Gruntfile.js | 3 +- .../markup/html/pages/AjaxBrowserInfoForm.java | 74 +++++++++++ .../markup/html/pages/BrowserInfoForm.html | 33 +---- .../markup/html/pages/BrowserInfoForm.java | 70 ++++++----- .../markup/html/pages/BrowserInfoPage.html | 2 +- .../markup/html/pages/BrowserInfoPage.java | 26 ++-- .../markup/html/pages/wicket-browser-info.js | 83 ++++++++++++ .../ajaxhellobrowser/AjaxHelloBrowser.html | 24 ++++ .../ajaxhellobrowser/AjaxHelloBrowser.java | 126 +++++++++++++++++++ .../HelloBrowserApplication.java | 33 +++++ .../examples/hellobrowser/HelloBrowser.java | 17 +-- .../hellobrowser/HelloBrowserApplication.java | 14 +-- .../wicket/examples/homepage/HomePage.html | 3 +- wicket-examples/src/main/webapp/WEB-INF/web.xml | 16 +++ 14 files changed, 428 insertions(+), 96 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/Gruntfile.js ---------------------------------------------------------------------- diff --git a/Gruntfile.js b/Gruntfile.js index cd47c7a..10dbdc3 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -23,7 +23,8 @@ module.exports = function(grunt) { 'wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js', "wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckSelector.js", "wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.js", - "wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormChoiceComponentUpdatingBehavior.js" + "wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormChoiceComponentUpdatingBehavior.js", + "wicket-core/src/main/java/org/apache/wicket/markup/html/pages/wicket-browser-info.js" ], extensionsJs = [ "wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js", http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/AjaxBrowserInfoForm.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/AjaxBrowserInfoForm.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/AjaxBrowserInfoForm.java new file mode 100644 index 0000000..86b2bb1 --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/AjaxBrowserInfoForm.java @@ -0,0 +1,74 @@ +package org.apache.wicket.markup.html.pages; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.attributes.AjaxCallListener; +import org.apache.wicket.ajax.attributes.AjaxRequestAttributes; +import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; +import org.apache.wicket.core.request.ClientInfo; +import org.apache.wicket.markup.html.form.Form; + +/** + * An extension of BrowserInfoForm that uses AjaxFormSubmitBehavior + * to collect the client info without redirect to another page + */ +public class AjaxBrowserInfoForm extends BrowserInfoForm +{ + /** + * Constructor. + * + * @param id component id + */ + public AjaxBrowserInfoForm(String id) + { + super(id); + } + + @Override + protected Form<? extends ClientPropertiesBean> createForm(String componentId) + { + Form<? extends ClientPropertiesBean> f = super.createForm(componentId); + f.add(new AjaxFormSubmitBehavior(f, "domready") + { + @Override + protected void updateAjaxAttributes(AjaxRequestAttributes attributes) + { + super.updateAjaxAttributes(attributes); + AjaxCallListener listener = new AjaxCallListener(); + listener.onBefore(String.format("Wicket.BrowserInfo.populateFields('%s');", getFormMarkupId())); + attributes.getAjaxCallListeners().add(listener); + } + + @Override + protected void onAfterSubmit(AjaxRequestTarget target) + { + super.onAfterSubmit(target); + ClientInfo info = getSession().getClientInfo(); + AjaxBrowserInfoForm.this.onAfterSubmit(target, info); + } + }); + return f; + } + + /** + * A callback method called when the client info is collected + * + * @param target + * The Ajax request handler + * @param info + * The client info + */ + protected void onAfterSubmit(AjaxRequestTarget target, ClientInfo info) + { + } + + /** + * Does nothing. + * + * Use {@linkplain #onAfterSubmit(org.apache.wicket.ajax.AjaxRequestTarget, org.apache.wicket.core.request.ClientInfo)} + */ + @Override + protected final void afterSubmit() + { + super.afterSubmit(); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.html b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.html index 2e46491..5676493 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.html +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.html @@ -15,39 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. --> -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<!DOCTYPE html> <html xmlns:wicket="http://wicket.apache.org"> - <wicket:head> - <script type="text/javascript">/*<![CDATA[*/ - function submitform() { - document.postback.navigatorAppName.value = window.navigator.appName; - document.postback.navigatorAppVersion.value = window.navigator.appVersion; - document.postback.navigatorAppCodeName.value = window.navigator.appCodeName; - var cookieEnabled = (window.navigator.cookieEnabled)? true : false; - if (typeof window.navigator.cookieEnabled == "undefined" && !cookieEnabled) { - document.cookie = "wickettestcookie"; - cookieEnabled = (document.cookie.indexOf("wickettestcookie")!=-1)? true : false; - } - document.postback.navigatorCookieEnabled.value = cookieEnabled; - document.postback.navigatorJavaEnabled.value = window.navigator.javaEnabled(); - document.postback.navigatorLanguage.value = window.navigator.language ? window.navigator.language : window.navigator.userLanguage; - document.postback.navigatorPlatform.value = window.navigator.platform; - document.postback.navigatorUserAgent.value = window.navigator.userAgent; - if (window.screen) { - document.postback.screenWidth.value = window.screen.width; - document.postback.screenHeight.value = window.screen.height; - document.postback.screenColorDepth.value = window.screen.colorDepth; - } - document.postback.utcOffset.value = (new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0).getTimezoneOffset() / -60); - document.postback.utcDSTOffset.value = (new Date(new Date().getFullYear(), 6, 1, 0, 0, 0, 0).getTimezoneOffset() / -60); - document.postback.browserWidth.value = window.innerWidth || document.body.offsetWidth; - document.postback.browserHeight.value = window.innerHeight || document.body.offsetHeight; - document.postback.hostname.value = window.location.hostname; - - document.postback.submit(); - } - /*]]>*/</script> - </wicket:head> <wicket:panel> <form name="postback" wicket:id="postback" style="position:absolute; left: -10000px;"> <input type="text" wicket:id="navigatorAppName" value="test" /> http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.java index 0b6d530..653c9eb 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoForm.java @@ -16,7 +16,8 @@ */ package org.apache.wicket.markup.html.pages; -import org.apache.wicket.util.io.IClusterable; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.Panel; @@ -24,23 +25,24 @@ import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.protocol.http.ClientProperties; import org.apache.wicket.protocol.http.WebSession; import org.apache.wicket.protocol.http.request.WebClientInfo; -import org.apache.wicket.core.request.ClientInfo; import org.apache.wicket.request.cycle.RequestCycle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.wicket.request.resource.JavaScriptResourceReference; +import org.apache.wicket.util.io.IClusterable; /** * Form for posting JavaScript properties. */ public class BrowserInfoForm extends Panel { - /** log. */ - private static final Logger log = LoggerFactory.getLogger(BrowserInfoForm.class); - private static final long serialVersionUID = 1L; /** - * Construct. + * The special form that submits the client/browser info + */ + private final Form<? extends ClientPropertiesBean> form; + + /** + * Constructor. * * @param id * component id @@ -49,21 +51,32 @@ public class BrowserInfoForm extends Panel { super(id); - Form<ClientPropertiesBean> form = new Form<ClientPropertiesBean>("postback", - new CompoundPropertyModel<ClientPropertiesBean>(new ClientPropertiesBean())) + this.form = createForm("postback"); + form.setOutputMarkupId(true); + add(form); + } + + /** + * Creates the form + * + * @param componentId + * the id for the Form component + * @return the Form that will submit the data + */ + protected Form<? extends ClientPropertiesBean> createForm(String componentId) + { + Form<ClientPropertiesBean> form = new Form<ClientPropertiesBean>(componentId, + new CompoundPropertyModel<ClientPropertiesBean>(new ClientPropertiesBean())) { private static final long serialVersionUID = 1L; - /** - * @see org.apache.wicket.markup.html.form.Form#onSubmit() - */ @Override protected void onSubmit() { ClientPropertiesBean propertiesBean = getModelObject(); RequestCycle requestCycle = getRequestCycle(); - WebSession session = (WebSession)getSession(); + WebSession session = getWebSession(); WebClientInfo clientInfo = session.getClientInfo(); if (clientInfo == null) @@ -94,27 +107,28 @@ public class BrowserInfoForm extends Panel form.add(new TextField<String>("browserWidth")); form.add(new TextField<String>("browserHeight")); form.add(new TextField<String>("hostname")); - add(form); + return form; } - - /** - * Log a warning that for in order to use this page, you should really be using - * {@link WebClientInfo}. - * - * @param clientInfo - * the actual client info object - */ - void warnNotUsingWebClientInfo(ClientInfo clientInfo) + protected void afterSubmit() { - log.warn("using " + getClass().getName() + " makes no sense if you are not using " + - WebClientInfo.class.getName() + " (you are using " + clientInfo.getClass().getName() + - " instead)"); } - protected void afterSubmit() + @Override + public void renderHead(IHeaderResponse response) { + super.renderHead(response); + + response.render(JavaScriptHeaderItem.forReference( + new JavaScriptResourceReference(BrowserInfoForm.class, "wicket-browser-info.js"))); + } + /** + * @return The markup id of the form that submits the client info + */ + public String getFormMarkupId() + { + return form.getMarkupId(); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.html b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.html index 2427950..81019d4 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.html +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.html @@ -20,7 +20,7 @@ <head> <meta wicket:id="meta" http-equiv="refresh" /> </head> - <body onload="javascript:submitform();"> + <body> If you see this, it means that both javascript and meta-refresh are not support by your browser configuration. Please click <a wicket:id="link" href="#">this link</a> to continue to the original destination. http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.java index 3f5452b..373cbb5 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/BrowserInfoPage.java @@ -17,6 +17,8 @@ package org.apache.wicket.markup.html.pages; import org.apache.wicket.AttributeModifier; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.OnLoadHeaderItem; import org.apache.wicket.markup.html.WebComponent; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.WebPage; @@ -29,7 +31,6 @@ import org.apache.wicket.protocol.http.request.WebClientInfo; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.settings.IRequestCycleSettings; - /** * <p> * This page uses a form post right after the page has loaded in the browser, using JavaScript or @@ -49,6 +50,8 @@ public class BrowserInfoPage extends WebPage { private static final long serialVersionUID = 1L; + private BrowserInfoForm browserInfoForm; + /** * Bookmarkable constructor. This is not for normal framework client use. It will be called * whenever JavaScript is not supported, and the browser info page's meta refresh fires to this @@ -74,9 +77,15 @@ public class BrowserInfoPage extends WebPage continueToOriginalDestination(); } - /** - * @see org.apache.wicket.Component#isVersioned() - */ + @Override + public void renderHead(IHeaderResponse response) + { + super.renderHead(response); + + response.render(OnLoadHeaderItem.forScript( + String.format("Wicket.BrowserInfo.submitForm('%s')", browserInfoForm.getFormMarkupId()))); + } + @Override public boolean isVersioned() { @@ -117,18 +126,17 @@ public class BrowserInfoPage extends WebPage WebMarkupContainer link = new WebMarkupContainer("link"); link.add(AttributeModifier.replace("href", urlModel)); add(link); - add(new BrowserInfoForm("postback") + + browserInfoForm = new BrowserInfoForm("postback") { private static final long serialVersionUID = 1L; - /** - * @see org.apache.wicket.markup.html.pages.BrowserInfoForm#afterSubmit() - */ @Override protected void afterSubmit() { continueToOriginalDestination(); } - }); + }; + add(browserInfoForm); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/wicket-browser-info.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/wicket-browser-info.js b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/wicket-browser-info.js new file mode 100644 index 0000000..6fb1fa3 --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/wicket-browser-info.js @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Wicket BrowserInfo Support + * + * Populates a special form with the client/browser info + * and submits it to the server + */ + +;(function (undefined) { + + 'use strict'; + + if (typeof(Wicket) === 'undefined') { + window.Wicket = {}; + } + + if (typeof(Wicket.BrowserInfo) === 'undefined') { + window.Wicket.BrowserInfo = { + + /** + * Populates the form elements with the client info + * + * @param formMarkupId The markup id of the special form + * @returns {HTMLFormElement} The special form + */ + populateFields: function(formMarkupId) { + var postbackForm = document.getElementById(formMarkupId); + postbackForm.navigatorAppName.value = window.navigator.appName; + postbackForm.navigatorAppVersion.value = window.navigator.appVersion; + postbackForm.navigatorAppCodeName.value = window.navigator.appCodeName; + var cookieEnabled = (window.navigator.cookieEnabled); + if (typeof(window.navigator.cookieEnabled) === "undefined" && !cookieEnabled) { + document.cookie = "wickettestcookie"; + cookieEnabled = (document.cookie.indexOf("wickettestcookie") !== -1); + } + postbackForm.navigatorCookieEnabled.value = cookieEnabled; + postbackForm.navigatorJavaEnabled.value = window.navigator.javaEnabled(); + postbackForm.navigatorLanguage.value = window.navigator.language ? window.navigator.language : window.navigator.userLanguage; + postbackForm.navigatorPlatform.value = window.navigator.platform; + postbackForm.navigatorUserAgent.value = window.navigator.userAgent; + if (window.screen) { + postbackForm.screenWidth.value = window.screen.width; + postbackForm.screenHeight.value = window.screen.height; + postbackForm.screenColorDepth.value = window.screen.colorDepth; + } + postbackForm.utcOffset.value = (new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0).getTimezoneOffset() / -60); + postbackForm.utcDSTOffset.value = (new Date(new Date().getFullYear(), 6, 1, 0, 0, 0, 0).getTimezoneOffset() / -60); + postbackForm.browserWidth.value = window.innerWidth || document.body.offsetWidth; + postbackForm.browserHeight.value = window.innerHeight || document.body.offsetHeight; + postbackForm.hostname.value = window.location.hostname; + + return postbackForm; + }, + + /** + * Populates and submits the special form. + * + * @param formMarkupId The markup id of the special form + */ + submitForm: function(formMarkupId) { + var postbackForm = Wicket.BrowserInfo.populateFields(formMarkupId); + postbackForm.submit(); + } + }; + } + +})(); http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/AjaxHelloBrowser.html ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/AjaxHelloBrowser.html b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/AjaxHelloBrowser.html new file mode 100644 index 0000000..059abbc --- /dev/null +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/AjaxHelloBrowser.html @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org"> +<head> + <title>Wicket Examples - hellobrowser</title> + <link rel="stylesheet" type="text/css" href="style.css"/> +</head> +<body> + <div wicket:id="mainNavigation"></div> + + <div wicket:id="form"></div> + + <p> + Hi there. We have been snooping around your browser, even doing a sneaky + redirect to test some javascript properties in the process, and this is what we + found out: <br /><br /> + ClientProperties: <span wicket:id="clientinfo">client info here</span> + </p> + + <p> + <span wicket:id="clienttime">client time info here</span> + </p> + +</body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/AjaxHelloBrowser.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/AjaxHelloBrowser.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/AjaxHelloBrowser.java new file mode 100644 index 0000000..824caf0 --- /dev/null +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/AjaxHelloBrowser.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.examples.ajaxhellobrowser; + +import java.text.DateFormat; +import java.util.Calendar; +import java.util.Locale; +import java.util.TimeZone; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.core.request.ClientInfo; +import org.apache.wicket.examples.WicketExamplePage; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.basic.MultiLineLabel; +import org.apache.wicket.markup.html.pages.AjaxBrowserInfoForm; +import org.apache.wicket.model.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.protocol.http.ClientProperties; +import org.apache.wicket.protocol.http.request.WebClientInfo; +import org.apache.wicket.settings.IRequestCycleSettings; + + +/** + * A demo usage of AjaxBrowserInfoForm + */ +public class AjaxHelloBrowser extends WicketExamplePage +{ + /** + * Constructor. + */ + public AjaxHelloBrowser() + { + final MultiLineLabel clientInfo = new MultiLineLabel("clientinfo", new AbstractReadOnlyModel<String>() + { + @Override + public String getObject() + { + ClientProperties properties = getClientProperties(); + return properties.toString(); + } + }); + clientInfo.setOutputMarkupPlaceholderTag(true); + clientInfo.setVisible(false); + + IModel<String> clientTimeModel = new AbstractReadOnlyModel<String>() + { + @Override + public String getObject() + { + ClientProperties properties = getClientProperties(); + TimeZone timeZone = properties.getTimeZone(); + if (timeZone != null) + { + Calendar cal = Calendar.getInstance(timeZone); + Locale locale = getLocale(); + DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.LONG, locale); + String calAsString = dateFormat.format(cal.getTime()); + StringBuilder b = new StringBuilder("Based on your settings, your time is: "); + b.append(calAsString); + b.append(" (and your time zone is "); + b.append(timeZone.getDisplayName(getLocale())); + b.append(')'); + return b.toString(); + } + return "Unfortunately, we were not able to figure out what your time zone is, so we have" + + " no idea what your time is"; + } + }; + final Label clientTime = new Label("clienttime", clientTimeModel); + clientTime.setOutputMarkupPlaceholderTag(true); + clientTime.setVisible(false); + + AjaxBrowserInfoForm form = new AjaxBrowserInfoForm("form") + { + @Override + protected void onAfterSubmit(AjaxRequestTarget target, ClientInfo info) + { + super.onAfterSubmit(target, info); + + clientInfo.setVisible(true); + clientTime.setVisible(true); + target.add(clientInfo, clientTime); + } + }; + + add(form, clientInfo, clientTime); + } + + /** + * A helper function that makes sure that gathering of extended browser info + * is not enabled when reading the ClientInfo's properties + * + * @return the currently available client info + */ + private ClientProperties getClientProperties() + { + IRequestCycleSettings requestCycleSettings = getApplication().getRequestCycleSettings(); + boolean gatherExtendedBrowserInfo = requestCycleSettings.getGatherExtendedBrowserInfo(); + ClientProperties properties = null; + try + { + requestCycleSettings.setGatherExtendedBrowserInfo(false); + WebClientInfo clientInfo = (WebClientInfo) getSession().getClientInfo(); + properties = clientInfo.getProperties(); + } + finally + { + requestCycleSettings.setGatherExtendedBrowserInfo(gatherExtendedBrowserInfo); + } + return properties; + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/HelloBrowserApplication.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/HelloBrowserApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/HelloBrowserApplication.java new file mode 100644 index 0000000..982b892 --- /dev/null +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/HelloBrowserApplication.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.examples.ajaxhellobrowser; + +import org.apache.wicket.Page; +import org.apache.wicket.examples.WicketExampleApplication; + +/** + * Application class for Ajax based browser info extractor. + */ +public class HelloBrowserApplication extends WicketExampleApplication +{ + @Override + public Class<? extends Page> getHomePage() + { + return AjaxHelloBrowser.class; + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java b/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java index 5cab415..12532c9 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java @@ -43,13 +43,8 @@ public class HelloBrowser extends WicketExamplePage */ public HelloBrowser() { - // add a label that outputs a the client info object; it will result in - // the calls RequestCycle.getClientInfo -> Session.getClientInfo -> - // RequestCycle.newClientInfo. this is done once by default and - // afterwards cached in the session object. This application uses - // a custom requestcycle that overrides newClientInfo to not only - // look at the user-agent request header, but also snoops javascript - // properties by redirecting to a special page. + // Add a label that outputs the client info object; it will result in + // the calls Session.getClientInfo. // don't use a property model here or anything else that is resolved // during rendering, as changing the request target during rendering @@ -73,17 +68,17 @@ public class HelloBrowser extends WicketExamplePage Locale locale = getLocale(); DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.LONG, locale); String calAsString = dateFormat.format(cal.getTime()); - StringBuilder b = new StringBuilder("Based on your settings, your time is: "); + StringBuilder b = new StringBuilder("Based on your settings, your time is: "); b.append(calAsString); b.append(" (and your time zone is "); b.append(timeZone.getDisplayName(getLocale())); - b.append(")"); + b.append(')'); return b.toString(); } return "Unfortunately, we were not able to figure out what your time zone is, so we have" - + "no idea what your time is"; + + " no idea what your time is"; } }; add(new Label("clienttime", clientTimeModel)); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowserApplication.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowserApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowserApplication.java index 66079cb..4e98f03 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowserApplication.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowserApplication.java @@ -26,31 +26,19 @@ import org.apache.wicket.examples.WicketExampleApplication; */ public class HelloBrowserApplication extends WicketExampleApplication { - /** - * Constructor. - */ - public HelloBrowserApplication() - { - } - - /** - * @see org.apache.wicket.Application#getHomePage() - */ @Override public Class<? extends Page> getHomePage() { return HelloBrowser.class; } - /** - * @see org.apache.wicket.examples.WicketExampleApplication#init() - */ @Override protected void init() { super.init(); getRequestCycleSettings().setGatherExtendedBrowserInfo(true); + mountPage("howdy", HelloBrowser.class); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-examples/src/main/resources/org/apache/wicket/examples/homepage/HomePage.html ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/resources/org/apache/wicket/examples/homepage/HomePage.html b/wicket-examples/src/main/resources/org/apache/wicket/examples/homepage/HomePage.html index e8d396d..e6c5daf 100644 --- a/wicket-examples/src/main/resources/org/apache/wicket/examples/homepage/HomePage.html +++ b/wicket-examples/src/main/resources/org/apache/wicket/examples/homepage/HomePage.html @@ -41,7 +41,8 @@ <tr><td align="right"><a href="template">template</a></td><td> - Templating example.</td></tr> <tr><td align="right"><a href="mailtemplate">mail template</a></td><td> - Generate mail templates out of Page, Panel or TextTemplate.</td></tr> <tr><td align="right"><a href="stateless">stateless</a></td><td> - Demonstrates stateless pages/sessions.</td></tr> - <tr><td align="right"><a href="hellobrowser">hellobrowser</a></td><td> - Browser snooper.</td></tr> + <tr><td align="right"><a href="hellobrowser">Browser Info</a></td><td> - Extracts client info by redirecting to a temporary page.</td></tr> + <tr><td align="right"><a href="ajaxhellobrowser">Ajax Browser Info</a></td><td> - Extracts client info by using Ajax.</td></tr> <tr><td align="right"><a href="frames">frames</a></td><td> - Example demonstrating HTML frames.</td></tr> <tr><td align="right"><a href="prototype">ajax with prototype</a></td><td> - AJAX example using prototype.js.</td></tr> <tr><td align="right"><a href="wizard">abacadabra</a></td><td> - Demonstrates the wizard component.</td></tr> http://git-wip-us.apache.org/repos/asf/wicket/blob/90235c1c/wicket-examples/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/webapp/WEB-INF/web.xml b/wicket-examples/src/main/webapp/WEB-INF/web.xml index 38799f0..db9c840 100644 --- a/wicket-examples/src/main/webapp/WEB-INF/web.xml +++ b/wicket-examples/src/main/webapp/WEB-INF/web.xml @@ -117,6 +117,15 @@ </filter> <filter> + <filter-name>AjaxHelloBrowserApplication</filter-name> + <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> + <init-param> + <param-name>applicationClassName</param-name> + <param-value>org.apache.wicket.examples.ajaxhellobrowser.HelloBrowserApplication</param-value> + </init-param> + </filter> + + <filter> <filter-name>StockQuoteApplication</filter-name> <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> <init-param> @@ -572,6 +581,13 @@ </filter-mapping> <filter-mapping> + <filter-name>AjaxHelloBrowserApplication</filter-name> + <url-pattern>/ajaxhellobrowser/*</url-pattern> + <dispatcher>REQUEST</dispatcher> + <dispatcher>INCLUDE</dispatcher> + </filter-mapping> + + <filter-mapping> <filter-name>FormInputApplication</filter-name> <url-pattern>/forminput/*</url-pattern> <dispatcher>REQUEST</dispatcher>
