blob: 9eb5775fdcff68e681efac8c1e19ffebe75b0d56 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed 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 com.google.gwt.dom.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
/**
* Element tests (many stolen from DOMTest).
*/
public class ElementTest extends GWTTestCase {
@Override
public String getModuleName() {
return "com.google.gwt.dom.DOMTest";
}
/**
* [get|set|remove]Attribute
*/
public void testElementAttribute() {
DivElement div = Document.get().createDivElement();
div.setAttribute("class", "testClass");
String cssClass = div.getAttribute("class");
assertEquals("testClass", cssClass);
div.removeAttribute("class");
cssClass = div.getAttribute("class");
assertEquals("", cssClass);
}
/**
* getAbsolute[Left|Top]
*/
public void testGetAbsolutePosition() {
final int border = 8;
final int margin = 9;
final int padding = 10;
final int top = 15;
final int left = 14;
Document doc = Document.get();
final DivElement elem = doc.createDivElement();
doc.getBody().appendChild(elem);
elem.getStyle().setProperty("position", "absolute");
elem.getStyle().setProperty("border", border + "px solid #000");
elem.getStyle().setProperty("padding", padding + "px");
elem.getStyle().setProperty("margin", margin + "px");
elem.getStyle().setPropertyPx("top", top - doc.getBodyOffsetLeft());
elem.getStyle().setPropertyPx("left", left - doc.getBodyOffsetTop());
delayTestFinish(1000);
DeferredCommand.addCommand(new Command() {
public void execute() {
assertEquals(top + margin, elem.getAbsoluteTop());
assertEquals(left + margin, elem.getAbsoluteLeft());
finishTest();
}
});
}
/**
* scroll[Left|Top], scrollIntoView
*/
public void testGetAbsolutePositionWhenScrolled() {
final DivElement outer = Document.get().createDivElement();
final DivElement inner = Document.get().createDivElement();
outer.getStyle().setProperty("position", "absolute");
outer.getStyle().setProperty("top", "0px");
outer.getStyle().setProperty("left", "0px");
outer.getStyle().setProperty("overflow", "auto");
outer.getStyle().setProperty("width", "200px");
outer.getStyle().setProperty("height", "200px");
inner.getStyle().setProperty("marginTop", "800px");
inner.getStyle().setProperty("marginLeft", "800px");
outer.appendChild(inner);
Document.get().getBody().appendChild(outer);
inner.setInnerText(":-)");
inner.scrollIntoView();
// Ensure that we are scrolled.
assertTrue(outer.getScrollTop() > 0);
assertTrue(outer.getScrollLeft() > 0);
outer.setScrollLeft(0);
outer.setScrollTop(0);
// Ensure that we are no longer scrolled.
assertEquals(outer.getScrollTop(), 0);
assertEquals(outer.getScrollLeft(), 0);
}
/**
* getParentElement
*/
public void testGetParent() {
Element element = Document.get().getBody();
int i = 0;
while (i < 10 && element != null) {
element = element.getParentElement();
i++;
}
// If we got here we looped "forever" or passed, as no exception was thrown.
if (i == 10) {
fail("Cyclic parent structure detected.");
}
// If we get here, we pass, because we encountered no errors going to the
// top of the parent hierarchy.
}
/**
* firstChildElement, nextSiblingElement
*/
public void testChildElements() {
Document doc = Document.get();
DivElement parent = doc.createDivElement();
DivElement div0 = doc.createDivElement();
DivElement div1 = doc.createDivElement();
parent.appendChild(doc.createTextNode("foo"));
parent.appendChild(div0);
parent.appendChild(doc.createTextNode("bar"));
parent.appendChild(div1);
Element fc = parent.getFirstChildElement();
Element ns = fc.getNextSiblingElement();
assertEquals(div0, fc);
assertEquals(div1, ns);
}
/**
* isOrHasChild
*/
public void testIsOrHasChild() {
DivElement div = Document.get().createDivElement();
DivElement childDiv = Document.get().createDivElement();
assertFalse(div.isOrHasChild(childDiv));
assertTrue(div.isOrHasChild(div));
div.appendChild(childDiv);
assertTrue(div.isOrHasChild(childDiv));
assertFalse(childDiv.isOrHasChild(div));
Document.get().getBody().appendChild(div);
assertTrue(div.isOrHasChild(childDiv));
assertTrue(div.isOrHasChild(div));
assertFalse(childDiv.isOrHasChild(div));
}
/**
* innerText
*/
public void testSetInnerText() {
Document doc = Document.get();
TableElement tableElem = doc.createTableElement();
TableRowElement trElem = doc.createTRElement();
TableCellElement tdElem = doc.createTDElement();
tdElem.setInnerText("Some Table Heading Data");
// Add a <em> element as a child to the td element
Element emElem = doc.createElement("em");
emElem.setInnerText("Some emphasized text");
tdElem.appendChild(emElem);
trElem.appendChild(tdElem);
tableElem.appendChild(trElem);
doc.getBody().appendChild(tableElem);
tdElem.setInnerText(null);
// Once we set the inner text on an element to null, all of the element's
// child nodes should be deleted, including any text nodes, for all
// supported browsers.
assertTrue(tdElem.getChildNodes().getLength() == 0);
}
/**
* innerHTML
*/
public void testSetInnerHTML() {
DivElement div = Document.get().createDivElement();
div.setInnerHTML("<button><img src='foo.gif'></button>");
Element button = div.getFirstChildElement();
Element img = button.getFirstChildElement();
assertEquals("button", button.getTagName().toLowerCase());
assertEquals("img", img.getTagName().toLowerCase());
assertTrue(((ImageElement) img).getSrc().endsWith("foo.gif"));
}
/**
* setProperty*, getProperty*
*/
public void testProperties() {
DivElement div = Document.get().createDivElement();
div.setPropertyString("foo", "bar");
assertEquals("bar", div.getPropertyString("foo"));
div.setPropertyInt("foo", 42);
assertEquals(42, div.getPropertyInt("foo"));
div.setPropertyBoolean("foo", true);
div.setPropertyBoolean("bar", false);
assertEquals(true, div.getPropertyBoolean("foo"));
assertEquals(false, div.getPropertyBoolean("bar"));
}
/**
* className, id, tagName, title, dir, lang
*/
public void testNativeProperties() {
DivElement div = Document.get().createDivElement();
assertEquals("div", div.getTagName().toLowerCase());
div.setClassName("myClass");
assertEquals(div.getClassName(), "myClass");
div.setId("myId");
assertEquals(div.getId(), "myId");
div.setTitle("myTitle");
assertEquals(div.getTitle(), "myTitle");
div.setDir("rtl");
assertEquals(div.getDir(), "rtl");
div.setLang("fr-FR");
assertEquals(div.getLang(), "fr-FR");
}
/**
* style
*/
public void testStyle() {
DivElement div = Document.get().createDivElement();
div.getStyle().setProperty("color", "black");
assertEquals("black", div.getStyle().getProperty("color"));
div.getStyle().setPropertyPx("width", 42);
assertEquals("42px", div.getStyle().getProperty("width"));
}
/**
* Test that styles only allow camelCase.
*/
public void testStyleCamelCase() {
DivElement div = Document.get().createDivElement();
// Use a camelCase property
div.getStyle().setProperty("backgroundColor", "black");
assertEquals("black", div.getStyle().getProperty("backgroundColor"));
div.getStyle().setPropertyPx("marginLeft", 10);
assertEquals("10px", div.getStyle().getProperty("marginLeft"));
// Use a hyphenated style
try {
div.getStyle().setProperty("background-color", "red");
fail("Expected assertion error: background-color should be in camelCase");
} catch (AssertionError e) {
// expected
}
try {
div.getStyle().setPropertyPx("margin-left", 20);
fail("Expected assertion error: margin-left should be in camelCase");
} catch (AssertionError e) {
// expected
}
try {
div.getStyle().getProperty("margin-right");
fail("Expected assertion error: margin-right should be in camelCase");
} catch (AssertionError e) {
// expected
}
}
/**
* offset[Left|Top|Width|Height], offsetParent
*/
public void testOffsets() {
DivElement outer = Document.get().createDivElement();
DivElement middle = Document.get().createDivElement();
DivElement inner = Document.get().createDivElement();
Document.get().getBody().appendChild(outer);
outer.appendChild(middle);
middle.appendChild(inner);
outer.getStyle().setProperty("position", "absolute");
inner.getStyle().setProperty("position", "relative");
inner.getStyle().setPropertyPx("left", 19);
inner.getStyle().setPropertyPx("top", 23);
inner.getStyle().setPropertyPx("width", 29);
inner.getStyle().setPropertyPx("height", 31);
assertEquals(outer, inner.getOffsetParent());
assertEquals(19, inner.getOffsetLeft());
assertEquals(23, inner.getOffsetTop());
assertEquals(29, inner.getOffsetWidth());
assertEquals(31, inner.getOffsetHeight());
}
/**
* getElementsByTagName
*/
public void testGetElementsByTagName() {
DivElement div = Document.get().createDivElement();
div.setInnerHTML("<span><button>foo</button><span><button>bar</button></span></span>");
NodeList<Element> nodes = div.getElementsByTagName("button");
assertEquals(2, nodes.getLength());
assertEquals("foo", nodes.getItem(0).getInnerText());
assertEquals("bar", nodes.getItem(1).getInnerText());
}
/**
* Tests HeadingElement.as() (it has slightly more complex assertion logic
* than most).
*/
public void testHeadingElementAs() {
DivElement placeHolder = Document.get().createDivElement();
for (int i = 0; i < 6; ++i) {
placeHolder.setInnerHTML("<H" + (i + 1) + "/>");
assertNotNull(HeadingElement.as(placeHolder.getFirstChildElement()));
}
if (!GWT.isScript()) {
Element notHeading = Document.get().createDivElement();
try {
HeadingElement.as(notHeading);
fail("Expected assertion failure");
} catch (AssertionError e) {
// this *should* happen.
}
}
}
}