Repository: wicket
Updated Branches:
  refs/heads/wicket-7.x 3db582cfe -> 5bfa280b2


WICKET-6056 make it easier to gather more properties


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

Branch: refs/heads/wicket-7.x
Commit: 5bfa280b2b7fb9dc7861d582a9c6e37d106be879
Parents: 3db582c
Author: Sven Meier <svenme...@apache.org>
Authored: Thu Nov 24 16:32:22 2016 +0100
Committer: Sven Meier <svenme...@apache.org>
Committed: Tue Dec 6 15:09:25 2016 +0100

----------------------------------------------------------------------
 .../wicket/ajax/AjaxClientInfoBehavior.java     | 47 +++-------------
 .../markup/html/pages/BrowserInfoForm.html      | 16 ------
 .../markup/html/pages/BrowserInfoForm.java      | 47 ++--------------
 .../markup/html/pages/BrowserInfoPage.java      | 44 +++++++++++----
 .../markup/html/pages/wicket-browser-info.js    | 11 +++-
 .../wicket/protocol/http/ClientProperties.java  | 57 +++++++++++++++-----
 .../protocol/http/request/WebClientInfo.java    | 39 ++++++++++++--
 .../ajaxhellobrowser/AjaxHelloBrowser.java      | 27 ++++++++--
 .../ExtendedClientProperties.java               | 49 +++++++++++++++++
 9 files changed, 206 insertions(+), 131 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/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
index a2fc41a..16ac6e6 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxClientInfoBehavior.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxClientInfoBehavior.java
@@ -22,7 +22,6 @@ 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;
@@ -62,50 +61,20 @@ public class AjaxClientInfoBehavior extends 
AbstractAjaxTimerBehavior
                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);
+               IRequestParameters requestParameters = 
requestCycle.getRequest().getRequestParameters();
+               WebClientInfo clientInfo = newWebClientInfo(requestCycle);
+               clientInfo.getProperties().read(requestParameters);
                Session.get().setClientInfo(clientInfo);
 
-               ClientProperties properties = clientInfo.getProperties();
-               properties.setJavaScriptEnabled(true);
-
-               properties.setNavigatorAppCodeName(navigatorAppCodeName);
-               properties.setNavigatorAppName(navigatorAppName);
-               properties.setNavigatorAppVersion(navigatorAppVersion);
-               properties.setNavigatorCookieEnabled(navigatorCookieEnabled);
-               properties.setNavigatorJavaEnabled(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);
        }
 
+       protected WebClientInfo newWebClientInfo(RequestCycle requestCycle)
+       {
+               return new WebClientInfo(requestCycle);
+       }
+
        /**
         * A callback method invoked when the client info is collected.
         * 

http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/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 5676493..add368f 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
@@ -19,22 +19,6 @@
 <html xmlns:wicket="http://wicket.apache.org";>
        <wicket:panel>
                <form name="postback" wicket:id="postback" 
style="position:absolute; left: -10000px;">
-                       <input type="text" wicket:id="navigatorAppName" 
value="test" />
-                       <input type="text" wicket:id="navigatorAppVersion" 
value="test" />
-                       <input type="text" wicket:id="navigatorAppCodeName" />
-                       <input type="text" wicket:id="navigatorCookieEnabled" />
-                       <input type="text" wicket:id="navigatorJavaEnabled" />
-                       <input type="text" wicket:id="navigatorLanguage" />
-                       <input type="text" wicket:id="navigatorPlatform" />
-                       <input type="text" wicket:id="navigatorUserAgent" />
-                       <input type="text" wicket:id="screenWidth" />
-                       <input type="text" wicket:id="screenHeight" />
-                       <input type="text" wicket:id="screenColorDepth" />
-                       <input type="text" wicket:id="utcOffset" />
-                       <input type="text" wicket:id="utcDSTOffset" />
-                       <input type="text" wicket:id="browserWidth" />
-                       <input type="text" wicket:id="browserHeight" />
-                       <input type="text" wicket:id="hostname" />
                </form>
        </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/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 8164c1b..51ef702 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,14 +16,10 @@
  */
 package org.apache.wicket.markup.html.pages;
 
-import java.util.Locale;
-
 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.GenericPanel;
-import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.protocol.http.ClientProperties;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
@@ -67,33 +63,18 @@ public class BrowserInfoForm extends 
GenericPanel<ClientProperties>
         */
        protected Form<ClientProperties> createForm(String componentId, 
IModel<ClientProperties> properties)
        {
-               Form<ClientProperties> form = new 
Form<ClientProperties>(componentId,
-                               new 
CompoundPropertyModel<ClientProperties>(properties))
+               Form<ClientProperties> form = new 
Form<ClientProperties>(componentId, properties)
                {
                        private static final long serialVersionUID = 1L;
 
                        @Override
                        protected void onSubmit()
                        {
+                               
getModelObject().read(getRequest().getPostParameters());
+
                                afterSubmit();
                        }
                };
-               form.add(new ReadOnlyTextField<String>("navigatorAppName"));
-               form.add(new ReadOnlyTextField<String>("navigatorAppVersion"));
-               form.add(new ReadOnlyTextField<String>("navigatorAppCodeName"));
-               form.add(new 
ReadOnlyTextField<Boolean>("navigatorCookieEnabled"));
-               form.add(new 
ReadOnlyTextField<Boolean>("navigatorJavaEnabled"));
-               form.add(new ReadOnlyTextField<String>("navigatorLanguage"));
-               form.add(new ReadOnlyTextField<String>("navigatorPlatform"));
-               form.add(new ReadOnlyTextField<String>("navigatorUserAgent"));
-               form.add(new ReadOnlyTextField<String>("screenWidth"));
-               form.add(new ReadOnlyTextField<String>("screenHeight"));
-               form.add(new ReadOnlyTextField<String>("screenColorDepth"));
-               form.add(new ReadOnlyTextField<String>("utcOffset"));
-               form.add(new ReadOnlyTextField<String>("utcDSTOffset"));
-               form.add(new ReadOnlyTextField<String>("browserWidth"));
-               form.add(new ReadOnlyTextField<String>("browserHeight"));
-               form.add(new ReadOnlyTextField<String>("hostname"));
                return form;
        }
 
@@ -116,24 +97,4 @@ public class BrowserInfoForm extends 
GenericPanel<ClientProperties>
        {
                return form.getMarkupId();
        }
-       
-       private static final class ReadOnlyTextField<T> extends TextField<T> {
-
-               public ReadOnlyTextField(String id)
-               {
-                       super(id);
-               }
-
-               @Override
-               protected String getModelValue()
-               {
-                       return "";
-               }
-               
-               @Override
-               public Locale getLocale()
-               {
-                       return Locale.ENGLISH;
-               }
-       }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/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 5856015..2a5f356 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
@@ -22,10 +22,12 @@ import org.apache.wicket.markup.head.OnLoadHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
 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.request.cycle.RequestCycle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,7 +54,7 @@ public class BrowserInfoPage extends WebPage
        private static final Logger log = 
LoggerFactory.getLogger(BrowserInfoPage.class);
 
        private BrowserInfoForm browserInfoForm;
-
+       
        /**
         * Bookmarkable constructor.
         */
@@ -76,17 +78,30 @@ public class BrowserInfoPage extends WebPage
                return false;
        }
 
+       protected WebClientInfo newWebClientInfo(RequestCycle requestCycle)
+       {
+               return new WebClientInfo(requestCycle);
+       }
+
        /**
         * Adds components.
         */
        private void initComps()
        {
-               IModel<ClientProperties> properties = new 
AbstractReadOnlyModel<ClientProperties>()
+               final IModel<WebClientInfo> info = new 
LoadableDetachableModel<WebClientInfo>() {
+                       @Override
+                       protected WebClientInfo load()
+                       {
+                               return newWebClientInfo(getRequestCycle());
+                       }                       
+               };
+
+               IModel<ClientProperties> properties = new 
LoadableDetachableModel<ClientProperties>()
                {
                        @Override
-                       public ClientProperties getObject()
+                       protected ClientProperties load()
                        {
-                               return 
WebSession.get().getClientInfo().getProperties();
+                               return info.getObject().getProperties();
                        }
                };
 
@@ -100,7 +115,7 @@ public class BrowserInfoPage extends WebPage
                        }
                }.setVisible(false));
 
-               add(new ContinueLink("link", properties));
+               add(new ContinueLink("link", info));
 
                browserInfoForm = new BrowserInfoForm("postback", properties)
                {
@@ -111,6 +126,8 @@ public class BrowserInfoPage extends WebPage
                        {
                                getModelObject().setJavaScriptEnabled(true);
 
+                               
WebSession.get().setClientInfo(info.getObject());
+
                                continueToOriginalDestination();
 
                                // switch to home page if no original 
destination was intercepted
@@ -120,11 +137,16 @@ public class BrowserInfoPage extends WebPage
                add(browserInfoForm);
        }
        
-       private static class ContinueLink extends Link<ClientProperties> {
+       protected ClientProperties newClientInfo()
+       {
+               return WebSession.get().getClientInfo().getProperties();
+       }
+
+       private static class ContinueLink extends Link<WebClientInfo> {
 
-               public ContinueLink(String id, IModel<ClientProperties> 
properties)
+               public ContinueLink(String id, IModel<WebClientInfo> info)
                {
-                       super(id, properties);
+                       super(id, info);
                }
 
                @Override
@@ -138,7 +160,9 @@ public class BrowserInfoPage extends WebPage
                @Override
                public void onClick()
                {
-                       getModelObject().setJavaScriptEnabled(false);
+                       
getModelObject().getProperties().setJavaScriptEnabled(false);
+
+                       WebSession.get().setClientInfo(getModelObject());
 
                        continueToOriginalDestination();
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/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 0d524af..cd0da94 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
@@ -63,6 +63,11 @@
                                info.browserWidth =  window.innerWidth || 
document.body.offsetWidth;
                                info.browserHeight =  window.innerHeight || 
document.body.offsetHeight;
                                info.hostname =  window.location.hostname;
+
+                               if (Wicket.BrowserInfo.collectExtraInfo) {
+                                       
Wicket.BrowserInfo.collectExtraInfo(info);
+                               }
+
                                return info;
                        },
 
@@ -77,7 +82,11 @@
                                var info = Wicket.BrowserInfo.collect();
                                var i;
                                for (i in info) {
-                                       postbackForm[i].value = info[i];
+                                       var input = 
document.createElement('input');
+                                       input.type = 'text';
+                                       input.name = i;
+                                       input.value = info[i];
+                                       postbackForm.appendChild(input);
                                }
 
                                return postbackForm;

http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/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 f8bb40b..e86f444 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
@@ -17,12 +17,14 @@
 package org.apache.wicket.protocol.http;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.util.Collection;
 import java.util.TimeZone;
 
 import javax.servlet.http.Cookie;
 
 import org.apache.wicket.markup.html.pages.BrowserInfoPage;
+import org.apache.wicket.request.IRequestParameters;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.util.io.IClusterable;
@@ -77,16 +79,15 @@ public class ClientProperties implements IClusterable
        private int screenColorDepth = -1;
        private int screenHeight = -1;
        private int screenWidth = -1;
-       /** Cached timezone for repeating calls to {@link #getTimeZone()} */
-       private TimeZone timeZone;
        private String utcDSTOffset;
-
        private String utcOffset;
-
        private String hostname;
 
        private boolean javaScriptEnabled;
 
+       /** Cached timezone for repeating calls to {@link #getTimeZone()} */
+       private transient TimeZone timeZone;
+
        /**
         * @return The browser height at the time it was measured
         */
@@ -746,15 +747,19 @@ public class ClientProperties implements IClusterable
        {
                StringBuilder b = new StringBuilder();
 
-               Field[] fields = ClientProperties.class.getDeclaredFields();
+               Class<?> clazz = getClass();
+               while (clazz != Object.class) {
+                       Field[] fields = clazz.getDeclaredFields();
 
-               for (Field field : fields)
-               {
-                       // Ignore these fields
-                       if (field.getName().equals("serialVersionUID") == false 
&&
-                               field.getName().startsWith("class$") == false &&
-                               field.getName().startsWith("timeZone") == false)
+                       for (Field field : fields)
                        {
+                               // Ignore these fields
+                               if (Modifier.isStatic(field.getModifiers()) ||
+                                       
Modifier.isTransient(field.getModifiers())  ||
+                                       field.isSynthetic())
+                               {
+                                       continue;
+                               }
 
                                field.setAccessible(true);
 
@@ -788,9 +793,35 @@ public class ClientProperties implements IClusterable
                                        b.append('\n');
                                }
                        }
-               }
 
+                       clazz = clazz.getSuperclass();
+               }
                return b.toString();
        }
 
-}
+       /**
+        * Read parameters.
+        * 
+        * @param parameters
+        *            parameters sent from browser
+        */
+       public void read(IRequestParameters parameters)
+       {
+               
setNavigatorAppCodeName(parameters.getParameterValue("navigatorAppCodeName").toString("N/A"));
+               
setNavigatorAppName(parameters.getParameterValue("navigatorAppName").toString("N/A"));
+               
setNavigatorAppVersion(parameters.getParameterValue("navigatorAppVersion").toString("N/A"));
+               
setNavigatorCookieEnabled(parameters.getParameterValue("navigatorCookieEnabled").toBoolean(false));
+               
setNavigatorJavaEnabled(parameters.getParameterValue("navigatorJavaEnabled").toBoolean(false));
+               
setNavigatorLanguage(parameters.getParameterValue("navigatorLanguage").toString("N/A"));
+               
setNavigatorPlatform(parameters.getParameterValue("navigatorPlatform").toString("N/A"));
+               
setNavigatorUserAgent(parameters.getParameterValue("navigatorUserAgent").toString("N/A"));
+               
setScreenWidth(parameters.getParameterValue("screenWidth").toInt(-1));
+               
setScreenHeight(parameters.getParameterValue("screenHeight").toInt(-1));
+               
setScreenColorDepth(parameters.getParameterValue("screenColorDepth").toInt(-1));
+               
setUtcOffset(parameters.getParameterValue("utcOffset").toString(null));
+               
setUtcDSTOffset(parameters.getParameterValue("utcDSTOffset").toString(null));
+               
setBrowserWidth(parameters.getParameterValue("browserWidth").toInt(-1));
+               
setBrowserHeight(parameters.getParameterValue("browserHeight").toInt(-1));
+               
setHostname(parameters.getParameterValue("hostname").toString("N/A"));
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/wicket-core/src/main/java/org/apache/wicket/protocol/http/request/WebClientInfo.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/request/WebClientInfo.java
 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/request/WebClientInfo.java
index 9fc4700..2b0747c 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/request/WebClientInfo.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/request/WebClientInfo.java
@@ -52,7 +52,7 @@ public class WebClientInfo extends ClientInfo
        private final String userAgent;
 
        /** Client properties object. */
-       private final ClientProperties properties = new ClientProperties();
+       private final ClientProperties properties;
 
        /**
         * Construct.
@@ -62,8 +62,19 @@ public class WebClientInfo extends ClientInfo
         */
        public WebClientInfo(RequestCycle requestCycle)
        {
+               this(requestCycle, new ClientProperties());
+       }
+
+       /**
+        * Construct.
+        * 
+        * @param requestCycle
+        *            the request cycle
+        */
+       public WebClientInfo(RequestCycle requestCycle, ClientProperties 
properties)
+       {
                this(requestCycle, 
((ServletWebRequest)requestCycle.getRequest()).getContainerRequest()
-                       .getHeader("User-Agent"));
+                       .getHeader("User-Agent"), properties);
        }
 
        /**
@@ -76,10 +87,28 @@ public class WebClientInfo extends ClientInfo
         */
        public WebClientInfo(final RequestCycle requestCycle, final String 
userAgent)
        {
+               this(requestCycle, userAgent, new ClientProperties());
+       }
+
+       /**
+        * Construct.
+        * 
+        * @param requestCycle
+        *            the request cycle
+        * @param userAgent
+        *            The User-Agent string
+        * @param properties
+        *                        properties of client            
+        */
+       public WebClientInfo(final RequestCycle requestCycle, final String 
userAgent, final ClientProperties properties)
+       {
                super();
 
                this.userAgent = userAgent;
+
+               this.properties = properties;
                properties.setRemoteAddress(getRemoteAddr(requestCycle));
+
                init();
        }
 
@@ -219,8 +248,8 @@ public class WebClientInfo extends ClientInfo
 
                        if (userAgent.contains("version/"))
                        {
-                               // e.g.: Mozilla/5.0 (Windows; U; Windows NT 
6.1; sv-SE) AppleWebKit/533.19.4
-// (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4
+                               // e.g.: Mozilla/5.0 (Windows; U; Windows NT 
6.1; sv-SE) AppleWebKit/533.19
+                               // (KHTML, like Gecko) Version/5.0.3 
Safari/533.19.4
                                
setMajorMinorVersionByPattern("version/(\\d+)\\.(\\d+)");
                        }
                }
@@ -239,7 +268,7 @@ public class WebClientInfo extends ClientInfo
                        if (properties.isBrowserMozillaFirefox())
                        {
                                // e.g.: Mozilla/5.0 (X11; U; Linux i686; 
pl-PL; rv:1.9.0.2) Gecko/20121223
-// Ubuntu/9.25 (jaunty) Firefox/3.8
+                               // Ubuntu/9.25 (jaunty) Firefox/3.8
                                
setMajorMinorVersionByPattern("firefox/(\\d+)\\.(\\d+)");
                        }
                }

http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/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 43ce570..cca2a28 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,15 +21,19 @@ import java.util.Calendar;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxClientInfoBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.examples.WicketExamplePage;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.basic.MultiLineLabel;
 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.request.cycle.RequestCycle;
 import org.apache.wicket.settings.RequestCycleSettings;
 
 
@@ -84,15 +88,30 @@ public class AjaxHelloBrowser extends WicketExamplePage
                clientTime.setOutputMarkupPlaceholderTag(true);
                clientTime.setVisible(false);
 
-               add(new AjaxClientInfoBehavior()
-               {
+               add(new AjaxClientInfoBehavior() {
+
+                       @Override
+                       public void renderHead(Component component, 
IHeaderResponse response)
+                       {
+                               super.renderHead(component, response);
+
+                               String script = 
"Wicket.BrowserInfo.collectExtraInfo = function(info) { info.extendedProperty = 
'This property was read extra.'; };";
+
+                               
response.render(JavaScriptHeaderItem.forScript(script, "extended-client-info"));
+                       }
+
                        @Override
-                       protected void onClientInfo(AjaxRequestTarget target, 
WebClientInfo info)
+                       protected WebClientInfo newWebClientInfo(RequestCycle 
requestCycle)
                        {
-                               super.onClientInfo(target, info);
+                               return new WebClientInfo(requestCycle, new 
ExtendedClientProperties());
+                       }
 
+                       @Override
+                       protected void onClientInfo(AjaxRequestTarget target, 
WebClientInfo webClientInfo)
+                       {
                                clientInfo.setVisible(true);
                                clientTime.setVisible(true);
+
                                target.add(clientInfo, clientTime);
                        }
                });

http://git-wip-us.apache.org/repos/asf/wicket/blob/5bfa280b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/ExtendedClientProperties.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/ExtendedClientProperties.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/ExtendedClientProperties.java
new file mode 100644
index 0000000..1d301f3
--- /dev/null
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajaxhellobrowser/ExtendedClientProperties.java
@@ -0,0 +1,49 @@
+/*
+ * 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.protocol.http.ClientProperties;
+import org.apache.wicket.request.IRequestParameters;
+
+/**
+ * Showcase for extended properties of a client.
+ */
+public class ExtendedClientProperties extends ClientProperties
+{
+       private String extendedProperty;
+       
+       public String getExtendedProperty()
+       {
+               return extendedProperty;
+       }
+
+       public void setExtendedProperty(String extendedProperty)
+       {
+               this.extendedProperty = extendedProperty;
+       }
+
+       /**
+        * Overridden to read additional properties.
+        */
+       @Override
+       public void read(IRequestParameters parameters)
+       {
+               super.read(parameters);
+               
+               
setExtendedProperty(parameters.getParameterValue("extendedProperty").toString("N/A"));
+       }
+}
\ No newline at end of file

Reply via email to