WICKET-5435 Ajaxified version of WebSession#getClientInfo should be added

Introduce AjaxClientInfoBehavior that collects the client info.

(cherry picked from commit c84f0c25bf86731e5abdaa1899def55f2545ee90)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/931f5e05
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/931f5e05
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/931f5e05

Branch: refs/heads/master
Commit: 931f5e058b4ca02ceea46f921603aa8e32ea437a
Parents: a2c4cd4
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Sat Dec 14 10:09:30 2013 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Sat Dec 14 23:06:33 2013 +0200

----------------------------------------------------------------------
 .../wicket/ajax/AjaxClientInfoBehavior.java     | 134 +++++++++++++++++++
 .../markup/html/pages/AjaxBrowserInfoForm.java  |  91 -------------
 .../markup/html/pages/wicket-browser-info.js    |  57 +++++---
 .../wicket/protocol/http/ClientProperties.java  |   6 +-
 .../ajaxhellobrowser/AjaxHelloBrowser.html      |   7 +-
 .../ajaxhellobrowser/AjaxHelloBrowser.java      |  13 +-
 6 files changed, 181 insertions(+), 127 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/931f5e05/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxClientInfoBehavior.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxClientInfoBehavior.java 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxClientInfoBehavior.java
new file mode 100644
index 0000000..c106d72
--- /dev/null
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxClientInfoBehavior.java
@@ -0,0 +1,134 @@
+/*
+ * 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.ajax;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.Session;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.html.pages.BrowserInfoForm;
+import org.apache.wicket.protocol.http.ClientProperties;
+import org.apache.wicket.protocol.http.request.WebClientInfo;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.util.time.Duration;
+
+/**
+ * An behavior that collects the information to populate
+ * WebClientInfo's ClientProperties by using Ajax
+ */
+public class AjaxClientInfoBehavior extends AbstractAjaxTimerBehavior
+{
+       /**
+        * Constructor.
+        *
+        * Auto fires after 50 millis.
+        */
+       public AjaxClientInfoBehavior()
+       {
+               this(Duration.milliseconds(50));
+       }
+
+       /**
+        * Constructor.
+        *
+        * Auto fires after {@code duration}.
+        */
+       public AjaxClientInfoBehavior(Duration duration)
+       {
+               super(duration);
+       }
+
+       @Override
+       protected final void onTimer(AjaxRequestTarget target)
+       {
+               stop(target);
+
+               RequestCycle requestCycle = RequestCycle.get();
+               IRequestParameters requestParameters = 
requestCycle.getRequest().getRequestParameters();
+               String navigatorAppName = 
requestParameters.getParameterValue("navigatorAppName").toString("N/A");
+               String navigatorAppVersion = 
requestParameters.getParameterValue("navigatorAppVersion").toString("N/A");
+               String navigatorAppCodeName = 
requestParameters.getParameterValue("navigatorAppCodeName").toString("N/A");
+               boolean navigatorCookieEnabled = 
requestParameters.getParameterValue("navigatorCookieEnabled").toBoolean(false);
+               Boolean navigatorJavaEnabled = 
requestParameters.getParameterValue("navigatorJavaEnabled").toBoolean(false);
+               String navigatorLanguage = 
requestParameters.getParameterValue("navigatorLanguage").toString("N/A");
+               String navigatorPlatform = 
requestParameters.getParameterValue("navigatorPlatform").toString("N/A");
+               String navigatorUserAgent = 
requestParameters.getParameterValue("navigatorUserAgent").toString("N/A");
+               int screenWidth = 
requestParameters.getParameterValue("screenWidth").toInt(-1);
+               int screenHeight = 
requestParameters.getParameterValue("screenHeight").toInt(-1);
+               int screenColorDepth = 
requestParameters.getParameterValue("screenColorDepth").toInt(-1);
+               String utcOffset = 
requestParameters.getParameterValue("utcOffset").toString("N/A");
+               String utcDSTOffset = 
requestParameters.getParameterValue("utcDSTOffset").toString("N/A");
+               int browserWidth = 
requestParameters.getParameterValue("browserWidth").toInt(-1);
+               int browserHeight = 
requestParameters.getParameterValue("browserHeight").toInt(-1);
+               String hostname = 
requestParameters.getParameterValue("hostname").toString("N/A");
+
+               WebClientInfo clientInfo = new WebClientInfo(requestCycle);
+               Session.get().setClientInfo(clientInfo);
+
+               ClientProperties properties = clientInfo.getProperties();
+               properties.setNavigatorAppCodeName(navigatorAppCodeName);
+               properties.setNavigatorAppName(navigatorAppName);
+               properties.setNavigatorAppVersion(navigatorAppVersion);
+               properties.setCookiesEnabled(navigatorCookieEnabled);
+               properties.setJavaEnabled(navigatorJavaEnabled);
+               properties.setNavigatorLanguage(navigatorLanguage);
+               properties.setNavigatorPlatform(navigatorPlatform);
+               properties.setNavigatorUserAgent(navigatorUserAgent);
+               properties.setScreenWidth(screenWidth);
+               properties.setScreenHeight(screenHeight);
+               properties.setScreenColorDepth(screenColorDepth);
+               properties.setUtcOffset(utcOffset);
+               properties.setUtcDSTOffset(utcDSTOffset);
+               properties.setBrowserWidth(browserWidth);
+               properties.setBrowserHeight(browserHeight);
+               properties.setHostname(hostname);
+
+               onClientInfo(target, clientInfo);
+       }
+
+       /**
+        * A callback method invoked when the client info is collected.
+        * 
+        * @param target
+        *          The Ajax request handler
+        * @param clientInfo
+        *          The collected info for the client 
+        */
+       protected void onClientInfo(AjaxRequestTarget target, WebClientInfo 
clientInfo)
+       {
+       }
+
+       @Override
+       protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
+       {
+               super.updateAjaxAttributes(attributes);
+
+               attributes.getDynamicExtraParameters().add("return 
Wicket.BrowserInfo.collect()");
+       }
+
+       @Override
+       public void renderHead(Component component, IHeaderResponse response)
+       {
+               super.renderHead(component, response);
+
+               response.render(JavaScriptHeaderItem.forReference(
+                               new 
JavaScriptResourceReference(BrowserInfoForm.class, "wicket-browser-info.js")));
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/931f5e05/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
deleted file mode 100644
index 1ac842c..0000000
--- 
a/wicket-core/src/main/java/org/apache/wicket/markup/html/pages/AjaxBrowserInfoForm.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.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;
-import org.apache.wicket.protocol.http.request.WebClientInfo;
-
-/**
- * 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);
-                               WebClientInfo info = 
getWebSession().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, WebClientInfo 
info)
-       {
-       }
-
-       /**
-        * Does nothing.
-        *
-        * Use {@linkplain 
#onAfterSubmit(org.apache.wicket.ajax.AjaxRequestTarget, 
org.apache.wicket.protocol.http.request.WebClientInfo)}
-        */
-       @Override
-       protected final void afterSubmit()
-       {
-               super.afterSubmit();
-       }
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/931f5e05/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
index 6fb1fa3..528ff44 100644
--- 
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
@@ -34,36 +34,51 @@
                window.Wicket.BrowserInfo = {
 
                        /**
-                        * Populates the form elements with the client info
+                        * Collects the client information
                         *
-                        * @param formMarkupId   The markup id of the special 
form
-                        * @returns {HTMLFormElement} The special form
+                        * @returns {Object}
                         */
-                       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;
+                       collect: function() {
+                               var info = {};
+                               info.navigatorAppName = 
window.navigator.appName;
+                               info.navigatorAppVersion = 
window.navigator.appVersion;
+                               info.navigatorAppCodeName = 
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;
+                               info.navigatorCookieEnabled = cookieEnabled;
+                               info.navigatorJavaEnabled =  
window.navigator.javaEnabled();
+                               info.navigatorLanguage = 
window.navigator.language ? window.navigator.language : 
window.navigator.userLanguage;
+                               info.navigatorPlatform = 
window.navigator.platform;
+                               info.navigatorUserAgent = 
window.navigator.userAgent;
                                if (window.screen) {
-                                       postbackForm.screenWidth.value = 
window.screen.width;
-                                       postbackForm.screenHeight.value = 
window.screen.height;
-                                       postbackForm.screenColorDepth.value = 
window.screen.colorDepth;
+                                       info.screenWidth = window.screen.width;
+                                       info.screenHeight = 
window.screen.height;
+                                       info.screenColorDepth = 
window.screen.colorDepth;
+                               }
+                               info.utcOffset = (new Date(new 
Date().getFullYear(), 0, 1, 0, 0, 0, 0).getTimezoneOffset() / -60);
+                               info.utcDSTOffset = (new Date(new 
Date().getFullYear(), 6, 1, 0, 0, 0, 0).getTimezoneOffset() / -60);
+                               info.browserWidth =  window.innerWidth || 
document.body.offsetWidth;
+                               info.browserHeight =  window.innerHeight || 
document.body.offsetHeight;
+                               info.hostname =  window.location.hostname;
+                               return info;
+                       },
+
+                       /**
+                        * 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);
+                               var info = Wicket.BrowserInfo.collect();
+                               var i;
+                               for (i in info) {
+                                       postbackForm[i].value = info[i];
                                }
-                               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;
                        },

http://git-wip-us.apache.org/repos/asf/wicket/blob/931f5e05/wicket-core/src/main/java/org/apache/wicket/protocol/http/ClientProperties.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/ClientProperties.java
 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/ClientProperties.java
index 5977a22..6c72cf4 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/ClientProperties.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/ClientProperties.java
@@ -257,7 +257,7 @@ public class ClientProperties implements IClusterable
                                        {
                                                utc = utc.substring(1);
                                        }
-                                       timeZone = TimeZone.getTimeZone("GMT" + 
((offset > 0) ? "+" : "-") + utc);
+                                       timeZone = TimeZone.getTimeZone("GMT" + 
((offset > 0) ? '+' : '-') + utc);
                                }
 
                                String dstOffset = getUtcDSTOffset();
@@ -284,7 +284,7 @@ public class ClientProperties implements IClusterable
                                                AppendingStringBuffer sb = new 
AppendingStringBuffer("GMT");
                                                sb.append(offsetHours > 0 ? '+' 
: '-');
                                                
sb.append(Math.abs(offsetHours));
-                                               sb.append(":");
+                                               sb.append(':');
                                                if (offsetMins < 10)
                                                {
                                                        sb.append('0');
@@ -299,7 +299,7 @@ public class ClientProperties implements IClusterable
                                                {
                                                        dstOffset = 
dstOffset.substring(1);
                                                }
-                                               dstTimeZone = 
TimeZone.getTimeZone("GMT" + ((offset > 0) ? "+" : "-") +
+                                               dstTimeZone = 
TimeZone.getTimeZone("GMT" + ((offset > 0) ? '+' : '-') +
                                                        dstOffset);
                                        }
                                        // if the dstTimezone (1 July) has a 
different offset then

http://git-wip-us.apache.org/repos/asf/wicket/blob/931f5e05/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
index 059abbc..48e9a0e 100644
--- 
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
@@ -7,12 +7,9 @@
 <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 />
+           This page uses 
<em>org.apache.wicket.ajax.AjaxClientInfoBehavior</em>
+        to collect the following information: <br /><br />
            ClientProperties: <span wicket:id="clientinfo">client info 
here</span>
        </p>
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/931f5e05/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
index 9e6c8e0..024ec01 100644
--- 
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
@@ -21,12 +21,11 @@ import java.util.Calendar;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import org.apache.wicket.ajax.AjaxClientInfoBehavior;
 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;
@@ -84,20 +83,20 @@ public class AjaxHelloBrowser extends WicketExamplePage
                clientTime.setOutputMarkupPlaceholderTag(true);
                clientTime.setVisible(false);
 
-               AjaxBrowserInfoForm form = new AjaxBrowserInfoForm("form")
+               add(new AjaxClientInfoBehavior()
                {
                        @Override
-                       protected void onAfterSubmit(AjaxRequestTarget target, 
WebClientInfo info)
+                       protected void onClientInfo(AjaxRequestTarget target, 
WebClientInfo info)
                        {
-                               super.onAfterSubmit(target, info);
+                               super.onClientInfo(target, info);
 
                                clientInfo.setVisible(true);
                                clientTime.setVisible(true);
                                target.add(clientInfo, clientTime);
                        }
-               };
+               });
 
-               add(form, clientInfo, clientTime);
+               add(clientInfo, clientTime);
        }
 
        /**

Reply via email to