--- /dev/null
+<!--\r
+ we use a quirks-mode DTD to check for quirks!\r
+-->\r
+<html>\r
+ <head>\r
+ <title> test html.js Box utils</title>\r
+ <style type="text/css">\r
+ /*@import "../../resources/dojo.css";*/\r
+ </style>\r
+ <script type="text/javascript" \r
+ src="../../dojo.js" \r
+ djConfig="isDebug: true"></script>\r
+ <script type="text/javascript">\r
+ dojo.require("doh.runner");\r
+ \r
+ var margin = '1px';\r
+ var border = '3px solid black';\r
+ var padding = '5px';\r
+ var defaultStyles = {\r
+ height: '100px',\r
+ width: '100px',\r
+ position: 'absolute',\r
+ backgroundColor: 'red'\r
+ };\r
+ \r
+ var defaultChildStyles = {\r
+ height: '20px',\r
+ width: '20px',\r
+ backgroundColor: 'blue'\r
+ }\r
+ \r
+ var testStyles = [\r
+ {},\r
+ {margin: margin},\r
+ {border: border},\r
+ {padding: padding},\r
+ {margin: margin, border: border},\r
+ {margin: margin, padding: padding},\r
+ {border: border, padding: padding},\r
+ {margin: margin, border: border, padding: padding} \r
+ ]\r
+ \r
+ \r
+ function sameBox(inBox1, inBox2) {\r
+ for (var i in inBox1)\r
+ if (inBox1[i] != inBox2[i]) {\r
+ console.log((arguments[2]||'box1') + '.' + i + ': ', inBox1[i], ' != ', (arguments[3]||'box2') + '.' + i + ': ', inBox2[i]);\r
+ return false;\r
+ } \r
+ return true; \r
+ }\r
+ \r
+ function reciprocalMarginBoxTest(inNode, inBox) {\r
+ var s = inBox || dojo.marginBox(inNode);\r
+ dojo.marginBox(inNode, s);\r
+ var e = dojo.marginBox(inNode);\r
+ return sameBox(s, e);\r
+ }\r
+ \r
+ function fitTest(inParent, inChild) {\r
+ var pcb = dojo.contentBox(inParent);\r
+ return reciprocalMarginBoxTest(inChild, pcb);\r
+ }\r
+ \r
+ function createStyledElement(inStyle, inParent, inElement, inNoDefault) {\r
+ inStyle = inStyle||{};\r
+ if (!inNoDefault) {\r
+ for (var i in defaultStyles)\r
+ if (!inStyle[i])\r
+ inStyle[i] = defaultStyles[i];\r
+ } \r
+ var n = document.createElement(inElement || 'div');\r
+ (inParent||document.body).appendChild(n);\r
+ dojo.mixin(n.style, inStyle);\r
+ return n; \r
+ }\r
+ \r
+ var _testTopInc = 0;\r
+ var _testTop = 150;\r
+ var _testInitTop = 250;\r
+ function styleIncTop(inStyle) {\r
+ inStyle = dojo.mixin({}, inStyle||{});\r
+ inStyle.top = (_testInitTop + _testTop*_testTopInc) + 'px';\r
+ _testTopInc++;\r
+ return inStyle;\r
+ }\r
+ \r
+ function removeTestNode(inNode) {\r
+ // leave nodes for inspection or don't return to delete them\r
+ return;\r
+ inNode = dojo.byId(inNode);\r
+ inNode.parentNode.removeChild(inNode);\r
+ _testTopInc--;\r
+ }\r
+ \r
+ function testAndCallback(inTest, inAssert, inComment, inOk, inErr) {\r
+ inTest.assertTrue('/* ' + inComment + '*/' + inAssert);\r
+ if (inAssert)\r
+ inOk&&inOk();\r
+ else\r
+ inErr&&inErr(); \r
+ }\r
+ \r
+ // args are (styles, parent, element name, no default)\r
+ function mixCreateElementArgs(inMix, inArgs) {\r
+ args = [{}];\r
+ if (inArgs&&inArgs[0])\r
+ dojo.mixin(args[0], inArgs[0]);\r
+ if (inMix.length)\r
+ dojo.mixin(args[0], inMix[0]||{});\r
+ // parent comes from source\r
+ if (inMix.length > 1)\r
+ args[1] = inMix[1];\r
+ args[2] = inArgs[2];\r
+ args[3] = inArgs[3] \r
+ return args; \r
+ };\r
+ \r
+ function createStyledNodes(inArgs, inFunc) {\r
+ for (var i=0, n; (s=testStyles[i]); i++) {\r
+ n = createStyledElement.apply(this, mixCreateElementArgs([styleIncTop(s)], inArgs));\r
+ inFunc&&inFunc(n);\r
+ } \r
+ }\r
+ \r
+ function createStyledParentChild(inParentArgs, inChildArgs, inFunc) {\r
+ for (var i=0, s, p, c; (s=testStyles[i]); i++) {\r
+ p = createStyledElement.apply(this, mixCreateElementArgs([styleIncTop(s)], inParentArgs));\r
+ c = createStyledElement.apply(this, mixCreateElementArgs([{}, p], inChildArgs));\r
+ inFunc&&inFunc(p, c);\r
+ } \r
+ }\r
+ \r
+ function createStyledParentChildren(inParentArgs, inChildArgs, inFunc) {\r
+ for (var i=0, s, p; (s=testStyles[i]); i++)\r
+ for (var j=0, sc, c, props; (sc=testStyles[j]); j++) {\r
+ p = createStyledElement.apply(this, mixCreateElementArgs([styleIncTop(s)], inParentArgs));\r
+ c = createStyledElement.apply(this, mixCreateElementArgs([sc, p], inChildArgs));\r
+ inFunc&&inFunc(p, c);\r
+ } \r
+ \r
+ for (var i=0, s, p, c; (s=testStyles[i]); i++) {\r
+ p = createStyledElement.apply(this, mixCreateElementArgs([styleIncTop(s)], inParentArgs));\r
+ c = createStyledElement.apply(this, mixCreateElementArgs([{}, p], inChildArgs));\r
+ inFunc&&inFunc(p, c);\r
+ } \r
+ }\r
+ \r
+ \r
+ function runFitTest(inTest, inParentStyles, inChildStyles) {\r
+ createStyledParentChildren([inParentStyles], [inChildStyles], function(p, c) {\r
+ testAndCallback(inTest, fitTest(p, c), '', function() {removeTestNode(p); });\r
+ });\r
+ }\r
+ \r
+ dojo.addOnLoad(function(){\r
+ doh.register("t", \r
+ [\r
+ function reciprocalTests(t) {\r
+ createStyledNodes([], function(n) {\r
+ testAndCallback(t, reciprocalMarginBoxTest(n), '', function() {removeTestNode(n); });\r
+ });\r
+ },\r
+ function fitTests(t) {\r
+ runFitTest(t, null, dojo.mixin({}, defaultChildStyles));\r
+ },\r
+ function fitTestsOverflow(t) {\r
+ runFitTest(t, null, dojo.mixin({overflow:'hidden'}, defaultChildStyles));\r
+ runFitTest(t, {overflow: 'hidden'}, dojo.mixin({}, defaultChildStyles));\r
+ runFitTest(t, {overflow: 'hidden'}, dojo.mixin({overflow:'hidden'}, defaultChildStyles));\r
+ },\r
+ function fitTestsFloat(t) {\r
+ runFitTest(t, null, dojo.mixin({float: 'left'}, defaultChildStyles));\r
+ runFitTest(t, {float: 'left'}, dojo.mixin({}, defaultChildStyles));\r
+ runFitTest(t, {float: 'left'}, dojo.mixin({float: 'left'}, defaultChildStyles));\r
+ },\r
+ function reciprocalTestsInline(t) {\r
+ createStyledParentChild([], [{}, null, 'span'], function(p, c) {\r
+ c.innerHTML = 'Hello World';\r
+ testAndCallback(t, reciprocalMarginBoxTest(c), '', function() {removeTestNode(c); });\r
+ });\r
+ },\r
+ function reciprocalTestsButtonChild(t) {\r
+ createStyledParentChild([], [{}, null, 'button'], function(p, c) {\r
+ c.innerHTML = 'Hello World';\r
+ testAndCallback(t, reciprocalMarginBoxTest(c), '', function() {removeTestNode(c); });\r
+ });\r
+ }\r
+ ]\r
+ );\r
+ doh.run();\r
+ });\r
+ </script>\r
+ <style type="text/css">\r
+ html, body {\r
+ padding: 0px;\r
+ margin: 0px;\r
+ border: 0px;\r
+ }\r
+ </style>\r
+ </head>\r
+ <body>\r
+ </body>\r
+</html>\r
+\r