/branches/v5.0-ouadji/api/js/dojo/src/io/RhinoIO.js |
---|
New file |
0,0 → 1,116 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.provide("dojo.io.RhinoIO"); |
dojo.require("dojo.io.common"); |
dojo.require("dojo.lang.func"); |
dojo.require("dojo.lang.array"); |
dojo.require("dojo.string.extras"); |
dojo.io.RhinoHTTPTransport = new function () { |
this.canHandle = function (req) { |
if (dojo.lang.find(["text/plain", "text/html", "text/xml", "text/javascript", "text/json", "application/json"], (req.mimetype.toLowerCase() || "")) < 0) { |
return false; |
} |
if (req.url.substr(0, 7) != "http://") { |
return false; |
} |
return true; |
}; |
function doLoad(req, conn) { |
var ret; |
if (req.method.toLowerCase() == "head") { |
} else { |
var stream = conn.getContent(); |
var reader = new java.io.BufferedReader(new java.io.InputStreamReader(stream)); |
var text = ""; |
var line = null; |
while ((line = reader.readLine()) != null) { |
text += line; |
} |
if (req.mimetype == "text/javascript") { |
try { |
ret = dj_eval(text); |
} |
catch (e) { |
dojo.debug(e); |
dojo.debug(text); |
ret = null; |
} |
} else { |
if (req.mimetype == "text/json" || req.mimetype == "application/json") { |
try { |
ret = dj_eval("(" + text + ")"); |
} |
catch (e) { |
dojo.debug(e); |
dojo.debug(text); |
ret = false; |
} |
} else { |
ret = text; |
} |
} |
} |
req.load("load", ret, req); |
} |
function connect(req) { |
var content = req.content || {}; |
var query; |
if (req.sendTransport) { |
content["dojo.transport"] = "rhinohttp"; |
} |
if (req.postContent) { |
query = req.postContent; |
} else { |
query = dojo.io.argsFromMap(content, req.encoding); |
} |
var url_text = req.url; |
if (req.method.toLowerCase() == "get" && query != "") { |
url_text = url_text + "?" + query; |
} |
var url = new java.net.URL(url_text); |
var conn = url.openConnection(); |
conn.setRequestMethod(req.method.toUpperCase()); |
if (req.headers) { |
for (var header in req.headers) { |
if (header.toLowerCase() == "content-type" && !req.contentType) { |
req.contentType = req.headers[header]; |
} else { |
conn.setRequestProperty(header, req.headers[header]); |
} |
} |
} |
if (req.contentType) { |
conn.setRequestProperty("Content-Type", req.contentType); |
} |
if (req.method.toLowerCase() == "post") { |
conn.setDoOutput(true); |
var output_stream = conn.getOutputStream(); |
var byte_array = (new java.lang.String(query)).getBytes(); |
output_stream.write(byte_array, 0, byte_array.length); |
} |
conn.connect(); |
doLoad(req, conn); |
} |
this.bind = function (req) { |
var async = req["sync"] ? false : true; |
if (async) { |
setTimeout(dojo.lang.hitch(this, function () { |
connect(req); |
}), 1); |
} else { |
connect(req); |
} |
}; |
dojo.io.transports.addTransport("RhinoHTTPTransport"); |
}; |
/branches/v5.0-ouadji/api/js/dojo/src/io/XhrIframeProxy.js |
---|
New file |
0,0 → 1,152 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.provide("dojo.io.XhrIframeProxy"); |
dojo.require("dojo.experimental"); |
dojo.experimental("dojo.io.XhrIframeProxy"); |
dojo.require("dojo.io.IframeIO"); |
dojo.require("dojo.dom"); |
dojo.require("dojo.uri.Uri"); |
dojo.io.XhrIframeProxy = {xipClientUrl:djConfig["xipClientUrl"] || dojo.uri.moduleUri("dojo.io", "xip_client.html"), _state:{}, _stateIdCounter:0, needFrameRecursion:function () { |
return (true == dojo.render.html.ie70); |
}, send:function (facade) { |
var stateId = "XhrIframeProxy" + (this._stateIdCounter++); |
facade._stateId = stateId; |
var frameUrl = this.xipClientUrl + "#0:init:id=" + stateId + "&server=" + encodeURIComponent(facade._ifpServerUrl) + "&fr=false"; |
if (this.needFrameRecursion()) { |
var fullClientUrl = window.location.href; |
if ((this.xipClientUrl + "").charAt(0) == "/") { |
var endIndex = fullClientUrl.indexOf("://"); |
endIndex = fullClientUrl.indexOf("/", endIndex + 1); |
fullClientUrl = fullClientUrl.substring(0, endIndex); |
} else { |
fullClientUrl = fullClientUrl.substring(0, fullClientUrl.lastIndexOf("/") + 1); |
} |
fullClientUrl += this.xipClientUrl; |
var serverUrl = facade._ifpServerUrl + (facade._ifpServerUrl.indexOf("?") == -1 ? "?" : "&") + "dojo.fr=1"; |
frameUrl = serverUrl + "#0:init:id=" + stateId + "&client=" + encodeURIComponent(fullClientUrl) + "&fr=" + this.needFrameRecursion(); |
} |
this._state[stateId] = {facade:facade, stateId:stateId, clientFrame:dojo.io.createIFrame(stateId, "", frameUrl)}; |
return stateId; |
}, receive:function (stateId, urlEncodedData) { |
var response = {}; |
var nvPairs = urlEncodedData.split("&"); |
for (var i = 0; i < nvPairs.length; i++) { |
if (nvPairs[i]) { |
var nameValue = nvPairs[i].split("="); |
response[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]); |
} |
} |
var state = this._state[stateId]; |
var facade = state.facade; |
facade._setResponseHeaders(response.responseHeaders); |
if (response.status == 0 || response.status) { |
facade.status = parseInt(response.status, 10); |
} |
if (response.statusText) { |
facade.statusText = response.statusText; |
} |
if (response.responseText) { |
facade.responseText = response.responseText; |
var contentType = facade.getResponseHeader("Content-Type"); |
if (contentType && (contentType == "application/xml" || contentType == "text/xml")) { |
facade.responseXML = dojo.dom.createDocumentFromText(response.responseText, contentType); |
} |
} |
facade.readyState = 4; |
this.destroyState(stateId); |
}, clientFrameLoaded:function (stateId) { |
var state = this._state[stateId]; |
var facade = state.facade; |
if (this.needFrameRecursion()) { |
var clientWindow = window.open("", state.stateId + "_clientEndPoint"); |
} else { |
var clientWindow = state.clientFrame.contentWindow; |
} |
var reqHeaders = []; |
for (var param in facade._requestHeaders) { |
reqHeaders.push(param + ": " + facade._requestHeaders[param]); |
} |
var requestData = {uri:facade._uri}; |
if (reqHeaders.length > 0) { |
requestData.requestHeaders = reqHeaders.join("\r\n"); |
} |
if (facade._method) { |
requestData.method = facade._method; |
} |
if (facade._bodyData) { |
requestData.data = facade._bodyData; |
} |
clientWindow.send(dojo.io.argsFromMap(requestData, "utf8")); |
}, destroyState:function (stateId) { |
var state = this._state[stateId]; |
if (state) { |
delete this._state[stateId]; |
var parentNode = state.clientFrame.parentNode; |
parentNode.removeChild(state.clientFrame); |
state.clientFrame = null; |
state = null; |
} |
}, createFacade:function () { |
if (arguments && arguments[0] && arguments[0]["iframeProxyUrl"]) { |
return new dojo.io.XhrIframeFacade(arguments[0]["iframeProxyUrl"]); |
} else { |
return dojo.io.XhrIframeProxy.oldGetXmlhttpObject.apply(dojo.hostenv, arguments); |
} |
}}; |
dojo.io.XhrIframeProxy.oldGetXmlhttpObject = dojo.hostenv.getXmlhttpObject; |
dojo.hostenv.getXmlhttpObject = dojo.io.XhrIframeProxy.createFacade; |
dojo.io.XhrIframeFacade = function (ifpServerUrl) { |
this._requestHeaders = {}; |
this._allResponseHeaders = null; |
this._responseHeaders = {}; |
this._method = null; |
this._uri = null; |
this._bodyData = null; |
this.responseText = null; |
this.responseXML = null; |
this.status = null; |
this.statusText = null; |
this.readyState = 0; |
this._ifpServerUrl = ifpServerUrl; |
this._stateId = null; |
}; |
dojo.lang.extend(dojo.io.XhrIframeFacade, {open:function (method, uri) { |
this._method = method; |
this._uri = uri; |
this.readyState = 1; |
}, setRequestHeader:function (header, value) { |
this._requestHeaders[header] = value; |
}, send:function (stringData) { |
this._bodyData = stringData; |
this._stateId = dojo.io.XhrIframeProxy.send(this); |
this.readyState = 2; |
}, abort:function () { |
dojo.io.XhrIframeProxy.destroyState(this._stateId); |
}, getAllResponseHeaders:function () { |
return this._allResponseHeaders; |
}, getResponseHeader:function (header) { |
return this._responseHeaders[header]; |
}, _setResponseHeaders:function (allHeaders) { |
if (allHeaders) { |
this._allResponseHeaders = allHeaders; |
allHeaders = allHeaders.replace(/\r/g, ""); |
var nvPairs = allHeaders.split("\n"); |
for (var i = 0; i < nvPairs.length; i++) { |
if (nvPairs[i]) { |
var nameValue = nvPairs[i].split(": "); |
this._responseHeaders[nameValue[0]] = nameValue[1]; |
} |
} |
} |
}}); |
/branches/v5.0-ouadji/api/js/dojo/src/io/__package__.js |
---|
New file |
0,0 → 1,15 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.kwCompoundRequire({common:["dojo.io.common"], rhino:["dojo.io.RhinoIO"], browser:["dojo.io.BrowserIO", "dojo.io.cookie"], dashboard:["dojo.io.BrowserIO", "dojo.io.cookie"]}); |
dojo.provide("dojo.io.*"); |
/branches/v5.0-ouadji/api/js/dojo/src/io/common.js |
---|
New file |
0,0 → 1,232 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.provide("dojo.io.common"); |
dojo.require("dojo.string"); |
dojo.require("dojo.lang.extras"); |
dojo.io.transports = []; |
dojo.io.hdlrFuncNames = ["load", "error", "timeout"]; |
dojo.io.Request = function (url, mimetype, transport, changeUrl) { |
if ((arguments.length == 1) && (arguments[0].constructor == Object)) { |
this.fromKwArgs(arguments[0]); |
} else { |
this.url = url; |
if (mimetype) { |
this.mimetype = mimetype; |
} |
if (transport) { |
this.transport = transport; |
} |
if (arguments.length >= 4) { |
this.changeUrl = changeUrl; |
} |
} |
}; |
dojo.lang.extend(dojo.io.Request, {url:"", mimetype:"text/plain", method:"GET", content:undefined, transport:undefined, changeUrl:undefined, formNode:undefined, sync:false, bindSuccess:false, useCache:false, preventCache:false, jsonFilter:function (value) { |
if ((this.mimetype == "text/json-comment-filtered") || (this.mimetype == "application/json-comment-filtered")) { |
var cStartIdx = value.indexOf("/*"); |
var cEndIdx = value.lastIndexOf("*/"); |
if ((cStartIdx == -1) || (cEndIdx == -1)) { |
dojo.debug("your JSON wasn't comment filtered!"); |
return ""; |
} |
return value.substring(cStartIdx + 2, cEndIdx); |
} |
dojo.debug("please consider using a mimetype of text/json-comment-filtered to avoid potential security issues with JSON endpoints"); |
return value; |
}, load:function (type, data, transportImplementation, kwArgs) { |
}, error:function (type, error, transportImplementation, kwArgs) { |
}, timeout:function (type, empty, transportImplementation, kwArgs) { |
}, handle:function (type, data, transportImplementation, kwArgs) { |
}, timeoutSeconds:0, abort:function () { |
}, fromKwArgs:function (kwArgs) { |
if (kwArgs["url"]) { |
kwArgs.url = kwArgs.url.toString(); |
} |
if (kwArgs["formNode"]) { |
kwArgs.formNode = dojo.byId(kwArgs.formNode); |
} |
if (!kwArgs["method"] && kwArgs["formNode"] && kwArgs["formNode"].method) { |
kwArgs.method = kwArgs["formNode"].method; |
} |
if (!kwArgs["handle"] && kwArgs["handler"]) { |
kwArgs.handle = kwArgs.handler; |
} |
if (!kwArgs["load"] && kwArgs["loaded"]) { |
kwArgs.load = kwArgs.loaded; |
} |
if (!kwArgs["changeUrl"] && kwArgs["changeURL"]) { |
kwArgs.changeUrl = kwArgs.changeURL; |
} |
kwArgs.encoding = dojo.lang.firstValued(kwArgs["encoding"], djConfig["bindEncoding"], ""); |
kwArgs.sendTransport = dojo.lang.firstValued(kwArgs["sendTransport"], djConfig["ioSendTransport"], false); |
var isFunction = dojo.lang.isFunction; |
for (var x = 0; x < dojo.io.hdlrFuncNames.length; x++) { |
var fn = dojo.io.hdlrFuncNames[x]; |
if (kwArgs[fn] && isFunction(kwArgs[fn])) { |
continue; |
} |
if (kwArgs["handle"] && isFunction(kwArgs["handle"])) { |
kwArgs[fn] = kwArgs.handle; |
} |
} |
dojo.lang.mixin(this, kwArgs); |
}}); |
dojo.io.Error = function (msg, type, num) { |
this.message = msg; |
this.type = type || "unknown"; |
this.number = num || 0; |
}; |
dojo.io.transports.addTransport = function (name) { |
this.push(name); |
this[name] = dojo.io[name]; |
}; |
dojo.io.bind = function (request) { |
if (!(request instanceof dojo.io.Request)) { |
try { |
request = new dojo.io.Request(request); |
} |
catch (e) { |
dojo.debug(e); |
} |
} |
var tsName = ""; |
if (request["transport"]) { |
tsName = request["transport"]; |
if (!this[tsName]) { |
dojo.io.sendBindError(request, "No dojo.io.bind() transport with name '" + request["transport"] + "'."); |
return request; |
} |
if (!this[tsName].canHandle(request)) { |
dojo.io.sendBindError(request, "dojo.io.bind() transport with name '" + request["transport"] + "' cannot handle this type of request."); |
return request; |
} |
} else { |
for (var x = 0; x < dojo.io.transports.length; x++) { |
var tmp = dojo.io.transports[x]; |
if ((this[tmp]) && (this[tmp].canHandle(request))) { |
tsName = tmp; |
break; |
} |
} |
if (tsName == "") { |
dojo.io.sendBindError(request, "None of the loaded transports for dojo.io.bind()" + " can handle the request."); |
return request; |
} |
} |
this[tsName].bind(request); |
request.bindSuccess = true; |
return request; |
}; |
dojo.io.sendBindError = function (request, message) { |
if ((typeof request.error == "function" || typeof request.handle == "function") && (typeof setTimeout == "function" || typeof setTimeout == "object")) { |
var errorObject = new dojo.io.Error(message); |
setTimeout(function () { |
request[(typeof request.error == "function") ? "error" : "handle"]("error", errorObject, null, request); |
}, 50); |
} else { |
dojo.raise(message); |
} |
}; |
dojo.io.queueBind = function (request) { |
if (!(request instanceof dojo.io.Request)) { |
try { |
request = new dojo.io.Request(request); |
} |
catch (e) { |
dojo.debug(e); |
} |
} |
var oldLoad = request.load; |
request.load = function () { |
dojo.io._queueBindInFlight = false; |
var ret = oldLoad.apply(this, arguments); |
dojo.io._dispatchNextQueueBind(); |
return ret; |
}; |
var oldErr = request.error; |
request.error = function () { |
dojo.io._queueBindInFlight = false; |
var ret = oldErr.apply(this, arguments); |
dojo.io._dispatchNextQueueBind(); |
return ret; |
}; |
dojo.io._bindQueue.push(request); |
dojo.io._dispatchNextQueueBind(); |
return request; |
}; |
dojo.io._dispatchNextQueueBind = function () { |
if (!dojo.io._queueBindInFlight) { |
dojo.io._queueBindInFlight = true; |
if (dojo.io._bindQueue.length > 0) { |
dojo.io.bind(dojo.io._bindQueue.shift()); |
} else { |
dojo.io._queueBindInFlight = false; |
} |
} |
}; |
dojo.io._bindQueue = []; |
dojo.io._queueBindInFlight = false; |
dojo.io.argsFromMap = function (map, encoding, last) { |
var enc = /utf/i.test(encoding || "") ? encodeURIComponent : dojo.string.encodeAscii; |
var mapped = []; |
var control = new Object(); |
for (var name in map) { |
var domap = function (elt) { |
var val = enc(name) + "=" + enc(elt); |
mapped[(last == name) ? "push" : "unshift"](val); |
}; |
if (!control[name]) { |
var value = map[name]; |
if (dojo.lang.isArray(value)) { |
dojo.lang.forEach(value, domap); |
} else { |
domap(value); |
} |
} |
} |
return mapped.join("&"); |
}; |
dojo.io.setIFrameSrc = function (iframe, src, replace) { |
try { |
var r = dojo.render.html; |
if (!replace) { |
if (r.safari) { |
iframe.location = src; |
} else { |
frames[iframe.name].location = src; |
} |
} else { |
var idoc; |
if (r.ie) { |
idoc = iframe.contentWindow.document; |
} else { |
if (r.safari) { |
idoc = iframe.document; |
} else { |
idoc = iframe.contentWindow; |
} |
} |
if (!idoc) { |
iframe.location = src; |
return; |
} else { |
idoc.location.replace(src); |
} |
} |
} |
catch (e) { |
dojo.debug(e); |
dojo.debug("setIFrameSrc: " + e); |
} |
}; |
/branches/v5.0-ouadji/api/js/dojo/src/io/cookie.js |
---|
New file |
0,0 → 1,104 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.provide("dojo.io.cookie"); |
dojo.io.cookie.setCookie = function (name, value, days, path, domain, secure) { |
var expires = -1; |
if ((typeof days == "number") && (days >= 0)) { |
var d = new Date(); |
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000)); |
expires = d.toGMTString(); |
} |
value = escape(value); |
document.cookie = name + "=" + value + ";" + (expires != -1 ? " expires=" + expires + ";" : "") + (path ? "path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "; secure" : ""); |
}; |
dojo.io.cookie.set = dojo.io.cookie.setCookie; |
dojo.io.cookie.getCookie = function (name) { |
var idx = document.cookie.lastIndexOf(name + "="); |
if (idx == -1) { |
return null; |
} |
var value = document.cookie.substring(idx + name.length + 1); |
var end = value.indexOf(";"); |
if (end == -1) { |
end = value.length; |
} |
value = value.substring(0, end); |
value = unescape(value); |
return value; |
}; |
dojo.io.cookie.get = dojo.io.cookie.getCookie; |
dojo.io.cookie.deleteCookie = function (name) { |
dojo.io.cookie.setCookie(name, "-", 0); |
}; |
dojo.io.cookie.setObjectCookie = function (name, obj, days, path, domain, secure, clearCurrent) { |
if (arguments.length == 5) { |
clearCurrent = domain; |
domain = null; |
secure = null; |
} |
var pairs = [], cookie, value = ""; |
if (!clearCurrent) { |
cookie = dojo.io.cookie.getObjectCookie(name); |
} |
if (days >= 0) { |
if (!cookie) { |
cookie = {}; |
} |
for (var prop in obj) { |
if (obj[prop] == null) { |
delete cookie[prop]; |
} else { |
if ((typeof obj[prop] == "string") || (typeof obj[prop] == "number")) { |
cookie[prop] = obj[prop]; |
} |
} |
} |
prop = null; |
for (var prop in cookie) { |
pairs.push(escape(prop) + "=" + escape(cookie[prop])); |
} |
value = pairs.join("&"); |
} |
dojo.io.cookie.setCookie(name, value, days, path, domain, secure); |
}; |
dojo.io.cookie.getObjectCookie = function (name) { |
var values = null, cookie = dojo.io.cookie.getCookie(name); |
if (cookie) { |
values = {}; |
var pairs = cookie.split("&"); |
for (var i = 0; i < pairs.length; i++) { |
var pair = pairs[i].split("="); |
var value = pair[1]; |
if (isNaN(value)) { |
value = unescape(pair[1]); |
} |
values[unescape(pair[0])] = value; |
} |
} |
return values; |
}; |
dojo.io.cookie.isSupported = function () { |
if (typeof navigator.cookieEnabled != "boolean") { |
dojo.io.cookie.setCookie("__TestingYourBrowserForCookieSupport__", "CookiesAllowed", 90, null); |
var cookieVal = dojo.io.cookie.getCookie("__TestingYourBrowserForCookieSupport__"); |
navigator.cookieEnabled = (cookieVal == "CookiesAllowed"); |
if (navigator.cookieEnabled) { |
this.deleteCookie("__TestingYourBrowserForCookieSupport__"); |
} |
} |
return navigator.cookieEnabled; |
}; |
if (!dojo.io.cookies) { |
dojo.io.cookies = dojo.io.cookie; |
} |
/branches/v5.0-ouadji/api/js/dojo/src/io/BrowserIO.js |
---|
New file |
0,0 → 1,495 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.provide("dojo.io.BrowserIO"); |
dojo.require("dojo.io.common"); |
dojo.require("dojo.lang.array"); |
dojo.require("dojo.lang.func"); |
dojo.require("dojo.string.extras"); |
dojo.require("dojo.dom"); |
dojo.require("dojo.undo.browser"); |
if (!dj_undef("window")) { |
dojo.io.checkChildrenForFile = function (node) { |
var hasFile = false; |
var inputs = node.getElementsByTagName("input"); |
dojo.lang.forEach(inputs, function (input) { |
if (hasFile) { |
return; |
} |
if (input.getAttribute("type") == "file") { |
hasFile = true; |
} |
}); |
return hasFile; |
}; |
dojo.io.formHasFile = function (formNode) { |
return dojo.io.checkChildrenForFile(formNode); |
}; |
dojo.io.updateNode = function (node, urlOrArgs) { |
node = dojo.byId(node); |
var args = urlOrArgs; |
if (dojo.lang.isString(urlOrArgs)) { |
args = {url:urlOrArgs}; |
} |
args.mimetype = "text/html"; |
args.load = function (t, d, e) { |
while (node.firstChild) { |
dojo.dom.destroyNode(node.firstChild); |
} |
node.innerHTML = d; |
}; |
dojo.io.bind(args); |
}; |
dojo.io.formFilter = function (node) { |
var type = (node.type || "").toLowerCase(); |
return !node.disabled && node.name && !dojo.lang.inArray(["file", "submit", "image", "reset", "button"], type); |
}; |
dojo.io.encodeForm = function (formNode, encoding, formFilter) { |
if ((!formNode) || (!formNode.tagName) || (!formNode.tagName.toLowerCase() == "form")) { |
dojo.raise("Attempted to encode a non-form element."); |
} |
if (!formFilter) { |
formFilter = dojo.io.formFilter; |
} |
var enc = /utf/i.test(encoding || "") ? encodeURIComponent : dojo.string.encodeAscii; |
var values = []; |
for (var i = 0; i < formNode.elements.length; i++) { |
var elm = formNode.elements[i]; |
if (!elm || elm.tagName.toLowerCase() == "fieldset" || !formFilter(elm)) { |
continue; |
} |
var name = enc(elm.name); |
var type = elm.type.toLowerCase(); |
if (type == "select-multiple") { |
for (var j = 0; j < elm.options.length; j++) { |
if (elm.options[j].selected) { |
values.push(name + "=" + enc(elm.options[j].value)); |
} |
} |
} else { |
if (dojo.lang.inArray(["radio", "checkbox"], type)) { |
if (elm.checked) { |
values.push(name + "=" + enc(elm.value)); |
} |
} else { |
values.push(name + "=" + enc(elm.value)); |
} |
} |
} |
var inputs = formNode.getElementsByTagName("input"); |
for (var i = 0; i < inputs.length; i++) { |
var input = inputs[i]; |
if (input.type.toLowerCase() == "image" && input.form == formNode && formFilter(input)) { |
var name = enc(input.name); |
values.push(name + "=" + enc(input.value)); |
values.push(name + ".x=0"); |
values.push(name + ".y=0"); |
} |
} |
return values.join("&") + "&"; |
}; |
dojo.io.FormBind = function (args) { |
this.bindArgs = {}; |
if (args && args.formNode) { |
this.init(args); |
} else { |
if (args) { |
this.init({formNode:args}); |
} |
} |
}; |
dojo.lang.extend(dojo.io.FormBind, {form:null, bindArgs:null, clickedButton:null, init:function (args) { |
var form = dojo.byId(args.formNode); |
if (!form || !form.tagName || form.tagName.toLowerCase() != "form") { |
throw new Error("FormBind: Couldn't apply, invalid form"); |
} else { |
if (this.form == form) { |
return; |
} else { |
if (this.form) { |
throw new Error("FormBind: Already applied to a form"); |
} |
} |
} |
dojo.lang.mixin(this.bindArgs, args); |
this.form = form; |
this.connect(form, "onsubmit", "submit"); |
for (var i = 0; i < form.elements.length; i++) { |
var node = form.elements[i]; |
if (node && node.type && dojo.lang.inArray(["submit", "button"], node.type.toLowerCase())) { |
this.connect(node, "onclick", "click"); |
} |
} |
var inputs = form.getElementsByTagName("input"); |
for (var i = 0; i < inputs.length; i++) { |
var input = inputs[i]; |
if (input.type.toLowerCase() == "image" && input.form == form) { |
this.connect(input, "onclick", "click"); |
} |
} |
}, onSubmit:function (form) { |
return true; |
}, submit:function (e) { |
e.preventDefault(); |
if (this.onSubmit(this.form)) { |
dojo.io.bind(dojo.lang.mixin(this.bindArgs, {formFilter:dojo.lang.hitch(this, "formFilter")})); |
} |
}, click:function (e) { |
var node = e.currentTarget; |
if (node.disabled) { |
return; |
} |
this.clickedButton = node; |
}, formFilter:function (node) { |
var type = (node.type || "").toLowerCase(); |
var accept = false; |
if (node.disabled || !node.name) { |
accept = false; |
} else { |
if (dojo.lang.inArray(["submit", "button", "image"], type)) { |
if (!this.clickedButton) { |
this.clickedButton = node; |
} |
accept = node == this.clickedButton; |
} else { |
accept = !dojo.lang.inArray(["file", "submit", "reset", "button"], type); |
} |
} |
return accept; |
}, connect:function (srcObj, srcFcn, targetFcn) { |
if (dojo.evalObjPath("dojo.event.connect")) { |
dojo.event.connect(srcObj, srcFcn, this, targetFcn); |
} else { |
var fcn = dojo.lang.hitch(this, targetFcn); |
srcObj[srcFcn] = function (e) { |
if (!e) { |
e = window.event; |
} |
if (!e.currentTarget) { |
e.currentTarget = e.srcElement; |
} |
if (!e.preventDefault) { |
e.preventDefault = function () { |
window.event.returnValue = false; |
}; |
} |
fcn(e); |
}; |
} |
}}); |
dojo.io.XMLHTTPTransport = new function () { |
var _this = this; |
var _cache = {}; |
this.useCache = false; |
this.preventCache = false; |
function getCacheKey(url, query, method) { |
return url + "|" + query + "|" + method.toLowerCase(); |
} |
function addToCache(url, query, method, http) { |
_cache[getCacheKey(url, query, method)] = http; |
} |
function getFromCache(url, query, method) { |
return _cache[getCacheKey(url, query, method)]; |
} |
this.clearCache = function () { |
_cache = {}; |
}; |
function doLoad(kwArgs, http, url, query, useCache) { |
if (((http.status >= 200) && (http.status < 300)) || (http.status == 304) || (http.status == 1223) || (location.protocol == "file:" && (http.status == 0 || http.status == undefined)) || (location.protocol == "chrome:" && (http.status == 0 || http.status == undefined))) { |
var ret; |
if (kwArgs.method.toLowerCase() == "head") { |
var headers = http.getAllResponseHeaders(); |
ret = {}; |
ret.toString = function () { |
return headers; |
}; |
var values = headers.split(/[\r\n]+/g); |
for (var i = 0; i < values.length; i++) { |
var pair = values[i].match(/^([^:]+)\s*:\s*(.+)$/i); |
if (pair) { |
ret[pair[1]] = pair[2]; |
} |
} |
} else { |
if (kwArgs.mimetype == "text/javascript") { |
try { |
ret = dj_eval(http.responseText); |
} |
catch (e) { |
dojo.debug(e); |
dojo.debug(http.responseText); |
ret = null; |
} |
} else { |
if (kwArgs.mimetype.substr(0, 9) == "text/json" || kwArgs.mimetype.substr(0, 16) == "application/json") { |
try { |
ret = dj_eval("(" + kwArgs.jsonFilter(http.responseText) + ")"); |
} |
catch (e) { |
dojo.debug(e); |
dojo.debug(http.responseText); |
ret = false; |
} |
} else { |
if ((kwArgs.mimetype == "application/xml") || (kwArgs.mimetype == "text/xml")) { |
ret = http.responseXML; |
if (!ret || typeof ret == "string" || !http.getResponseHeader("Content-Type")) { |
ret = dojo.dom.createDocumentFromText(http.responseText); |
} |
} else { |
ret = http.responseText; |
} |
} |
} |
} |
if (useCache) { |
addToCache(url, query, kwArgs.method, http); |
} |
kwArgs[(typeof kwArgs.load == "function") ? "load" : "handle"]("load", ret, http, kwArgs); |
} else { |
var errObj = new dojo.io.Error("XMLHttpTransport Error: " + http.status + " " + http.statusText); |
kwArgs[(typeof kwArgs.error == "function") ? "error" : "handle"]("error", errObj, http, kwArgs); |
} |
} |
function setHeaders(http, kwArgs) { |
if (kwArgs["headers"]) { |
for (var header in kwArgs["headers"]) { |
if (header.toLowerCase() == "content-type" && !kwArgs["contentType"]) { |
kwArgs["contentType"] = kwArgs["headers"][header]; |
} else { |
http.setRequestHeader(header, kwArgs["headers"][header]); |
} |
} |
} |
} |
this.inFlight = []; |
this.inFlightTimer = null; |
this.startWatchingInFlight = function () { |
if (!this.inFlightTimer) { |
this.inFlightTimer = setTimeout("dojo.io.XMLHTTPTransport.watchInFlight();", 10); |
} |
}; |
this.watchInFlight = function () { |
var now = null; |
if (!dojo.hostenv._blockAsync && !_this._blockAsync) { |
for (var x = this.inFlight.length - 1; x >= 0; x--) { |
try { |
var tif = this.inFlight[x]; |
if (!tif || tif.http._aborted || !tif.http.readyState) { |
this.inFlight.splice(x, 1); |
continue; |
} |
if (4 == tif.http.readyState) { |
this.inFlight.splice(x, 1); |
doLoad(tif.req, tif.http, tif.url, tif.query, tif.useCache); |
} else { |
if (tif.startTime) { |
if (!now) { |
now = (new Date()).getTime(); |
} |
if (tif.startTime + (tif.req.timeoutSeconds * 1000) < now) { |
if (typeof tif.http.abort == "function") { |
tif.http.abort(); |
} |
this.inFlight.splice(x, 1); |
tif.req[(typeof tif.req.timeout == "function") ? "timeout" : "handle"]("timeout", null, tif.http, tif.req); |
} |
} |
} |
} |
catch (e) { |
try { |
var errObj = new dojo.io.Error("XMLHttpTransport.watchInFlight Error: " + e); |
tif.req[(typeof tif.req.error == "function") ? "error" : "handle"]("error", errObj, tif.http, tif.req); |
} |
catch (e2) { |
dojo.debug("XMLHttpTransport error callback failed: " + e2); |
} |
} |
} |
} |
clearTimeout(this.inFlightTimer); |
if (this.inFlight.length == 0) { |
this.inFlightTimer = null; |
return; |
} |
this.inFlightTimer = setTimeout("dojo.io.XMLHTTPTransport.watchInFlight();", 10); |
}; |
var hasXmlHttp = dojo.hostenv.getXmlhttpObject() ? true : false; |
this.canHandle = function (kwArgs) { |
var mlc = kwArgs["mimetype"].toLowerCase() || ""; |
return hasXmlHttp && ((dojo.lang.inArray(["text/plain", "text/html", "application/xml", "text/xml", "text/javascript"], mlc)) || (mlc.substr(0, 9) == "text/json" || mlc.substr(0, 16) == "application/json")) && !(kwArgs["formNode"] && dojo.io.formHasFile(kwArgs["formNode"])); |
}; |
this.multipartBoundary = "45309FFF-BD65-4d50-99C9-36986896A96F"; |
this.bind = function (kwArgs) { |
if (!kwArgs["url"]) { |
if (!kwArgs["formNode"] && (kwArgs["backButton"] || kwArgs["back"] || kwArgs["changeUrl"] || kwArgs["watchForURL"]) && (!djConfig.preventBackButtonFix)) { |
dojo.deprecated("Using dojo.io.XMLHTTPTransport.bind() to add to browser history without doing an IO request", "Use dojo.undo.browser.addToHistory() instead.", "0.4"); |
dojo.undo.browser.addToHistory(kwArgs); |
return true; |
} |
} |
var url = kwArgs.url; |
var query = ""; |
if (kwArgs["formNode"]) { |
var ta = kwArgs.formNode.getAttribute("action"); |
if ((ta) && (!kwArgs["url"])) { |
url = ta; |
} |
var tp = kwArgs.formNode.getAttribute("method"); |
if ((tp) && (!kwArgs["method"])) { |
kwArgs.method = tp; |
} |
query += dojo.io.encodeForm(kwArgs.formNode, kwArgs.encoding, kwArgs["formFilter"]); |
} |
if (url.indexOf("#") > -1) { |
dojo.debug("Warning: dojo.io.bind: stripping hash values from url:", url); |
url = url.split("#")[0]; |
} |
if (kwArgs["file"]) { |
kwArgs.method = "post"; |
} |
if (!kwArgs["method"]) { |
kwArgs.method = "get"; |
} |
if (kwArgs.method.toLowerCase() == "get") { |
kwArgs.multipart = false; |
} else { |
if (kwArgs["file"]) { |
kwArgs.multipart = true; |
} else { |
if (!kwArgs["multipart"]) { |
kwArgs.multipart = false; |
} |
} |
} |
if (kwArgs["backButton"] || kwArgs["back"] || kwArgs["changeUrl"]) { |
dojo.undo.browser.addToHistory(kwArgs); |
} |
var content = kwArgs["content"] || {}; |
if (kwArgs.sendTransport) { |
content["dojo.transport"] = "xmlhttp"; |
} |
do { |
if (kwArgs.postContent) { |
query = kwArgs.postContent; |
break; |
} |
if (content) { |
query += dojo.io.argsFromMap(content, kwArgs.encoding); |
} |
if (kwArgs.method.toLowerCase() == "get" || !kwArgs.multipart) { |
break; |
} |
var t = []; |
if (query.length) { |
var q = query.split("&"); |
for (var i = 0; i < q.length; ++i) { |
if (q[i].length) { |
var p = q[i].split("="); |
t.push("--" + this.multipartBoundary, "Content-Disposition: form-data; name=\"" + p[0] + "\"", "", p[1]); |
} |
} |
} |
if (kwArgs.file) { |
if (dojo.lang.isArray(kwArgs.file)) { |
for (var i = 0; i < kwArgs.file.length; ++i) { |
var o = kwArgs.file[i]; |
t.push("--" + this.multipartBoundary, "Content-Disposition: form-data; name=\"" + o.name + "\"; filename=\"" + ("fileName" in o ? o.fileName : o.name) + "\"", "Content-Type: " + ("contentType" in o ? o.contentType : "application/octet-stream"), "", o.content); |
} |
} else { |
var o = kwArgs.file; |
t.push("--" + this.multipartBoundary, "Content-Disposition: form-data; name=\"" + o.name + "\"; filename=\"" + ("fileName" in o ? o.fileName : o.name) + "\"", "Content-Type: " + ("contentType" in o ? o.contentType : "application/octet-stream"), "", o.content); |
} |
} |
if (t.length) { |
t.push("--" + this.multipartBoundary + "--", ""); |
query = t.join("\r\n"); |
} |
} while (false); |
var async = kwArgs["sync"] ? false : true; |
var preventCache = kwArgs["preventCache"] || (this.preventCache == true && kwArgs["preventCache"] != false); |
var useCache = kwArgs["useCache"] == true || (this.useCache == true && kwArgs["useCache"] != false); |
if (!preventCache && useCache) { |
var cachedHttp = getFromCache(url, query, kwArgs.method); |
if (cachedHttp) { |
doLoad(kwArgs, cachedHttp, url, query, false); |
return; |
} |
} |
var http = dojo.hostenv.getXmlhttpObject(kwArgs); |
var received = false; |
if (async) { |
var startTime = this.inFlight.push({"req":kwArgs, "http":http, "url":url, "query":query, "useCache":useCache, "startTime":kwArgs.timeoutSeconds ? (new Date()).getTime() : 0}); |
this.startWatchingInFlight(); |
} else { |
_this._blockAsync = true; |
} |
if (kwArgs.method.toLowerCase() == "post") { |
if (!kwArgs.user) { |
http.open("POST", url, async); |
} else { |
http.open("POST", url, async, kwArgs.user, kwArgs.password); |
} |
setHeaders(http, kwArgs); |
http.setRequestHeader("Content-Type", kwArgs.multipart ? ("multipart/form-data; boundary=" + this.multipartBoundary) : (kwArgs.contentType || "application/x-www-form-urlencoded")); |
try { |
http.send(query); |
} |
catch (e) { |
if (typeof http.abort == "function") { |
http.abort(); |
} |
doLoad(kwArgs, {status:404}, url, query, useCache); |
} |
} else { |
var tmpUrl = url; |
if (query != "") { |
tmpUrl += (tmpUrl.indexOf("?") > -1 ? "&" : "?") + query; |
} |
if (preventCache) { |
tmpUrl += (dojo.string.endsWithAny(tmpUrl, "?", "&") ? "" : (tmpUrl.indexOf("?") > -1 ? "&" : "?")) + "dojo.preventCache=" + new Date().valueOf(); |
} |
if (!kwArgs.user) { |
http.open(kwArgs.method.toUpperCase(), tmpUrl, async); |
} else { |
http.open(kwArgs.method.toUpperCase(), tmpUrl, async, kwArgs.user, kwArgs.password); |
} |
setHeaders(http, kwArgs); |
try { |
http.send(null); |
} |
catch (e) { |
if (typeof http.abort == "function") { |
http.abort(); |
} |
doLoad(kwArgs, {status:404}, url, query, useCache); |
} |
} |
if (!async) { |
doLoad(kwArgs, http, url, query, useCache); |
_this._blockAsync = false; |
} |
kwArgs.abort = function () { |
try { |
http._aborted = true; |
} |
catch (e) { |
} |
return http.abort(); |
}; |
return; |
}; |
dojo.io.transports.addTransport("XMLHTTPTransport"); |
}; |
} |
/branches/v5.0-ouadji/api/js/dojo/src/io/IframeIO.js |
---|
New file |
0,0 → 1,214 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.provide("dojo.io.IframeIO"); |
dojo.require("dojo.io.BrowserIO"); |
dojo.require("dojo.uri.*"); |
dojo.io.createIFrame = function (fname, onloadstr, uri) { |
if (window[fname]) { |
return window[fname]; |
} |
if (window.frames[fname]) { |
return window.frames[fname]; |
} |
var r = dojo.render.html; |
var cframe = null; |
var turi = uri; |
if (!turi) { |
if (djConfig["useXDomain"] && !djConfig["dojoIframeHistoryUrl"]) { |
dojo.debug("dojo.io.createIFrame: When using cross-domain Dojo builds," + " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl" + " to the path on your domain to iframe_history.html"); |
} |
turi = (djConfig["dojoIframeHistoryUrl"] || dojo.uri.moduleUri("dojo", "../iframe_history.html")) + "#noInit=true"; |
} |
var ifrstr = ((r.ie) && (dojo.render.os.win)) ? "<iframe name=\"" + fname + "\" src=\"" + turi + "\" onload=\"" + onloadstr + "\">" : "iframe"; |
cframe = document.createElement(ifrstr); |
with (cframe) { |
name = fname; |
setAttribute("name", fname); |
id = fname; |
} |
dojo.body().appendChild(cframe); |
window[fname] = cframe; |
with (cframe.style) { |
if (!r.safari) { |
position = "absolute"; |
} |
left = top = "0px"; |
height = width = "1px"; |
visibility = "hidden"; |
} |
if (!r.ie) { |
dojo.io.setIFrameSrc(cframe, turi, true); |
cframe.onload = new Function(onloadstr); |
} |
return cframe; |
}; |
dojo.io.IframeTransport = new function () { |
var _this = this; |
this.currentRequest = null; |
this.requestQueue = []; |
this.iframeName = "dojoIoIframe"; |
this.fireNextRequest = function () { |
try { |
if ((this.currentRequest) || (this.requestQueue.length == 0)) { |
return; |
} |
var cr = this.currentRequest = this.requestQueue.shift(); |
cr._contentToClean = []; |
var fn = cr["formNode"]; |
var content = cr["content"] || {}; |
if (cr.sendTransport) { |
content["dojo.transport"] = "iframe"; |
} |
if (fn) { |
if (content) { |
for (var x in content) { |
if (!fn[x]) { |
var tn; |
if (dojo.render.html.ie) { |
tn = document.createElement("<input type='hidden' name='" + x + "' value='" + content[x] + "'>"); |
fn.appendChild(tn); |
} else { |
tn = document.createElement("input"); |
fn.appendChild(tn); |
tn.type = "hidden"; |
tn.name = x; |
tn.value = content[x]; |
} |
cr._contentToClean.push(x); |
} else { |
fn[x].value = content[x]; |
} |
} |
} |
if (cr["url"]) { |
cr._originalAction = fn.getAttribute("action"); |
fn.setAttribute("action", cr.url); |
} |
if (!fn.getAttribute("method")) { |
fn.setAttribute("method", (cr["method"]) ? cr["method"] : "post"); |
} |
cr._originalTarget = fn.getAttribute("target"); |
fn.setAttribute("target", this.iframeName); |
fn.target = this.iframeName; |
fn.submit(); |
} else { |
var query = dojo.io.argsFromMap(this.currentRequest.content); |
var tmpUrl = cr.url + (cr.url.indexOf("?") > -1 ? "&" : "?") + query; |
dojo.io.setIFrameSrc(this.iframe, tmpUrl, true); |
} |
} |
catch (e) { |
this.iframeOnload(e); |
} |
}; |
this.canHandle = function (kwArgs) { |
return ((dojo.lang.inArray(["text/plain", "text/html", "text/javascript", "text/json", "application/json"], kwArgs["mimetype"])) && (dojo.lang.inArray(["post", "get"], kwArgs["method"].toLowerCase())) && (!((kwArgs["sync"]) && (kwArgs["sync"] == true)))); |
}; |
this.bind = function (kwArgs) { |
if (!this["iframe"]) { |
this.setUpIframe(); |
} |
this.requestQueue.push(kwArgs); |
this.fireNextRequest(); |
return; |
}; |
this.setUpIframe = function () { |
this.iframe = dojo.io.createIFrame(this.iframeName, "dojo.io.IframeTransport.iframeOnload();"); |
}; |
this.iframeOnload = function (errorObject) { |
if (!_this.currentRequest) { |
_this.fireNextRequest(); |
return; |
} |
var req = _this.currentRequest; |
if (req.formNode) { |
var toClean = req._contentToClean; |
for (var i = 0; i < toClean.length; i++) { |
var key = toClean[i]; |
if (dojo.render.html.safari) { |
var fNode = req.formNode; |
for (var j = 0; j < fNode.childNodes.length; j++) { |
var chNode = fNode.childNodes[j]; |
if (chNode.name == key) { |
var pNode = chNode.parentNode; |
pNode.removeChild(chNode); |
break; |
} |
} |
} else { |
var input = req.formNode[key]; |
req.formNode.removeChild(input); |
req.formNode[key] = null; |
} |
} |
if (req["_originalAction"]) { |
req.formNode.setAttribute("action", req._originalAction); |
} |
if (req["_originalTarget"]) { |
req.formNode.setAttribute("target", req._originalTarget); |
req.formNode.target = req._originalTarget; |
} |
} |
var contentDoc = function (iframe_el) { |
var doc = iframe_el.contentDocument || ((iframe_el.contentWindow) && (iframe_el.contentWindow.document)) || ((iframe_el.name) && (document.frames[iframe_el.name]) && (document.frames[iframe_el.name].document)) || null; |
return doc; |
}; |
var value; |
var success = false; |
if (errorObject) { |
this._callError(req, "IframeTransport Request Error: " + errorObject); |
} else { |
var ifd = contentDoc(_this.iframe); |
try { |
var cmt = req.mimetype; |
if ((cmt == "text/javascript") || (cmt == "text/json") || (cmt == "application/json")) { |
var js = ifd.getElementsByTagName("textarea")[0].value; |
if (cmt == "text/json" || cmt == "application/json") { |
js = "(" + js + ")"; |
} |
value = dj_eval(js); |
} else { |
if (cmt == "text/html") { |
value = ifd; |
} else { |
value = ifd.getElementsByTagName("textarea")[0].value; |
} |
} |
success = true; |
} |
catch (e) { |
this._callError(req, "IframeTransport Error: " + e); |
} |
} |
try { |
if (success && dojo.lang.isFunction(req["load"])) { |
req.load("load", value, req); |
} |
} |
catch (e) { |
throw e; |
} |
finally { |
_this.currentRequest = null; |
_this.fireNextRequest(); |
} |
}; |
this._callError = function (req, message) { |
var errObj = new dojo.io.Error(message); |
if (dojo.lang.isFunction(req["error"])) { |
req.error("error", errObj, req); |
} |
}; |
dojo.io.transports.addTransport("IframeTransport"); |
}; |
/branches/v5.0-ouadji/api/js/dojo/src/io/cometd.js |
---|
New file |
0,0 → 1,530 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.require("dojo.io.common"); |
dojo.provide("dojo.io.cometd"); |
dojo.require("dojo.AdapterRegistry"); |
dojo.require("dojo.json"); |
dojo.require("dojo.io.BrowserIO"); |
dojo.require("dojo.io.IframeIO"); |
dojo.require("dojo.io.ScriptSrcIO"); |
dojo.require("dojo.io.cookie"); |
dojo.require("dojo.event.*"); |
dojo.require("dojo.lang.common"); |
dojo.require("dojo.lang.func"); |
cometd = new function () { |
this.initialized = false; |
this.connected = false; |
this.connectionTypes = new dojo.AdapterRegistry(true); |
this.version = 0.1; |
this.minimumVersion = 0.1; |
this.clientId = null; |
this._isXD = false; |
this.handshakeReturn = null; |
this.currentTransport = null; |
this.url = null; |
this.lastMessage = null; |
this.globalTopicChannels = {}; |
this.backlog = []; |
this.tunnelInit = function (childLocation, childDomain) { |
}; |
this.tunnelCollapse = function () { |
dojo.debug("tunnel collapsed!"); |
}; |
this.init = function (props, root, bargs) { |
props = props || {}; |
props.version = this.version; |
props.minimumVersion = this.minimumVersion; |
props.channel = "/meta/handshake"; |
this.url = root || djConfig["cometdRoot"]; |
if (!this.url) { |
dojo.debug("no cometd root specified in djConfig and no root passed"); |
return; |
} |
var bindArgs = {url:this.url, method:"POST", mimetype:"text/json", load:dojo.lang.hitch(this, "finishInit"), content:{"message":dojo.json.serialize([props])}}; |
var regexp = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"; |
var r = ("" + window.location).match(new RegExp(regexp)); |
if (r[4]) { |
var tmp = r[4].split(":"); |
var thisHost = tmp[0]; |
var thisPort = tmp[1] || "80"; |
r = this.url.match(new RegExp(regexp)); |
if (r[4]) { |
tmp = r[4].split(":"); |
var urlHost = tmp[0]; |
var urlPort = tmp[1] || "80"; |
if ((urlHost != thisHost) || (urlPort != thisPort)) { |
dojo.debug(thisHost, urlHost); |
dojo.debug(thisPort, urlPort); |
this._isXD = true; |
bindArgs.transport = "ScriptSrcTransport"; |
bindArgs.jsonParamName = "jsonp"; |
bindArgs.method = "GET"; |
} |
} |
} |
if (bargs) { |
dojo.lang.mixin(bindArgs, bargs); |
} |
return dojo.io.bind(bindArgs); |
}; |
this.finishInit = function (type, data, evt, request) { |
data = data[0]; |
this.handshakeReturn = data; |
if (data["authSuccessful"] == false) { |
dojo.debug("cometd authentication failed"); |
return; |
} |
if (data.version < this.minimumVersion) { |
dojo.debug("cometd protocol version mismatch. We wanted", this.minimumVersion, "but got", data.version); |
return; |
} |
this.currentTransport = this.connectionTypes.match(data.supportedConnectionTypes, data.version, this._isXD); |
this.currentTransport.version = data.version; |
this.clientId = data.clientId; |
this.tunnelInit = dojo.lang.hitch(this.currentTransport, "tunnelInit"); |
this.tunnelCollapse = dojo.lang.hitch(this.currentTransport, "tunnelCollapse"); |
this.initialized = true; |
this.currentTransport.startup(data); |
while (this.backlog.length != 0) { |
var cur = this.backlog.shift(); |
var fn = cur.shift(); |
this[fn].apply(this, cur); |
} |
}; |
this._getRandStr = function () { |
return Math.random().toString().substring(2, 10); |
}; |
this.deliver = function (messages) { |
dojo.lang.forEach(messages, this._deliver, this); |
}; |
this._deliver = function (message) { |
if (!message["channel"]) { |
dojo.debug("cometd error: no channel for message!"); |
return; |
} |
if (!this.currentTransport) { |
this.backlog.push(["deliver", message]); |
return; |
} |
this.lastMessage = message; |
if ((message.channel.length > 5) && (message.channel.substr(0, 5) == "/meta")) { |
switch (message.channel) { |
case "/meta/subscribe": |
if (!message.successful) { |
dojo.debug("cometd subscription error for channel", message.channel, ":", message.error); |
return; |
} |
this.subscribed(message.subscription, message); |
break; |
case "/meta/unsubscribe": |
if (!message.successful) { |
dojo.debug("cometd unsubscription error for channel", message.channel, ":", message.error); |
return; |
} |
this.unsubscribed(message.subscription, message); |
break; |
} |
} |
this.currentTransport.deliver(message); |
if (message.data) { |
var tname = (this.globalTopicChannels[message.channel]) ? message.channel : "/cometd" + message.channel; |
dojo.event.topic.publish(tname, message); |
} |
}; |
this.disconnect = function () { |
if (!this.currentTransport) { |
dojo.debug("no current transport to disconnect from"); |
return; |
} |
this.currentTransport.disconnect(); |
}; |
this.publish = function (channel, data, properties) { |
if (!this.currentTransport) { |
this.backlog.push(["publish", channel, data, properties]); |
return; |
} |
var message = {data:data, channel:channel}; |
if (properties) { |
dojo.lang.mixin(message, properties); |
} |
return this.currentTransport.sendMessage(message); |
}; |
this.subscribe = function (channel, useLocalTopics, objOrFunc, funcName) { |
if (!this.currentTransport) { |
this.backlog.push(["subscribe", channel, useLocalTopics, objOrFunc, funcName]); |
return; |
} |
if (objOrFunc) { |
var tname = (useLocalTopics) ? channel : "/cometd" + channel; |
if (useLocalTopics) { |
this.globalTopicChannels[channel] = true; |
} |
dojo.event.topic.subscribe(tname, objOrFunc, funcName); |
} |
return this.currentTransport.sendMessage({channel:"/meta/subscribe", subscription:channel}); |
}; |
this.subscribed = function (channel, message) { |
dojo.debug(channel); |
dojo.debugShallow(message); |
}; |
this.unsubscribe = function (channel, useLocalTopics, objOrFunc, funcName) { |
if (!this.currentTransport) { |
this.backlog.push(["unsubscribe", channel, useLocalTopics, objOrFunc, funcName]); |
return; |
} |
if (objOrFunc) { |
var tname = (useLocalTopics) ? channel : "/cometd" + channel; |
dojo.event.topic.unsubscribe(tname, objOrFunc, funcName); |
} |
return this.currentTransport.sendMessage({channel:"/meta/unsubscribe", subscription:channel}); |
}; |
this.unsubscribed = function (channel, message) { |
dojo.debug(channel); |
dojo.debugShallow(message); |
}; |
}; |
cometd.iframeTransport = new function () { |
this.connected = false; |
this.connectionId = null; |
this.rcvNode = null; |
this.rcvNodeName = ""; |
this.phonyForm = null; |
this.authToken = null; |
this.lastTimestamp = null; |
this.lastId = null; |
this.backlog = []; |
this.check = function (types, version, xdomain) { |
return ((!xdomain) && (!dojo.render.html.safari) && (dojo.lang.inArray(types, "iframe"))); |
}; |
this.tunnelInit = function () { |
this.postToIframe({message:dojo.json.serialize([{channel:"/meta/connect", clientId:cometd.clientId, connectionType:"iframe"}])}); |
}; |
this.tunnelCollapse = function () { |
if (this.connected) { |
this.connected = false; |
this.postToIframe({message:dojo.json.serialize([{channel:"/meta/reconnect", clientId:cometd.clientId, connectionId:this.connectionId, timestamp:this.lastTimestamp, id:this.lastId}])}); |
} |
}; |
this.deliver = function (message) { |
if (message["timestamp"]) { |
this.lastTimestamp = message.timestamp; |
} |
if (message["id"]) { |
this.lastId = message.id; |
} |
if ((message.channel.length > 5) && (message.channel.substr(0, 5) == "/meta")) { |
switch (message.channel) { |
case "/meta/connect": |
if (!message.successful) { |
dojo.debug("cometd connection error:", message.error); |
return; |
} |
this.connectionId = message.connectionId; |
this.connected = true; |
this.processBacklog(); |
break; |
case "/meta/reconnect": |
if (!message.successful) { |
dojo.debug("cometd reconnection error:", message.error); |
return; |
} |
this.connected = true; |
break; |
case "/meta/subscribe": |
if (!message.successful) { |
dojo.debug("cometd subscription error for channel", message.channel, ":", message.error); |
return; |
} |
dojo.debug(message.channel); |
break; |
} |
} |
}; |
this.widenDomain = function (domainStr) { |
var cd = domainStr || document.domain; |
if (cd.indexOf(".") == -1) { |
return; |
} |
var dps = cd.split("."); |
if (dps.length <= 2) { |
return; |
} |
dps = dps.slice(dps.length - 2); |
document.domain = dps.join("."); |
return document.domain; |
}; |
this.postToIframe = function (content, url) { |
if (!this.phonyForm) { |
if (dojo.render.html.ie) { |
this.phonyForm = document.createElement("<form enctype='application/x-www-form-urlencoded' method='POST' style='display: none;'>"); |
dojo.body().appendChild(this.phonyForm); |
} else { |
this.phonyForm = document.createElement("form"); |
this.phonyForm.style.display = "none"; |
dojo.body().appendChild(this.phonyForm); |
this.phonyForm.enctype = "application/x-www-form-urlencoded"; |
this.phonyForm.method = "POST"; |
} |
} |
this.phonyForm.action = url || cometd.url; |
this.phonyForm.target = this.rcvNodeName; |
this.phonyForm.setAttribute("target", this.rcvNodeName); |
while (this.phonyForm.firstChild) { |
this.phonyForm.removeChild(this.phonyForm.firstChild); |
} |
for (var x in content) { |
var tn; |
if (dojo.render.html.ie) { |
tn = document.createElement("<input type='hidden' name='" + x + "' value='" + content[x] + "'>"); |
this.phonyForm.appendChild(tn); |
} else { |
tn = document.createElement("input"); |
this.phonyForm.appendChild(tn); |
tn.type = "hidden"; |
tn.name = x; |
tn.value = content[x]; |
} |
} |
this.phonyForm.submit(); |
}; |
this.processBacklog = function () { |
while (this.backlog.length > 0) { |
this.sendMessage(this.backlog.shift(), true); |
} |
}; |
this.sendMessage = function (message, bypassBacklog) { |
if ((bypassBacklog) || (this.connected)) { |
message.connectionId = this.connectionId; |
message.clientId = cometd.clientId; |
var bindArgs = {url:cometd.url || djConfig["cometdRoot"], method:"POST", mimetype:"text/json", content:{message:dojo.json.serialize([message])}}; |
return dojo.io.bind(bindArgs); |
} else { |
this.backlog.push(message); |
} |
}; |
this.startup = function (handshakeData) { |
dojo.debug("startup!"); |
dojo.debug(dojo.json.serialize(handshakeData)); |
if (this.connected) { |
return; |
} |
this.rcvNodeName = "cometdRcv_" + cometd._getRandStr(); |
var initUrl = cometd.url + "/?tunnelInit=iframe"; |
if (false && dojo.render.html.ie) { |
this.rcvNode = new ActiveXObject("htmlfile"); |
this.rcvNode.open(); |
this.rcvNode.write("<html>"); |
this.rcvNode.write("<script>document.domain = '" + document.domain + "'"); |
this.rcvNode.write("</html>"); |
this.rcvNode.close(); |
var ifrDiv = this.rcvNode.createElement("div"); |
this.rcvNode.appendChild(ifrDiv); |
this.rcvNode.parentWindow.dojo = dojo; |
ifrDiv.innerHTML = "<iframe src='" + initUrl + "'></iframe>"; |
} else { |
this.rcvNode = dojo.io.createIFrame(this.rcvNodeName, "", initUrl); |
} |
}; |
}; |
cometd.mimeReplaceTransport = new function () { |
this.connected = false; |
this.connectionId = null; |
this.xhr = null; |
this.authToken = null; |
this.lastTimestamp = null; |
this.lastId = null; |
this.backlog = []; |
this.check = function (types, version, xdomain) { |
return ((!xdomain) && (dojo.render.html.mozilla) && (dojo.lang.inArray(types, "mime-message-block"))); |
}; |
this.tunnelInit = function () { |
if (this.connected) { |
return; |
} |
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/connect", clientId:cometd.clientId, connectionType:"mime-message-block"}])}); |
this.connected = true; |
}; |
this.tunnelCollapse = function () { |
if (this.connected) { |
this.connected = false; |
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/reconnect", clientId:cometd.clientId, connectionId:this.connectionId, timestamp:this.lastTimestamp, id:this.lastId}])}); |
} |
}; |
this.deliver = cometd.iframeTransport.deliver; |
this.handleOnLoad = function (resp) { |
cometd.deliver(dojo.json.evalJson(this.xhr.responseText)); |
}; |
this.openTunnelWith = function (content, url) { |
this.xhr = dojo.hostenv.getXmlhttpObject(); |
this.xhr.multipart = true; |
if (dojo.render.html.mozilla) { |
this.xhr.addEventListener("load", dojo.lang.hitch(this, "handleOnLoad"), false); |
} else { |
if (dojo.render.html.safari) { |
dojo.debug("Webkit is broken with multipart responses over XHR = ("); |
this.xhr.onreadystatechange = dojo.lang.hitch(this, "handleOnLoad"); |
} else { |
this.xhr.onload = dojo.lang.hitch(this, "handleOnLoad"); |
} |
} |
this.xhr.open("POST", (url || cometd.url), true); |
this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); |
dojo.debug(dojo.json.serialize(content)); |
this.xhr.send(dojo.io.argsFromMap(content, "utf8")); |
}; |
this.processBacklog = function () { |
while (this.backlog.length > 0) { |
this.sendMessage(this.backlog.shift(), true); |
} |
}; |
this.sendMessage = function (message, bypassBacklog) { |
if ((bypassBacklog) || (this.connected)) { |
message.connectionId = this.connectionId; |
message.clientId = cometd.clientId; |
var bindArgs = {url:cometd.url || djConfig["cometdRoot"], method:"POST", mimetype:"text/json", content:{message:dojo.json.serialize([message])}}; |
return dojo.io.bind(bindArgs); |
} else { |
this.backlog.push(message); |
} |
}; |
this.startup = function (handshakeData) { |
dojo.debugShallow(handshakeData); |
if (this.connected) { |
return; |
} |
this.tunnelInit(); |
}; |
}; |
cometd.longPollTransport = new function () { |
this.connected = false; |
this.connectionId = null; |
this.authToken = null; |
this.lastTimestamp = null; |
this.lastId = null; |
this.backlog = []; |
this.check = function (types, version, xdomain) { |
return ((!xdomain) && (dojo.lang.inArray(types, "long-polling"))); |
}; |
this.tunnelInit = function () { |
if (this.connected) { |
return; |
} |
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/connect", clientId:cometd.clientId, connectionType:"long-polling"}])}); |
this.connected = true; |
}; |
this.tunnelCollapse = function () { |
if (!this.connected) { |
this.connected = false; |
dojo.debug("clientId:", cometd.clientId); |
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/reconnect", connectionType:"long-polling", clientId:cometd.clientId, connectionId:this.connectionId, timestamp:this.lastTimestamp, id:this.lastId}])}); |
} |
}; |
this.deliver = cometd.iframeTransport.deliver; |
this.openTunnelWith = function (content, url) { |
dojo.io.bind({url:(url || cometd.url), method:"post", content:content, mimetype:"text/json", load:dojo.lang.hitch(this, function (type, data, evt, args) { |
cometd.deliver(data); |
this.connected = false; |
this.tunnelCollapse(); |
}), error:function () { |
dojo.debug("tunnel opening failed"); |
}}); |
this.connected = true; |
}; |
this.processBacklog = function () { |
while (this.backlog.length > 0) { |
this.sendMessage(this.backlog.shift(), true); |
} |
}; |
this.sendMessage = function (message, bypassBacklog) { |
if ((bypassBacklog) || (this.connected)) { |
message.connectionId = this.connectionId; |
message.clientId = cometd.clientId; |
var bindArgs = {url:cometd.url || djConfig["cometdRoot"], method:"post", mimetype:"text/json", content:{message:dojo.json.serialize([message])}, load:dojo.lang.hitch(this, function (type, data, evt, args) { |
cometd.deliver(data); |
})}; |
return dojo.io.bind(bindArgs); |
} else { |
this.backlog.push(message); |
} |
}; |
this.startup = function (handshakeData) { |
if (this.connected) { |
return; |
} |
this.tunnelInit(); |
}; |
}; |
cometd.callbackPollTransport = new function () { |
this.connected = false; |
this.connectionId = null; |
this.authToken = null; |
this.lastTimestamp = null; |
this.lastId = null; |
this.backlog = []; |
this.check = function (types, version, xdomain) { |
return dojo.lang.inArray(types, "callback-polling"); |
}; |
this.tunnelInit = function () { |
if (this.connected) { |
return; |
} |
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/connect", clientId:cometd.clientId, connectionType:"callback-polling"}])}); |
this.connected = true; |
}; |
this.tunnelCollapse = function () { |
if (!this.connected) { |
this.connected = false; |
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/reconnect", connectionType:"long-polling", clientId:cometd.clientId, connectionId:this.connectionId, timestamp:this.lastTimestamp, id:this.lastId}])}); |
} |
}; |
this.deliver = cometd.iframeTransport.deliver; |
this.openTunnelWith = function (content, url) { |
var req = dojo.io.bind({url:(url || cometd.url), content:content, mimetype:"text/json", transport:"ScriptSrcTransport", jsonParamName:"jsonp", load:dojo.lang.hitch(this, function (type, data, evt, args) { |
cometd.deliver(data); |
this.connected = false; |
this.tunnelCollapse(); |
}), error:function () { |
dojo.debug("tunnel opening failed"); |
}}); |
this.connected = true; |
}; |
this.processBacklog = function () { |
while (this.backlog.length > 0) { |
this.sendMessage(this.backlog.shift(), true); |
} |
}; |
this.sendMessage = function (message, bypassBacklog) { |
if ((bypassBacklog) || (this.connected)) { |
message.connectionId = this.connectionId; |
message.clientId = cometd.clientId; |
var bindArgs = {url:cometd.url || djConfig["cometdRoot"], mimetype:"text/json", transport:"ScriptSrcTransport", jsonParamName:"jsonp", content:{message:dojo.json.serialize([message])}, load:dojo.lang.hitch(this, function (type, data, evt, args) { |
cometd.deliver(data); |
})}; |
return dojo.io.bind(bindArgs); |
} else { |
this.backlog.push(message); |
} |
}; |
this.startup = function (handshakeData) { |
if (this.connected) { |
return; |
} |
this.tunnelInit(); |
}; |
}; |
cometd.connectionTypes.register("mime-message-block", cometd.mimeReplaceTransport.check, cometd.mimeReplaceTransport); |
cometd.connectionTypes.register("long-polling", cometd.longPollTransport.check, cometd.longPollTransport); |
cometd.connectionTypes.register("callback-polling", cometd.callbackPollTransport.check, cometd.callbackPollTransport); |
cometd.connectionTypes.register("iframe", cometd.iframeTransport.check, cometd.iframeTransport); |
dojo.io.cometd = cometd; |
/branches/v5.0-ouadji/api/js/dojo/src/io/xip_server.html |
---|
New file |
0,0 → 1,386 |
<!-- |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
Pieces taken from Dojo source to make this file stand-alone |
--> |
<html> |
<head> |
<title></title> |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta> |
<script type="text/javascript" src="isAllowed.js"></script> |
<!-- |
BY DEFAULT THIS FILE DOES NOT WORK SO THAT YOU DON'T ACCIDENTALLY EXPOSE |
ALL OF YOUR XHR-ENABLED SERVICES ON YOUR SITE. |
In order for this file to work, you need to uncomment the script element, |
and you should define a function with the following signature: |
function isAllowedRequest(request){ |
return false; |
} |
Return true out of the function if you want to allow the cross-domain request. |
DON'T DEFINE THIS FUNCTION IN THIS FILE! Define it in a separate file called isAllowed.js |
and include it in this page with a script tag that has a src attribute pointing to the file. |
See the very first script tag in this file for an example. You do not have to place the |
script file in the same directory as this file, just update the path above if you move it |
somewhere else. |
Customize the isAllowedRequest function to restrict what types of requests are allowed |
for this server. The request object has the following properties: |
- requestHeaders: an object with the request headers that are to be added to |
the XHR request. |
- method: the HTTP method (GET, POST, etc...) |
- uri: The URI for the request. |
- data: The URL-encoded data for the request. For a GET request, this would |
be the querystring parameters. For a POST request, it wll be the |
body data. |
See xip_client.html for more info on the xip fragment identifier protocol. |
--> |
<!-- Security protection: uncomment the script tag to enable. --> |
<!-- script type="text/javascript" --> |
// <!-- |
//Core XHR handling taken from Dojo IO code. |
dojo = {}; |
dojo.hostenv = {}; |
// These are in order of decreasing likelihood; this will change in time. |
dojo.hostenv._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0']; |
dojo.hostenv.getXmlhttpObject = function(){ |
var http = null; |
var last_e = null; |
try{ http = new XMLHttpRequest(); }catch(e){} |
if(!http){ |
for(var i=0; i<3; ++i){ |
var progid = dojo.hostenv._XMLHTTP_PROGIDS[i]; |
try{ |
http = new ActiveXObject(progid); |
}catch(e){ |
last_e = e; |
} |
if(http){ |
dojo.hostenv._XMLHTTP_PROGIDS = [progid]; // so faster next time |
break; |
} |
} |
/*if(http && !http.toString) { |
http.toString = function() { "[object XMLHttpRequest]"; } |
}*/ |
} |
if(!http){ |
throw "xip_server.html: XMLHTTP not available: " + last_e; |
} |
return http; |
} |
dojo.setHeaders = function(http, headers){ |
if(headers) { |
for(var header in headers) { |
var headerValue = headers[header]; |
http.setRequestHeader(header, headerValue); |
} |
} |
} |
//MSIE has the lowest limit for URLs with fragment identifiers, |
//at around 4K. Choosing a slightly smaller number for good measure. |
xipUrlLimit = 4000; |
xipIdCounter = 1; |
function xipServerInit(){ |
xipStateId = ""; |
xipCurrentHash = ""; |
xipRequestMessage = ""; |
xipResponseParts = []; |
xipPartIndex = 0; |
} |
function pollHash(){ |
//Can't use location.hash because at least Firefox does a decodeURIComponent on it. |
var urlParts = window.location.href.split("#"); |
if(urlParts.length == 2){ |
var newHash = urlParts[1]; |
if(newHash != xipCurrentHash){ |
try{ |
messageReceived(newHash); |
}catch(e){ |
//Make sure to not keep processing the error hash value. |
xipCurrentHash = newHash; |
throw e; |
} |
xipCurrentHash = newHash; |
} |
} |
} |
function messageReceived(encodedData){ |
var msg = unpackMessage(encodedData); |
switch(msg.command){ |
case "ok": |
sendResponsePart(); |
break; |
case "start": |
xipRequestMessage = ""; |
xipRequestMessage += msg.message; |
setClientUrl("ok"); |
break; |
case "part": |
xipRequestMessage += msg.message; |
setClientUrl("ok"); |
break; |
case "end": |
setClientUrl("ok"); |
xipRequestMessage += msg.message; |
sendXhr(); |
break; |
} |
} |
function sendResponse(encodedData){ |
//Break the message into parts, if necessary. |
xipResponseParts = []; |
var resData = encodedData; |
var urlLength = xipClientUrl.length; |
var partLength = xipUrlLimit - urlLength; |
var resIndex = 0; |
while((resData.length - resIndex) + urlLength > xipUrlLimit){ |
var part = resData.substring(resIndex, resIndex + partLength); |
//Safari will do some extra hex escaping unless we keep the original hex |
//escaping complete. |
var percentIndex = part.lastIndexOf("%"); |
if(percentIndex == part.length - 1 || percentIndex == part.length - 2){ |
part = part.substring(0, percentIndex); |
} |
xipResponseParts.push(part); |
resIndex += part.length; |
} |
xipResponseParts.push(resData.substring(resIndex, resData.length)); |
xipPartIndex = 0; |
sendResponsePart(); |
} |
function sendResponsePart(){ |
if(xipPartIndex < xipResponseParts.length){ |
//Get the message part. |
var partData = xipResponseParts[xipPartIndex]; |
//Get the command. |
var cmd = "part"; |
if(xipPartIndex + 1 == xipResponseParts.length){ |
cmd = "end"; |
}else if (xipPartIndex == 0){ |
cmd = "start"; |
} |
setClientUrl(cmd, partData); |
xipPartIndex++; |
}else{ |
xipServerInit(); |
} |
} |
function setClientUrl(cmd, message){ |
var clientUrl = makeClientUrl(cmd, message); |
//Safari won't let us replace across domains. |
if(navigator.userAgent.indexOf("Safari") == -1){ |
parent.location.replace(clientUrl); |
}else{ |
parent.location = clientUrl; |
} |
} |
function makeClientUrl(cmd, message){ |
var clientUrl = xipClientUrl + "#" + (xipIdCounter++) + ":" + cmd; |
if(message){ |
clientUrl += ":" + message; |
} |
return clientUrl |
} |
function xhrDone(xhr){ |
/* Need to pull off and return the following data: |
- responseHeaders |
- status |
- statusText |
- responseText |
*/ |
var response = {}; |
if(typeof(xhr.getAllResponseHeaders) != "undefined"){ |
var allHeaders = xhr.getAllResponseHeaders(); |
if(allHeaders){ |
response.responseHeaders = allHeaders; |
} |
} |
if(xhr.status == 0 || xhr.status){ |
response.status = xhr.status; |
} |
if(xhr.statusText){ |
response.statusText = xhr.statusText; |
} |
if(xhr.responseText){ |
response.responseText = xhr.responseText; |
} |
//Build a string of the response object. |
var result = ""; |
var isFirst = true; |
for (var param in response){ |
if(isFirst){ |
isFirst = false; |
}else{ |
result += "&"; |
} |
result += param + "=" + encodeURIComponent(response[param]); |
} |
sendResponse(result); |
} |
function sendXhr(){ |
var request = {}; |
var nvPairs = xipRequestMessage.split("&"); |
var i = 0; |
var nameValue = null; |
for(i = 0; i < nvPairs.length; i++){ |
if(nvPairs[i]){ |
var nameValue = nvPairs[i].split("="); |
request[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]); |
} |
} |
//Split up the request headers, if any. |
var headers = {}; |
if(request.requestHeaders){ |
nvPairs = request.requestHeaders.split("\r\n"); |
for(i = 0; i < nvPairs.length; i++){ |
if(nvPairs[i]){ |
nameValue = nvPairs[i].split(": "); |
headers[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]); |
} |
} |
request.requestHeaders = headers; |
} |
if(isAllowedRequest(request)){ |
//The request is allowed, so set up the XHR object. |
var xhr = dojo.hostenv.getXmlhttpObject(); |
//Start timer to look for readyState. |
var xhrIntervalId = setInterval(function(){ |
if(xhr.readyState == 4){ |
clearInterval(xhrIntervalId); |
xhrDone(xhr); |
} |
}, 10); |
//Actually start up the XHR request. |
xhr.open(request.method, request.uri, true); |
dojo.setHeaders(xhr, request.requestHeaders); |
var content = ""; |
if(request.data){ |
content = request.data; |
} |
try{ |
xhr.send(content); |
}catch(e){ |
if(typeof xhr.abort == "function"){ |
xhr.abort(); |
xhrDone({status: 404, statusText: "xip_server.html error: " + e}); |
} |
} |
} |
} |
function unpackMessage(encodedMessage){ |
var parts = encodedMessage.split(":"); |
var command = parts[1]; |
encodedMessage = parts[2] || ""; |
var config = null; |
if(command == "init"){ |
var configParts = encodedMessage.split("&"); |
config = {}; |
for(var i = 0; i < configParts.length; i++){ |
var nameValue = configParts[i].split("="); |
config[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]); |
} |
} |
return {command: command, message: encodedMessage, config: config}; |
} |
function onServerLoad(){ |
xipServerInit(); |
//Decode the init params |
var config = unpackMessage(window.location.href.split("#")[1]).config; |
xipStateId = config.id; |
xipClientUrl = config.client; |
//Make sure we don't have a javascript: url, just for good measure. |
if(xipClientUrl.split(":")[0].match(/javascript/i)){ |
throw "Invalid client URL"; |
} |
if(!xipStateId.match(/^XhrIframeProxy[0-9]+$/)){ |
throw "Invalid state ID"; |
} |
xipUseFrameRecursion = config["fr"]; |
setInterval(pollHash, 10); |
if(xipUseFrameRecursion == "true"){ |
var serverUrl = window.location.href.split("#")[0]; |
document.getElementById("iframeHolder").innerHTML = '<iframe name="' |
+ xipStateId + '_clientEndPoint' |
+ '" src="javascript:false">' |
+ '</iframe>'; |
var iframeNode = document.getElementsByTagName("iframe")[0]; |
iframeNode.src = makeClientUrl("init", 'id=' + xipStateId + '&server=' |
+ encodeURIComponent(serverUrl) + '&fr=endpoint'); |
}else{ |
setClientUrl("loaded"); |
} |
} |
if(typeof(window.addEventListener) == "undefined"){ |
window.attachEvent("onload", onServerLoad); |
}else{ |
window.addEventListener('load', onServerLoad, false); |
} |
// --> |
</script> |
</head> |
<body> |
<h4>The Dojo Toolkit -- xip_server.html</h4> |
<p>This file is used for Dojo's XMLHttpRequest Iframe Proxy. This is the the file |
that should go on the server that will actually be doing the XHR request.</p> |
<div id="iframeHolder"></div> |
</body> |
</html> |
/branches/v5.0-ouadji/api/js/dojo/src/io/RepubsubIO.js |
---|
New file |
0,0 → 1,337 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.require("dojo.event.*"); |
dojo.require("dojo.io.BrowserIO"); |
dojo.provide("dojo.io.RepubsubIO"); |
dojo.io.repubsubTranport = new function () { |
var rps = dojo.io.repubsub; |
this.canHandle = function (kwArgs) { |
if ((kwArgs["mimetype"] == "text/javascript") && (kwArgs["method"] == "repubsub")) { |
return true; |
} |
return false; |
}; |
this.bind = function (kwArgs) { |
if (!rps.isInitialized) { |
rps.init(); |
} |
if (!rps.topics[kwArgs.url]) { |
kwArgs.rpsLoad = function (evt) { |
kwArgs.load("load", evt); |
}; |
rps.subscribe(kwArgs.url, kwArgs, "rpsLoad"); |
} |
if (kwArgs["content"]) { |
var cEvt = dojo.io.repubsubEvent.initFromProperties(kwArgs.content); |
rps.publish(kwArgs.url, cEvt); |
} |
}; |
dojo.io.transports.addTransport("repubsubTranport"); |
}; |
dojo.io.repubsub = new function () { |
this.initDoc = "init.html"; |
this.isInitialized = false; |
this.subscriptionBacklog = []; |
this.debug = true; |
this.rcvNodeName = null; |
this.sndNodeName = null; |
this.rcvNode = null; |
this.sndNode = null; |
this.canRcv = false; |
this.canSnd = false; |
this.canLog = false; |
this.sndTimer = null; |
this.windowRef = window; |
this.backlog = []; |
this.tunnelInitCount = 0; |
this.tunnelFrameKey = "tunnel_frame"; |
this.serverBaseURL = location.protocol + "//" + location.host + location.pathname; |
this.logBacklog = []; |
this.getRandStr = function () { |
return Math.random().toString().substring(2, 10); |
}; |
this.userid = "guest"; |
this.tunnelID = this.getRandStr(); |
this.attachPathList = []; |
this.topics = []; |
this.parseGetStr = function () { |
var baseUrl = document.location.toString(); |
var params = baseUrl.split("?", 2); |
if (params.length > 1) { |
var paramStr = params[1]; |
var pairs = paramStr.split("&"); |
var opts = []; |
for (var x in pairs) { |
var sp = pairs[x].split("="); |
try { |
opts[sp[0]] = eval(sp[1]); |
} |
catch (e) { |
opts[sp[0]] = sp[1]; |
} |
} |
return opts; |
} else { |
return []; |
} |
}; |
var getOpts = this.parseGetStr(); |
for (var x in getOpts) { |
this[x] = getOpts[x]; |
} |
if (!this["tunnelURI"]) { |
this.tunnelURI = ["/who/", escape(this.userid), "/s/", this.getRandStr(), "/kn_journal"].join(""); |
} |
if (window["repubsubOpts"] || window["rpsOpts"]) { |
var optObj = window["repubsubOpts"] || window["rpsOpts"]; |
for (var x in optObj) { |
this[x] = optObj[x]; |
} |
} |
this.tunnelCloseCallback = function () { |
dojo.io.setIFrameSrc(this.rcvNode, this.initDoc + "?callback=repubsub.rcvNodeReady&domain=" + document.domain); |
}; |
this.receiveEventFromTunnel = function (evt, srcWindow) { |
if (!evt["elements"]) { |
this.log("bailing! event received without elements!", "error"); |
return; |
} |
var e = {}; |
for (var i = 0; i < evt.elements.length; i++) { |
var ee = evt.elements[i]; |
e[ee.name || ee.nameU] = (ee.value || ee.valueU); |
this.log("[event]: " + (ee.name || ee.nameU) + ": " + e[ee.name || ee.nameU]); |
} |
this.dispatch(e); |
}; |
this.widenDomain = function (domainStr) { |
var cd = domainStr || document.domain; |
if (cd.indexOf(".") == -1) { |
return; |
} |
var dps = cd.split("."); |
if (dps.length <= 2) { |
return; |
} |
dps = dps.slice(dps.length - 2); |
document.domain = dps.join("."); |
}; |
this.parseCookie = function () { |
var cs = document.cookie; |
var keypairs = cs.split(";"); |
for (var x = 0; x < keypairs.length; x++) { |
keypairs[x] = keypairs[x].split("="); |
if (x != keypairs.length - 1) { |
cs += ";"; |
} |
} |
return keypairs; |
}; |
this.setCookie = function (keypairs, clobber) { |
if ((clobber) && (clobber == true)) { |
document.cookie = ""; |
} |
var cs = ""; |
for (var x = 0; x < keypairs.length; x++) { |
cs += keypairs[x][0] + "=" + keypairs[x][1]; |
if (x != keypairs.length - 1) { |
cs += ";"; |
} |
} |
document.cookie = cs; |
}; |
this.log = function (str, lvl) { |
if (!this.debug) { |
return; |
} |
while (this.logBacklog.length > 0) { |
if (!this.canLog) { |
break; |
} |
var blo = this.logBacklog.shift(); |
this.writeLog("[" + blo[0] + "]: " + blo[1], blo[2]); |
} |
this.writeLog(str, lvl); |
}; |
this.writeLog = function (str, lvl) { |
dojo.debug(((new Date()).toLocaleTimeString()) + ": " + str); |
}; |
this.init = function () { |
this.widenDomain(); |
this.openTunnel(); |
this.isInitialized = true; |
while (this.subscriptionBacklog.length) { |
this.subscribe.apply(this, this.subscriptionBacklog.shift()); |
} |
}; |
this.clobber = function () { |
if (this.rcvNode) { |
this.setCookie([[this.tunnelFrameKey, "closed"], ["path", "/"]], false); |
} |
}; |
this.openTunnel = function () { |
this.rcvNodeName = "rcvIFrame_" + this.getRandStr(); |
this.setCookie([[this.tunnelFrameKey, this.rcvNodeName], ["path", "/"]], false); |
this.rcvNode = dojo.io.createIFrame(this.rcvNodeName); |
dojo.io.setIFrameSrc(this.rcvNode, this.initDoc + "?callback=repubsub.rcvNodeReady&domain=" + document.domain); |
this.sndNodeName = "sndIFrame_" + this.getRandStr(); |
this.sndNode = dojo.io.createIFrame(this.sndNodeName); |
dojo.io.setIFrameSrc(this.sndNode, this.initDoc + "?callback=repubsub.sndNodeReady&domain=" + document.domain); |
}; |
this.rcvNodeReady = function () { |
var statusURI = [this.tunnelURI, "/kn_status/", this.getRandStr(), "_", String(this.tunnelInitCount++)].join(""); |
this.log("rcvNodeReady"); |
var initURIArr = [this.serverBaseURL, "/kn?kn_from=", escape(this.tunnelURI), "&kn_id=", escape(this.tunnelID), "&kn_status_from=", escape(statusURI)]; |
dojo.io.setIFrameSrc(this.rcvNode, initURIArr.join("")); |
this.subscribe(statusURI, this, "statusListener", true); |
this.log(initURIArr.join("")); |
}; |
this.sndNodeReady = function () { |
this.canSnd = true; |
this.log("sndNodeReady"); |
this.log(this.backlog.length); |
if (this.backlog.length > 0) { |
this.dequeueEvent(); |
} |
}; |
this.statusListener = function (evt) { |
this.log("status listener called"); |
this.log(evt.status, "info"); |
}; |
this.dispatch = function (evt) { |
if (evt["to"] || evt["kn_routed_from"]) { |
var rf = evt["to"] || evt["kn_routed_from"]; |
var topic = rf.split(this.serverBaseURL, 2)[1]; |
if (!topic) { |
topic = rf; |
} |
this.log("[topic] " + topic); |
if (topic.length > 3) { |
if (topic.slice(0, 3) == "/kn") { |
topic = topic.slice(3); |
} |
} |
if (this.attachPathList[topic]) { |
this.attachPathList[topic](evt); |
} |
} |
}; |
this.subscribe = function (topic, toObj, toFunc, dontTellServer) { |
if (!this.isInitialized) { |
this.subscriptionBacklog.push([topic, toObj, toFunc, dontTellServer]); |
return; |
} |
if (!this.attachPathList[topic]) { |
this.attachPathList[topic] = function () { |
return true; |
}; |
this.log("subscribing to: " + topic); |
this.topics.push(topic); |
} |
var revt = new dojo.io.repubsubEvent(this.tunnelURI, topic, "route"); |
var rstr = [this.serverBaseURL + "/kn", revt.toGetString()].join(""); |
dojo.event.kwConnect({once:true, srcObj:this.attachPathList, srcFunc:topic, adviceObj:toObj, adviceFunc:toFunc}); |
if (!this.rcvNode) { |
} |
if (dontTellServer) { |
return; |
} |
this.log("sending subscription to: " + topic); |
this.sendTopicSubToServer(topic, rstr); |
}; |
this.sendTopicSubToServer = function (topic, str) { |
if (!this.attachPathList[topic]["subscriptions"]) { |
this.enqueueEventStr(str); |
this.attachPathList[topic].subscriptions = 0; |
} |
this.attachPathList[topic].subscriptions++; |
}; |
this.unSubscribe = function (topic, toObj, toFunc) { |
dojo.event.kwDisconnect({srcObj:this.attachPathList, srcFunc:topic, adviceObj:toObj, adviceFunc:toFunc}); |
}; |
this.publish = function (topic, event) { |
var evt = dojo.io.repubsubEvent.initFromProperties(event); |
evt.to = topic; |
var evtURLParts = []; |
evtURLParts.push(this.serverBaseURL + "/kn"); |
evtURLParts.push(evt.toGetString()); |
this.enqueueEventStr(evtURLParts.join("")); |
}; |
this.enqueueEventStr = function (evtStr) { |
this.log("enqueueEventStr"); |
this.backlog.push(evtStr); |
this.dequeueEvent(); |
}; |
this.dequeueEvent = function (force) { |
this.log("dequeueEvent"); |
if (this.backlog.length <= 0) { |
return; |
} |
if ((this.canSnd) || (force)) { |
dojo.io.setIFrameSrc(this.sndNode, this.backlog.shift() + "&callback=repubsub.sndNodeReady"); |
this.canSnd = false; |
} else { |
this.log("sndNode not available yet!", "debug"); |
} |
}; |
}; |
dojo.io.repubsubEvent = function (to, from, method, id, routeURI, payload, dispname, uid) { |
this.to = to; |
this.from = from; |
this.method = method || "route"; |
this.id = id || repubsub.getRandStr(); |
this.uri = routeURI; |
this.displayname = dispname || repubsub.displayname; |
this.userid = uid || repubsub.userid; |
this.payload = payload || ""; |
this.flushChars = 4096; |
this.initFromProperties = function (evt) { |
if (evt.constructor = dojo.io.repubsubEvent) { |
for (var x in evt) { |
this[x] = evt[x]; |
} |
} else { |
for (var x in evt) { |
if (typeof this.forwardPropertiesMap[x] == "string") { |
this[this.forwardPropertiesMap[x]] = evt[x]; |
} else { |
this[x] = evt[x]; |
} |
} |
} |
}; |
this.toGetString = function (noQmark) { |
var qs = [((noQmark) ? "" : "?")]; |
for (var x = 0; x < this.properties.length; x++) { |
var tp = this.properties[x]; |
if (this[tp[0]]) { |
qs.push(tp[1] + "=" + encodeURIComponent(String(this[tp[0]]))); |
} |
} |
return qs.join("&"); |
}; |
}; |
dojo.io.repubsubEvent.prototype.properties = [["from", "kn_from"], ["to", "kn_to"], ["method", "do_method"], ["id", "kn_id"], ["uri", "kn_uri"], ["displayname", "kn_displayname"], ["userid", "kn_userid"], ["payload", "kn_payload"], ["flushChars", "kn_response_flush"], ["responseFormat", "kn_response_format"]]; |
dojo.io.repubsubEvent.prototype.forwardPropertiesMap = {}; |
dojo.io.repubsubEvent.prototype.reversePropertiesMap = {}; |
for (var x = 0; x < dojo.io.repubsubEvent.prototype.properties.length; x++) { |
var tp = dojo.io.repubsubEvent.prototype.properties[x]; |
dojo.io.repubsubEvent.prototype.reversePropertiesMap[tp[0]] = tp[1]; |
dojo.io.repubsubEvent.prototype.forwardPropertiesMap[tp[1]] = tp[0]; |
} |
dojo.io.repubsubEvent.initFromProperties = function (evt) { |
var eventObj = new dojo.io.repubsubEvent(); |
eventObj.initFromProperties(evt); |
return eventObj; |
}; |
/branches/v5.0-ouadji/api/js/dojo/src/io/ScriptSrcIO.js |
---|
New file |
0,0 → 1,317 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
http://dojotoolkit.org/community/licensing.shtml |
*/ |
dojo.provide("dojo.io.ScriptSrcIO"); |
dojo.require("dojo.io.BrowserIO"); |
dojo.require("dojo.undo.browser"); |
dojo.io.ScriptSrcTransport = new function () { |
this.preventCache = false; |
this.maxUrlLength = 1000; |
this.inFlightTimer = null; |
this.DsrStatusCodes = {Continue:100, Ok:200, Error:500}; |
this.startWatchingInFlight = function () { |
if (!this.inFlightTimer) { |
this.inFlightTimer = setInterval("dojo.io.ScriptSrcTransport.watchInFlight();", 100); |
} |
}; |
this.watchInFlight = function () { |
var totalCount = 0; |
var doneCount = 0; |
for (var param in this._state) { |
totalCount++; |
var currentState = this._state[param]; |
if (currentState.isDone) { |
doneCount++; |
delete this._state[param]; |
} else { |
if (!currentState.isFinishing) { |
var listener = currentState.kwArgs; |
try { |
if (currentState.checkString && eval("typeof(" + currentState.checkString + ") != 'undefined'")) { |
currentState.isFinishing = true; |
this._finish(currentState, "load"); |
doneCount++; |
delete this._state[param]; |
} else { |
if (listener.timeoutSeconds && listener.timeout) { |
if (currentState.startTime + (listener.timeoutSeconds * 1000) < (new Date()).getTime()) { |
currentState.isFinishing = true; |
this._finish(currentState, "timeout"); |
doneCount++; |
delete this._state[param]; |
} |
} else { |
if (!listener.timeoutSeconds) { |
doneCount++; |
} |
} |
} |
} |
catch (e) { |
currentState.isFinishing = true; |
this._finish(currentState, "error", {status:this.DsrStatusCodes.Error, response:e}); |
} |
} |
} |
} |
if (doneCount >= totalCount) { |
clearInterval(this.inFlightTimer); |
this.inFlightTimer = null; |
} |
}; |
this.canHandle = function (kwArgs) { |
return dojo.lang.inArray(["text/javascript", "text/json", "application/json"], (kwArgs["mimetype"].toLowerCase())) && (kwArgs["method"].toLowerCase() == "get") && !(kwArgs["formNode"] && dojo.io.formHasFile(kwArgs["formNode"])) && (!kwArgs["sync"] || kwArgs["sync"] == false) && !kwArgs["file"] && !kwArgs["multipart"]; |
}; |
this.removeScripts = function () { |
var scripts = document.getElementsByTagName("script"); |
for (var i = 0; scripts && i < scripts.length; i++) { |
var scriptTag = scripts[i]; |
if (scriptTag.className == "ScriptSrcTransport") { |
var parent = scriptTag.parentNode; |
parent.removeChild(scriptTag); |
i--; |
} |
} |
}; |
this.bind = function (kwArgs) { |
var url = kwArgs.url; |
var query = ""; |
if (kwArgs["formNode"]) { |
var ta = kwArgs.formNode.getAttribute("action"); |
if ((ta) && (!kwArgs["url"])) { |
url = ta; |
} |
var tp = kwArgs.formNode.getAttribute("method"); |
if ((tp) && (!kwArgs["method"])) { |
kwArgs.method = tp; |
} |
query += dojo.io.encodeForm(kwArgs.formNode, kwArgs.encoding, kwArgs["formFilter"]); |
} |
if (url.indexOf("#") > -1) { |
dojo.debug("Warning: dojo.io.bind: stripping hash values from url:", url); |
url = url.split("#")[0]; |
} |
var urlParts = url.split("?"); |
if (urlParts && urlParts.length == 2) { |
url = urlParts[0]; |
query += (query ? "&" : "") + urlParts[1]; |
} |
if (kwArgs["backButton"] || kwArgs["back"] || kwArgs["changeUrl"]) { |
dojo.undo.browser.addToHistory(kwArgs); |
} |
var id = kwArgs["apiId"] ? kwArgs["apiId"] : "id" + this._counter++; |
var content = kwArgs["content"]; |
var jsonpName = kwArgs.jsonParamName; |
if (kwArgs.sendTransport || jsonpName) { |
if (!content) { |
content = {}; |
} |
if (kwArgs.sendTransport) { |
content["dojo.transport"] = "scriptsrc"; |
} |
if (jsonpName) { |
content[jsonpName] = "dojo.io.ScriptSrcTransport._state." + id + ".jsonpCall"; |
} |
} |
if (kwArgs.postContent) { |
query = kwArgs.postContent; |
} else { |
if (content) { |
query += ((query) ? "&" : "") + dojo.io.argsFromMap(content, kwArgs.encoding, jsonpName); |
} |
} |
if (kwArgs["apiId"]) { |
kwArgs["useRequestId"] = true; |
} |
var state = {"id":id, "idParam":"_dsrid=" + id, "url":url, "query":query, "kwArgs":kwArgs, "startTime":(new Date()).getTime(), "isFinishing":false}; |
if (!url) { |
this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"url.none"}); |
return; |
} |
if (content && content[jsonpName]) { |
state.jsonp = content[jsonpName]; |
state.jsonpCall = function (data) { |
if (data["Error"] || data["error"]) { |
if (dojo["json"] && dojo["json"]["serialize"]) { |
dojo.debug(dojo.json.serialize(data)); |
} |
dojo.io.ScriptSrcTransport._finish(this, "error", data); |
} else { |
dojo.io.ScriptSrcTransport._finish(this, "load", data); |
} |
}; |
} |
if (kwArgs["useRequestId"] || kwArgs["checkString"] || state["jsonp"]) { |
this._state[id] = state; |
} |
if (kwArgs["checkString"]) { |
state.checkString = kwArgs["checkString"]; |
} |
state.constantParams = (kwArgs["constantParams"] == null ? "" : kwArgs["constantParams"]); |
if (kwArgs["preventCache"] || (this.preventCache == true && kwArgs["preventCache"] != false)) { |
state.nocacheParam = "dojo.preventCache=" + new Date().valueOf(); |
} else { |
state.nocacheParam = ""; |
} |
var urlLength = state.url.length + state.query.length + state.constantParams.length + state.nocacheParam.length + this._extraPaddingLength; |
if (kwArgs["useRequestId"]) { |
urlLength += state.idParam.length; |
} |
if (!kwArgs["checkString"] && kwArgs["useRequestId"] && !state["jsonp"] && !kwArgs["forceSingleRequest"] && urlLength > this.maxUrlLength) { |
if (url > this.maxUrlLength) { |
this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"url.tooBig"}); |
return; |
} else { |
this._multiAttach(state, 1); |
} |
} else { |
var queryParams = [state.constantParams, state.nocacheParam, state.query]; |
if (kwArgs["useRequestId"] && !state["jsonp"]) { |
queryParams.unshift(state.idParam); |
} |
var finalUrl = this._buildUrl(state.url, queryParams); |
state.finalUrl = finalUrl; |
this._attach(state.id, finalUrl); |
} |
this.startWatchingInFlight(); |
}; |
this._counter = 1; |
this._state = {}; |
this._extraPaddingLength = 16; |
this._buildUrl = function (url, nameValueArray) { |
var finalUrl = url; |
var joiner = "?"; |
for (var i = 0; i < nameValueArray.length; i++) { |
if (nameValueArray[i]) { |
finalUrl += joiner + nameValueArray[i]; |
joiner = "&"; |
} |
} |
return finalUrl; |
}; |
this._attach = function (id, url) { |
var element = document.createElement("script"); |
element.type = "text/javascript"; |
element.src = url; |
element.id = id; |
element.className = "ScriptSrcTransport"; |
document.getElementsByTagName("head")[0].appendChild(element); |
}; |
this._multiAttach = function (state, part) { |
if (state.query == null) { |
this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"query.null"}); |
return; |
} |
if (!state.constantParams) { |
state.constantParams = ""; |
} |
var queryMax = this.maxUrlLength - state.idParam.length - state.constantParams.length - state.url.length - state.nocacheParam.length - this._extraPaddingLength; |
var isDone = state.query.length < queryMax; |
var currentQuery; |
if (isDone) { |
currentQuery = state.query; |
state.query = null; |
} else { |
var ampEnd = state.query.lastIndexOf("&", queryMax - 1); |
var eqEnd = state.query.lastIndexOf("=", queryMax - 1); |
if (ampEnd > eqEnd || eqEnd == queryMax - 1) { |
currentQuery = state.query.substring(0, ampEnd); |
state.query = state.query.substring(ampEnd + 1, state.query.length); |
} else { |
currentQuery = state.query.substring(0, queryMax); |
var queryName = currentQuery.substring((ampEnd == -1 ? 0 : ampEnd + 1), eqEnd); |
state.query = queryName + "=" + state.query.substring(queryMax, state.query.length); |
} |
} |
var queryParams = [currentQuery, state.idParam, state.constantParams, state.nocacheParam]; |
if (!isDone) { |
queryParams.push("_part=" + part); |
} |
var url = this._buildUrl(state.url, queryParams); |
this._attach(state.id + "_" + part, url); |
}; |
this._finish = function (state, callback, event) { |
if (callback != "partOk" && !state.kwArgs[callback] && !state.kwArgs["handle"]) { |
if (callback == "error") { |
state.isDone = true; |
throw event; |
} |
} else { |
switch (callback) { |
case "load": |
var response = event ? event.response : null; |
if (!response) { |
response = event; |
} |
state.kwArgs[(typeof state.kwArgs.load == "function") ? "load" : "handle"]("load", response, event, state.kwArgs); |
state.isDone = true; |
break; |
case "partOk": |
var part = parseInt(event.response.part, 10) + 1; |
if (event.response.constantParams) { |
state.constantParams = event.response.constantParams; |
} |
this._multiAttach(state, part); |
state.isDone = false; |
break; |
case "error": |
state.kwArgs[(typeof state.kwArgs.error == "function") ? "error" : "handle"]("error", event.response, event, state.kwArgs); |
state.isDone = true; |
break; |
default: |
state.kwArgs[(typeof state.kwArgs[callback] == "function") ? callback : "handle"](callback, event, event, state.kwArgs); |
state.isDone = true; |
} |
} |
}; |
dojo.io.transports.addTransport("ScriptSrcTransport"); |
}; |
window.onscriptload = function (event) { |
var state = null; |
var transport = dojo.io.ScriptSrcTransport; |
if (transport._state[event.id]) { |
state = transport._state[event.id]; |
} else { |
var tempState; |
for (var param in transport._state) { |
tempState = transport._state[param]; |
if (tempState.finalUrl && tempState.finalUrl == event.id) { |
state = tempState; |
break; |
} |
} |
if (state == null) { |
var scripts = document.getElementsByTagName("script"); |
for (var i = 0; scripts && i < scripts.length; i++) { |
var scriptTag = scripts[i]; |
if (scriptTag.getAttribute("class") == "ScriptSrcTransport" && scriptTag.src == event.id) { |
state = transport._state[scriptTag.id]; |
break; |
} |
} |
} |
if (state == null) { |
throw "No matching state for onscriptload event.id: " + event.id; |
} |
} |
var callbackName = "error"; |
switch (event.status) { |
case dojo.io.ScriptSrcTransport.DsrStatusCodes.Continue: |
callbackName = "partOk"; |
break; |
case dojo.io.ScriptSrcTransport.DsrStatusCodes.Ok: |
callbackName = "load"; |
break; |
} |
transport._finish(state, callbackName, event); |
}; |
/branches/v5.0-ouadji/api/js/dojo/src/io/xip_client.html |
---|
New file |
0,0 → 1,267 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
<head> |
<title></title> |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta> |
<!-- Security protection: uncomment the script tag to enable. --> |
<!-- script type="text/javascript" --> |
// <!-- |
/* |
This file is really focused on just sending one message to the server, and |
receiving one response. The code does not expect to be re-used for multiple messages. |
This might be reworked later if performance indicates a need for it. |
xip fragment identifier/hash values have the form: |
#id:cmd:realEncodedMessage |
id: some ID that should be unique among messages. No inherent meaning, |
just something to make sure the hash value is unique so the message |
receiver knows a new message is available. |
cmd: command to the receiver. Valid values are: |
- init: message used to init the frame. Sent as the first URL when loading |
the page. Contains some config parameters. |
- loaded: the remote frame is loaded. Only sent from server to client. |
- ok: the message that this page sent was received OK. The next message may |
now be sent. |
- start: the start message of a block of messages (a complete message may |
need to be segmented into many messages to get around the limitiations |
of the size of an URL that a browser accepts. |
- part: indicates this is a part of a message. |
- end: the end message of a block of messages. The message can now be acted upon. |
If the message is small enough that it doesn't need to be segmented, then |
just one hash value message can be sent with "end" as the command. |
To reassemble a segmented message, the realEncodedMessage parts just have to be concatenated |
together. |
*/ |
//MSIE has the lowest limit for URLs with fragment identifiers, |
//at around 4K. Choosing a slightly smaller number for good measure. |
xipUrlLimit = 4000; |
xipIdCounter = 1; |
function xipInit(){ |
xipStateId = ""; |
xipIsSending = false; |
xipServerUrl = null; |
xipStateId = null; |
xipRequestData = null; |
xipCurrentHash = ""; |
xipResponseMessage = ""; |
xipRequestParts = []; |
xipPartIndex = 0; |
xipServerWindow = null; |
xipUseFrameRecursion = false; |
} |
xipInit(); |
function send(encodedData){ |
if(xipUseFrameRecursion == "true"){ |
var clientEndPoint = window.open(xipStateId + "_clientEndPoint"); |
clientEndPoint.send(encodedData); |
}else{ |
if(!xipIsSending){ |
xipIsSending = true; |
xipRequestData = encodedData || ""; |
//Get a handle to the server iframe. |
xipServerWindow = frames[xipStateId + "_frame"]; |
if (!xipServerWindow){ |
xipServerWindow = document.getElementById(xipStateId + "_frame").contentWindow; |
} |
sendRequestStart(); |
} |
} |
} |
//Modify the server URL if it is a local path and |
//This is done for local/same domain testing. |
function fixServerUrl(ifpServerUrl){ |
if(ifpServerUrl.indexOf("..") == 0){ |
var parts = ifpServerUrl.split("/"); |
ifpServerUrl = parts[parts.length - 1]; |
} |
return ifpServerUrl; |
} |
function pollHash(){ |
//Can't use location.hash because at least Firefox does a decodeURIComponent on it. |
var urlParts = window.location.href.split("#"); |
if(urlParts.length == 2){ |
var newHash = urlParts[1]; |
if(newHash != xipCurrentHash){ |
try{ |
messageReceived(newHash); |
}catch(e){ |
//Make sure to not keep processing the error hash value. |
xipCurrentHash = newHash; |
throw e; |
} |
xipCurrentHash = newHash; |
} |
} |
} |
function messageReceived(encodedData){ |
var msg = unpackMessage(encodedData); |
switch(msg.command){ |
case "loaded": |
xipMasterFrame.dojo.io.XhrIframeProxy.clientFrameLoaded(xipStateId); |
break; |
case "ok": |
sendRequestPart(); |
break; |
case "start": |
xipResponseMessage = ""; |
xipResponseMessage += msg.message; |
setServerUrl("ok"); |
break; |
case "part": |
xipResponseMessage += msg.message; |
setServerUrl("ok"); |
break; |
case "end": |
setServerUrl("ok"); |
xipResponseMessage += msg.message; |
xipMasterFrame.dojo.io.XhrIframeProxy.receive(xipStateId, xipResponseMessage); |
break; |
} |
} |
function sendRequestStart(){ |
//Break the message into parts, if necessary. |
xipRequestParts = []; |
var reqData = xipRequestData; |
var urlLength = xipServerUrl.length; |
var partLength = xipUrlLimit - urlLength; |
var reqIndex = 0; |
while((reqData.length - reqIndex) + urlLength > xipUrlLimit){ |
var part = reqData.substring(reqIndex, reqIndex + partLength); |
//Safari will do some extra hex escaping unless we keep the original hex |
//escaping complete. |
var percentIndex = part.lastIndexOf("%"); |
if(percentIndex == part.length - 1 || percentIndex == part.length - 2){ |
part = part.substring(0, percentIndex); |
} |
xipRequestParts.push(part); |
reqIndex += part.length; |
} |
xipRequestParts.push(reqData.substring(reqIndex, reqData.length)); |
xipPartIndex = 0; |
sendRequestPart(); |
} |
function sendRequestPart(){ |
if(xipPartIndex < xipRequestParts.length){ |
//Get the message part. |
var partData = xipRequestParts[xipPartIndex]; |
//Get the command. |
var cmd = "part"; |
if(xipPartIndex + 1 == xipRequestParts.length){ |
cmd = "end"; |
}else if (xipPartIndex == 0){ |
cmd = "start"; |
} |
setServerUrl(cmd, partData); |
xipPartIndex++; |
} |
} |
function setServerUrl(cmd, message){ |
var serverUrl = makeServerUrl(cmd, message); |
//Safari won't let us replace across domains. |
if(navigator.userAgent.indexOf("Safari") == -1){ |
xipServerWindow.location.replace(serverUrl); |
}else{ |
xipServerWindow.location = serverUrl; |
} |
} |
function makeServerUrl(cmd, message){ |
var serverUrl = xipServerUrl + "#" + (xipIdCounter++) + ":" + cmd; |
if(message){ |
serverUrl += ":" + message; |
} |
return serverUrl; |
} |
function unpackMessage(encodedMessage){ |
var parts = encodedMessage.split(":"); |
var command = parts[1]; |
encodedMessage = parts[2] || ""; |
var config = null; |
if(command == "init"){ |
var configParts = encodedMessage.split("&"); |
config = {}; |
for(var i = 0; i < configParts.length; i++){ |
var nameValue = configParts[i].split("="); |
config[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]); |
} |
} |
return {command: command, message: encodedMessage, config: config}; |
} |
function onClientLoad(){ |
//Decode the init params |
var config = unpackMessage(window.location.href.split("#")[1]).config; |
xipStateId = config.id; |
//Remove the query param for the IE7 recursive case. |
xipServerUrl = fixServerUrl(config.server).replace(/(\?|\&)dojo\.fr\=1/, ""); |
//Make sure we don't have a javascript: url, just for good measure. |
if(xipServerUrl.split(":")[0].match(/javascript/i)){ |
throw "Invalid server URL"; |
} |
xipUseFrameRecursion = config["fr"]; |
if(xipUseFrameRecursion == "endpoint"){ |
xipMasterFrame = parent.parent; |
}else{ |
xipMasterFrame = parent; |
} |
//Start counter to inspect hash value. |
setInterval(pollHash, 10); |
var clientUrl = window.location.href.split("#")[0]; |
var iframeNode = document.getElementsByTagName("iframe")[0]; |
iframeNode.id = xipStateId + "_frame"; |
iframeNode.src = makeServerUrl("init", 'id=' + xipStateId + '&client=' |
+ encodeURIComponent(clientUrl) + '&fr=' + xipUseFrameRecursion); |
} |
if(typeof(window.addEventListener) == "undefined"){ |
window.attachEvent("onload", onClientLoad); |
}else{ |
window.addEventListener('load', onClientLoad, false); |
} |
// --> |
</script> |
</head> |
<body> |
<h4>The Dojo Toolkit -- xip_client.html</h4> |
<p>This file is used for Dojo's XMLHttpRequest Iframe Proxy. This is the "client" file used |
internally by dojo.io.XhrIframeProxy.</p> |
<iframe src="javascript:false"></iframe> |
</body> |
</html> |