Example #1
0
File: io.js Project: myoss/kissy
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
});
Example #2
0
File: io.js Project: myoss/kissy
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
});
Example #3
0
File: io.js Project: myoss/kissy
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
});