001: /*
002: * Copyright (c) 2002-2008 Gargoyle Software Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * 1. Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: * 2. Redistributions in binary form must reproduce the above copyright notice,
010: * this list of conditions and the following disclaimer in the documentation
011: * and/or other materials provided with the distribution.
012: * 3. The end-user documentation included with the redistribution, if any, must
013: * include the following acknowledgment:
014: *
015: * "This product includes software developed by Gargoyle Software Inc.
016: * (http://www.GargoyleSoftware.com/)."
017: *
018: * Alternately, this acknowledgment may appear in the software itself, if
019: * and wherever such third-party acknowledgments normally appear.
020: * 4. The name "Gargoyle Software" must not be used to endorse or promote
021: * products derived from this software without prior written permission.
022: * For written permission, please contact info@GargoyleSoftware.com.
023: * 5. Products derived from this software may not be called "HtmlUnit", nor may
024: * "HtmlUnit" appear in their name, without prior written permission of
025: * Gargoyle Software Inc.
026: *
027: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
028: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
029: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARGOYLE
030: * SOFTWARE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
031: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
032: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
033: * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
034: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
035: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
036: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
037: */
038: package com.gargoylesoftware.htmlunit.html;
039:
040: import java.util.ArrayList;
041: import java.util.Collections;
042: import java.util.List;
043:
044: import com.gargoylesoftware.htmlunit.CollectingAlertHandler;
045: import com.gargoylesoftware.htmlunit.MockWebConnection;
046: import com.gargoylesoftware.htmlunit.Page;
047: import com.gargoylesoftware.htmlunit.WebClient;
048: import com.gargoylesoftware.htmlunit.WebTestCase;
049:
050: /**
051: * Tests for {@link HtmlArea}.
052: *
053: * @version $Revision: 2132 $
054: * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
055: * @author David K. Taylor
056: * @author Ahmed Ashour
057: */
058: public class HtmlAreaTest extends WebTestCase {
059:
060: /**
061: * Create an instance
062: *
063: * @param name Name of the test
064: */
065: public HtmlAreaTest(final String name) {
066: super (name);
067: }
068:
069: private WebClient createWebClient(final String onClick) {
070: final String firstContent = "<html><head><title>first</title></head><body>\n"
071: + "<img src='/images/planets.gif' width='145' height='126' usemap='#planetmap'>\n"
072: + "<map id='planetmap' name='planetmap'>\n"
073: + "<area shape='rect' onClick=\""
074: + onClick
075: + "\" coords='0,0,82,126' id='second' "
076: + "href='"
077: + URL_SECOND
078: + "'>\n"
079: + "<area shape='circle' coords='90,58,3' id='third' href='"
080: + URL_THIRD + "'>\n" + "</map></body></html>";
081: final String secondContent = "<html><head><title>second</title></head><body></body></html>";
082: final String thirdContent = "<html><head><title>third</title></head><body></body></html>";
083: final WebClient client = new WebClient();
084:
085: final MockWebConnection webConnection = new MockWebConnection(
086: client);
087: webConnection.setResponse(URL_FIRST, firstContent);
088: webConnection.setResponse(URL_SECOND, secondContent);
089: webConnection.setResponse(URL_THIRD, thirdContent);
090:
091: client.setWebConnection(webConnection);
092: return client;
093: }
094:
095: /**
096: * @throws Exception if the test fails
097: */
098: public void testClick() throws Exception {
099: final WebClient client = createWebClient("");
100:
101: final HtmlPage page = (HtmlPage) client.getPage(URL_FIRST);
102: final HtmlArea area = (HtmlArea) page
103: .getHtmlElementById("third");
104:
105: // Test that the correct value is being passed back up to the server
106: final HtmlPage thirdPage = (HtmlPage) area.click();
107: assertEquals("third", thirdPage.getTitleText());
108: }
109:
110: /**
111: * @throws Exception if the test fails
112: */
113: public void testClick_onclickReturnsFalse() throws Exception {
114: final WebClient client = createWebClient("alert('foo');return false;");
115: final List collectedAlerts = new ArrayList();
116: client.setAlertHandler(new CollectingAlertHandler(
117: collectedAlerts));
118:
119: final HtmlPage page = (HtmlPage) client.getPage(URL_FIRST);
120: final HtmlArea area = (HtmlArea) page
121: .getHtmlElementById("second");
122:
123: final HtmlPage thirdPage = (HtmlPage) area.click();
124: assertEquals(new String[] { "foo" }, collectedAlerts);
125: assertEquals("first", thirdPage.getTitleText());
126: }
127:
128: /**
129: * @throws Exception if the test fails
130: */
131: public void testClick_onclickReturnsTrue() throws Exception {
132: final WebClient client = createWebClient("alert('foo');return true;");
133: final List collectedAlerts = new ArrayList();
134: client.setAlertHandler(new CollectingAlertHandler(
135: collectedAlerts));
136:
137: final HtmlPage page = (HtmlPage) client.getPage(URL_FIRST);
138: final HtmlArea area = (HtmlArea) page
139: .getHtmlElementById("second");
140:
141: final HtmlPage thirdPage = (HtmlPage) area.click();
142: assertEquals(new String[] { "foo" }, collectedAlerts);
143: assertEquals("second", thirdPage.getTitleText());
144: }
145:
146: /**
147: * @throws Exception if the test fails
148: */
149: public void testClick_javascriptUrl() throws Exception {
150: final String htmlContent = "<html><head><title>foo</title></head><body><map>\n"
151: + "<area href='javascript:alert(\"clicked\")' id='a2' coords='0,0,10,10'/>\n"
152: + "</map></body></html>";
153: final List collectedAlerts = new ArrayList();
154: final HtmlPage page = loadPage(htmlContent, collectedAlerts);
155:
156: final HtmlArea area = (HtmlArea) page.getHtmlElementById("a2");
157:
158: assertEquals(Collections.EMPTY_LIST, collectedAlerts);
159:
160: final HtmlPage secondPage = (HtmlPage) area.click();
161:
162: assertEquals(new String[] { "clicked" }, collectedAlerts);
163: assertSame(page, secondPage);
164: }
165:
166: /**
167: * @throws Exception if the test fails
168: */
169: public void testClick_javascriptUrl_javascriptDisabled()
170: throws Exception {
171: final String htmlContent = "<html><head><title>foo</title></head><body><map>\n"
172: + "<area href='javascript:alert(\"clicked\")' id='a2' coords='0,0,10,10'/>\n"
173: + "</map></body></html>";
174: final WebClient client = new WebClient();
175: client.setJavaScriptEnabled(false);
176:
177: final List collectedAlerts = new ArrayList();
178: client.setAlertHandler(new CollectingAlertHandler(
179: collectedAlerts));
180:
181: final MockWebConnection webConnection = new MockWebConnection(
182: client);
183: webConnection.setDefaultResponse(htmlContent);
184: client.setWebConnection(webConnection);
185:
186: final HtmlPage page = (HtmlPage) client.getPage(URL_GARGOYLE);
187: final HtmlArea area = (HtmlArea) page.getHtmlElementById("a2");
188:
189: assertEquals(Collections.EMPTY_LIST, collectedAlerts);
190:
191: final HtmlPage secondPage = (HtmlPage) area.click();
192:
193: assertEquals(Collections.EMPTY_LIST, collectedAlerts);
194: assertSame(page, secondPage);
195: }
196:
197: /**
198: * In action "this" should be the window and not the area
199: * @throws Exception if the test fails
200: */
201: public void testThisInJavascriptHRef() throws Exception {
202: final String htmlContent = "<html><head><title>foo</title></head><body><map>\n"
203: + "<area href='javascript:alert(this == window)' id='a2' coords='0,0,10,10'/>\n"
204: + "</map></body></html>";
205: final List collectedAlerts = new ArrayList();
206: final String[] expectedAlerts = { "true" };
207: final HtmlPage page = loadPage(htmlContent, collectedAlerts);
208: final Page page2 = ((HtmlArea) page.getHtmlElementById("a2"))
209: .click();
210:
211: assertEquals(expectedAlerts, collectedAlerts);
212: assertSame(page, page2);
213: }
214:
215: }
|