/******************************************************************************* * Copyright (c) 2004, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.css.core.tests.source; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.eclipse.wst.css.core.internal.parser.CSSSourceParser; import org.eclipse.wst.css.core.internal.parserz.CSSRegionContexts; import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel; import org.eclipse.wst.css.core.internal.util.CSSUtil; import org.eclipse.wst.css.core.tests.util.FileUtil; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; public class CSSUrlTest extends TestCase { /** * Declaration: without quotes */ public void testDeclaration1() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); ((CSSSourceParser) document.getParser()).setParserMode(CSSSourceParser.MODE_DECLARATION_VALUE); document.set("background-image: url(white space.gif);"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif", urls[0].getUrl()); //$NON-NLS-1$ } /** * Declaration: without quotes, with surrounded space */ public void testDeclaration2() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); ((CSSSourceParser) document.getParser()).setParserMode(CSSSourceParser.MODE_DECLARATION_VALUE); document.set("background-image: url( white space.gif );"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif", urls[0].getUrl()); //$NON-NLS-1$ } /** * Declaration: with single quote */ public void testDeclaration3() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); ((CSSSourceParser) document.getParser()).setParserMode(CSSSourceParser.MODE_DECLARATION_VALUE); document.set("background-image: url(\'white space.gif\');"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif", urls[0].getUrl()); //$NON-NLS-1$ } /** * Declaration: with double quote */ public void testDeclaration4() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); ((CSSSourceParser) document.getParser()).setParserMode(CSSSourceParser.MODE_DECLARATION_VALUE); document.set("background-image: url(\"white space.gif\");"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif", urls[0].getUrl()); //$NON-NLS-1$ } /** * Declaration: two urls */ public void testDeclaration5() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); ((CSSSourceParser) document.getParser()).setParserMode(CSSSourceParser.MODE_DECLARATION_VALUE); document.set("background-image: url(white space.gif); list-style-image: url(style image.gif);"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(2, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif", urls[0].getUrl()); //$NON-NLS-1$ assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[1].getType()); assertEquals("style image.gif", urls[1].getUrl()); //$NON-NLS-1$ } /** * Style rule: two urls */ public void testStyleRule1() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); document.set("LI { background-image: url(white space.gif);\r\nlist-style-image: url(style image.gif); }"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(2, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif", urls[0].getUrl()); //$NON-NLS-1$ assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[1].getType()); assertEquals("style image.gif", urls[1].getUrl()); //$NON-NLS-1$ } /** * Import rule and style rule: without quotes */ public void testSomeRules1() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); document.set("@import url(white space.css);LI { background-image: url(white space.gif);list-style-image: url(style image.gif); }"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(3, urls.length); assertEquals(CSSRegionContexts.CSS_URI, urls[0].getType()); assertEquals("white space.css", urls[0].getUrl()); //$NON-NLS-1$ assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[1].getType()); assertEquals("white space.gif", urls[1].getUrl()); //$NON-NLS-1$ assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[2].getType()); assertEquals("style image.gif", urls[2].getUrl()); //$NON-NLS-1$ } /** * Declaration: Two urls but parenthesis are missed, so concatenated url * is identified. By adding parenthesis, urls are corrected. */ public void testFixError1() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); ((CSSSourceParser) document.getParser()).setParserMode(CSSSourceParser.MODE_DECLARATION_VALUE); // ____________01234567890123456789012345678901234567890123456789012345678901234567890123456789 document.set("background-image: url(white space.gif; list-style-image: urlstyle image.gif);"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif; list-style-image: urlstyle image.gif", urls[0].getUrl()); //$NON-NLS-1$ // correct first url document.replaceText(null, 37, 0, ")"); //$NON-NLS-1$ urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif", urls[0].getUrl()); //$NON-NLS-1$ // correct second url document.replaceText(null, 61, 0, "("); //$NON-NLS-1$ urls = pickupUrl(document); assertEquals(2, urls.length); assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[0].getType()); assertEquals("white space.gif", urls[0].getUrl()); //$NON-NLS-1$ assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[1].getType()); assertEquals("style image.gif", urls[1].getUrl()); //$NON-NLS-1$ } /** * Import rule and style rule: Two urls but parenthesis are missed, so * concatenated url is identified. By adding parenthesis, urls are * corrected. */ public void testFixError2() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); // ____________01234567890123456789012345678901234567890123456789012345678901234567890123456789 document.set("@import url(white space.css;LI { background-image: urlwhite space.gif); }"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_URI, urls[0].getType()); assertEquals("white space.css;LI { background-image: urlwhite space.gif", urls[0].getUrl()); //$NON-NLS-1$ // correct first url document.replaceText(null, 27, 0, ")"); //$NON-NLS-1$ urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_URI, urls[0].getType()); assertEquals("white space.css", urls[0].getUrl()); //$NON-NLS-1$ // correct second url document.replaceText(null, 55, 0, "("); //$NON-NLS-1$ urls = pickupUrl(document); assertEquals(2, urls.length); assertEquals(CSSRegionContexts.CSS_URI, urls[0].getType()); assertEquals("white space.css", urls[0].getUrl()); //$NON-NLS-1$ assertEquals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI, urls[1].getType()); assertEquals("white space.gif", urls[1].getUrl()); //$NON-NLS-1$ } /** * Import rule: Url has only one quote, so it is not identified as url. By * removing quote, url is corrected. */ public void testFixError3() { ICSSModel model = FileUtil.createModel(); IStructuredDocument document = model.getStructuredDocument(); // ____________0123456789012345678901234567890 document.set("@import url(white space.css\");"); //$NON-NLS-1$ UrlInfo[] urls = pickupUrl(document); assertEquals(0, urls.length); // correct url document.replaceText(null, 27, 1, ""); //$NON-NLS-1$ urls = pickupUrl(document); assertEquals(1, urls.length); assertEquals(CSSRegionContexts.CSS_URI, urls[0].getType()); assertEquals("white space.css", urls[0].getUrl()); //$NON-NLS-1$ } private UrlInfo[] pickupUrl(IStructuredDocument document) { List urls = new ArrayList(); IStructuredDocumentRegion documentRegion = document.getFirstStructuredDocumentRegion(); while (documentRegion != null) { ITextRegionList regionList = documentRegion.getRegions(); Iterator i = regionList.iterator(); while (i.hasNext()) { ITextRegion textRegion = (ITextRegion) i.next(); String type = textRegion.getType(); if (type.equals(CSSRegionContexts.CSS_URI) || type.equals(CSSRegionContexts.CSS_DECLARATION_VALUE_URI)) { urls.add(new UrlInfo(type, documentRegion.getFullText(textRegion))); } } documentRegion = documentRegion.getNext(); } return (UrlInfo[]) urls.toArray(new UrlInfo[urls.size()]); } private class UrlInfo { UrlInfo(String type, String url) { fType = type; fUrl = CSSUtil.extractUriContents(url); } String getType() { return fType; } String getUrl() { return fUrl; } private String fType; private String fUrl; } }