📄 engine.js.svn-base
字号:
// Comet replies might have already partially executed if (batch.isPoll && batch.map.partialResponse == dwr.engine._partialResponseYes) { dwr.engine._processCometResponse(reply, batch); } else { if (reply.search("//#DWR") == -1) { dwr.engine._handleWarning(batch, { name:"dwr.engine.invalidReply", message:"Invalid reply from server" }); } else { toEval = reply; } } } } } catch (ex) { dwr.engine._handleWarning(batch, ex); } dwr.engine._callPostHooks(batch); // Outside of the try/catch so errors propogate normally: dwr.engine._receivedBatch = batch; if (toEval != null) toEval = toEval.replace(dwr.engine._scriptTagProtection, ""); dwr.engine._eval(toEval); dwr.engine._receivedBatch = null; dwr.engine._clearUp(batch);};/** @private Called by the server: Execute a callback */dwr.engine._remoteHandleCallback = function(batchId, callId, reply) { var batch = dwr.engine._batches[batchId]; if (batch == null) { dwr.engine._debug("Warning: batch == null in remoteHandleCallback for batchId=" + batchId, true); return; } // Error handlers inside here indicate an error that is nothing to do // with DWR so we handle them differently. try { var handlers = batch.handlers[callId]; if (!handlers) { dwr.engine._debug("Warning: Missing handlers. callId=" + callId, true); } else if (typeof handlers.callback == "function") handlers.callback(reply); } catch (ex) { dwr.engine._handleError(batch, ex); }};/** @private Called by the server: Handle an exception for a call */dwr.engine._remoteHandleException = function(batchId, callId, ex) { var batch = dwr.engine._batches[batchId]; if (batch == null) { dwr.engine._debug("Warning: null batch in remoteHandleException", true); return; } var handlers = batch.handlers[callId]; if (handlers == null) { dwr.engine._debug("Warning: null handlers in remoteHandleException", true); return; } if (ex.message == undefined) ex.message = ""; if (typeof handlers.exceptionHandler == "function") handlers.exceptionHandler(ex.message, ex); else if (typeof batch.errorHandler == "function") batch.errorHandler(ex.message, ex);};/** @private Called by the server: The whole batch is broken */dwr.engine._remoteHandleBatchException = function(ex, batchId) { var searchBatch = (dwr.engine._receivedBatch == null && batchId != null); if (searchBatch) { dwr.engine._receivedBatch = dwr.engine._batches[batchId]; } if (ex.message == undefined) ex.message = ""; dwr.engine._handleError(dwr.engine._receivedBatch, ex); if (searchBatch) { dwr.engine._receivedBatch = null; dwr.engine._clearUp(dwr.engine._batches[batchId]); }};/** @private Called by the server: Reverse ajax should not be used */dwr.engine._remotePollCometDisabled = function(ex, batchId) { dwr.engine.setActiveReverseAjax(false); var searchBatch = (dwr.engine._receivedBatch == null && batchId != null); if (searchBatch) { dwr.engine._receivedBatch = dwr.engine._batches[batchId]; } if (ex.message == undefined) ex.message = ""; dwr.engine._handleError(dwr.engine._receivedBatch, ex); if (searchBatch) { dwr.engine._receivedBatch = null; dwr.engine._clearUp(dwr.engine._batches[batchId]); }};/** @private Called by the server: An IFrame reply is about to start */dwr.engine._remoteBeginIFrameResponse = function(iframe, batchId) { if (iframe != null) dwr.engine._receivedBatch = iframe.batch; dwr.engine._callPostHooks(dwr.engine._receivedBatch);};/** @private Called by the server: An IFrame reply is just completing */dwr.engine._remoteEndIFrameResponse = function(batchId) { dwr.engine._clearUp(dwr.engine._receivedBatch); dwr.engine._receivedBatch = null;};/** @private This is a hack to make the context be this window */dwr.engine._eval = function(script) { if (script == null) return null; if (script == "") { dwr.engine._debug("Warning: blank script", true); return null; } // dwr.engine._debug("Exec: [" + script + "]", true); return eval(script);};/** @private Called as a result of a request timeout */dwr.engine._abortRequest = function(batch) { if (batch && !batch.completed) { clearInterval(batch.interval); dwr.engine._clearUp(batch); if (batch.req) batch.req.abort(); dwr.engine._handleError(batch, { name:"dwr.engine.timeout", message:"Timeout" }); }};/** @private call all the post hooks for a batch */dwr.engine._callPostHooks = function(batch) { if (batch.postHooks) { for (var i = 0; i < batch.postHooks.length; i++) { batch.postHooks[i](); } batch.postHooks = null; }}/** @private A call has finished by whatever means and we need to shut it all down. */dwr.engine._clearUp = function(batch) { if (!batch) { dwr.engine._debug("Warning: null batch in dwr.engine._clearUp()", true); return; } if (batch.completed == "true") { dwr.engine._debug("Warning: Double complete", true); return; } // IFrame tidyup if (batch.div) batch.div.parentNode.removeChild(batch.div); if (batch.iframe) { // If this is a poll frame then stop comet polling for (var i = 0; i < dwr.engine._outstandingIFrames.length; i++) { if (dwr.engine._outstandingIFrames[i] == batch.iframe) { dwr.engine._outstandingIFrames.splice(i, 1); } } batch.iframe.parentNode.removeChild(batch.iframe); } if (batch.form) batch.form.parentNode.removeChild(batch.form); // XHR tidyup: avoid IE handles increase if (batch.req) { // If this is a poll frame then stop comet polling if (batch.req == dwr.engine._pollReq) dwr.engine._pollReq = null; delete batch.req; } if (batch.map && batch.map.batchId) { delete dwr.engine._batches[batch.map.batchId]; dwr.engine._batchesLength--; } batch.completed = true; // If there is anything on the queue waiting to go out, then send it. // We don't need to check for ordered mode, here because when ordered mode // gets turned off, we still process *waiting* batches in an ordered way. if (dwr.engine._batchQueue.length != 0) { var sendbatch = dwr.engine._batchQueue.shift(); dwr.engine._sendData(sendbatch); }};/** @private Generic error handling routing to save having null checks everywhere */dwr.engine._handleError = function(batch, ex) { if (typeof ex == "string") ex = { name:"unknown", message:ex }; if (ex.message == null) ex.message = ""; if (ex.name == null) ex.name = "unknown"; if (batch && typeof batch.errorHandler == "function") batch.errorHandler(ex.message, ex); else if (dwr.engine._errorHandler) dwr.engine._errorHandler(ex.message, ex); dwr.engine._clearUp(batch);};/** @private Generic error handling routing to save having null checks everywhere */dwr.engine._handleWarning = function(batch, ex) { if (typeof ex == "string") ex = { name:"unknown", message:ex }; if (ex.message == null) ex.message = ""; if (ex.name == null) ex.name = "unknown"; if (batch && typeof batch.warningHandler == "function") batch.warningHandler(ex.message, ex); else if (dwr.engine._warningHandler) dwr.engine._warningHandler(ex.message, ex); dwr.engine._clearUp(batch);};/** * @private Marshall a data item * @param batch A map of variables to how they have been marshalled * @param referto An array of already marshalled variables to prevent recurrsion * @param data The data to be marshalled * @param name The name of the data being marshalled */dwr.engine._serializeAll = function(batch, referto, data, name) { if (data == null) { batch.map[name] = "null:null"; return; } switch (typeof data) { case "boolean": batch.map[name] = "boolean:" + data; break; case "number": batch.map[name] = "number:" + data; break; case "string": batch.map[name] = "string:" + encodeURIComponent(data); break; case "object": if (data instanceof String) batch.map[name] = "String:" + encodeURIComponent(data); else if (data instanceof Boolean) batch.map[name] = "Boolean:" + data; else if (data instanceof Number) batch.map[name] = "Number:" + data; else if (data instanceof Date) batch.map[name] = "Date:" + data.getTime(); else if (data && data.join) batch.map[name] = dwr.engine._serializeArray(batch, referto, data, name); else batch.map[name] = dwr.engine._serializeObject(batch, referto, data, name); break; case "function": // We just ignore functions. break; default: dwr.engine._handleWarning(null, { name:"dwr.engine.unexpectedType", message:"Unexpected type: " + typeof data + ", attempting default converter." }); batch.map[name] = "default:" + data; break; }};/** @private Have we already converted this object? */dwr.engine._lookup = function(referto, data, name) { var lookup; // Can't use a map: getahead.org/ajax/javascript-gotchas for (var i = 0; i < referto.length; i++) { if (referto[i].data == data) { lookup = referto[i]; break; } } if (lookup) return "reference:" + lookup.name; referto.push({ data:data, name:name }); return null;};/** @private Marshall an object */dwr.engine._serializeObject = function(batch, referto, data, name) { var ref = dwr.engine._lookup(referto, data, name); if (ref) return ref; // This check for an HTML is not complete, but is there a better way? // Maybe we should add: data.hasChildNodes typeof "function" == true if (data.nodeName && data.nodeType) { return dwr.engine._serializeXml(batch, referto, data, name); } // treat objects as an associative arrays var reply = "Object_" + dwr.engine._getObjectClassName(data) + ":{"; var element; for (element in data) { if (typeof data[element] != "function") { batch.paramCount++; var childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount; dwr.engine._serializeAll(batch, referto, data[element], childName); reply += encodeURIComponent(element) + ":reference:" + childName + ", "; } } if (reply.substring(reply.length - 2) == ", ") { reply = reply.substring(0, reply.length - 2); } reply += "}"; return reply;};/** @private Returns the classname of supplied argument obj */dwr.engine._errorClasses = { "Error":Error, "EvalError":EvalError, "RangeError":RangeError, "ReferenceError":ReferenceError, "SyntaxError":SyntaxError, "TypeError":TypeError, "URIError":URIError };dwr.engine._getObjectClassName = function(obj) { // Try to find the classname by stringifying the object's constructor // and extract <class> from "function <class>". if (obj && obj.constructor && obj.constructor.toString) { var str = obj.constructor.toString(); var regexpmatch = str.match(/function\s+(\w+)/); if (regexpmatch && regexpmatch.length == 2) { return regexpmatch[1]; } } // Now manually test against the core Error classes, as these in some // browsers successfully match to the wrong class in the // Object.toString() test we will do later if (obj && obj.constructor) { for (var errorname in dwr.engine._errorClasses) { if (obj.constructor == dwr.engine._errorClasses[errorname]) return errorname; } } // Try to find the classname by calling Object.toString() on the object // and extracting <class> from "[object <class>]" if (obj) { var str = Object.prototype.toString.call(obj); var regexpmatch = str.match(/\[object\s+(\w+)/); if (regexpmatch && regexpmatch.length==2) { return regexpmatch[1]; } } // Supplied argument was probably not an object, but what is better? return "Object";};/** @private Marshall an object */dwr.engine._serializeXml = function(batch, referto, data, name) { var ref = dwr.engine._lookup(referto, data, name); if (ref) return ref; var output; if (window.XMLSerializer) output = new XMLSerializer().serializeToString(data); else if (data.toXml) output = data.toXml; else output = data.innerHTML; return "XML:" + encodeURIComponent(output);};/** @private Marshall an array */dwr.engine._serializeArray = function(batch, referto, data, name) { var ref = dwr.engine._lookup(referto, data, name); if (ref) return ref; var reply = "Array:["; for (var i = 0; i < data.length; i++) { if (i != 0) reply += ","; batch.paramCount++; var childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount; dwr.engine._serializeAll(batch, referto, data[i], childName); reply += "reference:"; reply += childName; } reply += "]"; return reply;};/** @private Convert an XML string into a DOM object. */dwr.engine._unserializeDocument = function(xml) { var dom; if (window.DOMParser) { var parser = new DOMParser(); dom = parser.parseFromString(xml, "text/xml"); if (!dom.documentElement || dom.documentElement.tagName == "parsererror") { var message = dom.documentElement.firstChild.data; message += "\n" + dom.documentElement.firstChild.nextSibling.firstChild.data; throw message; } return dom; } else if (window.ActiveXObject) { dom = dwr.engine._newActiveXObject(dwr.engine._DOMDocument); dom.loadXML(xml); // What happens on parse fail with IE? return dom; } else { var div = document.createElement("div"); div.innerHTML = xml; return div; }};/** @param axarray An array of strings to attempt to create ActiveX objects from */dwr.engine._newActiveXObject = function(axarray) { var returnValue; for (var i = 0; i < axarray.length; i++) { try { returnValue = new ActiveXObject(axarray[i]); break; } catch (ex) { /* ignore */ } } return returnValue;};/** @private Used internally when some message needs to get to the programmer */dwr.engine._debug = function(message, stacktrace) { var written = false; try { if (window.console) { if (stacktrace && window.console.trace) window.console.trace(); window.console.log(message); written = true; } else if (window.opera && window.opera.postError) { window.opera.postError(message); written = true; } } catch (ex) { /* ignore */ } if (!written) { var debug = document.getElementById("dwr-debug"); if (debug) { var contents = message + "<br/>" + debug.innerHTML; if (contents.length > 2048) contents = contents.substring(0, 2048); debug.innerHTML = contents; } }};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -