package org.apache.wicket.examples.csp;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.examples.WicketExamplePage;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
public class NonceDemoPage extends WicketExamplePage
{
private static final ResourceReference JS_DELAYED =
new JavaScriptResourceReference(NonceDemoPage.class, "delayedVisible.js");
private static final ResourceReference CSS_DELAYED =
new CssResourceReference(NonceDemoPage.class, "delayedVisible.css");
private final IModel<Integer> clickMeCountModel = Model.of(0);
public NonceDemoPage()
{
super();
add(new Label("testNonceScript", getString("testNonceScript")));
add(new Label("testNoNonceScript", getString("testNoNonceScript")));
final Label clickMeCount = new Label("clickMeCount", clickMeCountModel);
clickMeCount.setOutputMarkupId(true);
add(clickMeCount);
final WebMarkupContainer delayedVisible = new WebMarkupContainer("delayedVisible")
{
private static final long serialVersionUID = 1L;
@Override
public void renderHead(IHeaderResponse response)
{
super.renderHead(response);
response.render(JavaScriptHeaderItem.forReference(JS_DELAYED));
response.render(CssHeaderItem.forReference(CSS_DELAYED));
}
};
delayedVisible.setOutputMarkupPlaceholderTag(true);
delayedVisible.setVisible(false);
add(delayedVisible);
WebMarkupContainer blacktext = new WebMarkupContainer("blacktext");
blacktext.setOutputMarkupId(true);
add(blacktext);
add(new AjaxLink<String>("clickMe")
{
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target)
{
clickMeCountModel.setObject(clickMeCountModel.getObject() + 1);
target.add(clickMeCount);
target.appendJavaScript(
"document.querySelector(\".click-me-text\").innerHTML = \"replaced\";");
delayedVisible.setVisible(true);
target.add(delayedVisible);
blacktext.add(AttributeModifier.replace("style", "color: red"));
target.add(blacktext);
}
}.setOutputMarkupId(true));
}
@Override
public void renderHead(IHeaderResponse response)
{
super.renderHead(response);
response.render(JavaScriptHeaderItem.forScript(
"$(function(){$(\".test-nonce-script\").html(\"Text injected by script with nonce: success\");});",
"test-nonce-script"));
response.render(
CssHeaderItem.forCSS(".injected-style--with-nonce{color: green; font-weight: bold;}",
"injected-style-with-nonce"));
}
@Override
public void detachModels()
{
super.detachModels();
clickMeCountModel.detach();
}
}