1 /**
  2  * @fileOverview solve io between sub domains using proxy page
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("ajax/SubDomainTransport", function (S, XhrTransportBase, Event, DOM) {
  6 
  7     var rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
  8         PROXY_PAGE = "/sub_domain_proxy.html",
  9         doc = S.Env.host.document,
 10         iframeMap = {
 11             // hostname:{iframe: , ready:}
 12         };
 13 
 14     function SubDomainTransport(xhrObj) {
 15         var self = this,
 16             c = xhrObj.config;
 17         self.xhrObj = xhrObj;
 18         var m = c.url.match(rurl);
 19         self.hostname = m[2];
 20         self.protocol = m[1];
 21         c.crossDomain = false;
 22     }
 23 
 24 
 25     S.augment(SubDomainTransport, XhrTransportBase.proto, {
 26         // get nativeXhr from iframe document
 27         // not from current document directly like XhrTransport
 28         send:function () {
 29             var self = this,
 30                 c = self.xhrObj.config,
 31                 hostname = self.hostname,
 32                 iframe,
 33                 iframeDesc = iframeMap[hostname];
 34 
 35             var proxy = PROXY_PAGE;
 36 
 37             if (c['xdr'] && c['xdr']['subDomain'] && c['xdr']['subDomain'].proxy) {
 38                 proxy = c['xdr']['subDomain'].proxy;
 39             }
 40 
 41             if (iframeDesc && iframeDesc.ready) {
 42                 self.nativeXhr = XhrTransportBase.nativeXhr(0, iframeDesc.iframe.contentWindow);
 43                 if (self.nativeXhr) {
 44                     self.sendInternal();
 45                 } else {
 46                     S.error("document.domain not set correctly!");
 47                 }
 48                 return;
 49             }
 50 
 51             if (!iframeDesc) {
 52                 iframeDesc = iframeMap[hostname] = {};
 53                 iframe = iframeDesc.iframe = doc.createElement("iframe");
 54                 DOM.css(iframe, {
 55                     position:'absolute',
 56                     left:'-9999px',
 57                     top:'-9999px'
 58                 });
 59                 DOM.prepend(iframe, doc.body || doc.documentElement);
 60                 iframe.src = self.protocol + "//" + hostname + proxy;
 61             } else {
 62                 iframe = iframeDesc.iframe;
 63             }
 64 
 65             Event.on(iframe, "load", _onLoad, self);
 66 
 67         }
 68     });
 69 
 70     function _onLoad() {
 71         var self = this,
 72             hostname = self.hostname,
 73             iframeDesc = iframeMap[hostname];
 74         iframeDesc.ready = 1;
 75         Event.detach(iframeDesc.iframe, "load", _onLoad, self);
 76         self.send();
 77     }
 78 
 79     return SubDomainTransport;
 80 
 81 }, {
 82     requires:['./XhrTransportBase', 'event', 'dom']
 83 });