Only create a frame state if the map has non-zero size

This commit is contained in:
Tim Schaub
2014-01-09 13:06:36 -07:00
parent bed7084200
commit 36e2e51899
2 changed files with 88 additions and 1 deletions

View File

@@ -1044,12 +1044,27 @@ ol.Map.prototype.renderFrame_ = function(time) {
return; return;
} }
/**
* Check whether a size has non-zero width and height. Note that this
* function is here because the compiler doesn't recognize that size is
* defined in the frameState assignment below when the same code is inline in
* the condition below. The compiler inlines this function itself, so the
* resulting code is the same.
*
* @param {ol.Size} size The size to test.
* @return {boolean} Has non-zero width and height.
*/
function hasArea(size) {
return size[0] > 0 && size[1] > 0;
}
var size = this.getSize(); var size = this.getSize();
var view = this.getView(); var view = this.getView();
var view2D = goog.isDef(view) ? this.getView().getView2D() : undefined; var view2D = goog.isDef(view) ? this.getView().getView2D() : undefined;
/** @type {?ol.FrameState} */ /** @type {?ol.FrameState} */
var frameState = null; var frameState = null;
if (goog.isDef(size) && goog.isDef(view2D) && view2D.isDef()) { if (goog.isDef(size) && hasArea(size) &&
goog.isDef(view2D) && view2D.isDef()) {
var viewHints = view.getHints(); var viewHints = view.getHints();
var obj = this.getLayerGroup().getLayerStatesArray(); var obj = this.getLayerGroup().getLayerStatesArray();
var layersArray = obj.layers; var layersArray = obj.layers;

View File

@@ -97,6 +97,76 @@ describe('ol.Map', function() {
}); });
}); });
describe('#requestRenderFrame()', function() {
var target, map;
beforeEach(function() {
target = document.createElement('div');
var style = target.style;
style.position = 'absolute';
style.left = '-1000px';
style.top = '-1000px';
style.width = '360px';
style.height = '180px';
document.body.appendChild(target);
map = new ol.Map({
target: target,
view: new ol.View2D({
projection: 'EPSG:4326',
center: [0, 0],
resolution: 1
})
});
});
afterEach(function() {
goog.dispose(map);
document.body.removeChild(target);
});
it('results in an postrender event', function(done) {
map.requestRenderFrame();
map.on('postrender', function(event) {
expect(event).to.be.a(ol.MapEvent);
var frameState = event.frameState;
expect(frameState).not.to.be(null);
done();
});
});
it('results in an postrender event (for zero height map)', function(done) {
target.style.height = '0px';
map.updateSize();
map.requestRenderFrame();
map.on('postrender', function(event) {
expect(event).to.be.a(ol.MapEvent);
var frameState = event.frameState;
expect(frameState).to.be(null);
done();
});
});
it('results in an postrender event (for zero width map)', function(done) {
target.style.width = '0px';
map.updateSize();
map.requestRenderFrame();
map.on('postrender', function(event) {
expect(event).to.be.a(ol.MapEvent);
var frameState = event.frameState;
expect(frameState).to.be(null);
done();
});
});
});
describe('dispose', function() { describe('dispose', function() {
var map; var map;
@@ -171,8 +241,10 @@ describe('ol.Map', function() {
goog.require('goog.dispose'); goog.require('goog.dispose');
goog.require('goog.dom'); goog.require('goog.dom');
goog.require('ol.Map'); goog.require('ol.Map');
goog.require('ol.MapEvent');
goog.require('ol.RendererHint'); goog.require('ol.RendererHint');
goog.require('ol.RendererHints'); goog.require('ol.RendererHints');
goog.require('ol.View2D');
goog.require('ol.interaction'); goog.require('ol.interaction');
goog.require('ol.interaction.Interaction'); goog.require('ol.interaction.Interaction');
goog.require('ol.interaction.DoubleClickZoom'); goog.require('ol.interaction.DoubleClickZoom');