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 });