/* * 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.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.MetaDataHeaderItem; import org.apache.wicket.markup.head.OnLoadHeaderItem; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.link.Link; 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; /** * This page uses a form post right after the page has loaded in the browser, using JavaScript or * alternative means to detect and pass on settings to the embedded form. The form submit method * updates this session's {@link org.apache.wicket.core.request.ClientInfo} object and then redirects to * the original location as was passed in as a URL argument in the constructor. * <p> * If JavaScript is not enabled in the browser, a "refresh" meta-header will initiate a get on this page to * continue with the original destination. As a fallback the user can click a link to do the same. * <p> * This page is being used by the default implementation of {@link org.apache.wicket.Session#getClientInfo()}, * which in turn uses * {@link org.apache.wicket.settings.RequestCycleSettings#getGatherExtendedBrowserInfo() a setting} to * determine whether this page should be redirected to (it does when it is true). * * @author Eelco Hillenius */ public class BrowserInfoPage extends WebPage { private static final long serialVersionUID = 1L; private BrowserInfoForm browserInfoForm; /** * Bookmarkable constructor. */ public BrowserInfoPage() { initComps(); } @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() { return false; } protected WebClientInfo newWebClientInfo(RequestCycle requestCycle) { return new WebClientInfo(requestCycle); } /** * Adds components. */ private void initComps() { IModel<WebClientInfo> info = new LoadableDetachableModel<WebClientInfo>() { @Override protected WebClientInfo load() { return newWebClientInfo(getRequestCycle()); } }; IModel<ClientProperties> properties = new LoadableDetachableModel<ClientProperties>() { @Override protected ClientProperties load() { return info.getObject().getProperties(); } }; add(new ContinueLink("link", info)); browserInfoForm = new BrowserInfoForm("postback", properties) { private static final long serialVersionUID = 1L; @Override protected void afterSubmit() { getModelObject().setJavaScriptEnabled(true); WebSession.get().setClientInfo(info.getObject()); continueToOriginalDestination(); // switch to home page if no original destination was intercepted setResponsePage(getApplication().getHomePage()); } }; add(browserInfoForm); } protected ClientProperties newClientInfo() { return WebSession.get().getClientInfo().getProperties(); } private static class ContinueLink extends Link<WebClientInfo> { public ContinueLink(String id, IModel<WebClientInfo> info) { super(id, info); } @Override public void renderHead(IHeaderResponse response) { String content = "0; url=" + getURL(); response.render(new MetaDataHeaderItem(MetaDataHeaderItem.META_TAG).addTagAttribute("http-equiv", "refresh").addTagAttribute("content", content)); } @Override public void onClick() { getModelObject().getProperties().setJavaScriptEnabled(false); WebSession.get().setClientInfo(getModelObject()); continueToOriginalDestination(); // switch to home page if no original destination was intercepted setResponsePage(getApplication().getHomePage()); } }; }