Pulling in patches for OL 2.11 RC3:
* ArcGISCache resolutions get compromised by some JS frameworks. (Closes #3474) * OpenLayers.Layer.HTTPRequest initialize simplification (Closes #3470) * missing requires (Closes #3467) * deleting a vertex does not update feature.modified (Closes #3463) * fixing test failure in some browsers (Closes #3461) * a grid layer may be moved while its grid hasn't been initialized yet (Closes #3458) -- this one is the actual release blocker * Change the callback function of Protocol.Script (JSONP) (Closes #3417) * "build.py -c closure" does not work on Windows systems. (Closes #3158) git-svn-id: http://svn.openlayers.org/branches/openlayers/2.11@12274 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -633,6 +633,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
|
|||||||
this.layer.drawFeature(this.feature, this.standalone ?
|
this.layer.drawFeature(this.feature, this.standalone ?
|
||||||
undefined :
|
undefined :
|
||||||
this.selectControl.renderIntent);
|
this.selectControl.renderIntent);
|
||||||
|
this.modified = true;
|
||||||
this.resetVertices();
|
this.resetVertices();
|
||||||
this.setFeatureState();
|
this.setFeatureState();
|
||||||
this.onModification(this.feature);
|
this.onModification(this.feature);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @requires OpenLayers/Format/XML.js
|
* @requires OpenLayers/Format/XML.js
|
||||||
|
* @requires OpenLayers/Format/OWSCommon/v1_1_0.js
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -172,21 +172,23 @@ OpenLayers.Layer.ArcGISCache = OpenLayers.Class(OpenLayers.Layer.XYZ, {
|
|||||||
|
|
||||||
this.lods = [];
|
this.lods = [];
|
||||||
for(var key in info.tileInfo.lods) {
|
for(var key in info.tileInfo.lods) {
|
||||||
var lod = info.tileInfo.lods[key];
|
if (info.tileInfo.lods.hasOwnProperty(key)) {
|
||||||
if (this.useScales) {
|
var lod = info.tileInfo.lods[key];
|
||||||
this.scales.push(lod.scale);
|
if (this.useScales) {
|
||||||
} else {
|
this.scales.push(lod.scale);
|
||||||
this.resolutions.push(lod.resolution);
|
} else {
|
||||||
|
this.resolutions.push(lod.resolution);
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = this.getContainingTileCoords(upperLeft, lod.resolution);
|
||||||
|
lod.startTileCol = start.x;
|
||||||
|
lod.startTileRow = start.y;
|
||||||
|
|
||||||
|
var end = this.getContainingTileCoords(bottomRight, lod.resolution);
|
||||||
|
lod.endTileCol = end.x;
|
||||||
|
lod.endTileRow = end.y;
|
||||||
|
this.lods.push(lod);
|
||||||
}
|
}
|
||||||
|
|
||||||
var start = this.getContainingTileCoords(upperLeft, lod.resolution);
|
|
||||||
lod.startTileCol = start.x;
|
|
||||||
lod.startTileRow = start.y;
|
|
||||||
|
|
||||||
var end = this.getContainingTileCoords(bottomRight, lod.resolution);
|
|
||||||
lod.endTileCol = end.x;
|
|
||||||
lod.endTileRow = end.y;
|
|
||||||
this.lods.push(lod);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.maxExtent = this.calculateMaxExtentWithLOD(this.lods[0]);
|
this.maxExtent = this.calculateMaxExtentWithLOD(this.lods[0]);
|
||||||
|
|||||||
@@ -58,9 +58,7 @@ OpenLayers.Layer.HTTPRequest = OpenLayers.Class(OpenLayers.Layer, {
|
|||||||
* options - {Object} Hashtable of extra options to tag onto the layer
|
* options - {Object} Hashtable of extra options to tag onto the layer
|
||||||
*/
|
*/
|
||||||
initialize: function(name, url, params, options) {
|
initialize: function(name, url, params, options) {
|
||||||
var newArguments = arguments;
|
OpenLayers.Layer.prototype.initialize.apply(this, [name, options]);
|
||||||
newArguments = [name, options];
|
|
||||||
OpenLayers.Layer.prototype.initialize.apply(this, newArguments);
|
|
||||||
this.url = url;
|
this.url = url;
|
||||||
this.params = OpenLayers.Util.extend( {}, params);
|
this.params = OpenLayers.Util.extend( {}, params);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1722,7 +1722,8 @@ OpenLayers.Map = OpenLayers.Class({
|
|||||||
var layer, i, len;
|
var layer, i, len;
|
||||||
for (i=0, len=this.layers.length; i<len; ++i) {
|
for (i=0, len=this.layers.length; i<len; ++i) {
|
||||||
layer = this.layers[i];
|
layer = this.layers[i];
|
||||||
if (layer.visibility) {
|
if (layer.visibility &&
|
||||||
|
(layer === this.baseLayer || layer.inRange)) {
|
||||||
layer.moveByPx(dx, dy);
|
layer.moveByPx(dx, dy);
|
||||||
layer.events.triggerEvent("move");
|
layer.events.triggerEvent("move");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ OpenLayers.Protocol.Script = OpenLayers.Class(OpenLayers.Protocol, {
|
|||||||
*/
|
*/
|
||||||
createRequest: function(url, params, callback) {
|
createRequest: function(url, params, callback) {
|
||||||
var id = OpenLayers.Protocol.Script.register(callback);
|
var id = OpenLayers.Protocol.Script.register(callback);
|
||||||
var name = "OpenLayers.Protocol.Script.getCallback(" + id + ")";
|
var name = "OpenLayers.Protocol.Script.registry[" + id + "]";
|
||||||
params = OpenLayers.Util.extend({}, params);
|
params = OpenLayers.Util.extend({}, params);
|
||||||
params[this.callbackKey] = this.callbackPrefix + name;
|
params[this.callbackKey] = this.callbackPrefix + name;
|
||||||
url = OpenLayers.Util.urlAppend(
|
url = OpenLayers.Util.urlAppend(
|
||||||
@@ -328,7 +328,7 @@ OpenLayers.Protocol.Script = OpenLayers.Class(OpenLayers.Protocol, {
|
|||||||
(function() {
|
(function() {
|
||||||
var o = OpenLayers.Protocol.Script;
|
var o = OpenLayers.Protocol.Script;
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
var registry = {};
|
o.registry = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function: OpenLayers.Protocol.Script.register
|
* Function: OpenLayers.Protocol.Script.register
|
||||||
@@ -344,7 +344,10 @@ OpenLayers.Protocol.Script = OpenLayers.Class(OpenLayers.Protocol, {
|
|||||||
*/
|
*/
|
||||||
o.register = function(callback) {
|
o.register = function(callback) {
|
||||||
var id = ++counter;
|
var id = ++counter;
|
||||||
registry[id] = callback;
|
o.registry[id] = function() {
|
||||||
|
o.unregister(id);
|
||||||
|
callback.apply(this, arguments);
|
||||||
|
};
|
||||||
return id;
|
return id;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -356,22 +359,6 @@ OpenLayers.Protocol.Script = OpenLayers.Class(OpenLayers.Protocol, {
|
|||||||
* id: {Number} The identifer returned by the register function.
|
* id: {Number} The identifer returned by the register function.
|
||||||
*/
|
*/
|
||||||
o.unregister = function(id) {
|
o.unregister = function(id) {
|
||||||
delete registry[id];
|
delete o.registry[id];
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function: OpenLayers.Protocol.Script.getCallback
|
|
||||||
* Retreive and unregister a callback. A call to this function is the "P"
|
|
||||||
* in JSONP. For example, a script may be added with a src attribute
|
|
||||||
* http://example.com/features.json?callback=OpenLayers.Protocol.Script.getCallback(1)
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* id: {Number} The identifer returned by the register function.
|
|
||||||
*/
|
|
||||||
o.getCallback = function(id) {
|
|
||||||
var callback = registry[id];
|
|
||||||
o.unregister(id);
|
|
||||||
return callback;
|
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,15 @@
|
|||||||
|
|
||||||
// check invalid date
|
// check invalid date
|
||||||
date = new Date("foo");
|
date = new Date("foo");
|
||||||
str = OpenLayers.Date.toISOString(date);
|
try {
|
||||||
|
str = OpenLayers.Date.toISOString(date);
|
||||||
|
} catch (err) {
|
||||||
|
// some implementations throw RangeError
|
||||||
|
// see https://bugzilla.mozilla.org/show_bug.cgi?id=649575
|
||||||
|
if (err instanceof RangeError) {
|
||||||
|
str = "Invalid Date";
|
||||||
|
}
|
||||||
|
}
|
||||||
t.eq(str, "Invalid Date", "invalid date");
|
t.eq(str, "Invalid Date", "invalid date");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function test_handleKeypress(t) {
|
function test_handleKeypress(t) {
|
||||||
t.plan(14);
|
t.plan(16);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* There are two things that we want to test here
|
* There are two things that we want to test here
|
||||||
@@ -101,6 +101,8 @@
|
|||||||
// mock up vertex deletion
|
// mock up vertex deletion
|
||||||
control.dragControl.feature = point;
|
control.dragControl.feature = point;
|
||||||
control.feature = poly;
|
control.feature = poly;
|
||||||
|
// we cannot use selectFeature since the control is not part of a map
|
||||||
|
control._originalGeometry = poly.geometry.clone();
|
||||||
control.vertices = [point];
|
control.vertices = [point];
|
||||||
point.geometry.parent = {
|
point.geometry.parent = {
|
||||||
removeComponent: function(geometry) {
|
removeComponent: function(geometry) {
|
||||||
@@ -110,6 +112,7 @@
|
|||||||
};
|
};
|
||||||
layer.events.on({
|
layer.events.on({
|
||||||
"featuremodified": function(event) {
|
"featuremodified": function(event) {
|
||||||
|
t.ok(event.feature.modified !== null, "modified property of feature should have been set");
|
||||||
t.eq(event.feature.id, poly.id, "vertex deletion: featuremodifed triggered");
|
t.eq(event.feature.id, poly.id, "vertex deletion: featuremodifed triggered");
|
||||||
},
|
},
|
||||||
"vertexremoved": function(evt) {
|
"vertexremoved": function(evt) {
|
||||||
|
|||||||
@@ -219,6 +219,32 @@
|
|||||||
t.ok((tile.x >= 0 && tile.y >= 0), 'layer should not generate negative tile ranges for level of detail');
|
t.ok((tile.x >= 0 && tile.y >= 0), 'layer should not generate negative tile ranges for level of detail');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test that messing up the Array.prototype does not mess up the lods of the layer.
|
||||||
|
* This messes up zooming when resolutions are very small/scales are very large/zoomed way in.
|
||||||
|
*/
|
||||||
|
function test_Layer_ARCGISCACHE_lods (t) {
|
||||||
|
t.plan( 2 );
|
||||||
|
var layerInfo = capabilitiesObject;
|
||||||
|
|
||||||
|
lods = layerInfo.tileInfo.lods.length;
|
||||||
|
|
||||||
|
// mess up the Array prototype
|
||||||
|
Array.prototype.foo = function() { };
|
||||||
|
|
||||||
|
t.ok( lods == layerInfo.tileInfo.lods.length, 'proper number of "Levels of Detail" before initialization' );
|
||||||
|
|
||||||
|
// initialize the layer using the JSON object from an arcgis server
|
||||||
|
// see: ArcGISCache.json
|
||||||
|
var layer = new OpenLayers.Layer.ArcGISCache(name, url, {
|
||||||
|
layerInfo: layerInfo
|
||||||
|
});
|
||||||
|
|
||||||
|
t.ok( lods == layer.lods.length, 'proper number of "Levels of Detail" after initialization.' );
|
||||||
|
// restore the Array prototype
|
||||||
|
delete Array.prototype.foo;
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -1790,36 +1790,76 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function test_moveByPx(t) {
|
function test_moveByPx(t) {
|
||||||
t.plan(8);
|
t.plan(16);
|
||||||
|
|
||||||
|
var moved;
|
||||||
|
var Layer = OpenLayers.Class(OpenLayers.Layer, {
|
||||||
|
moveByPx: function(dx, dy) {
|
||||||
|
moved[this.name] = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var map = new OpenLayers.Map({
|
var map = new OpenLayers.Map({
|
||||||
div: 'map',
|
div: 'map',
|
||||||
maxExtent: new OpenLayers.Bounds(-50, -50, 50, 50),
|
maxExtent: new OpenLayers.Bounds(-50, -50, 50, 50),
|
||||||
restrictedExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
|
restrictedExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
|
||||||
layers: [
|
layers: [
|
||||||
new OpenLayers.Layer('name', {isBaseLayer: true})
|
new Layer('base',
|
||||||
|
{isBaseLayer: true}),
|
||||||
|
new Layer('outofrange',
|
||||||
|
{isBaseLayer: false, minResolution:2})
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
moved = {};
|
||||||
map.zoomToExtent(new OpenLayers.Bounds(-1, -1, 1, 1));
|
map.zoomToExtent(new OpenLayers.Bounds(-1, -1, 1, 1));
|
||||||
|
|
||||||
// check initial state
|
// check initial state
|
||||||
t.eq(map.layerContainerDiv.style.left, '0px', 'layer container left correct');
|
t.eq(map.layerContainerDiv.style.left, '0px',
|
||||||
t.eq(map.layerContainerDiv.style.top, '0px', 'layer container top correct');
|
'[initial state] layer container left correct');
|
||||||
|
t.eq(map.layerContainerDiv.style.top, '0px',
|
||||||
|
'[initial state] layer container top correct');
|
||||||
|
t.eq(moved['base'], undefined,
|
||||||
|
'[initial state] base layer not moved');
|
||||||
|
t.eq(moved['outofrange'], undefined,
|
||||||
|
'[initial state] out-of-range layer not moved');
|
||||||
|
|
||||||
// move to a valid position
|
// move to a valid position
|
||||||
|
moved = {};
|
||||||
map.moveByPx(-455, 455);
|
map.moveByPx(-455, 455);
|
||||||
t.eq(map.layerContainerDiv.style.left, '455px', 'layer container left correct');
|
t.eq(map.layerContainerDiv.style.left, '455px',
|
||||||
t.eq(map.layerContainerDiv.style.top, '-455px', 'layer container top correct');
|
'[valid position] layer container left correct');
|
||||||
|
t.eq(map.layerContainerDiv.style.top, '-455px',
|
||||||
|
'[valid position] layer container top correct');
|
||||||
|
t.eq(moved['base'], true,
|
||||||
|
'[valid position] base layer moved');
|
||||||
|
t.eq(moved['outofrange'], undefined,
|
||||||
|
'[valid position] out-of-range layer not moved');
|
||||||
|
|
||||||
// move outside the max extent
|
// move outside the max extent
|
||||||
|
moved = {};
|
||||||
map.moveByPx(-4500, 4500);
|
map.moveByPx(-4500, 4500);
|
||||||
t.eq(map.layerContainerDiv.style.left, '455px', 'layer container left correct');
|
t.eq(map.layerContainerDiv.style.left, '455px',
|
||||||
t.eq(map.layerContainerDiv.style.top, '-455px', 'layer container top correct');
|
'[outside max extent] layer container left correct');
|
||||||
|
t.eq(map.layerContainerDiv.style.top, '-455px',
|
||||||
|
'[outside max extent] layer container top correct');
|
||||||
|
t.eq(moved['base'], undefined,
|
||||||
|
'[outside max extent] base layer not moved');
|
||||||
|
t.eq(moved['outofrange'], undefined,
|
||||||
|
'[outside max extent] out-of-range layer not moved');
|
||||||
|
|
||||||
// move outside the restricted extent
|
// move outside the restricted extent
|
||||||
|
moved = {};
|
||||||
map.moveByPx(-500, 500);
|
map.moveByPx(-500, 500);
|
||||||
t.eq(map.layerContainerDiv.style.left, '455px', 'layer container left correct');
|
t.eq(map.layerContainerDiv.style.left, '455px',
|
||||||
t.eq(map.layerContainerDiv.style.top, '-455px', 'layer container top correct');
|
'[outside restricted extent] layer container left correct');
|
||||||
|
t.eq(map.layerContainerDiv.style.top, '-455px',
|
||||||
|
'[outside restricted extent] layer container top correct');
|
||||||
|
t.eq(moved['base'], undefined,
|
||||||
|
'[outside restricted extent] base layer not moved');
|
||||||
|
t.eq(moved['outofrange'], undefined,
|
||||||
|
'[outside restricted extent] out-of-range layer not moved');
|
||||||
|
|
||||||
|
|
||||||
map.destroy();
|
map.destroy();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,7 +150,7 @@
|
|||||||
|
|
||||||
t.eq(script.type, 'text/javascript',
|
t.eq(script.type, 'text/javascript',
|
||||||
'created script has a correct type');
|
'created script has a correct type');
|
||||||
t.eq(script.src, 'http://bar_url/?k=bar_param&cb_key=cb_prefix%3AOpenLayers.Protocol.Script.getCallback(bar)',
|
t.eq(script.src, 'http://bar_url/?k=bar_param&cb_key=cb_prefix%3AOpenLayers.Protocol.Script.registry%5Bbar%5D',
|
||||||
'created script has a correct url');
|
'created script has a correct url');
|
||||||
t.eq(script.id, 'OpenLayers_Protocol_Script_bar',
|
t.eq(script.id, 'OpenLayers_Protocol_Script_bar',
|
||||||
'created script has a correct id');
|
'created script has a correct id');
|
||||||
|
|||||||
@@ -2,20 +2,21 @@ import sys
|
|||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
path = os.path.abspath(os.path.join(os.path.dirname(__file__), "closure-compiler.jar"))
|
path = "../tools/closure-compiler.jar"
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
raise Exception("No closure-compiler.jar at %s; read README.txt!" % path)
|
raise Exception("No closure-compiler.jar at %s; read README.txt!" % path)
|
||||||
|
|
||||||
def minimize(code):
|
def minimize(code):
|
||||||
ntf = tempfile.NamedTemporaryFile()
|
ntf = tempfile.NamedTemporaryFile(delete=False)
|
||||||
ntf.write(code)
|
ntf.write(code)
|
||||||
ntf.flush()
|
ntf.flush()
|
||||||
|
|
||||||
ntf2 = tempfile.NamedTemporaryFile()
|
ntf2 = tempfile.NamedTemporaryFile(delete=False)
|
||||||
|
|
||||||
os.system("java -jar %s --js %s --js_output_file %s" % (path, ntf.name, ntf2.name))
|
|
||||||
ntf2.seek(0)
|
|
||||||
data = ntf2.read()
|
|
||||||
ntf.close()
|
ntf.close()
|
||||||
ntf2.close()
|
ntf2.close()
|
||||||
|
|
||||||
|
os.system("java -jar %s --js %s --js_output_file %s" % (path, ntf.name, ntf2.name))
|
||||||
|
data = open(ntf2.name).read()
|
||||||
|
os.unlink(ntf.name)
|
||||||
|
os.unlink(ntf2.name)
|
||||||
return data
|
return data
|
||||||
|
|||||||
Reference in New Issue
Block a user