From 54a51904e956696016c8604c3bc2be8ef45be306 Mon Sep 17 00:00:00 2001 From: Xavier Mamano Date: Sun, 3 Jun 2012 16:54:20 +0200 Subject: [PATCH 1/4] Adjustment on "Util.getRenderedDimensions" when "containerElement" is absolutely positioned. --- lib/OpenLayers/Util.js | 57 +++++++++++++++++---------- tests/manual/rendered-dimensions.html | 54 +++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 20 deletions(-) diff --git a/lib/OpenLayers/Util.js b/lib/OpenLayers/Util.js index 491448c9c9..8e326a3b30 100644 --- a/lib/OpenLayers/Util.js +++ b/lib/OpenLayers/Util.js @@ -1526,6 +1526,33 @@ OpenLayers.Util.getRenderedDimensions = function(contentHTML, size, options) { var containerElement = (options && options.containerElement) ? options.containerElement : document.body; + + // Opera and IE7 can't handle a node with position:aboslute if it inherits + // position:absolute from a parent. + var parentHasPositionAbsolute = false; + var superContainer = null; + var parent = containerElement; + while (parent && parent.tagName.toLowerCase()!="body") { + var parentPosition = OpenLayers.Element.getStyle(parent, "position"); + if(parentPosition == "absolute") { + parentHasPositionAbsolute = true; + break; + } else if (parentPosition && parentPosition != "static") { + break; + } + parent = parent.parentNode; + } + if(parentHasPositionAbsolute && (containerElement.clientHeight === 0 || + containerElement.clientWidth === 0) ){ + superContainer = document.createElement("div"); + superContainer.style.visibility = "hidden"; + superContainer.style.position = "absolute"; + superContainer.style.overflow = "visible"; + superContainer.style.width = document.body.clientWidth + "px"; + superContainer.style.height = document.body.clientHeight + "px"; + superContainer.appendChild(container); + } + container.style.position = "absolute"; //fix a dimension, if specified. if (size) { @@ -1560,25 +1587,10 @@ OpenLayers.Util.getRenderedDimensions = function(contentHTML, size, options) { container.appendChild(content); // append container to body for rendering - containerElement.appendChild(container); - - // Opera and IE7 can't handle a node with position:aboslute if it inherits - // position:absolute from a parent. - var parentHasPositionAbsolute = false; - var parent = container.parentNode; - while (parent && parent.tagName.toLowerCase()!="body") { - var parentPosition = OpenLayers.Element.getStyle(parent, "position"); - if(parentPosition == "absolute") { - parentHasPositionAbsolute = true; - break; - } else if (parentPosition && parentPosition != "static") { - break; - } - parent = parent.parentNode; - } - - if(!parentHasPositionAbsolute) { - container.style.position = "absolute"; + if (superContainer) { + containerElement.appendChild(superContainer); + } else { + containerElement.appendChild(container); } // calculate scroll width of content and add corners and shadow width @@ -1595,7 +1607,12 @@ OpenLayers.Util.getRenderedDimensions = function(contentHTML, size, options) { // remove elements container.removeChild(content); - containerElement.removeChild(container); + if (superContainer) { + superContainer.removeChild(container); + containerElement.removeChild(superContainer); + } else { + containerElement.removeChild(container); + } return new OpenLayers.Size(w, h); }; diff --git a/tests/manual/rendered-dimensions.html b/tests/manual/rendered-dimensions.html index 41b0fcf4d4..72f0eecc1d 100644 --- a/tests/manual/rendered-dimensions.html +++ b/tests/manual/rendered-dimensions.html @@ -39,10 +39,64 @@ function run() { else { out.innerHTML += "
height Fail: " + size + ", " + height; } + + // To use the same syntax as in "\tests" + t = {eq: function(a, b, msg) { + if (a == b) { + out.innerHTML += "
ok " + msg; + } + else { + out.innerHTML += "
Fail (" + a + " not eq " + b + "): " + msg + ""; + } + } + } + var text = (new Array(10)).join("foo foo foo
"), + content = "
" + text + "
"; + var testName, + finalSize, + initialSize = OpenLayers.Util.getRenderedDimensions(content, null); + // containerElement option on absolute position with width and height + testName = "Absolute with w&h: "; + var optionAbsDiv ={ + containerElement: document.getElementById("absoluteDiv") + } + finalSize = OpenLayers.Util.getRenderedDimensions(content, null, optionAbsDiv); + t.eq(finalSize.w, initialSize.w, + testName + "initial width " + initialSize.w + "px is maintained"); + t.eq(finalSize.h, initialSize.h, + testName + "initial height " + initialSize.h + "px is maintained"); + testName = "Absolute with w&h (set height): "; + finalSize = OpenLayers.Util.getRenderedDimensions(content, {h: 15}, optionAbsDiv); + t.eq(finalSize.h, 15, testName + "got the fixed height to 15px"); + t.eq(finalSize.w, initialSize.w, + testName + "initial width " + initialSize.w + "px is maintained"); + testName = "Absolute with w&h (set width): "; + finalSize = OpenLayers.Util.getRenderedDimensions(content, {w: 20}, optionAbsDiv); + t.eq(finalSize.w, 20, testName + "got the fixed width to 20px"); + // containerElement option on absolute position without width and height + testName = "Absolute without w&h: "; + var optionAbsDiv00 ={ + containerElement: document.getElementById("absoluteDiv00") + } + finalSize = OpenLayers.Util.getRenderedDimensions(content, null, optionAbsDiv00); + t.eq(finalSize.w, initialSize.w, + testName + "initial width " + initialSize.w + "px is maintained"); + t.eq(finalSize.h, initialSize.h, + testName + "initial height " + initialSize.h + "px is maintained"); + testName = "Absolute without w&h (set height): "; + finalSize = OpenLayers.Util.getRenderedDimensions(content, {h: 15}, optionAbsDiv00); + t.eq(finalSize.h, 15, testName + "got the fixed height to 15px"); + t.eq(finalSize.w, initialSize.w, + testName + "initial width " + initialSize.w + "px is maintained"); + testName = "Absolute without w&h (set width): "; + finalSize = OpenLayers.Util.getRenderedDimensions(content, {w: 20}, optionAbsDiv00); + t.eq(finalSize.w, 20, testName + "got the fixed width to 20px"); }
+
+
From b7e2222d463fea1c1b237479974ab1c7409065a8 Mon Sep 17 00:00:00 2001 From: Xavier Mamano Date: Sun, 3 Jun 2012 22:45:28 +0200 Subject: [PATCH 2/4] missing semicolons on tests --- tests/manual/rendered-dimensions.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/manual/rendered-dimensions.html b/tests/manual/rendered-dimensions.html index 72f0eecc1d..36ab370905 100644 --- a/tests/manual/rendered-dimensions.html +++ b/tests/manual/rendered-dimensions.html @@ -49,7 +49,7 @@ function run() { out.innerHTML += "
Fail (" + a + " not eq " + b + "): " + msg + ""; } } - } + }; var text = (new Array(10)).join("foo foo foo
"), content = "
" + text + "
"; var testName, @@ -59,7 +59,7 @@ function run() { testName = "Absolute with w&h: "; var optionAbsDiv ={ containerElement: document.getElementById("absoluteDiv") - } + }; finalSize = OpenLayers.Util.getRenderedDimensions(content, null, optionAbsDiv); t.eq(finalSize.w, initialSize.w, testName + "initial width " + initialSize.w + "px is maintained"); @@ -77,7 +77,7 @@ function run() { testName = "Absolute without w&h: "; var optionAbsDiv00 ={ containerElement: document.getElementById("absoluteDiv00") - } + }; finalSize = OpenLayers.Util.getRenderedDimensions(content, null, optionAbsDiv00); t.eq(finalSize.w, initialSize.w, testName + "initial width " + initialSize.w + "px is maintained"); From 2b9ea5007b8fcc209421ffdfd5bc1564e2bdec47 Mon Sep 17 00:00:00 2001 From: Xavier Mamano Date: Sun, 3 Jun 2012 23:54:11 +0200 Subject: [PATCH 3/4] Use "superContainer" to operate well in Android, . --- lib/OpenLayers/Util.js | 3 +-- tests/manual/rendered-dimensions.html | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/OpenLayers/Util.js b/lib/OpenLayers/Util.js index 8e326a3b30..e88ce435e2 100644 --- a/lib/OpenLayers/Util.js +++ b/lib/OpenLayers/Util.js @@ -1542,8 +1542,7 @@ OpenLayers.Util.getRenderedDimensions = function(contentHTML, size, options) { } parent = parent.parentNode; } - if(parentHasPositionAbsolute && (containerElement.clientHeight === 0 || - containerElement.clientWidth === 0) ){ + if(parentHasPositionAbsolute){ superContainer = document.createElement("div"); superContainer.style.visibility = "hidden"; superContainer.style.position = "absolute"; diff --git a/tests/manual/rendered-dimensions.html b/tests/manual/rendered-dimensions.html index 36ab370905..71025afef8 100644 --- a/tests/manual/rendered-dimensions.html +++ b/tests/manual/rendered-dimensions.html @@ -41,7 +41,7 @@ function run() { } // To use the same syntax as in "\tests" - t = {eq: function(a, b, msg) { + var t = {eq: function(a, b, msg) { if (a == b) { out.innerHTML += "
ok " + msg; } From 4f3252bfe851082bb2547643a1ea32d3c51b15a2 Mon Sep 17 00:00:00 2001 From: Xavier Mamano Date: Mon, 4 Jun 2012 18:49:43 +0200 Subject: [PATCH 4/4] Revert "Use "superContainer" to operate well in Android, ." This reverts commit 2b9ea5007b8fcc209421ffdfd5bc1564e2bdec47. --- lib/OpenLayers/Util.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/OpenLayers/Util.js b/lib/OpenLayers/Util.js index e88ce435e2..8e326a3b30 100644 --- a/lib/OpenLayers/Util.js +++ b/lib/OpenLayers/Util.js @@ -1542,7 +1542,8 @@ OpenLayers.Util.getRenderedDimensions = function(contentHTML, size, options) { } parent = parent.parentNode; } - if(parentHasPositionAbsolute){ + if(parentHasPositionAbsolute && (containerElement.clientHeight === 0 || + containerElement.clientWidth === 0) ){ superContainer = document.createElement("div"); superContainer.style.visibility = "hidden"; superContainer.style.position = "absolute";