/*
* 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.resource;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import java.util.Locale;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.image.ImageTest;
import org.apache.wicket.mock.MockApplication;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.resource.caching.FilenameWithVersionResourceCachingStrategy;
import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
import org.apache.wicket.request.resource.caching.ResourceUrl;
import org.apache.wicket.request.resource.caching.version.MessageDigestResourceVersion;
import org.apache.wicket.util.tester.WicketTestCase;
import org.junit.Before;
import org.junit.Test;
public class CssUrlReplacerTest extends WicketTestCase
{
private static final String DECORATION_SUFFIX = "--decorated";
@Override
protected WebApplication newApplication()
{
return new MockApplication()
{
@Override
protected void init()
{
super.init();
getResourceSettings().setCachingStrategy(
new FilenameWithVersionResourceCachingStrategy("=VER=",
new MessageDigestResourceVersion())
{
@Override
public void decorateUrl(ResourceUrl url, IStaticCacheableResource resource)
{
url.setFileName(url.getFileName() + DECORATION_SUFFIX);
}
});
}
@Override
public Session newSession(Request request, Response response) {
Session newSession = super.newSession(request, response);
newSession.setLocale(Locale.ROOT);
return newSession;
}
};
}
@Before
public void before()
{
tester.getSession().setLocale(Locale.ENGLISH);
}
@Test
public void doNotProcessFullUrls()
{
String input = ".class {background-image: url('http://example.com/some.img');}";
Class<?> scope = CssUrlReplacerTest.class;
String cssRelativePath = "res/css/some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(processed, is(input));
}
@Test
public void doNotProcessDataUrls_WICKET_6290()
{
String input = ".class {background-image: url(data:image/gif;base64,R0lGODlhEAAQAMQAAORHH);}";
Class<?> scope = CssUrlReplacerTest.class;
String cssRelativePath = "res/css/some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(processed, is(input));
}
@Test
public void doNotProcessContextAbsoluteUrls()
{
String input = ".class {background-image: url('/some.img');}";
Class<?> scope = CssUrlReplacerTest.class;
String cssRelativePath = "res/css/some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(processed, is(input));
}
@Test
public void sameFolderSingleQuotes()
{
String input = ".class {background-image: url('some.img');}";
Class<?> scope = CssUrlReplacerTest.class;
String cssRelativePath = "res/css/some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(
processed,
is(".class {background-image: url('./wicket/resource/org.apache.wicket.resource.CssUrlReplacerTest/res/css/some.img" +
DECORATION_SUFFIX + "');}"));
}
@Test
public void sameFolderDoubleQuotes()
{
String input = ".class {background-image: url(\"some.img\");}";
Class<?> scope = CssUrlReplacerTest.class;
String cssRelativePath = "res/css/some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(
processed,
is(".class {background-image: url('./wicket/resource/org.apache.wicket.resource.CssUrlReplacerTest/res/css/some.img" +
DECORATION_SUFFIX + "');}"));
}
@Test
public void parentFolderAppendFolder()
{
String input = ".class {background-image: url('../images/some.img');}";
Class<?> scope = CssUrlReplacerTest.class;
String cssRelativePath = "res/css/some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(
processed,
is(".class {background-image: url('./wicket/resource/org.apache.wicket.resource.CssUrlReplacerTest/res/images/some.img" +
DECORATION_SUFFIX + "');}"));
}
@Test
public void sameFolderAppendFolder()
{
String input = ".class {background-image: url('./images/some.img');}";
Class<?> scope = CssUrlReplacerTest.class;
String cssRelativePath = "res/css/some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(
processed,
is(".class {background-image: url('./wicket/resource/org.apache.wicket.resource.CssUrlReplacerTest/res/css/images/some.img" +
DECORATION_SUFFIX + "');}"));
}
@Test
public void base64EncodedImage()
{
String input = ".class {background-image: url('Beer.gif?embedBase64');}";
Class<?> scope = ImageTest.class;
String cssRelativePath = "some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(
processed,
containsString(".class {background-image: url(data:image/gif;base64,R0lGODlh1wATAXAAACH5BAEAAP8ALAAAAADXA"));
}
@Test
public void severalUrls()
{
String input = ".class {\n" + "a: url('../images/a.img');\n" + "b: url('./b.img');\n" + "}";
Class<?> scope = CssUrlReplacerTest.class;
String cssRelativePath = "res/css/some.css";
CssUrlReplacer replacer = new CssUrlReplacer();
String processed = replacer.process(input, scope, cssRelativePath);
assertThat(processed, containsString("CssUrlReplacerTest/res/images/a.img" +
DECORATION_SUFFIX + "');"));
assertThat(processed, containsString("CssUrlReplacerTest/res/css/b.img" +
DECORATION_SUFFIX + "');"));
}
}