📄 dwr-engine.js
字号:
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;
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(element, batchId) {
dwr.engine._receivedBatch = element.batch;
element.batch = null;
dwr.engine._callPostHooks(batch);
};
/** @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; }
// var debug = script;
// debug = debug.replace(/\/\/#DWR-START#\r\n/g, "");
// debug = debug.replace(/\/\/#DWR-END#\r\n/g, "");
// debug = debug.replace(/\r/g, "");
// debug = debug.replace(/\n/g, " ");
// dwr.engine._debug("Exec: [" + debug + "]");
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
if (batch.iframe == dwr.engine._pollFrame) dwr.engine._pollFrame = null;
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 instanceof Array) 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: http://getahead.ltd.uk/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) {
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 + -