1 //{+xhrgadget"OpenSocialガジェット通信プロキシ"(Xドメインは元よりXプロトコルな擬似xhr通信を可能にする)[+xhr]
\r
4 * gadgets.io.makeRequest
\r
6 * 1. gadget-iframe を作る。指示を # で渡す。 元文書は frame 内の images の監視を開始する。
\r
9 * 2. gadget-iframe が 通信用 img を作る。#ready
\r
11 * 3. 元文書が #ready を受け取ったら、iframe の # を書き換えて指示を送る。指示が長い場合、分割して送る。
\r
13 * 4. gadget-iframe は 通信用 img の # に結果を書く。コンテンツが長い場合、分割する。
\r
15 * 5. 元文書は結果を受け取ったことを gadget-iframe の # に書いて伝える。
\r
20 var X_NET_GIMR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],
\r
22 X_NET_GIMR_iframeName = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ),
\r
24 X_NET_GIMR_GADGET_XML_URL = 'http://googledrive.com/host/0B4Y86MXyTfuoVUkwTE54T3V1V1U',
\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
29 X_NET_GIMR_IMAGE_URL = 'img/opacity0.gif',
\r
31 // https://code.google.com/p/xssinterface/source/browse/trunk/js/xssinterface.js
\r
32 X_NET_GIMR_maxQueryLength = X_UA[ 'IE' ] ? 2000 : 6000,
\r
34 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
36 X_NET_GIMR_requestBatches,
\r
38 X_NET_GIMR_requestOriginal,
\r
42 X_NET_GIMR_phase = 0,
\r
44 X_NET_GIMR_lastHashString,
\r
46 X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString = '';
\r
49 function X_NET_GIMR_detectImageOverIframe(){
\r
50 var raw = this[ '_rawObject' ],
\r
51 iwin, ret, n, error, data = null, zero, e;
\r
54 iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ];
\r
56 if( iwin && iwin.frames && iwin.frames.length ){
\r
57 ret = X_NET_GIMR_detection( iwin.frames );
\r
58 if( ret && ret !== X_NET_GIMR_lastHashString ){
\r
59 X_NET_GIMR_lastHashString = ret;
\r
60 //console.log( ret.length );
\r
61 //console.log( '' + ret );
\r
63 switch( X_NET_GIMR_phase ){
\r
64 case 0 : // makeRequest
\r
65 iwin.location.href = X_NET_GIMR_GADGET_URL + '#' + X_NET_GIMR_requestBatches.shift();
\r
66 if( X_NET_GIMR_requestBatches.length ) return; //TODO boost
\r
69 case 1 : // after makeRequest > :ok 待ち
\r
70 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_waiting_';
\r
73 case 2 : // _waiting_ 通信結果待ち
\r
75 ret = ret.substr( 1 );
\r
76 n = parseInt( ret );
\r
78 if( X_NET_GIMR_isReceiveBatches ){
\r
79 X_NET_GIMR_receivedString += X_Net_GIMR_decodeLocationHash( ret );
\r
80 if( --X_NET_GIMR_isReceiveBatches ){
\r
81 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;
\r
86 ret = ret.substr( ( n + ':' ).length );
\r
87 X_NET_GIMR_receivedString = X_Net_GIMR_decodeLocationHash( ret );
\r
88 X_NET_GIMR_isReceiveBatches = --n;
\r
89 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;
\r
91 X_NET_GIMR_timerID = X_Timer_add( 16, 0, this, X_NET_GIMR_detectImageOverIframe );
\r
92 return X_Callback_UN_LISTEN;
\r
94 X_NET_GIMR_receivedString = X_Net_GIMR_decodeLocationHash( ret );
\r
97 ret = X_String_parseTrustedJsonString( X_NET_GIMR_receivedString );
\r
100 X_NET_GIMR_receivedString = '';
\r
102 error = ret[ 'errors' ] && ret[ 'errors' ].length;
\r
104 switch( !error && X_NET_GIMR_requestOriginal[ 'dataType' ] ){
\r
106 data = X_String_parseTrustedJsonString( ret[ 'json' ] || ret[ 'text' ] || '' );
\r
110 //console.dir( data || ret );
\r
112 X_NET_GIMRWrapper._busy = false;
\r
114 if( error || ret[ 'rc' ] < 200 || 400 < ret[ 'rc' ] ){
\r
116 type : X_EVENT_ERROR,
\r
117 status : ret[ 'rc' ] || ret[ 'code' ] || 400,
\r
118 'message' : error && ret[ 'errors' ].join( '\n' )
\r
122 type : X_EVENT_SUCCESS,
\r
123 status : ret[ 'rc' ] || 200,
\r
128 e[ 'headers' ] = ret[ 'headers' ];
\r
130 X_NET_GIMRWrapper[ 'asyncDispatch' ]( e );
\r
132 //console.dir( e );
\r
134 X_NET_GIMR_timerID = X_NET_GIMR_phase = 0;
\r
135 X_NET_GIMR_lastHashString = '';
\r
136 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_';
\r
138 return X_Callback_UN_LISTEN;
\r
140 ++X_NET_GIMR_phase;
\r
146 // http://outcloud.blogspot.jp/2015/06/gecko-location-hash.html
\r
147 function X_Net_GIMR_decodeLocationHash( str ){
\r
148 return X_UA[ 'Gecko' ] ? unescape( str ) : decodeURIComponent( str );
\r
151 X_TEMP.X_Net_GIMR_init = function(){
\r
152 X_NET_GIMRWrapper = X_Class_override(
\r
154 .create( 'iframe', {
\r
155 className : 'hidden-iframe',
\r
156 name : X_NET_GIMR_iframeName,
\r
157 id : X_NET_GIMR_iframeName,
\r
158 src : X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent(
\r
159 X_JSON_stringify( {
\r
160 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ),
\r
161 'len' : X_NET_GIMR_maxQueryLength,
\r
163 'gck' : X_UA[ 'Gecko' ] ? 1 : 0
\r
167 allowtransparency : 'no',
\r
171 X_TEMP.X_Net_GIMR_props );
\r
173 delete X_TEMP.X_Net_GIMR_init;
\r
174 delete X_TEMP.X_Net_GIMR_props;
\r
176 X_NET_GIMR_requestBatches = [];
\r
178 return X_NET_GIMRWrapper;
\r
181 X_TEMP.X_Net_GIMR_props = {
\r
187 load : function( obj ){
\r
189 k, max, sendStr, l, str;
\r
192 X_NET_GIMR_requestOriginal = obj;
\r
202 req[ k ] = obj[ k ];
\r
207 max = X_NET_GIMR_maxQueryLength - X_NET_GIMR_GADGET_URL.length - 5;
\r
209 sendStr = X_JSON_stringify( req );
\r
211 while( sendStr.length ){
\r
213 str = encodeURIComponent( sendStr.substr( 0, l ) );
\r
214 while( max < str.length ){
\r
215 l = l * ( 2 + l / str.length ) / 3 | 0;
\r
216 str = encodeURIComponent( sendStr.substr( 0, l ) );
\r
217 //console.log( l );
\r
219 X_NET_GIMR_requestBatches.push( str );
\r
220 sendStr = sendStr.substr( l );
\r
226 if( 1 < X_NET_GIMR_requestBatches.length ){
\r
227 X_NET_GIMR_requestBatches[ 0 ] = X_NET_GIMR_requestBatches.length + ':' + X_NET_GIMR_requestBatches[ 0 ];
\r
230 X_NET_GIMR_timerID = X_Timer_add( 333, 0, this, X_NET_GIMR_detectImageOverIframe );
\r
235 cancel : function(){
\r
236 this._canceled = true;
\r
239 reset : function(){
\r
240 this._busy = this._canceled = false;
\r
241 this._onloadCount = 0;
\r