root / trunk / web / dojo / dojox / io / proxy / xip.js
History | View | Annotate | Download (6.89 KB)
1 | 9 | andrej.cim | /*
|
---|---|---|---|
2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
4 | see: http://dojotoolkit.org/license for details
|
||
5 | */
|
||
6 | |||
7 | |||
8 | if(!dojo._hasResource["dojox.io.proxy.xip"]){ |
||
9 | dojo._hasResource["dojox.io.proxy.xip"]=true; |
||
10 | dojo.provide("dojox.io.proxy.xip");
|
||
11 | dojo.require("dojo.io.iframe");
|
||
12 | dojo.require("dojox.data.dom");
|
||
13 | dojox.io.proxy.xip={xipClientUrl:((dojo.config||djConfig)["xipClientUrl"])||dojo.moduleUrl("dojox.io.proxy","xip_client.html"),urlLimit:4000,_callbackName:(dojox._scopeName||"dojox")+".io.proxy.xip.fragmentReceived",_state:{},_stateIdCounter:0,_isWebKit:navigator.userAgent.indexOf("WebKit")!=-1,send:function(_1){ |
||
14 | var _2=this.xipClientUrl; |
||
15 | if(_2.split(":")[0].match(/javascript/i)||_1._ifpServerUrl.split(":")[0].match(/javascript/i)){ |
||
16 | return;
|
||
17 | } |
||
18 | var _3=_2.indexOf(":"); |
||
19 | var _4=_2.indexOf("/"); |
||
20 | if(_3==-1||_4<_3){ |
||
21 | var _5=window.location.href;
|
||
22 | if(_4==0){ |
||
23 | _2=_5.substring(0,_5.indexOf("/",9))+_2; |
||
24 | }else{
|
||
25 | _2=_5.substring(0,(_5.lastIndexOf("/")+1))+_2; |
||
26 | } |
||
27 | } |
||
28 | this.fullXipClientUrl=_2;
|
||
29 | if(typeof document.postMessage!="undefined"){ |
||
30 | document.addEventListener("message",dojo.hitch(this,this.fragmentReceivedEvent),false); |
||
31 | } |
||
32 | this.send=this._realSend; |
||
33 | return this._realSend(_1); |
||
34 | },_realSend:function(_6){ |
||
35 | var _7="XhrIframeProxy"+(this._stateIdCounter++); |
||
36 | _6._stateId=_7; |
||
37 | var _8=_6._ifpServerUrl+"#0:init:id="+_7+"&client="+encodeURIComponent(this.fullXipClientUrl)+"&callback="+encodeURIComponent(this._callbackName); |
||
38 | this._state[_7]={facade:_6,stateId:_7,clientFrame:dojo.io.iframe.create(_7,"",_8),isSending:false,serverUrl:_6._ifpServerUrl,requestData:null,responseMessage:"",requestParts:[],idCounter:1,partIndex:0,serverWindow:null}; |
||
39 | return _7;
|
||
40 | },receive:function(_9,_a){ |
||
41 | var _b={};
|
||
42 | var _c=_a.split("&"); |
||
43 | for(var i=0;i<_c.length;i++){ |
||
44 | if(_c[i]){
|
||
45 | var _d=_c[i].split("="); |
||
46 | _b[decodeURIComponent(_d[0])]=decodeURIComponent(_d[1]); |
||
47 | } |
||
48 | } |
||
49 | var _e=this._state[_9]; |
||
50 | var _f=_e.facade;
|
||
51 | _f._setResponseHeaders(_b.responseHeaders); |
||
52 | if(_b.status==0||_b.status){ |
||
53 | _f.status=parseInt(_b.status,10);
|
||
54 | } |
||
55 | if(_b.statusText){
|
||
56 | _f.statusText=_b.statusText; |
||
57 | } |
||
58 | if(_b.responseText){
|
||
59 | _f.responseText=_b.responseText; |
||
60 | var _10=_f.getResponseHeader("Content-Type"); |
||
61 | if(_10){
|
||
62 | var _11=_10.split(";")[0]; |
||
63 | if(_11.indexOf("application/xml")==0||_11.indexOf("text/xml")==0){ |
||
64 | _f.responseXML=dojox.data.dom.createDocument(_b.responseText,_10); |
||
65 | } |
||
66 | } |
||
67 | } |
||
68 | _f.readyState=4;
|
||
69 | this.destroyState(_9);
|
||
70 | },frameLoaded:function(_12){ |
||
71 | var _13=this._state[_12]; |
||
72 | var _14=_13.facade;
|
||
73 | var _15=[];
|
||
74 | for(var _16 in _14._requestHeaders){ |
||
75 | _15.push(_16+": "+_14._requestHeaders[_16]);
|
||
76 | } |
||
77 | var _17={uri:_14._uri}; |
||
78 | if(_15.length>0){ |
||
79 | _17.requestHeaders=_15.join("\r\n");
|
||
80 | } |
||
81 | if(_14._method){
|
||
82 | _17.method=_14._method; |
||
83 | } |
||
84 | if(_14._bodyData){
|
||
85 | _17.data=_14._bodyData; |
||
86 | } |
||
87 | this.sendRequest(_12,dojo.objectToQuery(_17));
|
||
88 | },destroyState:function(_18){ |
||
89 | var _19=this._state[_18]; |
||
90 | if(_19){
|
||
91 | delete this._state[_18]; |
||
92 | var _1a=_19.clientFrame.parentNode;
|
||
93 | _1a.removeChild(_19.clientFrame); |
||
94 | _19.clientFrame=null;
|
||
95 | _19=null;
|
||
96 | } |
||
97 | },createFacade:function(){ |
||
98 | if(arguments&&arguments[0]&&arguments[0].iframeProxyUrl){ |
||
99 | return new dojox.io.proxy.xip.XhrIframeFacade(arguments[0].iframeProxyUrl); |
||
100 | }else{
|
||
101 | return dojox.io.proxy.xip._xhrObjOld.apply(dojo,arguments); |
||
102 | } |
||
103 | },sendRequest:function(_1b,_1c){ |
||
104 | var _1d=this._state[_1b]; |
||
105 | if(!_1d.isSending){
|
||
106 | _1d.isSending=true;
|
||
107 | _1d.requestData=_1c||"";
|
||
108 | _1d.serverWindow=frames[_1d.stateId]; |
||
109 | if(!_1d.serverWindow){
|
||
110 | _1d.serverWindow=document.getElementById(_1d.stateId).contentWindow; |
||
111 | } |
||
112 | if(typeof document.postMessage=="undefined"){ |
||
113 | if(_1d.serverWindow.contentWindow){
|
||
114 | _1d.serverWindow=_1d.serverWindow.contentWindow; |
||
115 | } |
||
116 | } |
||
117 | this.sendRequestStart(_1b);
|
||
118 | } |
||
119 | },sendRequestStart:function(_1e){ |
||
120 | var _1f=this._state[_1e]; |
||
121 | _1f.requestParts=[]; |
||
122 | var _20=_1f.requestData;
|
||
123 | var _21=_1f.serverUrl.length;
|
||
124 | var _22=this.urlLimit-_21; |
||
125 | var _23=0; |
||
126 | while((_20.length-_23)+_21>this.urlLimit){ |
||
127 | var _24=_20.substring(_23,_23+_22);
|
||
128 | var _25=_24.lastIndexOf("%"); |
||
129 | if(_25==_24.length-1||_25==_24.length-2){ |
||
130 | _24=_24.substring(0,_25);
|
||
131 | } |
||
132 | _1f.requestParts.push(_24); |
||
133 | _23+=_24.length; |
||
134 | } |
||
135 | _1f.requestParts.push(_20.substring(_23,_20.length)); |
||
136 | _1f.partIndex=0;
|
||
137 | this.sendRequestPart(_1e);
|
||
138 | },sendRequestPart:function(_26){ |
||
139 | var _27=this._state[_26]; |
||
140 | if(_27.partIndex<_27.requestParts.length){
|
||
141 | var _28=_27.requestParts[_27.partIndex];
|
||
142 | var cmd="part"; |
||
143 | if(_27.partIndex+1==_27.requestParts.length){ |
||
144 | cmd="end";
|
||
145 | }else{
|
||
146 | if(_27.partIndex==0){ |
||
147 | cmd="start";
|
||
148 | } |
||
149 | } |
||
150 | this.setServerUrl(_26,cmd,_28);
|
||
151 | _27.partIndex++; |
||
152 | } |
||
153 | },setServerUrl:function(_29,cmd,_2a){ |
||
154 | var _2b=this.makeServerUrl(_29,cmd,_2a); |
||
155 | var _2c=this._state[_29]; |
||
156 | if(this._isWebKit){ |
||
157 | _2c.serverWindow.location=_2b; |
||
158 | }else{
|
||
159 | _2c.serverWindow.location.replace(_2b); |
||
160 | } |
||
161 | },makeServerUrl:function(_2d,cmd,_2e){ |
||
162 | var _2f=this._state[_2d]; |
||
163 | var _30=_2f.serverUrl+"#"+(_2f.idCounter++)+":"+cmd; |
||
164 | if(_2e){
|
||
165 | _30+=":"+_2e;
|
||
166 | } |
||
167 | return _30;
|
||
168 | },fragmentReceivedEvent:function(evt){ |
||
169 | if(evt.uri.split("#")[0]==this.fullXipClientUrl){ |
||
170 | this.fragmentReceived(evt.data);
|
||
171 | } |
||
172 | },fragmentReceived:function(_31){ |
||
173 | var _32=_31.indexOf("#"); |
||
174 | var _33=_31.substring(0,_32); |
||
175 | var _34=_31.substring(_32+1,_31.length); |
||
176 | var msg=this.unpackMessage(_34); |
||
177 | var _35=this._state[_33]; |
||
178 | switch(msg.command){
|
||
179 | case "loaded": |
||
180 | this.frameLoaded(_33);
|
||
181 | break;
|
||
182 | case "ok": |
||
183 | this.sendRequestPart(_33);
|
||
184 | break;
|
||
185 | case "start": |
||
186 | _35.responseMessage=""+msg.message;
|
||
187 | this.setServerUrl(_33,"ok"); |
||
188 | break;
|
||
189 | case "part": |
||
190 | _35.responseMessage+=msg.message; |
||
191 | this.setServerUrl(_33,"ok"); |
||
192 | break;
|
||
193 | case "end": |
||
194 | this.setServerUrl(_33,"ok"); |
||
195 | _35.responseMessage+=msg.message; |
||
196 | this.receive(_33,_35.responseMessage);
|
||
197 | break;
|
||
198 | } |
||
199 | },unpackMessage:function(_36){ |
||
200 | var _37=_36.split(":"); |
||
201 | var _38=_37[1]; |
||
202 | _36=_37[2]||""; |
||
203 | var _39=null; |
||
204 | if(_38=="init"){ |
||
205 | var _3a=_36.split("&"); |
||
206 | _39={}; |
||
207 | for(var i=0;i<_3a.length;i++){ |
||
208 | var _3b=_3a[i].split("="); |
||
209 | _39[decodeURIComponent(_3b[0])]=decodeURIComponent(_3b[1]); |
||
210 | } |
||
211 | } |
||
212 | return {command:_38,message:_36,config:_39}; |
||
213 | }}; |
||
214 | dojox.io.proxy.xip._xhrObjOld=dojo._xhrObj; |
||
215 | dojo._xhrObj=dojox.io.proxy.xip.createFacade; |
||
216 | dojox.io.proxy.xip.XhrIframeFacade=function(_3c){ |
||
217 | this._requestHeaders={};
|
||
218 | this._allResponseHeaders=null; |
||
219 | this._responseHeaders={};
|
||
220 | this._method=null; |
||
221 | this._uri=null; |
||
222 | this._bodyData=null; |
||
223 | this.responseText=null; |
||
224 | this.responseXML=null; |
||
225 | this.status=null; |
||
226 | this.statusText=null; |
||
227 | this.readyState=0; |
||
228 | this._ifpServerUrl=_3c;
|
||
229 | this._stateId=null; |
||
230 | }; |
||
231 | dojo.extend(dojox.io.proxy.xip.XhrIframeFacade,{open:function(_3d,uri){ |
||
232 | this._method=_3d;
|
||
233 | this._uri=uri;
|
||
234 | this.readyState=1; |
||
235 | },setRequestHeader:function(_3e,_3f){ |
||
236 | this._requestHeaders[_3e]=_3f;
|
||
237 | },send:function(_40){ |
||
238 | this._bodyData=_40;
|
||
239 | this._stateId=dojox.io.proxy.xip.send(this); |
||
240 | this.readyState=2; |
||
241 | },abort:function(){ |
||
242 | dojox.io.proxy.xip.destroyState(this._stateId);
|
||
243 | },getAllResponseHeaders:function(){ |
||
244 | return this._allResponseHeaders; |
||
245 | },getResponseHeader:function(_41){ |
||
246 | return this._responseHeaders[_41]; |
||
247 | },_setResponseHeaders:function(_42){ |
||
248 | if(_42){
|
||
249 | this._allResponseHeaders=_42;
|
||
250 | _42=_42.replace(/\r/g,""); |
||
251 | var _43=_42.split("\n"); |
||
252 | for(var i=0;i<_43.length;i++){ |
||
253 | if(_43[i]){
|
||
254 | var _44=_43[i].split(": "); |
||
255 | this._responseHeaders[_44[0]]=_44[1]; |
||
256 | } |
||
257 | } |
||
258 | } |
||
259 | }}); |
||
260 | } |