blob: e29b6657f92254688d5fc8502721e31d15f7d7e2 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>shown_test.html</title>
<script src="test_bootstrap.js"></script>
<script type="text/javascript">
goog.require('bot');
goog.require('bot.dom');
goog.require('bot.locators');
goog.require('bot.userAgent');
goog.require('goog.dom');
goog.require('goog.style');
goog.require('goog.testing.ExpectedFailures');
goog.require('goog.testing.jsunit');
goog.require('goog.userAgent');
goog.require('goog.userAgent.platform');
</script>
<style>
#box {
border: 1px solid black;
}
#box ul {
height: 250px;
overflow: hidden;
}
#box ul>li {
height: 50px;
}
#box ul>li>a {
height: 26px;
}
</style>
<script type="text/javascript">
var isShown = bot.dom.isShown;
var findElement = bot.locators.findElement;
var expectedFailures;
function setUp() {
expectedFailures = new goog.testing.ExpectedFailures();
}
function tearDown() {
expectedFailures.handleTearDown();
goog.style.setStyle(document.body, 'display', 'block');
goog.style.setStyle(document.body, 'overflow', 'auto');
}
function testMustBeGivenAnElement() {
assertThrows(function () {
isShown(undefined);
});
}
function testBodyShown() {
assertTrue(isShown(document.body));
}
function testBodyAlwaysShown() {
goog.style.setStyle(document.body, 'display', 'none');
assertTrue("BODY element must *always* be shown", isShown(document.body));
}
function testCanDetermineIfAnElementIsShownOrNot() {
assertTrue(isShown(findElement({ id: 'displayed' })));
assertFalse(isShown(findElement({ id: 'none' })));
assertFalse(isShown(findElement({ id: 'suppressedParagraph' })));
assertFalse(isShown(findElement({ id: 'hidden' })));
}
function testIsShownTakesIntoAccountParentDisplay() {
var parent = findElement({ id: 'hiddenparent' });
assertFalse('parent is explicitly set to display:none',
isShown(parent));
var childDiv = findElement({ id: 'hiddenchild' });
var hiddenLink = findElement({ id: 'hiddenlink' });
assertFalse(isShown(childDiv));
assertFalse(isShown(hiddenLink));
}
function testIsShownTakesIntoAccountParentVisibility() {
var parent = findElement({ id: 'hiddenFormFields' });
var child = findElement({ id: 'untogglable' });
expectedFailures.expectFailureFor(
goog.userAgent.IE && goog.userAgent.platform.isVersion(6) &&
!goog.userAgent.platform.isVersion(6.1),
'Vista fails this test, have not figured it out yet...');
// TODO: Figure it out
expectedFailures.run(function () {
assertFalse(isShown(parent));
assertFalse(isShown(child));
});
}
function testCountElementsAsVisibleIfStylePropertyHasBeenSet() {
var shown = findElement({ id: 'visibleSubElement' });
assertTrue(isShown(shown));
}
function testHiddenInputElementsAreNeverVisible() {
var hidden = findElement({ name: 'hidden' });
assertFalse(isShown(hidden));
}
function testElementWithZeroHeightIsNotConsideredDisplayed() {
// IE6 doesn't render the element correctly for the test to work.
if (goog.userAgent.IE && bot.userAgent.isEngineVersion(6)) {
return;
}
var zeroHeight = findElement({ id: 'zeroheight' });
assertFalse(isShown(zeroHeight));
}
function testElementWithZeroWidthIsNotConsideredDisplayed() {
// IE6 doesn't render the element correctly for the test to work.
if (goog.userAgent.IE && bot.userAgent.isEngineVersion(6)) {
return;
}
var zeroWidth = findElement({ id: 'zerowidth' });
assertFalse(isShown(zeroWidth));
}
function testElementWithOnlyWhitespaceReturnsConsistentResults() {
var span = findElement({ id: 'onlyWhitespace' });
// Make sure we report the same result every time. Both will be true in
// most browsers, except IE7 and earlier, where they will both be false.
assertEquals(isShown(span), isShown(span));
}
function testCorrectlyDeterminesVisibilityViaDisplayStyle() {
var span = findElement({ id: 'visibleSpan' });
assertFalse(isShown(span));
}
function testThrowsErrorIfPassedATextNode() {
var textNode = findElement({ id: 'displayed' }).firstChild;
var err = assertThrows('Argument to isShown must be of type Element',
function () {
isShown(textNode);
});
assertEquals('Argument to isShown must be of type Element', err.message);
}
function testOptionShownWhenEnclosingSelectShown() {
var option = findElement({ id: 'shownOption' });
assertTrue(isShown(option));
}
function testOptionNotShownWhenEnclosingSelectNotShown() {
var option = findElement({ id: 'hiddenOption' });
assertFalse(isShown(option));
}
function testOrphanOptionIsNotShown() {
var option = findElement({ id: 'orphanOption' });
// In some browsers, an orphan option is not rendered at all.
assertFalse(!!option && isShown(option));
}
function testMapShownWhenImageShown() {
var map = findElement({ id: 'shownMap' });
assertTrue(isShown(map));
}
function testMapNotShownWhenImageNotShown() {
var map = findElement({ id: 'hiddenImageMap' });
assertFalse(isShown(map));
}
function testMapNotShownWhenNoImage() {
var map = findElement({ id: 'noImageMap' });
assertFalse(isShown(map));
}
function testMapNotShownWhenNoName() {
var map = findElement({ id: 'noNameMap' });
assertFalse(isShown(map));
}
function testAreaShownWhenEnclosingMapShown() {
var area = findElement({ id: 'shownArea' });
assertTrue(isShown(area));
}
function testAreaNotShownWhenEnclosingMapNotShown() {
var area = findElement({ id: 'hiddenArea' });
assertFalse(isShown(area));
}
function testOrphanAreaIsNotShown() {
var area = findElement({ id: 'orphanArea' });
// In some browsers, an orphan area is not rendered at all.
assertFalse(!!area && isShown(area));
}
function testElementWithNestedBlockLevelElementShown() {
var containsNestedBlock = findElement({ id: 'containsNestedBlock' });
assertTrue(isShown(containsNestedBlock));
}
function testZeroOpacityMakesElementNotShown() {
var transparent = findElement({ id: 'transparent' });
assertFalse(isShown(transparent));
}
function testTitleIsNotShown() {
var title = findElement({ tagName: 'title' });
assertFalse(isShown(title));
}
function testTitleOfFrameWindowNotShown() {
var iframe = findElement({ id: 'iframe' });
var iframeDoc = goog.dom.getFrameContentDocument(iframe);
var iframeTitle = findElement({ tagName: 'title' }, iframeDoc);
assertFalse(isShown(iframeTitle));
}
function testTwoEmptyDivsAreZeroSizedAndNotShown() {
var element = goog.dom.createDom('div', null,
goog.dom.createDom('div'));
document.body.appendChild(element);
var size = bot.dom.getClientRect(element);
// Width will be equivalent of width:100%
assertEquals('Should have 0 height', 0, size.height);
assertFalse(isShown(element));
}
function testZeroSizedDivIsShownIfDescendantHasSize() {
if (goog.userAgent.IE && !bot.userAgent.isProductVersion(7)) {
return;
}
var element = goog.dom.createDom('div',
{ id: 'ZeroSizedDiv', style: 'width:0;height:0' },
goog.dom.createDom('div', null,
goog.dom.createDom('img', {
src: 'testdata/map.png',
height: '126',
width: '364'
})));
document.body.appendChild(element);
var size = bot.dom.getClientRect(element);
assertEquals('Should have 0 width', 0, size.width);
assertEquals('Should have 0 height', 0, size.height);
assertTrue(isShown(element));
}
function testZeroSizedAbsolutePositionedBlockElementsAreShownIfDescendantHasSize() {
var div = goog.partial(goog.dom.createDom, 'div');
function position(element, left, top, opt_zIndex) {
element.style.position = 'absolute';
element.style.left = left;
element.style.top = top;
if (opt_zIndex)
element.style.zIndex = opt_zIndex;
return element;
}
function size(element, width, height) {
element.style.width = width;
element.style.height = height;
return element;
}
var root = position(div(), 0, 0, 1),
child = position(div(), 0, 0, 100),
grandChild = position(div(), 0, 0),
greatGrandChild = size(position(div(), 0, 0), '250px', '250px');
grandChild.appendChild(greatGrandChild);
child.appendChild(grandChild);
root.appendChild(child);
document.body.appendChild(root);
var size = bot.dom.getClientRect(root);
assertEquals('Should have 0 width', 0, size.width);
assertEquals('Should have 0 height', 0, size.height);
assertTrue('Should still be considered shown', isShown(root));
}
/** @see http://code.google.com/p/selenium/issues/detail?id=2922 */
function testOptionsInInvisibleSelectAreStillShown() {
var select = goog.dom.$('invisiSelect');
assertEquals(0, bot.dom.getOpacity(select));
assertFalse(bot.dom.isShown(select));
assertTrue('Select should be visible when ignoring opacity',
bot.dom.isShown(select, true));
assertTrue(bot.dom.isShown(select.firstChild));
}
/** @see http://code.google.com/p/selenium/issues/detail?id=1941 */
function testMapsForInvisibleImagesAreShownWhenIgnoringOpacity() {
var img = goog.dom.$('invisiImg');
assertEquals(0, bot.dom.getOpacity(img));
assertFalse(bot.dom.isShown(img));
assertTrue(bot.dom.isShown(img, true));
var map = goog.dom.$('invisiShownMap');
assertFalse(bot.dom.isShown(map));
assertTrue(bot.dom.isShown(map, true));
var area = goog.dom.$('invisiShownArea');
assertFalse(bot.dom.isShown(area));
assertTrue(bot.dom.isShown(area, true));
}
function testNoscriptElementIsNotShown() {
var noscript = findElement({ id: 'noscript' });
assertFalse(isShown(noscript));
}
function testThatItemsHiddenWithOverflowHiddenAreFalse() {
if (goog.userAgent.IE && !bot.userAgent.isProductVersion(7)) {
return;
}
var target = findElement({ id: 'target' });
assertFalse(isShown(target));
}
function testThatItemsAreConsideredInvisbleIfAbsolutePositionIsNotInCascade() {
var target = findElement({ id: 'iHaveAbsolutePosition' });
assertFalse(isShown(target));
}
function testZeroSizeElemWithOverflowHiddenAndTextNotShown() {
var target = findElement({ id: 'bug5022' });
assertFalse(isShown(target));
}
function testOverflowHiddenWithFixedPositionChild() {
var target = findElement({ id: 'overflowHiddenWithFixedPositionChild' });
var child = findElement({ id: 'fixedPositionChild' });
goog.dom.removeChildren(child);
assertFalse(isShown(target));
goog.dom.setTextContent(child, 'some content');
assertTrue(isShown(target));
}
function testThatElementIsShownWithZIndex() {
assertTrue(isShown(findElement({ id: 'bug5109' })));
}
function testNegativePositionedParentWithPositionPositionedChildIsShown() {
var target = findElement({ id: 'negativePositionWithPositivePositionChildren' });
assertTrue(isShown(target));
}
function testCanNotSeeElementWithHiddenAttribute() {
expectedFailures.expectFailureFor(
(goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(11)) ||
bot.userAgent.ANDROID_PRE_GINGERBREAD,
'IE and Android Froyo do not understand hidden attribute');
var elem = findElement({ id: 'html5hidden' });
expectedFailures.run(function () {
assertFalse(isShown(elem));
});
}
function testTableRowDefaultVisibility() {
var elem = findElement({ id: 'visible-row' });
assertTrue(isShown(elem));
assertTrue(isShown(elem.firstChild));
}
function testTableRowCollapsedVisibility() {
expectedFailures.expectFailureFor(
(goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(8)),
'IE does not support visibility:collapsed until IE8');
var elem = findElement({ id: 'collapsed-row' });
expectedFailures.run(function () {
assertFalse(isShown(elem));
assertFalse(isShown(elem.firstChild));
});
}
function testVisibleTableRowAfterCollapsedRow() {
var elem = findElement({ id: 'post-collapsed-row' });
assertTrue(isShown(elem));
assertTrue(isShown(elem.firstChild));
}
function testDisplayContentsOverflowIgnored() {
assertTrue(isShown(findElement({ id: 'displayContentsInput' })));
}
function testDetailsSummaryVisibility() {
var summary = findElement({ id: 'summary' });
assertTrue(isShown(summary));
}
function testDetailsNonSummaryDescendantsVisibility() {
var contents = findElement({ id: 'non-summary' });
assertFalse(isShown(contents));
assertFalse(isShown(contents.firstChild));
}
function testContentVisibleHidden() {
var content = findElement({ id: 'contentVisibility' });
assertFalse(isShown(content));
assertFalse(isShown(findElement({ id: 'b' }, content)));
}
</script>
<style type="text/css">
#nav {
padding: 0;
margin: 0;
list-style: none;
}
#nav li {
float: left;
position: relative;
width: 10em;
}
#nav li ul {
display: none;
position: absolute;
top: 1em;
left: 0;
}
#nav li>ul {
top: auto;
left: auto;
}
#nav li:hover ul,
#nav li.over ul {
display: block;
background: white;
}
#transparent {
opacity: 0;
/* non IE */
filter: alpha(opacity=0);
/* IE 6+ */
}
#zeroheight,
#zerowidth {
border: 0;
padding: 0;
margin: 0;
}
#zerowidth {
width: 0;
height: 70px;
}
#zeroheight {
width: 70px;
height: 0;
}
box-popup {
border: 1px;
min-width: 150px;
}
#box {
border: 1px solid black;
}
#box ul {
height: 250px;
overflow: hidden;
}
#box ul>li {
height: 50px;
}
#box ul>li>a {
height: 26px;
}
</style>
</head>
<body>
<div style="left: 30px; top: 10px; visibility: visible; position: absolute; overflow: visible;" class="box-popup"
id="suggest">
<p>Hello world. I like cheese.</p>
</div>
<div>
<p id="displayed">Displayed</p>
<p id="transparent">Transparent</p>
<form action="#"><input type="hidden" name="hidden" /></form>
<p id="none" style="display: none;">Display set to none</p>
<p id="hidden" style="visibility: hidden;">Hidden</p>
<div id="hiddenparent" style="height: 2em; display: none;">
<div id="hiddenchild">
<a href="#" id="hiddenlink">ok</a>
</div>
</div>
<div id="hiddenFormFields" style="visibility: hidden;">
<span>
<input id="unclickable" />
<input type="checkbox" id="untogglable" checked="checked" />Check box you can't see
</span>
</div>
<div style="display:none">
<span id="visibleSpan" style="display:block">cheese puffs</span>
</div>
<p id="outer" style="visibility: hidden">A
<b id="visibleSubElement" style="visibility: visible">sub-element that is
explicitly visible</b> using CSS visibility=visible
</p>
<noscript id='noscript'>Noscript subelement that is not visible</noscript>
</div>
<img id="zeroheight" src="testdata/map.png">
<img id="zerowidth" src="testdata/map.png">
<p id="suppressedParagraph" style="display: none">A paragraph suppressed using CSS display=none</p>
<select>
<option id="shownOption" style="display:none;visibility:hidden;">
</select>
<select style="display:none;">
<option id="hiddenOption">
</select>
<option id="orphanOption"></option>
<label>invisible select:
<select id="invisiSelect" style="opacity:0; filter:alpha(opacity=0)">
<option>Test</option>
</select>
</label>
<img usemap="#shownMap" src="testdata/map.png">
<map id="shownMap" name="shownMap">
<area id="shownArea" shape="rect" coords="0,0,1,1" href="#">
</map>
<img usemap="#hiddenImageMap" src="testdata/map.png" style="visibility: hidden">
<map id="hiddenImageMap" name="hiddenImageMap">
<area id="hiddenArea" shape="rect" coords="0,0,1,1" href="#">
</map>
<map id="noImageMap" name="noImageMap"></map>
<map id="noNameMap"></map>
<img id="invisiImg" usemap="#invisiShownMap" src="testdata/map.png" width="91" height="31"
style="opacity:0; filter:alpha(opacity=0)">
<map id="invisiShownMap" name="invisiShownMap">
<area id="invisiShownArea" shape="rect" coords="0,0,1,1" href="#">
</map>
<area id="orphanArea" shape="rect" coords="0,0,1,1" href="#"></area>
<a id="containsNestedBlock" href="#">
<div style="display:block;">text</div>
</a>
<iframe id="iframe" src="testdata/iframe_page.html"></iframe>
<span id="onlyWhitespace"> </span>
<div id="box">
<ul id="list1">
<li><a>Item 1</a></li>
<li><a>Item 2</a></li>
<li><a>Item 3</a></li>
<li><a>Item 4</a></li>
<li><a>Item 5</a></li>
<li><a>Item 6</a></li>
<li><a>Item 7</a></li>
<li id="target"><a>Item 8</a></li>
</ul>
</div>
<div id="grandparent" style="display:none;width:10px;">
<div id="parent" style="position:absolute;right:10px;">
<div id="iHaveAbsolutePosition" style="display:block">I am over here</div>
</div>
</div>
<div id="bug5022" style="overflow:hidden; height:0; width:0;">
This is a zero height/width div and overflow hidden
</div>
<div style="overflow:hidden; height:0; width:0;">
<div id="overflowHiddenWithFixedPositionChild">
This is a zero height/width div and overflow hidden
<div id="fixedPositionChild" style="position:fixed"></div>
</div>
</div>
<div style="position:relative;
width:300px;
height:300px;
background-image:url(testdata/kitten1.jpg);
background-position:center;">
<a id="bug5109" href="kitten2.jpg" style="display:block;
position:relative;
width:100px;
height:100px;
left:-60px;
top:-66px;
background-image:url(testdata/kitten2.jpg);
background-position:center;"></a>
</div>
<div id="negativePositionWithPositivePositionChildren" style="position:absolute;left:-10px;top:-10px">
<div style="position:absolute;left:100px;top:100px">
positivePositionChildInNegativePositionParent
</div>
</div>
<div id='html5hidden' hidden>This is not visible</div>
<div style="display: contents; overflow-y: auto">
<input id="displayContentsInput" />
</div>
<table>
<tr id="visible-row">
<td>a</td>
</tr>
<tr id="collapsed-row" style="visibility:collapse">
<td>b</td>
</tr>
<tr id="post-collapsed-row">
<td>c</td>
</tr>
</table>
<details>
<summary id="summary">Some Summary</summary>
<div id="non-summary">
<p>More text</p>
</div>
</details>
<div id='contentVisibility' style='content-visibility: hidden'>
A
<div id='b'>B</div>
</div>
</body>
</html>