PageRenderTime 34ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/qooxdoo/framework/source/class/qx/test/bom/Location.js

https://github.com/stephaneerard/qooxdoo
JavaScript | 406 lines | 311 code | 72 blank | 23 comment | 23 complexity | 72a0d3374af04066ed6a59c33572961a MD5 | raw file
  1. /* ************************************************************************
  2. qooxdoo - the new era of web development
  3. http://qooxdoo.org
  4. Copyright:
  5. 2004-2009 1&1 Internet AG, Germany, http://www.1und1.de
  6. License:
  7. LGPL: http://www.gnu.org/licenses/lgpl.html
  8. EPL: http://www.eclipse.org/org/documents/epl-v10.php
  9. See the LICENSE file in the project's top-level directory for details.
  10. Authors:
  11. * Martin Wittemann (martinwittemann)
  12. * Fabian Jakobs (fjakobs)
  13. ************************************************************************ */
  14. qx.Class.define("qx.test.bom.Location",
  15. {
  16. extend : qx.dev.unit.TestCase,
  17. members :
  18. {
  19. __bodyStyles : null,
  20. __marginTop : null,
  21. __marginLeft : null,
  22. __left : null,
  23. __top : null,
  24. __position : null,
  25. __border : null,
  26. __padding : null,
  27. setUp : function()
  28. {
  29. this.__bodyStyles = document.body.style;
  30. this.__marginTop = this.__bodyStyles.marginTop;
  31. this.__marginLeft = this.__bodyStyles.marginLeft;
  32. this.__left = this.__bodyStyles.left;
  33. this.__top = this.__bodyStyles.top;
  34. this.__position = this.__bodyStyles.position;
  35. this.__border = this.__bodyStyles.border;
  36. this.__padding = this.__bodyStyles.padding;
  37. // set up the defaults
  38. this.__bodyStyles.marginLeft = "0px";
  39. this.__bodyStyles.marginTop = "0px";
  40. this.__bodyStyles.left = "0px";
  41. this.__bodyStyles.top = "0px";
  42. this.__bodyStyles.position = "static";
  43. this.__bodyStyles.padding = "0px";
  44. },
  45. tearDown : function()
  46. {
  47. this.__bodyStyles.marginTop = this.__marginTop;
  48. this.__bodyStyles.marginLeft = this.__marginLeft;
  49. this.__bodyStyles.top = this.__top;
  50. this.__bodyStyles.left = this.__left;
  51. this.__bodyStyles.position = this.__position;
  52. this.__bodyStyles.border = this.__border;
  53. this.__bodyStyles.padding = this.__padding;
  54. document.body.innerHTML = "";
  55. },
  56. testBodyLocationDefault : function()
  57. {
  58. // check the defaults
  59. var pos = qx.bom.element.Location.get(document.body);
  60. this.assertEquals(0, pos.left);
  61. this.assertEquals(0, pos.top);
  62. },
  63. testBodyLocationMargins : function()
  64. {
  65. // set the defaults
  66. this.__bodyStyles.marginLeft = "10px";
  67. this.__bodyStyles.marginTop = "20px";
  68. var pos = qx.bom.element.Location.get(document.body);
  69. this.assertEquals(10, pos.left);
  70. this.assertEquals(20, pos.top);
  71. },
  72. testBodyLocationBorder : function()
  73. {
  74. this.__bodyStyles.border = "5px solid black";
  75. var pos = qx.bom.element.Location.get(document.body);
  76. this.assertEquals(0, pos.left);
  77. this.assertEquals(0, pos.top);
  78. },
  79. testBodyLocationPadding : function()
  80. {
  81. this.__bodyStyles.padding = "5px";
  82. var pos = qx.bom.element.Location.get(document.body);
  83. this.assertEquals(0, pos.left);
  84. this.assertEquals(0, pos.top);
  85. },
  86. testBodyLocationMode : function()
  87. {
  88. this.__bodyStyles.marginLeft = "10px";
  89. this.__bodyStyles.marginTop = "20px";
  90. this.__bodyStyles.border = "5px solid black";
  91. this.__bodyStyles.padding = "30px";
  92. var pos = qx.bom.element.Location.get(document.body, "margin");
  93. this.assertEquals(0, pos.left);
  94. this.assertEquals(0, pos.top);
  95. var pos = qx.bom.element.Location.get(document.body, "box");
  96. this.assertEquals(10, pos.left);
  97. this.assertEquals(20, pos.top);
  98. var pos = qx.bom.element.Location.get(document.body, "border");
  99. this.assertEquals(15, pos.left);
  100. this.assertEquals(25, pos.top);
  101. var pos = qx.bom.element.Location.get(document.body, "scroll");
  102. this.assertEquals(15, pos.left);
  103. this.assertEquals(25, pos.top);
  104. var pos = qx.bom.element.Location.get(document.body, "padding");
  105. this.assertEquals(45, pos.left);
  106. this.assertEquals(55, pos.top);
  107. },
  108. testDivStatic : function()
  109. {
  110. document.body.innerHTML =
  111. '<div id="div1" style=" position: static; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
  112. '<div id="div2" style="position: static; margin: 5px; border: 2px solid #000; padding: 3px; width: 150px; height: 150px;">' +
  113. '<div id="div3" style="position: static; margin: 5px; border: 2px solid #000; padding: 3px; width: 100px; height: 100px;"></div>' +
  114. '</div>' +
  115. '</div>';
  116. var div1 = document.getElementById("div1");
  117. var pos = qx.bom.element.Location.get(div1);
  118. this.assertEquals(5, pos.left, "left1");
  119. this.assertEquals(5, pos.top, "top1");
  120. var div2 = document.getElementById("div2");
  121. var pos = qx.bom.element.Location.get(div2);
  122. this.assertEquals(5 + 2 + 3 + 5, pos.left, "left2");
  123. var badIE = qx.bom.client.Engine.MSHTML &&
  124. (qx.bom.client.Engine.VERSION < 8 || qx.bom.client.Feature.QUIRKS_MODE ||
  125. qx.bom.client.Engine.DOCUMENT_MODE === 7);
  126. if (badIE) {
  127. this.assertEquals(12, pos.top, "top2 (IE)");
  128. } else {
  129. this.assertEquals(5 + 2 + 3 + 5, pos.top, "top2");
  130. }
  131. var div3 = document.getElementById("div3");
  132. var pos = qx.bom.element.Location.get(div3);
  133. this.assertEquals(15 + 5 + 2 + 3, pos.left, "left3");
  134. if (badIE) {
  135. this.assertEquals(19, pos.top, "top3 (IE)");
  136. } else {
  137. this.assertEquals(15 + 5 + 2 + 3, pos.top, "top3");
  138. }
  139. },
  140. testDivRelative : function()
  141. {
  142. document.body.innerHTML =
  143. '<div id="div1" style="position: relative; top: 5px; left: 5px; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
  144. '<div id="div2" style="position: relative; top: 5px; left: 5px; margin: 5px; border: 2px solid #000; padding: 3px; width: 150px; height: 150px;">' +
  145. '<div id="div3" style="position: relative; top: -5px; left: -5px; margin: 5px; border: 2px solid #000; padding: 3px; width: 100px; height: 100px;"></div>' +
  146. '</div>' +
  147. '</div>';
  148. var div1 = document.getElementById("div1");
  149. var pos = qx.bom.element.Location.get(div1);
  150. this.assertEquals(10, pos.left);
  151. this.assertEquals(10, pos.top);
  152. var div2 = document.getElementById("div2");
  153. var pos = qx.bom.element.Location.get(div2);
  154. this.assertEquals(10 + 5 + 2 + 3 + 5, pos.left, "left2");
  155. var badIE = qx.bom.client.Engine.MSHTML &&
  156. (qx.bom.client.Engine.VERSION < 8 || qx.bom.client.Feature.QUIRKS_MODE ||
  157. qx.bom.client.Engine.DOCUMENT_MODE === 7);
  158. if (badIE) {
  159. this.assertEquals(10 + 5 + 2 + 5, pos.top, "top2 (IE)");
  160. } else {
  161. this.assertEquals(10 + 5 + 2 + 3 + 5, pos.top, "top2");
  162. }
  163. var div3 = document.getElementById("div3");
  164. var pos = qx.bom.element.Location.get(div3);
  165. this.assertEquals(25 - 5 + 5 + 2 + 3, pos.left, "left3");
  166. if (badIE) {
  167. this.assertEquals(24, pos.top, "top3 (IE)");
  168. } else {
  169. this.assertEquals(25 - 5 + 5 + 2 + 3, pos.top, "top3");
  170. }
  171. },
  172. testDivAbsolute : function()
  173. {
  174. document.body.innerHTML =
  175. '<div id="div1" style="position: absolute; top: 200px; left: 10px; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
  176. '<div id="div2" style="position: absolute; top: -100px; left: -10px; margin: 5px; border: 2px solid #000; padding: 3px; width: 150px; height: 150px;">' +
  177. '<div id="div3" style="position: absolute; top: 100px; left: 10px; margin: 5px; border: 2px solid #000; padding: 3px; width: 100px; height: 100px;"></div>' +
  178. '</div>' +
  179. '</div>';
  180. var div1 = document.getElementById("div1");
  181. var pos = qx.bom.element.Location.get(div1);
  182. this.assertEquals(10 + 5, pos.left);
  183. this.assertEquals(200 + 5, pos.top);
  184. var div2 = document.getElementById("div2");
  185. var pos = qx.bom.element.Location.get(div2);
  186. this.assertEquals(15 - 10 + 2 + 5, pos.left);
  187. this.assertEquals(205 - 100 + 2 + 5, pos.top);
  188. var div3 = document.getElementById("div3");
  189. var pos = qx.bom.element.Location.get(div3);
  190. this.assertEquals(12 + 10 + 5 + 2, pos.left);
  191. this.assertEquals(112 + 100 + 5 + 2, pos.top);
  192. },
  193. testDivMixedPositions : function()
  194. {
  195. document.body.innerHTML =
  196. '<div id="absolute1" style="position: absolute; top: 300px; left: 400px; margin: 5px; border: 2px solid #000; padding: 3px; width: 100px; height: 100px;">' +
  197. ' <div id="relative1" style="position: relative; top: 50px; left: 50px; margin: 5px; border: 2px solid #000; padding: 3px; width: 300px; height: 300px;">' +
  198. ' <div id="static1" style="overflow: hidden; position: static; margin: 5px; border: 2px solid #000; padding: 3px; width: 250px; height: 250px;">' +
  199. ' <div id="relative2" style="overflow: auto; position: relative; top: 10px; left: 10px; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
  200. ' <div id="absolute2" style="position: absolute; top: 30px; left: -90px; margin: 5px; border: 2px solid #000; padding: 3px; width: 200px; height: 200px;">' +
  201. ' <div id="static2" style="position: static; margin: 10px; border: 2px solid #000; padding: 3px; width: 250px; height: 250px;">' +
  202. ' </div>' +
  203. ' </div>' +
  204. ' </div>' +
  205. ' </div>' +
  206. ' </div>' +
  207. '</div>';
  208. var absolute1 = document.getElementById("absolute1");
  209. var pos = qx.bom.element.Location.get(absolute1);
  210. this.assertEquals(400 + 5, pos.left);
  211. this.assertEquals(300 + 5, pos.top);
  212. var relative1 = document.getElementById("relative1");
  213. var pos = qx.bom.element.Location.get(relative1);
  214. this.assertEquals(405 + 2 + 3 + 50 + 5, pos.left);
  215. var badIE = qx.bom.client.Engine.MSHTML &&
  216. (qx.bom.client.Engine.VERSION < 8 || qx.bom.client.Feature.QUIRKS_MODE ||
  217. qx.bom.client.Engine.DOCUMENT_MODE === 7);
  218. if (badIE) {
  219. this.assertEquals(362, pos.top, "top2 (IE)");
  220. } else {
  221. this.assertEquals(305 + 2 + 3 + 50 + 5, pos.top, "top2");
  222. }
  223. var static1 = document.getElementById("static1");
  224. var pos = qx.bom.element.Location.get(static1);
  225. this.assertEquals(465 + 2 + 3 + 5, pos.left);
  226. if (badIE) {
  227. this.assertEquals(369, pos.top, "top3 (IE)");
  228. } else {
  229. this.assertEquals(365 + 2 + 3 + 5, pos.top, "top3");
  230. }
  231. var relative2 = document.getElementById("relative2");
  232. var pos = qx.bom.element.Location.get(relative2);
  233. this.assertEquals(475 + 2 + 3 + 10 + 5, pos.left);
  234. if (badIE) {
  235. this.assertEquals(386, pos.top, "top4 (IE)");
  236. } else {
  237. this.assertEquals(375 + 2 + 3 + 10 + 5, pos.top, "top4");
  238. }
  239. var absolute2 = document.getElementById("absolute2");
  240. var pos = qx.bom.element.Location.get(absolute2);
  241. this.assertEquals(495 + 2 - 90 + 5, pos.left);
  242. if (badIE) {
  243. this.assertEquals(423, pos.top, "top4 (IE)");
  244. } else {
  245. this.assertEquals(395 + 2 + 30 + 5, pos.top, "top4");
  246. }
  247. var static2 = document.getElementById("static2");
  248. var pos = qx.bom.element.Location.get(static2);
  249. this.assertEquals(412 + 3 + 2 + 10, pos.left);
  250. if (badIE) {
  251. this.assertEquals(435, pos.top, "top5 (IE)");
  252. } else {
  253. this.assertEquals(432 + 3 + 2 + 10, pos.top, "top5");
  254. }
  255. },
  256. testDivWithBodyMargin : function()
  257. {
  258. this.__bodyStyles.marginLeft = "10px";
  259. this.__bodyStyles.marginTop = "20px";
  260. document.body.innerHTML = '<div id="div">affe</div>';
  261. var div = document.getElementById("div");
  262. var pos = qx.bom.element.Location.get(div);
  263. this.assertEquals(10, pos.left);
  264. this.assertEquals(20, pos.top);
  265. },
  266. testDivWithBodyPadding : function()
  267. {
  268. this.__bodyStyles.padding = "10px";
  269. document.body.innerHTML = '<div id="div"></div>';
  270. var div = document.getElementById("div");
  271. var pos = qx.bom.element.Location.get(div);
  272. this.assertEquals(10, pos.left);
  273. this.assertEquals(10, pos.top);
  274. },
  275. testDivWithBodyBorder : function()
  276. {
  277. this.__bodyStyles.border = "10px solid black";
  278. document.body.innerHTML = '<div id="div">juhu</div>';
  279. var div = document.getElementById("div");
  280. var pos = qx.bom.element.Location.get(div);
  281. // IE quirks mode puts the border outside of the body
  282. if (qx.bom.client.Engine.MSHTML && qx.bom.client.Feature.QUIRKS_MODE)
  283. {
  284. this.assertEquals(0, pos.left);
  285. this.assertEquals(0, pos.top);
  286. }
  287. else
  288. {
  289. this.assertEquals(10, pos.left);
  290. this.assertEquals(10, pos.top);
  291. }
  292. },
  293. testDivLocationMode : function()
  294. {
  295. document.body.innerHTML = '<div id="div" style="margin: 5px; padding: 10px; border: 3px solid green;"></div>';
  296. var div = document.getElementById("div");
  297. var pos = qx.bom.element.Location.get(div, "margin");
  298. this.assertEquals(0, pos.left);
  299. this.assertEquals(0, pos.top);
  300. var pos = qx.bom.element.Location.get(div, "box");
  301. this.assertEquals(5, pos.left);
  302. this.assertEquals(5, pos.top);
  303. var pos = qx.bom.element.Location.get(div, "border");
  304. this.assertEquals(8, pos.left);
  305. this.assertEquals(8, pos.top);
  306. var pos = qx.bom.element.Location.get(div, "scroll");
  307. this.assertEquals(8, pos.left);
  308. this.assertEquals(8, pos.top);
  309. var pos = qx.bom.element.Location.get(div, "padding");
  310. this.assertEquals(18, pos.left);
  311. this.assertEquals(18, pos.top);
  312. },
  313. testDivInline : function()
  314. {
  315. document.body.innerHTML =
  316. '<div style="width:100px">' +
  317. '<span id="span1" style="margin-left: 10px"><img src="about:blank" width="10px" height="10px" style="border: 0px"></img></span>' +
  318. '<span id="span2" style="margin-left: 10px">a</span>' +
  319. '</div>';
  320. var span1 = document.getElementById("span1");
  321. var pos = qx.bom.element.Location.get(span1);
  322. this.assertEquals(10, pos.left);
  323. var span2 = document.getElementById("span2");
  324. var pos = qx.bom.element.Location.get(span2);
  325. this.assertEquals(30, pos.left);
  326. }
  327. }
  328. });