/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for * full list of contributors). Published under the 2-clause BSD license. * See license.txt in the OpenLayers distribution or repository for the * full text of the license. */ /** * @requires OpenLayers/Tile/Image.js */ /** * Constant: OpenLayers.Tile.Image.IFrame * Mixin for tiles that use form-encoded POST requests to get images from * remote services. Images will be loaded using HTTP-POST into an IFrame. * * This mixin will be applied to instances * configured with set. */ OpenLayers.Tile.Image.IFrame = { /** * Property: useIFrame * {Boolean} true if we are currently using an IFrame to render POST * responses, false if we are using an img element to render GET responses. */ useIFrame: null, /** * Property: blankImageUrl * {String} Using a data scheme url is not supported by all browsers, but * we don't care because we either set it as css backgroundImage, or the * image's display style is set to "none" when we use it. */ blankImageUrl: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAQAIBRAA7", /** * Method: draw * Set useIFrame in the instance, and operate the image/iframe switch. * Then call Tile.Image.draw. * * Returns: * {Boolean} */ draw: function() { var draw = OpenLayers.Tile.Image.prototype.shouldDraw.call(this); if(draw) { // this.url isn't set to the currect value yet, so we call getURL // on the layer and store the result in a local variable var url = this.layer.getURL(this.bounds); var usedIFrame = this.useIFrame; this.useIFrame = this.maxGetUrlLength !== null && !this.layer.async && url.length > this.maxGetUrlLength; var fromIFrame = usedIFrame && !this.useIFrame; var toIFrame = !usedIFrame && this.useIFrame; if(fromIFrame || toIFrame) { // Switching between GET (image) and POST (iframe). // We remove the imgDiv (really either an image or an iframe) // from the frame and set it to null to make sure initImage // will call getImage. if(this.imgDiv && this.imgDiv.parentNode === this.frame) { this.frame.removeChild(this.imgDiv); } this.imgDiv = null; // And if we had an iframe we also remove the event pane. if(fromIFrame) { this.frame.removeChild(this.frame.firstChild); } } } return OpenLayers.Tile.Image.prototype.draw.apply(this, arguments); }, /** * Method: getImage * Creates the content for the frame on the tile. */ getImage: function() { if (this.useIFrame === true) { if (!this.frame.childNodes.length) { var eventPane = document.createElement("div"), style = eventPane.style; style.position = "absolute"; style.width = "100%"; style.height = "100%"; style.zIndex = 1; style.backgroundImage = "url(" + this.blankImageUrl + ")"; this.frame.appendChild(eventPane); } var id = this.id + '_iFrame', iframe; if (parseFloat(navigator.appVersion.split("MSIE")[1]) < 9) { // Older IE versions do 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('