From 247eb62e3b582e74a52341a48929554db25b0eaf Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 23 Feb 2016 12:48:27 -0700 Subject: [PATCH 1/7] Avoid shadowing --- test/spec/ol/source/rastersource.test.js | 52 ++++++++++++------------ 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/test/spec/ol/source/rastersource.test.js b/test/spec/ol/source/rastersource.test.js index b127f04a33..c4fc3b438d 100644 --- a/test/spec/ol/source/rastersource.test.js +++ b/test/spec/ol/source/rastersource.test.js @@ -103,7 +103,7 @@ try { var log = []; - raster = new ol.source.Raster({ + var source = new ol.source.Raster({ threads: 0, sources: [redSource, greenSource, blueSource], operation: function(inputs) { @@ -112,7 +112,7 @@ try { } }); - raster.on('afteroperations', function() { + source.on('afteroperations', function() { expect(log.length).to.equal(4); var inputs = log[0]; var pixel = inputs[0]; @@ -120,41 +120,39 @@ try { done(); }); - map.getLayers().item(0).setSource(raster); + map.getLayers().item(0).setSource(source); var view = map.getView(); view.setCenter([0, 0]); view.setZoom(0); }); - itNoPhantom('allows operation type to be set to "image"', - function(done) { + itNoPhantom('allows operation type to be set to "image"', function(done) { + var log = []; - var log = []; + var source = new ol.source.Raster({ + operationType: ol.raster.OperationType.IMAGE, + threads: 0, + sources: [redSource, greenSource, blueSource], + operation: function(inputs) { + log.push(inputs); + return inputs[0]; + } + }); - raster = new ol.source.Raster({ - operationType: ol.raster.OperationType.IMAGE, - threads: 0, - sources: [redSource, greenSource, blueSource], - operation: function(inputs) { - log.push(inputs); - return inputs[0]; - } - }); + source.on('afteroperations', function() { + expect(log.length).to.equal(1); + var inputs = log[0]; + expect(inputs[0]).to.be.an(ImageData); + done(); + }); - raster.on('afteroperations', function() { - expect(log.length).to.equal(1); - var inputs = log[0]; - expect(inputs[0]).to.be.an(ImageData); - done(); - }); + map.getLayers().item(0).setSource(source); + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); - map.getLayers().item(0).setSource(raster); - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); + }); }); From b440872e60a33b6e80e5b6dfdcf0ed49aa67e71e Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 23 Feb 2016 12:50:33 -0700 Subject: [PATCH 2/7] Less crazy indentation --- test/spec/ol/source/rastersource.test.js | 493 ++++++++++++----------- 1 file changed, 247 insertions(+), 246 deletions(-) diff --git a/test/spec/ol/source/rastersource.test.js b/test/spec/ol/source/rastersource.test.js index c4fc3b438d..43760791fb 100644 --- a/test/spec/ol/source/rastersource.test.js +++ b/test/spec/ol/source/rastersource.test.js @@ -24,284 +24,285 @@ try { hasImageDataConstructor = false; } -(hasImageDataConstructor ? describe : xdescribe)('ol.source.Raster', - function() { +var maybeDescribe = hasImageDataConstructor ? describe : xdescribe; - var target, map, redSource, greenSource, blueSource, raster; +maybeDescribe('ol.source.Raster', function() { - beforeEach(function() { - target = document.createElement('div'); + var target, map, redSource, greenSource, blueSource, raster; - var style = target.style; - style.position = 'absolute'; - style.left = '-1000px'; - style.top = '-1000px'; - style.width = '2px'; - style.height = '2px'; - document.body.appendChild(target); + beforeEach(function() { + target = document.createElement('div'); - var extent = [-1, -1, 1, 1]; + var style = target.style; + style.position = 'absolute'; + style.left = '-1000px'; + style.top = '-1000px'; + style.width = '2px'; + style.height = '2px'; + document.body.appendChild(target); - redSource = new ol.source.ImageStatic({ - url: red, - imageExtent: extent - }); + var extent = [-1, -1, 1, 1]; - greenSource = new ol.source.ImageStatic({ - url: green, - imageExtent: extent - }); + redSource = new ol.source.ImageStatic({ + url: red, + imageExtent: extent + }); - blueSource = new ol.source.ImageStatic({ - url: blue, - imageExtent: extent - }); + greenSource = new ol.source.ImageStatic({ + url: green, + imageExtent: extent + }); - raster = new ol.source.Raster({ - threads: 0, - sources: [redSource, greenSource, blueSource], - operation: function(inputs) { - return inputs[0]; - } - }); + blueSource = new ol.source.ImageStatic({ + url: blue, + imageExtent: extent + }); - map = new ol.Map({ - target: target, - view: new ol.View({ - resolutions: [1], - projection: new ol.proj.Projection({ - code: 'image', - units: 'pixels', - extent: extent - }) - }), - layers: [ - new ol.layer.Image({ - source: raster - }) - ] - }); + raster = new ol.source.Raster({ + threads: 0, + sources: [redSource, greenSource, blueSource], + operation: function(inputs) { + return inputs[0]; + } + }); + + map = new ol.Map({ + target: target, + view: new ol.View({ + resolutions: [1], + projection: new ol.proj.Projection({ + code: 'image', + units: 'pixels', + extent: extent + }) + }), + layers: [ + new ol.layer.Image({ + source: raster + }) + ] + }); + }); + + afterEach(function() { + goog.dispose(map); + document.body.removeChild(target); + }); + + describe('constructor', function() { + + it('returns a tile source', function() { + var source = new ol.source.Raster({ + threads: 0, + sources: [new ol.source.Tile({})] + }); + expect(source).to.be.a(ol.source.Source); + expect(source).to.be.a(ol.source.Raster); + }); + + itNoPhantom('defaults to "pixel" operation', function(done) { + + var log = []; + + var source = new ol.source.Raster({ + threads: 0, + sources: [redSource, greenSource, blueSource], + operation: function(inputs) { + log.push(inputs); + return inputs[0]; + } }); - afterEach(function() { - goog.dispose(map); - document.body.removeChild(target); + source.on('afteroperations', function() { + expect(log.length).to.equal(4); + var inputs = log[0]; + var pixel = inputs[0]; + expect(pixel).to.be.an('array'); + done(); }); - describe('constructor', function() { + map.getLayers().item(0).setSource(source); + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); - it('returns a tile source', function() { - var source = new ol.source.Raster({ - threads: 0, - sources: [new ol.source.Tile({})] - }); - expect(source).to.be.a(ol.source.Source); - expect(source).to.be.a(ol.source.Raster); - }); + }); - itNoPhantom('defaults to "pixel" operation', function(done) { - - var log = []; - - var source = new ol.source.Raster({ - threads: 0, - sources: [redSource, greenSource, blueSource], - operation: function(inputs) { - log.push(inputs); - return inputs[0]; - } - }); - - source.on('afteroperations', function() { - expect(log.length).to.equal(4); - var inputs = log[0]; - var pixel = inputs[0]; - expect(pixel).to.be.an('array'); - done(); - }); - - map.getLayers().item(0).setSource(source); - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); - - itNoPhantom('allows operation type to be set to "image"', function(done) { - var log = []; - - var source = new ol.source.Raster({ - operationType: ol.raster.OperationType.IMAGE, - threads: 0, - sources: [redSource, greenSource, blueSource], - operation: function(inputs) { - log.push(inputs); - return inputs[0]; - } - }); - - source.on('afteroperations', function() { - expect(log.length).to.equal(1); - var inputs = log[0]; - expect(inputs[0]).to.be.an(ImageData); - done(); - }); - - map.getLayers().item(0).setSource(source); - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); + itNoPhantom('allows operation type to be set to "image"', function(done) { + var log = []; + var source = new ol.source.Raster({ + operationType: ol.raster.OperationType.IMAGE, + threads: 0, + sources: [redSource, greenSource, blueSource], + operation: function(inputs) { + log.push(inputs); + return inputs[0]; + } }); - describe('#setOperation()', function() { - - itNoPhantom('allows operation to be set', function(done) { - - var count = 0; - raster.setOperation(function(pixels) { - ++count; - var redPixel = pixels[0]; - var greenPixel = pixels[1]; - var bluePixel = pixels[2]; - expect(redPixel).to.eql([255, 0, 0, 255]); - expect(greenPixel).to.eql([0, 255, 0, 255]); - expect(bluePixel).to.eql([0, 0, 255, 255]); - return pixels[0]; - }); - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - raster.on('afteroperations', function(event) { - expect(count).to.equal(4); - done(); - }); - - }); - - itNoPhantom('updates and re-runs the operation', function(done) { - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - var count = 0; - raster.on('afteroperations', function(event) { - ++count; - if (count === 1) { - raster.setOperation(function(inputs) { - return inputs[0]; - }); - } else { - done(); - } - }); - - }); - + source.on('afteroperations', function() { + expect(log.length).to.equal(1); + var inputs = log[0]; + expect(inputs[0]).to.be.an(ImageData); + done(); }); - describe('beforeoperations', function() { + map.getLayers().item(0).setSource(source); + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); - itNoPhantom('gets called before operations are run', function(done) { + }); - var count = 0; - raster.setOperation(function(inputs) { - ++count; - return inputs[0]; - }); + }); - raster.on('beforeoperations', function(event) { - expect(count).to.equal(0); - expect(!!event).to.be(true); - expect(event.extent).to.be.an('array'); - expect(event.resolution).to.be.a('number'); - expect(event.data).to.be.an('object'); - done(); - }); + describe('#setOperation()', function() { - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); - - - itNoPhantom('allows data to be set for the operation', function(done) { - - raster.setOperation(function(inputs, data) { - ++data.count; - return inputs[0]; - }); - - raster.on('beforeoperations', function(event) { - event.data.count = 0; - }); - - raster.on('afteroperations', function(event) { - expect(event.data.count).to.equal(4); - done(); - }); - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); + itNoPhantom('allows operation to be set', function(done) { + var count = 0; + raster.setOperation(function(pixels) { + ++count; + var redPixel = pixels[0]; + var greenPixel = pixels[1]; + var bluePixel = pixels[2]; + expect(redPixel).to.eql([255, 0, 0, 255]); + expect(greenPixel).to.eql([0, 255, 0, 255]); + expect(bluePixel).to.eql([0, 0, 255, 255]); + return pixels[0]; }); - describe('afteroperations', function() { - - itNoPhantom('gets called after operations are run', function(done) { - - var count = 0; - raster.setOperation(function(inputs) { - ++count; - return inputs[0]; - }); - - raster.on('afteroperations', function(event) { - expect(count).to.equal(4); - expect(!!event).to.be(true); - expect(event.extent).to.be.an('array'); - expect(event.resolution).to.be.a('number'); - expect(event.data).to.be.an('object'); - done(); - }); - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); - - itNoPhantom('receives data set by the operation', function(done) { - - raster.setOperation(function(inputs, data) { - data.message = 'hello world'; - return inputs[0]; - }); - - raster.on('afteroperations', function(event) { - expect(event.data.message).to.equal('hello world'); - done(); - }); - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + raster.on('afteroperations', function(event) { + expect(count).to.equal(4); + done(); }); }); + itNoPhantom('updates and re-runs the operation', function(done) { + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + var count = 0; + raster.on('afteroperations', function(event) { + ++count; + if (count === 1) { + raster.setOperation(function(inputs) { + return inputs[0]; + }); + } else { + done(); + } + }); + + }); + + }); + + describe('beforeoperations', function() { + + itNoPhantom('gets called before operations are run', function(done) { + + var count = 0; + raster.setOperation(function(inputs) { + ++count; + return inputs[0]; + }); + + raster.on('beforeoperations', function(event) { + expect(count).to.equal(0); + expect(!!event).to.be(true); + expect(event.extent).to.be.an('array'); + expect(event.resolution).to.be.a('number'); + expect(event.data).to.be.an('object'); + done(); + }); + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + }); + + + itNoPhantom('allows data to be set for the operation', function(done) { + + raster.setOperation(function(inputs, data) { + ++data.count; + return inputs[0]; + }); + + raster.on('beforeoperations', function(event) { + event.data.count = 0; + }); + + raster.on('afteroperations', function(event) { + expect(event.data.count).to.equal(4); + done(); + }); + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + }); + + }); + + describe('afteroperations', function() { + + itNoPhantom('gets called after operations are run', function(done) { + + var count = 0; + raster.setOperation(function(inputs) { + ++count; + return inputs[0]; + }); + + raster.on('afteroperations', function(event) { + expect(count).to.equal(4); + expect(!!event).to.be(true); + expect(event.extent).to.be.an('array'); + expect(event.resolution).to.be.a('number'); + expect(event.data).to.be.an('object'); + done(); + }); + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + }); + + itNoPhantom('receives data set by the operation', function(done) { + + raster.setOperation(function(inputs, data) { + data.message = 'hello world'; + return inputs[0]; + }); + + raster.on('afteroperations', function(event) { + expect(event.data.message).to.equal('hello world'); + done(); + }); + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + }); + + }); + +}); + goog.require('ol.Map'); goog.require('ol.View'); goog.require('ol.layer.Image'); From eaab8e47ceb5b420c2e5da7e96a0fe2567af1fa2 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 23 Feb 2016 12:57:39 -0700 Subject: [PATCH 3/7] More cleanup --- test/spec/ol/source/rastersource.test.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/spec/ol/source/rastersource.test.js b/test/spec/ol/source/rastersource.test.js index 43760791fb..69f8dbf6db 100644 --- a/test/spec/ol/source/rastersource.test.js +++ b/test/spec/ol/source/rastersource.test.js @@ -85,7 +85,12 @@ maybeDescribe('ol.source.Raster', function() { }); afterEach(function() { - goog.dispose(map); + map.setTarget(null); + map.dispose(); + raster.dispose(); + greenSource.dispose(); + redSource.dispose(); + blueSource.dispose(); document.body.removeChild(target); }); From 9da8cd890e8981169021056d5a6d46350edcbbeb Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 23 Feb 2016 13:06:38 -0700 Subject: [PATCH 4/7] Simpler alias --- test/spec/ol/source/rastersource.test.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/test/spec/ol/source/rastersource.test.js b/test/spec/ol/source/rastersource.test.js index 69f8dbf6db..8d779c45d9 100644 --- a/test/spec/ol/source/rastersource.test.js +++ b/test/spec/ol/source/rastersource.test.js @@ -9,13 +9,7 @@ var green = 'data:image/gif;base64,R0lGODlhAQABAPAAAAD/AP///yH5BAAAAAAALAAAA' + var blue = 'data:image/gif;base64,R0lGODlhAQABAPAAAAAA/////yH5BAAAAAAALAAAAA' + 'ABAAEAAAICRAEAOw=='; -function itNoPhantom() { - if (window.checkForMocha) { - return xit.apply(this, arguments); - } else { - return it.apply(this, arguments); - } -} +var itNoPhantom = window.checkForMocha ? xit : it; var hasImageDataConstructor = true; try { From 24b7b278368c80cb197c361512731d1800f493ef Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 23 Feb 2016 13:10:47 -0700 Subject: [PATCH 5/7] Listen once when calling done --- test/spec/ol/source/rastersource.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/spec/ol/source/rastersource.test.js b/test/spec/ol/source/rastersource.test.js index 8d779c45d9..12b1d08c4f 100644 --- a/test/spec/ol/source/rastersource.test.js +++ b/test/spec/ol/source/rastersource.test.js @@ -112,7 +112,7 @@ maybeDescribe('ol.source.Raster', function() { } }); - source.on('afteroperations', function() { + source.once('afteroperations', function() { expect(log.length).to.equal(4); var inputs = log[0]; var pixel = inputs[0]; From 02904cda8ee391c29afa96d5714cc0f696fb4832 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 23 Feb 2016 13:13:15 -0700 Subject: [PATCH 6/7] Guard against handlers handling events after done --- test/spec/ol/source/rastersource.test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/spec/ol/source/rastersource.test.js b/test/spec/ol/source/rastersource.test.js index 12b1d08c4f..28a807ee76 100644 --- a/test/spec/ol/source/rastersource.test.js +++ b/test/spec/ol/source/rastersource.test.js @@ -140,7 +140,7 @@ maybeDescribe('ol.source.Raster', function() { } }); - source.on('afteroperations', function() { + source.once('afteroperations', function() { expect(log.length).to.equal(1); var inputs = log[0]; expect(inputs[0]).to.be.an(ImageData); @@ -176,7 +176,7 @@ maybeDescribe('ol.source.Raster', function() { view.setCenter([0, 0]); view.setZoom(0); - raster.on('afteroperations', function(event) { + raster.once('afteroperations', function(event) { expect(count).to.equal(4); done(); }); @@ -215,7 +215,7 @@ maybeDescribe('ol.source.Raster', function() { return inputs[0]; }); - raster.on('beforeoperations', function(event) { + raster.once('beforeoperations', function(event) { expect(count).to.equal(0); expect(!!event).to.be(true); expect(event.extent).to.be.an('array'); @@ -242,7 +242,7 @@ maybeDescribe('ol.source.Raster', function() { event.data.count = 0; }); - raster.on('afteroperations', function(event) { + raster.once('afteroperations', function(event) { expect(event.data.count).to.equal(4); done(); }); @@ -265,7 +265,7 @@ maybeDescribe('ol.source.Raster', function() { return inputs[0]; }); - raster.on('afteroperations', function(event) { + raster.once('afteroperations', function(event) { expect(count).to.equal(4); expect(!!event).to.be(true); expect(event.extent).to.be.an('array'); @@ -287,7 +287,7 @@ maybeDescribe('ol.source.Raster', function() { return inputs[0]; }); - raster.on('afteroperations', function(event) { + raster.once('afteroperations', function(event) { expect(event.data.message).to.equal('hello world'); done(); }); From f2d5d572abae7c59f9e4e8450ef4f71592c9f67d Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Tue, 23 Feb 2016 21:55:12 +0100 Subject: [PATCH 7/7] Only composeFrame when prepareFrame prepared something to render --- src/ol/renderer/canvas/canvasimagelayerrenderer.js | 2 +- src/ol/source/rastersource.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ol/renderer/canvas/canvasimagelayerrenderer.js b/src/ol/renderer/canvas/canvasimagelayerrenderer.js index 9b4aeae64b..94cb00d390 100644 --- a/src/ol/renderer/canvas/canvasimagelayerrenderer.js +++ b/src/ol/renderer/canvas/canvasimagelayerrenderer.js @@ -202,5 +202,5 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, laye this.updateLogos(frameState, imageSource); } - return true; + return !!this.image_; }; diff --git a/src/ol/source/rastersource.js b/src/ol/source/rastersource.js index 1a89287129..5eb8ee4890 100644 --- a/src/ol/source/rastersource.js +++ b/src/ol/source/rastersource.js @@ -343,7 +343,9 @@ ol.source.Raster.prototype.onWorkerComplete_ = function(frameState, callback, er * @private */ ol.source.Raster.getImageData_ = function(renderer, frameState, layerState) { - renderer.prepareFrame(frameState, layerState); + if (!renderer.prepareFrame(frameState, layerState)) { + return null; + } var width = frameState.size[0]; var height = frameState.size[1]; if (!ol.source.Raster.context_) {