Changeset 10773


Ignore:
Timestamp:
Sep 17, 2010 4:20:55 PM (6 years ago)
Author:
ahocevar
Message:

Fixed viewRequestID regression and mixin issue that caused the mixin to always be applied unless maxGetUrlLength was explicitly set. Includes a regression test for the viewRequestID bit. r=tschaub (closes #2847)

Location:
trunk/openlayers
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/openlayers/lib/OpenLayers/Tile/Image.js

    r10755 r10773  
    111111     */   
    112112    initialize: function(layer, position, bounds, url, size, options) {
    113         options = options || {};
    114         if (options.maxGetUrlLength !== null) {
    115             OpenLayers.Util.applyDefaults(options, OpenLayers.Tile.Image.IFrame);
    116         }
    117         OpenLayers.Tile.prototype.initialize.apply(this, [layer, position, bounds, url, size, options]);
     113        OpenLayers.Tile.prototype.initialize.apply(this, arguments);
     114
     115        if (this.maxGetUrlLength != null) {
     116            OpenLayers.Util.extend(this, OpenLayers.Tile.Image.IFrame);
     117        }
    118118
    119119        this.url = url; //deprecated remove me
     
    356356     */
    357357    initImgDiv: function() {
    358         if (this.imgDiv) {
    359             return;
    360         }
    361         var offset = this.layer.imageOffset;
    362         var size = this.layer.getImageSize(this.bounds);
    363 
    364         if (this.layerAlphaHack) {
    365             this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null,
    366                                                            offset,
    367                                                            size,
    368                                                            null,
    369                                                            "relative",
    370                                                            null,
    371                                                            null,
    372                                                            null,
    373                                                            true);
    374         } else {
    375             this.imgDiv = OpenLayers.Util.createImage(null,
    376                                                       offset,
    377                                                       size,
    378                                                       null,
    379                                                       "relative",
    380                                                       null,
    381                                                       null,
    382                                                       true);
    383         }
    384 
    385         // needed for changing to a different server for onload error
    386         if (this.layer.url instanceof Array) {
    387             this.imgDiv.urls = this.layer.url.slice();
    388         }
     358        if (this.imgDiv == null) {
     359            var offset = this.layer.imageOffset;
     360            var size = this.layer.getImageSize(this.bounds);
     361
     362            if (this.layerAlphaHack) {
     363                this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null,
     364                                                               offset,
     365                                                               size,
     366                                                               null,
     367                                                               "relative",
     368                                                               null,
     369                                                               null,
     370                                                               null,
     371                                                               true);
     372            } else {
     373                this.imgDiv = OpenLayers.Util.createImage(null,
     374                                                          offset,
     375                                                          size,
     376                                                          null,
     377                                                          "relative",
     378                                                          null,
     379                                                          null,
     380                                                          true);
     381            }
     382
     383            // needed for changing to a different server for onload error
     384            if (this.layer.url instanceof Array) {
     385                this.imgDiv.urls = this.layer.url.slice();
     386            }
    389387     
    390         this.imgDiv.className = 'olTileImage';
    391 
    392         /* checkImgURL used to be used to called as a work around, but it
    393            ended up hiding problems instead of solving them and broke things
    394            like relative URLs. See discussion on the dev list:
    395            http://openlayers.org/pipermail/dev/2007-January/000205.html
    396 
    397         OpenLayers.Event.observe( this.imgDiv, "load",
    398             OpenLayers.Function.bind(this.checkImgURL, this) );
    399         */
    400         this.frame.style.zIndex = this.isBackBuffer ? 0 : 1;
    401         this.frame.appendChild(this.imgDiv);
    402         this.layer.div.appendChild(this.frame);
    403 
    404         if(this.layer.opacity != null) {
    405 
    406             OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null,
    407                                              null, null, null,
    408                                              this.layer.opacity);
    409         }
    410 
    411         // we need this reference to check back the viewRequestID
    412         this.imgDiv.map = this.layer.map;
    413 
    414         //bind a listener to the onload of the image div so that we
    415         // can register when a tile has finished loading.
    416         var onload = function() {
    417 
    418             //normally isLoading should always be true here but there are some
    419             // right funky conditions where loading and then reloading a tile
    420             // with the same url *really*fast*. this check prevents sending
    421             // a 'loadend' if the msg has already been sent
    422             //
    423             if (this.isLoading) {
    424                 this.isLoading = false;
    425                 this.events.triggerEvent("loadend");
    426             }
    427         };
    428 
    429         if (this.layerAlphaHack) {
    430             OpenLayers.Event.observe(this.imgDiv.childNodes[0], 'load',
    431                                      OpenLayers.Function.bind(onload, this));   
    432         } else {
    433             OpenLayers.Event.observe(this.imgDiv, 'load',
    434                                  OpenLayers.Function.bind(onload, this));
    435         }
    436 
    437 
    438         // Bind a listener to the onerror of the image div so that we
    439         // can registere when a tile has finished loading with errors.
    440         var onerror = function() {
    441 
    442             // If we have gone through all image reload attempts, it is time
    443             // to realize that we are done with this image. Since
    444             // OpenLayers.Util.onImageLoadError already has taken care about
    445             // the error, we can continue as if the image was loaded
    446             // successfully.
    447             if (this.imgDiv._attempts > OpenLayers.IMAGE_RELOAD_ATTEMPTS) {
    448                 onload.call(this);
    449             }
    450         };
    451         OpenLayers.Event.observe(this.imgDiv, "error",
    452                                  OpenLayers.Function.bind(onerror, this));
    453 
     388            this.imgDiv.className = 'olTileImage';
     389
     390            /* checkImgURL used to be used to called as a work around, but it
     391               ended up hiding problems instead of solving them and broke things
     392               like relative URLs. See discussion on the dev list:
     393               http://openlayers.org/pipermail/dev/2007-January/000205.html
     394
     395            OpenLayers.Event.observe( this.imgDiv, "load",
     396                OpenLayers.Function.bind(this.checkImgURL, this) );
     397            */
     398            this.frame.style.zIndex = this.isBackBuffer ? 0 : 1;
     399            this.frame.appendChild(this.imgDiv);
     400            this.layer.div.appendChild(this.frame);
     401
     402            if(this.layer.opacity != null) {
     403
     404                OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null,
     405                                                 null, null, null,
     406                                                 this.layer.opacity);
     407            }
     408
     409            // we need this reference to check back the viewRequestID
     410            this.imgDiv.map = this.layer.map;
     411
     412            //bind a listener to the onload of the image div so that we
     413            // can register when a tile has finished loading.
     414            var onload = function() {
     415
     416                //normally isLoading should always be true here but there are some
     417                // right funky conditions where loading and then reloading a tile
     418                // with the same url *really*fast*. this check prevents sending
     419                // a 'loadend' if the msg has already been sent
     420                //
     421                if (this.isLoading) {
     422                    this.isLoading = false;
     423                    this.events.triggerEvent("loadend");
     424                }
     425            };
     426
     427            if (this.layerAlphaHack) {
     428                OpenLayers.Event.observe(this.imgDiv.childNodes[0], 'load',
     429                                         OpenLayers.Function.bind(onload, this));   
     430            } else {
     431                OpenLayers.Event.observe(this.imgDiv, 'load',
     432                                     OpenLayers.Function.bind(onload, this));
     433            }
     434
     435
     436            // Bind a listener to the onerror of the image div so that we
     437            // can registere when a tile has finished loading with errors.
     438            var onerror = function() {
     439
     440                // If we have gone through all image reload attempts, it is time
     441                // to realize that we are done with this image. Since
     442                // OpenLayers.Util.onImageLoadError already has taken care about
     443                // the error, we can continue as if the image was loaded
     444                // successfully.
     445                if (this.imgDiv._attempts > OpenLayers.IMAGE_RELOAD_ATTEMPTS) {
     446                    onload.call(this);
     447                }
     448            };
     449            OpenLayers.Event.observe(this.imgDiv, "error",
     450                                     OpenLayers.Function.bind(onerror, this));
     451        }
     452       
    454453        this.imgDiv.viewRequestID = this.layer.map.viewRequestID;
    455454    },
  • trunk/openlayers/lib/OpenLayers/Tile/Image/IFrame.js

    r10769 r10773  
    7878                // switch between get and post
    7979                this.removeImgDiv();
    80                 delete this.imgDiv;
    81             } else {
    82                 return;
     80                this.imgDiv = null;
    8381            }
    8482        }
    8583        if (this.useIFrame) {
    86             var eventPane = document.createElement("div");
    87 
    88             if(OpenLayers.Util.getBrowserName() == "msie") {
    89                 // IE cannot handle events on elements without backgroundcolor. So we
    90                 // use this little hack to make elements transparent
    91                 eventPane.style.backgroundColor = '#FFFFFF';
    92                 eventPane.style.filter          = 'chroma(color=#FFFFFF)';
    93             }
    94 
    95             OpenLayers.Util.modifyDOMElement(eventPane, null,
    96                 new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
    97 
    98             this.imgDiv = document.createElement("div");
    99             this.imgDiv.appendChild(eventPane);
    100 
    101             OpenLayers.Util.modifyDOMElement(this.imgDiv, this.id, null,
    102                 this.layer.getImageSize(), "relative");
    103             this.imgDiv.className = 'olTileImage';
    104 
    105             this.frame.appendChild(this.imgDiv);
    106             this.layer.div.appendChild(this.frame);
    107 
    108             if(this.layer.opacity != null) {
    109 
    110                 OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null,
    111                                                  null, null, null,
    112                                                  this.layer.opacity);
    113             }
    114 
    115             // we need this reference to check back the viewRequestID
    116             this.imgDiv.map = this.layer.map;
    117            
     84            if (this.imgDiv == null) {
     85                var eventPane = document.createElement("div");
     86
     87                if(OpenLayers.Util.getBrowserName() == "msie") {
     88                    // IE cannot handle events on elements without backgroundcolor.
     89                    // So we use this little hack to make elements transparent
     90                    eventPane.style.backgroundColor = '#FFFFFF';
     91                    eventPane.style.filter          = 'chroma(color=#FFFFFF)';
     92                }
     93
     94                OpenLayers.Util.modifyDOMElement(eventPane, null,
     95                    new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
     96
     97                this.imgDiv = document.createElement("div");
     98                this.imgDiv.appendChild(eventPane);
     99
     100                OpenLayers.Util.modifyDOMElement(this.imgDiv, this.id, null,
     101                    this.layer.getImageSize(), "relative");
     102                this.imgDiv.className = 'olTileImage';
     103
     104                this.frame.appendChild(this.imgDiv);
     105                this.layer.div.appendChild(this.frame);
     106
     107                if(this.layer.opacity != null) {
     108
     109                    OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null,
     110                                                     null, null, null, null,
     111                                                     this.layer.opacity);
     112                }
     113
     114                // we need this reference to check back the viewRequestID
     115                this.imgDiv.map = this.layer.map;
     116            }
    118117            this.imgDiv.viewRequestID = this.layer.map.viewRequestID;
    119118
  • trunk/openlayers/tests/Tile/Image.html

    r8407 r10773  
    8888    }
    8989   
     90    function test_Tile_Image_IFrame_viewRequestID (t) {
     91        t.plan( 2 );
     92        var map   = new OpenLayers.Map('map');
     93        var layer = new OpenLayers.Layer.WMS(
     94            "Name",
     95            "http://labs.metacarta.com/TESTURL?",
     96            {layers: 'basic'}
     97        );
     98        map.addLayer(layer);
     99
     100        var position = new OpenLayers.Pixel(20,30);
     101        var bounds = new OpenLayers.Bounds(1,2,3,4);
     102        tile = layer.addTile(bounds, position);
     103        tile.renderTile();
     104        t.eq(tile.imgDiv.viewRequestID, map.viewRequestID, "viewRequestID correct after renderTile");
     105        map.viewRequestID++;
     106        tile.renderTile();
     107        t.eq(tile.imgDiv.viewRequestID, map.viewRequestID, "viewRequestID correct after subsequent renderTile");
     108        tile.destroy();
     109        layer.destroy();
     110        map.destroy();
     111    }
     112
    90113    function test_Tile_Image_draw (t) {
    91114        t.plan( 7 );
Note: See TracChangeset for help on using the changeset viewer.