@qooxdoo/framework
Version:
The JS Framework for Coders
370 lines (296 loc) • 13.5 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2009 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Martin Wittemann (martinwittemann)
* Fabian Jakobs (fjakobs)
************************************************************************ */
qx.Class.define("qx.test.bom.Location",
{
extend : qx.dev.unit.TestCase,
members :
{
__el : null,
__bodyStyles : null,
__marginTop : null,
__marginLeft : null,
__left : null,
__top : null,
__position : null,
__border : null,
__padding : null,
setUp : function()
{
this.__el = qx.dom.Element.create("div", { "id": "testRoot" });
document.body.appendChild(this.__el);
this.__bodyStyles = document.body.style;
this.__marginTop = this.__bodyStyles.marginTop;
this.__marginLeft = this.__bodyStyles.marginLeft;
this.__left = this.__bodyStyles.left;
this.__top = this.__bodyStyles.top;
this.__position = this.__bodyStyles.position;
this.__border = this.__bodyStyles.border;
this.__padding = this.__bodyStyles.padding;
// set up the defaults
this.__bodyStyles.marginLeft = "0px";
this.__bodyStyles.marginTop = "0px";
this.__bodyStyles.left = "0px";
this.__bodyStyles.top = "0px";
this.__bodyStyles.position = "static";
this.__bodyStyles.padding = "0px";
},
tearDown : function()
{
this.__bodyStyles.marginTop = this.__marginTop;
this.__bodyStyles.marginLeft = this.__marginLeft;
this.__bodyStyles.top = this.__top;
this.__bodyStyles.left = this.__left;
this.__bodyStyles.position = this.__position;
this.__bodyStyles.border = this.__border;
this.__bodyStyles.padding = this.__padding;
document.body.removeChild(this.__el);
this.__el = null;
},
testBodyLocationDefault : function()
{
// check the defaults
var pos = qx.bom.element.Location.get(document.body);
this.assertEquals(0, pos.left);
this.assertEquals(0, pos.top);
},
testBodyLocationMargins : function()
{
// set the defaults
this.__bodyStyles.marginLeft = "10px";
this.__bodyStyles.marginTop = "20px";
var pos = qx.bom.element.Location.get(document.body);
this.assertEquals(10, pos.left);
this.assertEquals(20, pos.top);
},
testBodyLocationBorder : function()
{
this.__bodyStyles.border = "5px solid black";
var pos = qx.bom.element.Location.get(document.body);
this.assertEquals(0, pos.left);
this.assertEquals(0, pos.top);
},
testBodyLocationPadding : function()
{
this.__bodyStyles.padding = "5px";
var pos = qx.bom.element.Location.get(document.body);
this.assertEquals(0, pos.left);
this.assertEquals(0, pos.top);
},
testBodyLocationMode : function()
{
this.__bodyStyles.marginLeft = "10px";
this.__bodyStyles.marginTop = "20px";
this.__bodyStyles.border = "5px solid black";
this.__bodyStyles.padding = "30px";
var pos = qx.bom.element.Location.get(document.body, "margin");
this.assertEquals(0, pos.left);
this.assertEquals(0, pos.top);
var pos = qx.bom.element.Location.get(document.body, "box");
this.assertEquals(10, pos.left);
this.assertEquals(20, pos.top);
var pos = qx.bom.element.Location.get(document.body, "border");
this.assertEquals(15, pos.left);
this.assertEquals(25, pos.top);
var pos = qx.bom.element.Location.get(document.body, "scroll");
this.assertEquals(15, pos.left);
this.assertEquals(25, pos.top);
var pos = qx.bom.element.Location.get(document.body, "padding");
this.assertEquals(45, pos.left);
this.assertEquals(55, pos.top);
},
testDivStatic : function()
{
this.__el.innerHTML =
'<div id="div1" style=" position: static; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
'<div id="div2" style="position: static; margin: 5px; border: 2px solid #000; padding: 3px; width: 150px; height: 150px;">' +
'<div id="div3" style="position: static; margin: 5px; border: 2px solid #000; padding: 3px; width: 100px; height: 100px;"></div>' +
'</div>' +
'</div>';
var div1 = document.getElementById("div1");
var pos = qx.bom.element.Location.get(div1);
this.assertEquals(5, pos.left, "left1");
this.assertEquals(5, pos.top, "top1");
var div2 = document.getElementById("div2");
var pos = qx.bom.element.Location.get(div2);
this.assertEquals(5 + 2 + 3 + 5, pos.left, "left2");
this.assertEquals(5 + 2 + 3 + 5, pos.top, "top2");
var div3 = document.getElementById("div3");
var pos = qx.bom.element.Location.get(div3);
this.assertEquals(15 + 5 + 2 + 3, pos.left, "left3");
this.assertEquals(15 + 5 + 2 + 3, pos.top, "top3");
},
testDivRelative : function()
{
this.__el.innerHTML =
'<div id="div1" style="position: relative; top: 5px; left: 5px; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
'<div id="div2" style="position: relative; top: 5px; left: 5px; margin: 5px; border: 2px solid #000; padding: 3px; width: 150px; height: 150px;">' +
'<div id="div3" style="position: relative; top: -5px; left: -5px; margin: 5px; border: 2px solid #000; padding: 3px; width: 100px; height: 100px;"></div>' +
'</div>' +
'</div>';
var div1 = document.getElementById("div1");
var pos = qx.bom.element.Location.get(div1);
this.assertEquals(10, pos.left);
this.assertEquals(10, pos.top);
var div2 = document.getElementById("div2");
var pos = qx.bom.element.Location.get(div2);
this.assertEquals(10 + 5 + 2 + 3 + 5, pos.left, "left2");
this.assertEquals(10 + 5 + 2 + 3 + 5, pos.top, "top2");
var div3 = document.getElementById("div3");
var pos = qx.bom.element.Location.get(div3);
this.assertEquals(25 - 5 + 5 + 2 + 3, pos.left, "left3");
this.assertEquals(25 - 5 + 5 + 2 + 3, pos.top, "top3");
},
testDivAbsolute : function()
{
this.__el.innerHTML =
'<div id="div1" style="position: absolute; top: 200px; left: 10px; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
'<div id="div2" style="position: absolute; top: -100px; left: -10px; margin: 5px; border: 2px solid #000; padding: 3px; width: 150px; height: 150px;">' +
'<div id="div3" style="position: absolute; top: 100px; left: 10px; margin: 5px; border: 2px solid #000; padding: 3px; width: 100px; height: 100px;"></div>' +
'</div>' +
'</div>';
var div1 = document.getElementById("div1");
var pos = qx.bom.element.Location.get(div1);
this.assertEquals(10 + 5, pos.left);
this.assertEquals(200 + 5, pos.top);
var div2 = document.getElementById("div2");
var pos = qx.bom.element.Location.get(div2);
this.assertEquals(15 - 10 + 2 + 5, pos.left);
this.assertEquals(205 - 100 + 2 + 5, pos.top);
var div3 = document.getElementById("div3");
var pos = qx.bom.element.Location.get(div3);
this.assertEquals(12 + 10 + 5 + 2, pos.left);
this.assertEquals(112 + 100 + 5 + 2, pos.top);
},
testDivMixedPositions : function()
{
this.__el.innerHTML =
'<div id="absolute1" style="position: absolute; top: 300px; left: 400px; margin: 5px; border: 2px solid #000; padding: 3px; width: 100px; height: 100px;">' +
' <div id="relative1" style="position: relative; top: 50px; left: 50px; margin: 5px; border: 2px solid #000; padding: 3px; width: 300px; height: 300px;">' +
' <div id="static1" style="overflow: hidden; position: static; margin: 5px; border: 2px solid #000; padding: 3px; width: 250px; height: 250px;">' +
' <div id="relative2" style="overflow: auto; position: relative; top: 10px; left: 10px; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
' <div id="absolute2" style="position: absolute; top: 30px; left: -90px; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
' <div id="static2" style="position: static; margin: 10px; border: 2px solid #000; padding: 3px; width: 250px; height: 250px;">' +
' </div>' +
' </div>' +
' </div>' +
' </div>' +
' </div>' +
'</div>';
var absolute1 = document.getElementById("absolute1");
var pos = qx.bom.element.Location.get(absolute1);
this.assertEquals(400 + 5, pos.left);
this.assertEquals(300 + 5, pos.top);
var relative1 = document.getElementById("relative1");
var pos = qx.bom.element.Location.get(relative1);
this.assertEquals(405 + 2 + 3 + 50 + 5, pos.left);
this.assertEquals(305 + 2 + 3 + 50 + 5, pos.top, "top2");
var static1 = document.getElementById("static1");
var pos = qx.bom.element.Location.get(static1);
this.assertEquals(465 + 2 + 3 + 5, pos.left);
this.assertEquals(365 + 2 + 3 + 5, pos.top, "top3");
var relative2 = document.getElementById("relative2");
var pos = qx.bom.element.Location.get(relative2);
this.assertEquals(475 + 2 + 3 + 10 + 5, pos.left);
this.assertEquals(375 + 2 + 3 + 10 + 5, pos.top, "top4");
var absolute2 = document.getElementById("absolute2");
var pos = qx.bom.element.Location.get(absolute2);
this.assertEquals(495 + 2 - 90 + 5, pos.left);
this.assertEquals(395 + 2 + 30 + 5, pos.top, "top4");
var static2 = document.getElementById("static2");
var pos = qx.bom.element.Location.get(static2);
this.assertEquals(412 + 3 + 2 + 10, pos.left);
this.assertEquals(432 + 3 + 2 + 10, pos.top, "top5");
},
testDivWithBodyMargin : function()
{
this.__bodyStyles.marginLeft = "10px";
this.__bodyStyles.marginTop = "20px";
this.__el.innerHTML = '<div id="div">affe</div>';
var div = document.getElementById("div");
var pos = qx.bom.element.Location.get(div);
this.assertEquals(10, pos.left);
this.assertEquals(20, pos.top);
},
testDivWithBodyPadding : function()
{
this.__bodyStyles.padding = "10px";
this.__el.innerHTML = '<div id="div"></div>';
var div = document.getElementById("div");
var pos = qx.bom.element.Location.get(div);
this.assertEquals(10, pos.left);
this.assertEquals(10, pos.top);
},
testDivWithBodyBorder : function()
{
this.__bodyStyles.border = "10px solid black";
this.__el.innerHTML = '<div id="div">juhu</div>';
var div = document.getElementById("div");
var pos = qx.bom.element.Location.get(div);
// IE quirks mode puts the border outside of the body
if (qx.core.Environment.get("engine.name") == "mshtml" &&
qx.core.Environment.get("browser.quirksmode"))
{
this.assertEquals(0, pos.left);
this.assertEquals(0, pos.top);
}
else
{
this.assertEquals(10, pos.left);
this.assertEquals(10, pos.top);
}
},
testDivLocationMode : function()
{
this.__el.innerHTML = '<div id="div" style="margin: 5px; padding: 10px; border: 3px solid green;"></div>';
var div = document.getElementById("div");
var pos = qx.bom.element.Location.get(div, "margin");
this.assertEquals(0, pos.left);
this.assertEquals(0, pos.top);
var pos = qx.bom.element.Location.get(div, "box");
this.assertEquals(5, pos.left);
this.assertEquals(5, pos.top);
var pos = qx.bom.element.Location.get(div, "border");
this.assertEquals(8, pos.left);
this.assertEquals(8, pos.top);
var pos = qx.bom.element.Location.get(div, "scroll");
this.assertEquals(8, pos.left);
this.assertEquals(8, pos.top);
var pos = qx.bom.element.Location.get(div, "padding");
this.assertEquals(18, pos.left);
this.assertEquals(18, pos.top);
},
testDivInline : function()
{
this.__el.innerHTML =
'<div style="width:100px">' +
'<span id="span1" style="margin-left: 10px"><img src="about:blank" width="10px" height="10px" style="border: 0px"></img></span>' +
'<span id="span2" style="margin-left: 10px">a</span>' +
'</div>';
var span1 = document.getElementById("span1");
var pos = qx.bom.element.Location.get(span1);
this.assertEquals(10, pos.left);
var span2 = document.getElementById("span2");
var pos = qx.bom.element.Location.get(span2);
this.assertEquals(30, pos.left);
},
testDivFixed : function()
{
this.__el.innerHTML =
'<div style="position: absolute; left: 0px; top: 0px; width: 20px; height: 2000px;"></div>' +
'<div id="test" style="position: fixed; width: 300px; height: 600px; top: 50px;"></div>';
window.scrollTo(0,100);
var pos = qx.bom.element.Location.get(document.getElementById("test"));
this.assertEquals(150, pos.top);
}
}
});