OSDN Git Service

443d4553580c7e5a237ca731da0978954598808f
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 05_XXHRGadget.js
1 //{+xhrgadget"OpenSocialガジェット通信プロキシ"(Xドメインは元よりXプロトコルな擬似xhr通信を可能にする)[+xhr]\r
2 \r
3 /*\r
4  * gadgets.io.makeRequest\r
5  * \r
6  * 1. gadget-iframe を作る。指示を # で渡す。 元文書は frame 内の images の監視を開始する。\r
7  *  1. 通信用 img の src\r
8  *\r
9  * 2. gadget-iframe が 通信用 img を作る。#ready\r
10  * \r
11  * 3. 元文書が #ready を受け取ったら、iframe の # を書き換えて指示を送る。指示が長い場合、分割して送る。\r
12  * \r
13  * 4. gadget-iframe は 通信用 img の # に結果を書く。コンテンツが長い場合、分割する。\r
14  * \r
15  * 5. 元文書は結果を受け取ったことを gadget-iframe の # に書いて伝える。\r
16  * \r
17  * \r
18  */\r
19 \r
20 var X_NET_GIMR_canUse         = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],\r
21         \r
22         X_NET_GIMR_iframeName     = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ),\r
23         \r
24         X_NET_GIMR_GADGET_XML_URL = 'http://googledrive.com/host/0B4Y86MXyTfuoVUkwTE54T3V1V1U',\r
25         \r
26         // https://kldleov8fp2dl82hphfmor8riij82tof-a-sites-opensocial.googleusercontent.com/gadgets/ifr\r
27         X_NET_GIMR_GADGET_URL     = 'http://www.ig.gmodules.com/gadgets/ifr?url=' + encodeURIComponent( X_NET_GIMR_GADGET_XML_URL ) + '&nocache=1',\r
28         \r
29         X_NET_GIMR_IMAGE_URL      = 'img/opacity0.gif',\r
30         \r
31         X_NET_GIMR_detection      = new Function( 'f,j,i', 'for(j=f.length;j;)try{i=f[--j];return i.location.hash}catch(e){}' ),\r
32         \r
33         X_NET_GIMR_gadgetIframe,\r
34         \r
35         X_NET_GIMR_requestOptions,\r
36         \r
37         X_NET_GIMR_requestOriginal,\r
38         \r
39         X_NET_GIMR_timerID,\r
40         \r
41         X_NET_GIMR_phase = 0,\r
42         \r
43         X_NET_GIMR_lastHashString,\r
44         \r
45         X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString = '';\r
46 \r
47 \r
48 function X_NET_GIMR_detectImageOverIframe(){\r
49         var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ],\r
50                 iwin, ret, n, error, data = null, zero, e;\r
51         \r
52         if( raw ){\r
53                 iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ];\r
54                 \r
55                 if( iwin && iwin.frames && iwin.frames.length ){\r
56                         ret = X_NET_GIMR_detection( iwin.frames );\r
57                         if( ret && ret !== X_NET_GIMR_lastHashString ){\r
58                                 X_NET_GIMR_lastHashString = ret;\r
59                                 //console.log( ret.length );\r
60                                 //console.log( '' + ret );\r
61                                 \r
62                                 switch( X_NET_GIMR_phase ){\r
63                                         case 0 : // init\r
64                                                 // TODO 分割\r
65                                                 iwin.location.href = X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent( X_NET_GIMR_toJSONString( X_NET_GIMR_requestOptions ) );\r
66                                                 break;\r
67                                                 \r
68                                         case 1 : // after makeRequest > :ok 待ち\r
69                                                 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_waiting_';\r
70                                                 break;\r
71 \r
72                                         case 2 : // _waiting_ 通信結果待ち\r
73                                                 // 分割受信モードか?\r
74                                                 ret = ret.substr( 1 );\r
75                                                 n   = parseInt( ret );\r
76                                                 \r
77                                                 if( X_NET_GIMR_isReceiveBatches ){\r
78                                                         X_NET_GIMR_receivedString += X_Net_GIMR_decodeLocationHash( ret );                                              \r
79                                                         if( --X_NET_GIMR_isReceiveBatches ){\r
80                                                                 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\r
81                                                                 return;\r
82                                                         };\r
83                                                 } else\r
84                                                 if( 1 < n ){\r
85                                                         ret = ret.substr( ( n + ':' ).length );\r
86                                                         X_NET_GIMR_receivedString   = X_Net_GIMR_decodeLocationHash( ret );\r
87                                                         X_NET_GIMR_isReceiveBatches = --n;\r
88                                                         iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\r
89                                                         // speedup\r
90                                                         X_NET_GIMR_timerID = X_Timer_add( 16, 0, X_NET_GIMR_detectImageOverIframe );\r
91                                                         return X_Callback_UN_LISTEN;\r
92                                                 } else {\r
93                                                         X_NET_GIMR_receivedString = X_Net_GIMR_decodeLocationHash( ret );\r
94                                                 };\r
95 \r
96                                                 ret = X_String_parseTrustedJsonString( X_NET_GIMR_receivedString );\r
97                                                 \r
98                                                 \r
99                                                 X_NET_GIMR_receivedString = '';\r
100                                                 \r
101                                                 error = ret[ 'errors' ] && ret[ 'errors' ].length;\r
102                                                 \r
103                                                 switch( !error && X_NET_GIMR_requestOriginal[ 'dataType' ] ){\r
104                                                         case 'json' :\r
105                                                                 data = X_String_parseTrustedJsonString( ret[ 'json' ] || ret[ 'text' ] || '' );\r
106                                                                 break;\r
107                                                 };\r
108                                                 \r
109                                                 //console.dir( data || ret );\r
110                                                 \r
111                                                 X_NET_GIMRWrapper._busy = false;\r
112                                                 \r
113                                                 X_NET_GIMRWrapper\r
114                                                         [ 'asyncDispatch' ]( e = {\r
115                                                                 type      : error || ret[ 'rc' ] < 200 || 400 < ret[ 'rc' ] ? X_EVENT_ERROR : X_EVENT_SUCCESS,\r
116                                                                 status    : ret[ 'rc' ] || ( error ? ret[ 'code' ] || 400 : 200 ),\r
117                                                                 data      : data,\r
118                                                                 'headers' : ret[ 'headers' ],\r
119                                                                 'message' : error && ret[ 'errors' ].join( '\n' )\r
120                                                         });\r
121                                                 \r
122                                                 //console.dir( e );\r
123                                                         \r
124                                                 X_NET_GIMR_timerID = X_NET_GIMR_phase = 0;\r
125                                                 X_NET_GIMR_lastHashString = '';                                                 \r
126                                                 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_';\r
127                                                 \r
128                                                 return X_Callback_UN_LISTEN;\r
129                                 };\r
130                                 ++X_NET_GIMR_phase;\r
131                         };\r
132                 };\r
133         };\r
134 };\r
135 /*\r
136 (function( i, l, res ){\r
137         var start = X.Timer.now(), loc = location, res = [], hash;\r
138         for( ; i < l; ++i ){\r
139                 loc.replace = chr = '#' + String.fromCharCode( i );\r
140                 hash = _builtin_decodeURI( loc.hash );\r
141                 if( _builtin_decodeURI( chr ) !== hash ) res.push( i + ':' + _builtin_decodeURI( chr ) );\r
142                 if( start + 16 < X.Timer.now() ){\r
143                         //console.log( i + ' / ' + l + ' ' + start + ' ' + X.Timer.now()  );\r
144                         X.Timer.once( 16, arguments.callee, [ ++i, l, res ] );\r
145                         return;\r
146                 };\r
147         };\r
148         alert( res.length + '\n' + res.join() );\r
149 })( 0xff, 0xffff, [] ); */\r
150 \r
151 // http://outcloud.blogspot.jp/2015/06/gecko-location-hash.html\r
152 function X_Net_GIMR_decodeLocationHash( str ){\r
153         return X_UA[ 'Gecko' ] ? unescape( str ) : decodeURIComponent( str );\r
154 };\r
155 \r
156 // コマンドが長い場合、分割する\r
157 function X_NET_GIMR_toJSONString( obj ){\r
158         var json = '', k, v;\r
159         for( k in obj ){\r
160                 if( json ) json += ',';\r
161                 v = obj[ k ];\r
162                 v = v || v === 0 ? v : null;\r
163                 json += '"' + k + '":' + ( X_Type_isObject( v ) ? X_NET_GIMR_toJSONString( v ) : X_Type_isString( v ) ? '"' + v + '"' : v );\r
164         };\r
165         console.log( json );\r
166         return '{' + json + '}';\r
167 };\r
168 \r
169 \r
170 X_TEMP.X_Net_GIMR_init = function(){\r
171         // TODO extend NinjaIframe\r
172         X_NET_GIMRWrapper = X_Class_override(\r
173                         X_EventDispatcher(),\r
174                         X_TEMP.X_Net_GIMR_props\r
175                 );\r
176         \r
177         delete X_TEMP.X_Net_GIMR_init;\r
178         delete X_TEMP.X_Net_GIMR_props; \r
179         \r
180         return X_NET_GIMRWrapper;\r
181 };\r
182 \r
183 X_TEMP.X_Net_GIMR_props = {\r
184 \r
185                 _busy         : false,\r
186                 _canceled     : false,\r
187                 _onloadCount  : 0,\r
188                 \r
189                 load : function( obj ){\r
190                         var k, v;\r
191                         //createURL\r
192                         if( !X_NET_GIMR_gadgetIframe ){\r
193                                 X_NET_GIMR_gadgetIframe = X_Node_systemNode\r
194                                                 .create( 'iframe', {\r
195                                                         className         : 'hidden-iframe',\r
196                                                         name              : X_NET_GIMR_iframeName,\r
197                                                         id                : X_NET_GIMR_iframeName,\r
198                                                         src               : X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent(\r
199                                                                 X_NET_GIMR_toJSONString( { 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ), 'len' : 1000, 'itvl' : 200 } ) ),\r
200                                                         scrolling         : 'no',\r
201                                                         allowtransparency : 'no',                                       \r
202                                                         frameborder       : 0,\r
203                                                         tabindex          : -1\r
204                                                         } );\r
205                         };\r
206                         \r
207                         X_NET_GIMR_timerID = X_Timer_add( 333, 0, X_NET_GIMR_detectImageOverIframe );\r
208                         \r
209                         X_NET_GIMR_requestOriginal = X_Object_deepCopy( obj );\r
210         \r
211                         //console.dir( obj );\r
212                         \r
213                         X_NET_GIMR_requestOptions = {\r
214                                 'CONTENT_TYPE'     : 'TEXT',\r
215                                 'GET_FULL_HEADERS' : true,\r
216                                 'REFRESH_INTERVAL' : 0,\r
217                                 'url'              : obj[ 'url' ]\r
218                         };\r
219                         \r
220                         for( k in obj ){\r
221                                 if( v = '' + obj[ k ] ){\r
222                                         switch( k ){\r
223                                                 case 'postdata' :\r
224                                                         X_NET_GIMR_requestOptions[ 'POST_DATA' ] = v;\r
225                                                         break;\r
226                                                 case 'method' :\r
227                                                         X_NET_GIMR_requestOptions[ 'METHOD' ] = v;\r
228                                                         break;                                  \r
229                                                 case 'dataType' :\r
230                                                         // TEXT 以外は無視される?\r
231                                                         switch( v = v.toUpperCase() ){\r
232                                                                 case 'TEXT' :\r
233                                                                 case 'JSON' :\r
234                                                                         X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = v;\r
235                                                                         break;\r
236                                                                 case 'DOM'  :\r
237                                                                 case 'HTML' :\r
238                                                                 case 'HTM'  :\r
239                                                                 case 'XML'  :\r
240                                                                         X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = 'DOM';\r
241                                                                         break;\r
242                                                                 //case 'FEED' :\r
243                                                         };              \r
244                                                         break;\r
245                                                 case 'headers' :\r
246                                                         X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_NET_GIMR_requestOriginal[ k ];\r
247                                                         break;\r
248                                                 case 'cashe' :\r
249                                                         X_NET_GIMR_requestOptions[ 'REFRESH_INTERVAL' ] = 3600;\r
250                                                         break;\r
251                                         };                                      \r
252                                 };\r
253                         };\r
254                         \r
255                         this._busy = true;\r
256                 },\r
257                 \r
258                 cancel : function(){\r
259                         this._canceled = true;\r
260                 },\r
261                 \r
262                 reset : function(){\r
263                         this._busy = this._canceled = false;\r
264                         this._onloadCount = 0;\r
265                 }\r
266         };\r
267 \r
268 //}+xhrgadget