KISSY.add("io/xhr-transport", ["./base", "./xhr-transport-base", "./xdr-flash-transport", "./sub-domain-transport"], function(S, require) { var IO = require("./base"), XhrTransportBase = require("./xhr-transport-base"), XdrFlashTransport = require("./xdr-flash-transport"), SubDomainTransport = require("./sub-domain-transport"); var logger = S.getLogger("s/io"); var win = S.Env.host, doc = win.document, XDomainRequest_ = XhrTransportBase.XDomainRequest_; function isSubDomain(hostname) { return doc.domain && S.endsWith(hostname, doc.domain) } function XhrTransport(io) { var c = io.config, crossDomain = c.crossDomain, self = this, xhr, xdrCfg = c.xdr || {}, subDomain = xdrCfg.subDomain = xdrCfg.subDomain || {}; self.io = io; if(crossDomain && !XhrTransportBase.supportCORS) { if(isSubDomain(c.uri.getHostname())) { if(subDomain.proxy !== false) { return new SubDomainTransport(io) } } if(String(xdrCfg.use) === "flash" || !XDomainRequest_) { return new XdrFlashTransport(io) } } xhr = self.nativeXhr = XhrTransportBase.nativeXhr(crossDomain); var msg = "crossDomain: " + crossDomain + ", use " + (XDomainRequest_ && xhr instanceof XDomainRequest_ ? "XDomainRequest" : "XhrTransport") + " for: " + c.url; logger.debug(msg); return self } S.augment(XhrTransport, XhrTransportBase.proto, {send:function() { this.sendInternal() }}); IO.setupTransport("*", XhrTransport); return IO });
KISSY.add("io/script-transport", ["./base"], function(S, require) { var IO = require("./base"); var logger = S.getLogger("s/io"); var OK_CODE = 200, ERROR_CODE = 500; IO.setupConfig({accepts:{script:"text/javascript, " + "application/javascript, " + "application/ecmascript, " + "application/x-ecmascript"}, contents:{script:/javascript|ecmascript/}, converters:{text:{script:function(text) { S.globalEval(text); return text }}}}); function ScriptTransport(io) { var config = io.config, self = this; if(!config.crossDomain) { return new (IO.getTransport("*"))(io) } self.io = io; logger.info("use ScriptTransport for: " + config.url); return self } S.augment(ScriptTransport, {send:function() { var self = this, io = self.io, c = io.config; self.script = S.getScript(io._getUrlForSend(), {charset:c.scriptCharset, success:function() { self._callback("success") }, error:function() { self._callback("error") }}) }, _callback:function(event, abort) { var self = this, script = self.script, io = self.io; if(!script) { return } self.script = undefined; if(abort) { return } if(event !== "error") { io._ioReady(OK_CODE, "success") }else { if(event === "error") { io._ioReady(ERROR_CODE, "script error") } } }, abort:function() { this._callback(0, 1) }}); IO.setupTransport("script", ScriptTransport); return IO });
KISSY.add("io/iframe-transport", ["dom", "./base", "event/dom"], function(S, require) { var Dom = require("dom"), IO = require("./base"), Event = require("event/dom"); var logger = S.getLogger("s/io"); var doc = S.Env.host.document, OK_CODE = 200, ERROR_CODE = 500, BREATH_INTERVAL = 30, iframeConverter = S.clone(IO.getConfig().converters.text); iframeConverter.json = function(str) { return S.parseJson(S.unEscapeHtml(str)) }; IO.setupConfig({converters:{iframe:iframeConverter, text:{iframe:function(text) { return text }}, xml:{iframe:function(xml) { return xml }}}}); function createIframe(xhr) { var id = S.guid("io-iframe"), iframe, src = Dom.getEmptyIframeSrc(); iframe = xhr.iframe = Dom.create("<iframe " + (src ? ' src="' + src + '" ' : "") + ' id="' + id + '"' + ' name="' + id + '"' + ' style="position:absolute;left:-9999px;top:-9999px;"/>'); Dom.prepend(iframe, doc.body || doc.documentElement); return iframe } function addDataToForm(query, form, serializeArray) { var ret = [], isArray, vs, i, e; S.each(query, function(data, k) { isArray = S.isArray(data); vs = S.makeArray(data); for(i = 0;i < vs.length;i++) { e = doc.createElement("input"); e.type = "hidden"; e.name = k + (isArray && serializeArray ? "[]" : ""); e.value = vs[i]; Dom.append(e, form); ret.push(e) } }); return ret } function removeFieldsFromData(fields) { Dom.remove(fields) } function IframeTransport(io) { this.io = io; logger.info("use IframeTransport for: " + io.config.url) } S.augment(IframeTransport, {send:function() { var self = this, io = self.io, c = io.config, fields, iframe, query, data = c.data, form = Dom.get(c.form); self.attrs = {target:Dom.attr(form, "target") || "", action:Dom.attr(form, "action") || "", encoding:Dom.attr(form, "encoding"), enctype:Dom.attr(form, "enctype"), method:Dom.attr(form, "method")}; self.form = form; iframe = createIframe(io); Dom.attr(form, {target:iframe.id, action:io._getUrlForSend(), method:"post", enctype:"multipart/form-data", encoding:"multipart/form-data"}); if(data) { query = S.unparam(data) } if(query) { fields = addDataToForm(query, form, c.serializeArray) } self.fields = fields; function go() { Event.on(iframe, "load error", self._callback, self); form.submit() } if(S.UA.ie === 6) { setTimeout(go, 0) }else { go() } }, _callback:function(event) { var self = this, form = self.form, io = self.io, eventType = event.type, iframeDoc, iframe = io.iframe; if(!iframe) { return } if(eventType === "abort" && S.UA.ie === 6) { setTimeout(function() { Dom.attr(form, self.attrs) }, 0) }else { Dom.attr(form, self.attrs) } removeFieldsFromData(this.fields); Event.detach(iframe); setTimeout(function() { Dom.remove(iframe) }, BREATH_INTERVAL); io.iframe = null; if(eventType === "load") { try { iframeDoc = iframe.contentWindow.document; if(iframeDoc && iframeDoc.body) { io.responseText = Dom.html(iframeDoc.body); if(S.startsWith(io.responseText, "<?xml")) { io.responseText = undefined } } if(iframeDoc && iframeDoc.XMLDocument) { io.responseXML = iframeDoc.XMLDocument }else { io.responseXML = iframeDoc } if(iframeDoc) { io._ioReady(OK_CODE, "success") }else { io._ioReady(ERROR_CODE, "parser error") } }catch(e) { io._ioReady(ERROR_CODE, "parser error") } }else { if(eventType === "error") { io._ioReady(ERROR_CODE, "error") } } }, abort:function() { this._callback({type:"abort"}) }}); IO.setupTransport("iframe", IframeTransport); return IO });