Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / io / proxy / xip.js @ 12

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
}