diff --git a/lib/OpenLayers/Request.js b/lib/OpenLayers/Request.js index 653ed1ab96..35ade9e738 100644 --- a/lib/OpenLayers/Request.js +++ b/lib/OpenLayers/Request.js @@ -141,6 +141,54 @@ OpenLayers.Request = { request.setRequestHeader(header, config.headers[header]); } + var events = this.events; + + // we want to execute runCallbacks with "this" as the + // execution scope + var self = this; + + request.onreadystatechange = function() { + if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) { + var proceed = events.triggerEvent( + "complete", + {request: request, config: config, requestUrl: url} + ); + if(proceed !== false) { + self.runCallbacks( + {request: request, config: config, requestUrl: url} + ); + } + } + }; + + // send request (optionally with data) and return + // call in a timeout for asynchronous requests so the return is + // available before readyState == 4 for cached docs + if(config.async === false) { + request.send(config.data); + } else { + window.setTimeout(function(){ + request.send(config.data); + }, 0); + } + return request; + }, + + /** + * Method: runCallbacks + * Calls the complete, success and failure callbacks. Application + * can listen to the "complete" event, have the listener + * display a confirm window and always return false, and + * execute OpenLayers.Request.runCallbacks if the user + * hits "yes" in the confirm window. + * + * Parameters: + * options - {Object} Hash containing request, config and requestUrl keys + */ + runCallbacks: function(options) { + var request = options.request; + var config = options.config; + // bind callbacks to readyState 4 (done) var complete = (config.scope) ? OpenLayers.Function.bind(config.callback, config.scope) : @@ -161,50 +209,21 @@ OpenLayers.Request = { OpenLayers.Function.bind(config.failure, config.scope) : config.failure; } - - var events = this.events; - - request.onreadystatechange = function() { - if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) { - var proceed = events.triggerEvent( - "complete", - {request: request, config: config, requestUrl: url} - ); - if(proceed !== false) { - complete(request); - if (!request.status || (request.status >= 200 && request.status < 300)) { - events.triggerEvent( - "success", - {request: request, config: config, requestUrl: url} - ); - if(success) { - success(request); - } - } - if(request.status && (request.status < 200 || request.status >= 300)) { - events.triggerEvent( - "failure", - {request: request, config: config, requestUrl: url} - ); - if(failure) { - failure(request); - } - } - } + + complete(request); + + if (!request.status || (request.status >= 200 && request.status < 300)) { + this.events.triggerEvent("success", options); + if(success) { + success(request); + } + } + if(request.status && (request.status < 200 || request.status >= 300)) { + this.events.triggerEvent("failure", options); + if(failure) { + failure(request); } - }; - - // send request (optionally with data) and return - // call in a timeout for asynchronous requests so the return is - // available before readyState == 4 for cached docs - if(config.async === false) { - request.send(config.data); - } else { - window.setTimeout(function(){ - request.send(config.data); - }, 0); } - return request; }, /**