added Layer.WMS.Post for WMS request params exceeding the maximum url length for GET requests. Thanks ingo for this excellent work! It is an honor to commit such a high quality patch. p=ingo, r=elemoine,me (closes #2224)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@9734 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
ahocevar
2009-10-08 18:13:55 +00:00
parent 6dabe0646e
commit e264e8c6c4
7 changed files with 844 additions and 0 deletions

175
examples/WMSPost.html Normal file
View File

@@ -0,0 +1,175 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>OpenLayers Basic WMS Example via HTTP-POST protocol</title>
<link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script src="../lib/OpenLayers.js"></script>
<script type="text/javascript">
var map;
function init(){
var sld = '<StyledLayerDescriptor version="1.0.0">';
sld+= '<NamedLayer>';
sld+= '<Name>topp:tasmania_roads</Name>';
sld+= '<UserStyle>';
sld+= '<IsDefault>1</IsDefault>';
sld+= '<FeatureTypeStyle>';
sld+= '<Rule>';
sld+= '<LineSymbolizer>';
sld+= '<Stroke>';
sld+= '<CssParameter name="stroke">';
sld+= '<Literal>#787878</Literal>';
sld+= '</CssParameter>';
sld+= '<CssParameter name="stroke-width">';
sld+= '<Literal>2</Literal>';
sld+= '</CssParameter>';
sld+= '</Stroke>';
sld+= '</LineSymbolizer>';
sld+= '</Rule>';
sld+= '</FeatureTypeStyle>';
sld+= '</UserStyle>';
sld+= '</NamedLayer>';
sld+= '<NamedLayer>';
sld+= '<Name>topp:tasmania_water_bodies</Name>';
sld+= '<UserStyle>';
sld+= '<IsDefault>1</IsDefault>';
sld+= '<FeatureTypeStyle>';
sld+= '<Rule>';
sld+= '<LineSymbolizer>';
sld+= '<Stroke>';
sld+= '<CssParameter name="stroke">';
sld+= '<Literal>#4F94CD</Literal>';
sld+= '</CssParameter>';
sld+= '<CssParameter name="stroke-width">';
sld+= '<Literal>3</Literal>';
sld+= '</CssParameter>';
sld+= '</Stroke>';
sld+= '</LineSymbolizer>';
sld+= '<PolygonSymbolizer>';
sld+= '<Fill>';
sld+= '<CssParameter name="fill">';
sld+= '<Literal>#63B8FF</Literal>';
sld+= '</CssParameter>';
sld+= '</Fill>';
sld+= '</PolygonSymbolizer>';
sld+= '</Rule>';
sld+= '</FeatureTypeStyle>';
sld+= '</UserStyle>';
sld+= '</NamedLayer>';
sld+= '<NamedLayer>';
sld+= '<Name>topp:tasmania_cities</Name>';
sld+= '<UserStyle>';
sld+= '<IsDefault>1</IsDefault>';
sld+= '<FeatureTypeStyle>';
sld+= '<Rule>';
sld+= '<PointSymbolizer>';
sld+= '<Graphic>';
sld+= '<Mark>';
sld+= '<WellKnownName>cross</WellKnownName>';
sld+= '<Fill>';
sld+= '<CssParameter name="fill">';
sld+= '<Literal>#00FF00</Literal>';
sld+= '</CssParameter>';
sld+= '</Fill>';
sld+= '</Mark>';
sld+= '<Size>15</Size>';
sld+= '</Graphic>';
sld+= '</PointSymbolizer>';
sld+= '<TextSymbolizer>';
sld+= '<Label><PropertyName>CITY_NAME</PropertyName></Label>';
sld+= '<Font>';
sld+= '<SvgParameter name="font-size">15</SvgParameter>';
sld+= '</Font>';
sld+= '</TextSymbolizer>';
sld+= '</Rule>';
sld+= '</FeatureTypeStyle>';
sld+= '</UserStyle>';
sld+= '</NamedLayer>';
sld+= '<NamedLayer>';
sld+= '<Name>topp:tasmania_state_boundaries</Name>';
sld+= '<UserStyle>';
sld+= '<IsDefault>1</IsDefault>';
sld+= '<FeatureTypeStyle>';
sld+= '<Rule>';
sld+= '<PolygonSymbolizer>';
sld+= '<Fill>';
sld+= '<CssParameter name="fill">';
sld+= '<Literal>#8B8989</Literal>';
sld+= '</CssParameter>';
sld+= '<CssParameter name="fill-opacity">';
sld+= '<Literal>0.2</Literal>';
sld+= '</CssParameter>';
sld+= '</Fill>';
sld+= '<Stroke>';
sld+= '<CssParameter name="stroke">';
sld+= '<Literal>#FF4040</Literal>';
sld+= '</CssParameter>';
sld+= '<CssParameter name="stroke-width">';
sld+= '<Literal>2</Literal>';
sld+= '</CssParameter>';
sld+= '</Stroke>';
sld+= '</PolygonSymbolizer>';
sld+= '</Rule>';
sld+= '</FeatureTypeStyle>';
sld+= '</UserStyle>';
sld+= '</NamedLayer>';
sld+= '</StyledLayerDescriptor>';
map = new OpenLayers.Map('map');
map.addControl(new OpenLayers.Control.LayerSwitcher());
var layer = new OpenLayers.Layer.WMS(
"OpenLayers WMS",
"http://labs.metacarta.com/wms/vmap0",
{
layers: 'basic'
}
);
var rcbw = new OpenLayers.Layer.WMS.Post("Roads, Cities, Boundaries, Water",
"http://demo.opengeo.org/geoserver/wms",
{
'layers': 'topp:tasmania_roads,topp:tasmania_water_bodies,topp:tasmania_state_boundaries,topp:tasmania_cities',
transparent: true,
format: 'image/jpeg',
sld_body: sld
},
{
isBaseLayer: false,
unsupportedBrowsers: []
}
);
map.addLayers([layer, rcbw]);
map.setCenter(new OpenLayers.LonLat(146.65748632815,-42.230763671875), 7);
}
</script>
</head>
<body onload="init()">
<h1 id="title">Basic WMS Example via HTTP-POST protocol with a large SLD
included</h1>
<div id="tags"></div>
<div id="shortdesc">Creating a WMS layer with a large SLD in the sld_body</div>
<div id="map" style="width: 512; height: 256; border: 1px solid red;"></div>
<div id="docs">
This example uses a large SLD created on the client side to style a WMS
layer. This example uses a WMS.Post layer which transfers data via the
HTTP-POST protocol. <br>
NOTE: Opera is not able to display transparent tiles with this layer,
and in some Firefox browsers can appear ugly viewport-shaking effects
while dragging arround. Use the 'unsupportedBrowsers' property to
control which browsers should use plain image tiles (like Layer.WMS)
instead. The default setting (["mozilla", "firefox", "opera"])
excludes problematic browsers without removing the ability to use long
request parameters, because all these browsers support long urls via
GET.
</div>
</body>
</html>

View File

@@ -91,6 +91,7 @@
"OpenLayers/Popup.js",
"OpenLayers/Tile.js",
"OpenLayers/Tile/Image.js",
"OpenLayers/Tile/Image/IFrame.js",
"OpenLayers/Tile/WFS.js",
"OpenLayers/Layer/Image.js",
"OpenLayers/Layer/SphericalMercator.js",
@@ -113,6 +114,7 @@
"OpenLayers/Layer/ArcGIS93Rest.js",
"OpenLayers/Layer/WMS.js",
"OpenLayers/Layer/WMS/Untiled.js",
"OpenLayers/Layer/WMS/Post.js",
"OpenLayers/Layer/ArcIMS.js",
"OpenLayers/Layer/GeoRSS.js",
"OpenLayers/Layer/Boxes.js",

View File

@@ -0,0 +1,98 @@
/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
* license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the
* full text of the license. */
/**
* @requires OpenLayers/Layer/WMS.js
* @requires OpenLayers/Tile/Image/IFrame.js
*/
/**
* Class: OpenLayers.Layer.WMS.Post
* Instances of OpenLayers.Layer.WMS.Post are used to retrieve data from OGC
* Web Mapping Services via HTTP-POST (application/x-www-form-urlencoded).
* Create a new WMS layer with the <OpenLayers.Layer.WMS.Post> constructor.
*
* Inherits from:
* - <OpenLayers.Layer.WMS>
*/
OpenLayers.Layer.WMS.Post = OpenLayers.Class(OpenLayers.Layer.WMS, {
/**
* Property: tileClass
* {Object} Class, used to create tiles.
*/
tileClass: null,
/**
* APIProperty: unsupportedBrowsers
* {Array} Array with browsers, which should use the HTTP-GET protocol
* instead of HTTP-POST for fetching tiles from a WMS .
* Defaults to ["mozilla", "firefox", "opera"], because Opera is not able
* to show transparent images in IFrames and Firefox/Mozilla has some ugly
* effects of viewport-shaking when panning the map. Both browsers, Opera
* and Firefox/Mozilla, have no problem with long urls, which is the reason
* for using POST instead of GET. The strings to pass to this array are
* the ones returned by <OpenLayers.Util.getBrowserName()>.
*/
unsupportedBrowsers: ["mozilla", "firefox", "opera"],
/**
* Property: SUPPORTED_TRANSITIONS
* {Array}
* no supported transitions for this type of layer, because it is not
* possible to modify the initialized tiles (iframes)
*/
SUPPORTED_TRANSITIONS: [],
/**
* Constructor: OpenLayers.Layer.WMS.Post
* Creates a new WMS layer object.
*
* Example:
* (code)
* var wms = new OpenLayers.Layer.WMS.Post(
* "NASA Global Mosaic",
* "http://wms.jpl.nasa.gov/wms.cgi",
* {layers: "modis, global_mosaic"});
* (end)
*
* Parameters:
* name - {String} A name for the layer
* url - {String} Base url for the WMS
* (e.g. http://wms.jpl.nasa.gov/wms.cgi)
* params - {Object} An object with key/value pairs representing the
* GetMap query string parameters and parameter values.
* options - {Object} Hashtable of extra options to tag onto the layer.
*/
initialize: function(name, url, params, options) {
var newArguments = [];
newArguments.push(name, url, params, options);
OpenLayers.Layer.WMS.prototype.initialize.apply(this, newArguments);
this.tileClass = OpenLayers.Util.indexOf(
this.unsupportedBrowsers, OpenLayers.Util.getBrowserName()) != -1
? OpenLayers.Tile.Image
: OpenLayers.Tile.Image.IFrame;
},
/**
* Method: addTile
* addTile creates a tile, initializes it and adds it as iframe to the
* layer div.
*
* Parameters:
* bounds - {<OpenLayers.Bounds>}
* position - {<OpenLayers.Pixel>}
*
* Returns:
* {<OpenLayers.Tile.Image.IFrame>} The added OpenLayers.Tile.Image.IFrame
*/
addTile: function(bounds,position) {
return new this.tileClass(
this, position, bounds, null, this.tileSize);
},
CLASS_NAME: 'OpenLayers.Layer.WMS.Post'
});

View File

@@ -0,0 +1,260 @@
/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
* license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the
* full text of the license. */
/**
* @requires OpenLayers/Tile/Image.js
*/
/**
* Class: OpenLayers.Tile.Image.IFrame
* Instances of OpenLayers.Tile.Image.IFrame are used to manage the image tiles
* used by Layer.WMS.Post loaded via HTTP-POST-protocol. Create a new image
* tile with the <OpenLayers.Tile.Image.IFrame> constructor.
*
* Inherits from:
* - <OpenLayers.Tile.Image>
*/
OpenLayers.Tile.Image.IFrame = OpenLayers.Class(OpenLayers.Tile.Image, {
/**
* Property: layerAlphaHack
* {Boolean} Always false for an instance.
*/
/**
* Constructor: OpenLayers.Tile.Image.IFrame
* Constructor for a new <OpenLayers.Tile.Image.IFrame> instance.
*
* Parameters:
* layer - {<OpenLayers.Layer>} layer that the tile will go in.
* position - {<OpenLayers.Pixel>}
* bounds - {<OpenLayers.Bounds>}
* size - {<OpenLayers.Size>}
*/
initialize: function(layer, position, bounds, url, size) {
OpenLayers.Tile.Image.prototype.initialize.apply(this, arguments);
this.layerAlphaHack = false;
},
/**
* Method: destroy
* nullify references to prevent circular references and memory leaks
*/
destroy: function() {
if(this.imgDiv != null) {
// unregister the "load" handler
OpenLayers.Event.stopObservingElement(this.imgDiv.firstChild);
}
OpenLayers.Tile.Image.prototype.destroy.apply(this, arguments);
},
/**
* Method: clear
* Removes the iframe from DOM (avoids back-button problems).
*/
clear: function() {
if(this.imgDiv) {
var iFrame = this.imgDiv.firstChild;
OpenLayers.Event.stopObservingElement(iFrame);
this.imgDiv.removeChild(iFrame);
}
},
/**
* Method: clone
*
* Parameters:
* obj - {<OpenLayers.Tile.Image.IFrame>} The tile to be cloned
*
* Returns:
* {<OpenLayers.Tile.Image.IFrame>} An exact clone of this
* <OpenLayers.Tile.Image.IFrame>
*/
clone: function (obj) {
if (obj == null) {
obj = new OpenLayers.Tile.Image.IFrame(
this.layer, this.position, this.bounds, this.url, this.size);
}
//pick up properties from superclass
obj = OpenLayers.Tile.Image.prototype.clone.apply(this, [obj]);
return obj;
},
/**
* Method: renderTile
*/
renderTile: function() {
if(OpenLayers.Tile.Image.prototype.renderTile.apply(this, arguments)) {
// create a html form and add it temporary to the layer div
var form = this.createRequestForm();
this.imgDiv.appendChild(form);
// submit the form (means fetching the image)
form.submit();
this.imgDiv.removeChild(form);
}
},
/**
* Method: initImgDiv
* Creates the imgDiv property on the tile.
*/
initImgDiv: function() {
this.imgDiv = this.createImgDiv()
OpenLayers.Util.modifyDOMElement(this.imgDiv, this.id, null,
this.layer.getImageSize(), "relative");
this.imgDiv.className = 'olTileImage';
this.frame.appendChild(this.imgDiv);
this.layer.div.appendChild(this.frame);
if(this.layer.opacity != null) {
OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null,
null, null, null,
this.layer.opacity);
}
// we need this reference to check back the viewRequestID
this.imgDiv.map = this.layer.map;
//bind a listener to the onload of the iframe so that we
// can register when a tile has finished loading.
var onload = function() {
this.show();
//normally isLoading should always be true here but there are some
// right funky conditions where loading and then reloading a tile
// with the same url *really*fast*. this check prevents sending
// a 'loadend' if the msg has already been sent
//
if (this.isLoading) {
this.isLoading = false;
this.events.triggerEvent("loadend");
}
};
},
/**
* Method: createImgDiv
* Creates a div with iframe.and eventPane
*
* Returns:
* {DOMElement}
*/
createImgDiv: function() {
var eventPane = document.createElement("div");
if(OpenLayers.Util.getBrowserName() == "msie") {
// IE cannot handle events on elements without backgroundcolor. So we
// use this little hack to make elements transparent
eventPane.style.backgroundColor = '#FFFFFF';
eventPane.style.filter = 'chroma(color=#FFFFFF)';
}
OpenLayers.Util.modifyDOMElement(eventPane, null,
new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
var imgDiv = document.createElement("div");
imgDiv.appendChild(eventPane);
return imgDiv;
},
/**
* Method: createIFrame
* Create the IFrame which shows the image.
*
* Returns:
* {DOMElement} Iframe
*/
createIFrame: function() {
var id = this.id+'_iFrame';
var iframe;
if(OpenLayers.Util.getBrowserName() == "msie") {
// InternetExplorer does not set the name attribute of an iFrame
// properly via DOM manipulation, so we need to do it on our own with
// this hack.
iframe = document.createElement('<iframe name="'+id+'">');
// IFrames in InternetExplorer are not transparent, if you set the
// backgroundColor transparent. This is a workarround to get
// transparent iframes.
iframe.style.backgroundColor = '#FFFFFF';
iframe.style.filter = 'chroma(color=#FFFFFF)';
}
else {
iframe = document.createElement('iframe');
iframe.style.backgroundColor = 'transparent';
// iframe.name needs to be an unique id, otherwise it
// could happen that other iframes are overwritten.
iframe.name = id;
}
iframe.id = id;
// some special properties to avoid scaling the images and scrollbars
// in the iframe
iframe.scrolling = 'no';
iframe.marginWidth = '0px';
iframe.marginHeight = '0px';
iframe.frameBorder = '0';
OpenLayers.Util.modifyDOMElement(iframe, id,
new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
return iframe;
},
/**
* Method: createRequestForm
* Create the html <form> element with width, height, bbox and all
* parameters specified in the layer params.
*
* Returns:
* {DOMElement} The form element which sends the HTTP-POST request to the
* WMS.
*/
createRequestForm: function() {
// creation of the form element
var form = document.createElement('form');
form.method = 'POST';
// call getFullRequestString in a scope without params
var cacheId = this.layer.params["_OLSALT"];
cacheId = (cacheId ? cacheId + "_" : "") + this.bounds.toBBOX();
form.action = OpenLayers.Util.urlAppend(this.layer.url, cacheId);
// insert the iframe, which has been removed to avoid back-button
// problems
this.imgDiv.insertBefore(this.createIFrame(), this.imgDiv.firstChild);
form.target = this.id+'_iFrame';
// adding all parameters in layer params as hidden fields to the html
// form element
var imageSize = this.layer.getImageSize();
var params = OpenLayers.Util.extend(
{
"BBOX": this.encodeBBOX ? this.bounds.toBBOX() :
this.bounds.toArray(),
"WIDTH": imageSize.w,
"HEIGHT": imageSize.h
}, this.layer.params);
for(var par in params) {
var field = document.createElement('input');
field.type = 'hidden';
field.name = par;
field.value = params[par];
form.appendChild(field);
}
return form;
},
CLASS_NAME: "OpenLayers.Tile.Image.IFrame"
}
);

86
tests/Layer/WMS/Post.html Normal file
View File

@@ -0,0 +1,86 @@
<html>
<head>
<script src="../../../lib/OpenLayers.js"></script>
<script type="text/javascript">
var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
var layer;
var name = 'Test Layer';
var url = "http://octo.metacarta.com/cgi-bin/mapserv";
var params = { map: '/mapdata/vmap_wms.map',
layers: 'basic',
format: 'image/jpeg'};
function test_Layer_WMS_Post_constructor (t) {
t.plan( 2 );
var url = "http://octo.metacarta.com/cgi-bin/mapserv";
layer = new OpenLayers.Layer.WMS.Post(name, url, params);
t.ok(
layer.tileClass == OpenLayers.Tile.Image.IFrame,
"instantiate OpenLayers.Tile.Image.IFrame tiles.");
layer.destroy();
var options = { unsupportedBrowsers: [OpenLayers.Util.getBrowserName()]};
layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
t.ok(
layer.tileClass == OpenLayers.Tile.Image,
"unsupported browser instantiate Image tiles.");
layer.destroy();
}
function test_Layer_WMS_Post_addtile (t) {
t.plan( 3 );
layer = new OpenLayers.Layer.WMS.Post(name, url, params);
var map = new OpenLayers.Map('map');
map.addLayer(layer);
var bounds = new OpenLayers.Bounds(1,2,3,4);
var pixel = new OpenLayers.Pixel(5,6);
var tile = layer.addTile(bounds, pixel);
if(isMozilla || isOpera) {
t.ok(
tile instanceof OpenLayers.Tile.Image,
"tile is an instance of OpenLayers.Tile.Image");
}
else {
t.ok(
tile instanceof OpenLayers.Tile.Image.IFrame,
"tile is an instance of OpenLayers.Tile.Image.IFrame");
}
map.destroy();
var browserName = OpenLayers.Util.getBrowserName();
var options = { unsupportedBrowsers: [browserName]};
// test the unsupported browser
layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
map = new OpenLayers.Map('map');
map.addLayer(layer);
tile = layer.addTile(bounds, pixel);
t.ok(
tile instanceof OpenLayers.Tile.Image,
"unsupported browser: tile is an instance of Tile.Image");
layer.destroy();
// test a supported browser
OpenLayers.Util.getBrowserName = function () { return 'not_' + browserName };
layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
map.addLayer(layer);
var tile2 = layer.addTile(bounds, pixel);
t.ok(
tile2 instanceof OpenLayers.Tile.Image.IFrame,
"supported browser: tile is an instance of Tile.Image.IFrame");
map.destroy();
}
</script>
</head>
<body>
<div id="map" style="width:500px;height:550px"></div>
</body>
</html>

View File

@@ -0,0 +1,221 @@
<html>
<head>
<script src="../../../lib/OpenLayers.js"></script>
<script type="text/javascript">
var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
var isIE = (navigator.userAgent.indexOf("MSIE") != -1);
var map, layer;
var position = new OpenLayers.Pixel(20,30);
var bounds = new OpenLayers.Bounds(1,2,3,4);
var url = "http://www.openlayers.org/dev/tests/tileimage";
var size = new OpenLayers.Size(5,6);
var name = "OpenaLayers WMS";
var wmsUrl = "http://labs.metacarta.com/wms/vmap0?";
function test_Tile_Image_IFrame_constructor (t) {
t.plan( 2 );
var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
t.ok( tile instanceof OpenLayers.Tile.Image.IFrame, "new OpenLayers.Tile.Image.IFrame returns Tile object" );
t.eq( tile.layerAlphaHack, false, "layerAlphaHack is set to false.");
}
function test_Tile_Image_IFrame_destroy (t) {
t.plan( 2 );
map = new OpenLayers.Map('map');
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
map.addLayer(layer);
var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, null, size);
tile.renderTile();
tile.positionImage();
tile.destroy();
t.eq( tile.imgDiv, null, "IFrame successfully removed from DOM");
t.eq( tile.frame, null, "Event div successfully removed from DOM");
map.destroy();
}
function test_Tile_Image_IFrame_clone (t) {
t.plan( 9 );
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
tile.iFrame = {};
var clone = tile.clone();
t.ok( clone instanceof OpenLayers.Tile.Image.IFrame, "clone is a Tile.Image.IFrame object" );
t.ok( clone.layer == layer, "clone.layer is set correctly");
t.ok( clone.position.equals(position), "clone.position is set correctly");
t.ok( clone.bounds.equals(bounds), "clone.bounds is set correctly");
t.eq( clone.url, url, "clone.url is set correctly");
t.ok( clone.size.equals(size), "clone.size is set correctly");
t.ok( clone.frame, "clone has a frame");
t.ok( clone.frame != tile.frame, "clone's frame is a new one");
t.ok( clone.imgDiv == null, "clone's imgDiv was not copied");
}
function test_Tile_Image_IFrame_clear (t) {
t.plan( 1 );
map = new OpenLayers.Map('map');
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
map.addLayer(layer);
tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
tile.draw();
tile.clear();
t.ok(
tile.imgDiv.firstChild.nodeName != "IFRAME",
"IFrame successfully removed from DOM");
map.destroy();
}
function test_Tile_Image_IFrame_initImgDiv (t) {
t.plan( 4 );
map = new OpenLayers.Map('map');
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
map.addLayer(layer);
tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
tile.initImgDiv();
if(isMozilla) {
t.ok( tile.imgDiv instanceof HTMLElement, "tile.iFrame successfully created.");
}
else {
t.ok( tile.imgDiv != null, "tile.iFrame successfully created.");
}
t.eq( tile.imgDiv.id, tile.id, "imgDiv id correctly set.");
t.eq( tile.imgDiv.className, "olTileImage", "iFrame's className correctly set.");
t.ok( tile.imgDiv.map == map, "map correctly added to iFrame.");
map.destroy();
}
function test_Tile_Image_IFrame_createImgDiv (t) {
t.plan( 3 );
map = new OpenLayers.Map('map');
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
map.addLayer(layer);
var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
var imgDiv = tile.createImgDiv();
var iFrame = imgDiv.firstChild;
var eventPane = imgDiv.childNodes[1];
if(isIE) {
t.ok(iFrame != null, "IFrame successfully created.");
t.eq(eventPane.style.backgroundColor, '#ffffff', "backgroundColor of overlay pane is set in InternetExplorer.");
t.eq(eventPane.style.filter, 'chroma(color=#FFFFFF)', "filter of overlay pane is set in InternetExplorer.");
}
else {
t.ok(iFrame instanceof HTMLElement, "IFrame successfully created.");
t.ok(true, 'Skip eventPane backgroundColor test outside IE');
t.ok(true, 'Skip eventPane filter test outside IE');
}
map.destroy();
}
function test_Tile_Image_IFrame_createIFrame (t) {
t.plan( 8 );
map = new OpenLayers.Map('map');
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
map.addLayer(layer);
var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
var iFrame = tile.createIFrame();
var id = tile.id+'_iFrame';
t.eq(iFrame.id, id, "iframe id correctly set.");
t.eq(iFrame.name, id, "iframe name correctly set.");
if(isIE) {
t.eq(iFrame.style.backgroundColor, '#ffffff', "backgroundColor correctly set.");
t.eq(iFrame.style.filter, 'chroma(color=#FFFFFF)', "filter correctly set.");
}
else {
t.eq(iFrame.style.backgroundColor, 'transparent', "backgroundColor correctly set.");
t.ok(true, "Skip filter test outside InternetExplorer.");
}
t.eq( iFrame.scrolling, 'no', "no scrolling");
t.eq( iFrame.marginWidth, '0', "no margin width");
t.eq( iFrame.marginHeight, '0', "no margin height");
t.eq( iFrame.frameBorder, '0', "no iframe border");
}
function test_Tile_Image_IFrame_createRequestForm (t) {
t.plan( 6 );
var tParams = {
SERVICE: "WMS", VERSION: "1.1.1",
REQUEST: "GetMap", STYLES: "",
EXCEPTIONS: "application/vnd.ogc.se_inimage", FORMAT: "image/jpeg",
SRS: "EPSG:4326", BBOX: [1,2,3,4],
WIDTH: String(size.w), HEIGHT: String(size.h)
};
var newLayer = new OpenLayers.Layer.WMS.Post("Name",
"http://labs.metacarta.com/TESTURL",
tParams,
{tileSize: size});
map = new OpenLayers.Map('map');
map.addLayer(newLayer);
tile = new OpenLayers.Tile.Image.IFrame(newLayer, position, bounds, url, size);
tile.initImgDiv();
var form = tile.createRequestForm();
if(isMozilla) {
t.ok( form instanceof HTMLElement, "created html form successfully.");
}
else {
t.ok( form != null, "created html form successfully.");
}
var cacheId = newLayer.params["_OLSALT"];
cacheId = (cacheId ? cacheId + "_" : "") + tile.bounds.toBBOX();
var url = OpenLayers.Util.urlAppend(newLayer.url, cacheId);
t.eq( form.method, 'post', "form method correctly set.");
t.eq( form.target, tile.id+'_iFrame', "form target correctly set.");
t.eq( form.action, url, "form action correctly set.");
var contain = true;
var children = form.childNodes;
for(var par in newLayer.params) {
var test = false;
for(var i=0; i<children.length; i++) {
if(children.item(i).name == par && children.item(i).value == newLayer.params[par]) {
test = true;
break;
}
}
if(test == false) {
contain = false;
break;
}
}
t.eq( contain, true, "html form elements equal layer's parameters.");
tile.draw();
tile.clear();
tile.createRequestForm();
t.ok(
tile.imgDiv.firstChild.nodeName == "IFRAME",
"Iframe has been reinserted properly"
);
map.destroy();
}
</script>
</head>
<body>
<div id="map" style="height:550px;width:500px"></div>
</body>
</html>

View File

@@ -133,6 +133,7 @@
<li>Layer/Vector/RootContainer.html</li>
<li>Layer/WFS.html</li>
<li>Layer/WMS.html</li>
<li>Layer/WMS/Post.html</li>
<li>Layer/WrapDateLine.html</li>
<li>Layer/XYZ.html</li>
<li>Layer/Yahoo.html</li>
@@ -168,6 +169,7 @@
<li>StyleMap.html</li>
<li>Tile.html</li>
<li>Tile/Image.html</li>
<li>Tile/Image/IFrame.html</li>
<li>Tile/WFS.html</li>
<li>Tween.html</li>
<li>Util.html</li>