[OpenLayers-Dev] Possible bug with Protocol.HTTP
Stephen Woodbridge
woodbri at swoodbridge.com
Sun May 2 11:53:59 EDT 2010
Hi Devs,
I have been working with OL.Protocol.HTTP and I think I have identified
a bug in the code after spending considerable time reading and tracing
the code via firebug. Basically if you create a Protocol.HTTP with a
user callback, it never gets called. Below is a summary of my analysis
and I would appreciate it if one of you can confirm or refute these
observations.
In OpenLayers.Protocol.HTTP.commit() near the end the code starts
issuing requests with:
var queue = types[OpenLayers.State.INSERT];
if(queue.length > 0) {
resp.push(this.create(
queue, OpenLayers.Util.applyDefaults(
{callback: insertCallback, scope: this}, options.create
)
));
}
queue = types[OpenLayers.State.UPDATE];
for(var i=queue.length-1; i>=0; --i) {
resp.push(this.update(
queue[i], OpenLayers.Util.applyDefaults(
{callback: callback, scope: this}, options.update
))
);
}
queue = types[OpenLayers.State.DELETE];
for(var i=queue.length-1; i>=0; --i) {
resp.push(this["delete"](
queue[i], OpenLayers.Util.applyDefaults(
{callback: callback, scope: this}, options["delete"]
))
);
}
I think the arguments to OpenLayers.Util.applyDefaults(to, from) are
reversed in the above code. I think the intent here was to create a hash
like:
options[requestType] = {callback: callback, scope: this}
that would get passed as the options array to to the create, update,
delete method respectively because this is what is expected later by the
OpenLayers.Protocol.HTTP.callUserCallback. Also not the callback() and
insertCallback() are local function to commit() and should not be
confused with this.callback.
And in fact the above code might be more correctly expressed as for example:
queue = types[OpenLayers.State.DELETE];
for(var i=queue.length-1; i>=0; --i) {
var opt = OpenLayers.Util.applyDefaults(options, "delete:
{callback: callback, scope: this});
resp.push(this["delete"](queue[i], opt)
);
}
It would seem, this would more accurately reflect the usage below in
callUserCallback():
callUserCallback: function(resp, options) {
var opt = options[resp.requestType];
if(opt && opt.callback) {
opt.callback.call(opt.scope, resp);
}
},
In current code (OL 2.8 and OL 2.9) opt is currently always undefined so
the callback never gets called.
A simple test of this is to create an OpenLayers.Protocol.HTTP with a
callback: function() {alert( "Hello World!"); }
and issue a create, update, or delete request via the protocol and the
callback is not currently called.
I admit to a fledgling understanding of OpenLayers but I have been
trying to get my head around why the callback is not getting called. My
next step is to try and patch the "start issuing requests" block of code
and see if I can get it to work with a patch which I'll report back on,
but it would be nice if a dev can look at this analysis and provide some
feedback on it.
All the best,
-Steve
More information about the Dev
mailing list