X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F06_net%2F05_XXHRGadget.js;h=c13ed9f527b765ed822cb7bc1f57b2a073856a16;hb=HEAD;hp=1d294e0236030a0b7abb80353e8581aa7b53d5a6;hpb=094b0536bafe5efd70540698cf74ab13ece03ebb;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/06_net/05_XXHRGadget.js b/0.6.x/js/06_net/05_XXHRGadget.js index 1d294e0..c13ed9f 100644 --- a/0.6.x/js/06_net/05_XXHRGadget.js +++ b/0.6.x/js/06_net/05_XXHRGadget.js @@ -1,3 +1,5 @@ +//{+xhrgadget"OpenSocialガジェット通信プロキシ"(クロスドメインは元よりクロスプロトコルな擬似xhr通信を可能にする)[+xhr] + /* * gadgets.io.makeRequest * @@ -15,233 +17,200 @@ * */ - - -var X_NET_GIMR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ], +var X_GadgetXHR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ], - X_NET_GIMR_iframeName = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ), + X_GadgetXHR_iframeName = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ), - X_NET_GIMR_GADGET_XML_URL = 'http://googledrive.com/host/0B4Y86MXyTfuoVUkwTE54T3V1V1U', + X_GadgetXHR_GADGET_XML_URL = 'http://googledrive.com/host/0B4Y86MXyTfuoVUkwTE54T3V1V1U', // https://kldleov8fp2dl82hphfmor8riij82tof-a-sites-opensocial.googleusercontent.com/gadgets/ifr - X_NET_GIMR_GADGET_URL = 'http://www.ig.gmodules.com/gadgets/ifr?url=' + encodeURIComponent( X_NET_GIMR_GADGET_XML_URL ) + '&nocache=1', - - X_NET_GIMR_IMAGE_URL = 'img/opacity0.gif', + X_GadgetXHR_GADGET_URL = 'http://www.ig.gmodules.com/gadgets/ifr?url=' + encodeURIComponent( X_GadgetXHR_GADGET_XML_URL ) + '&nocache=1', - X_NET_GIMR_detection = new Function( 'f,j,i', 'for(j=f.length;j;)try{i=f[--j];return i.location.hash}catch(e){}' ), + X_GadgetXHR_IMAGE_URL = 'img/opacity0.gif', - X_NET_GIMR_gadgetIframe, + // https://code.google.com/p/xssinterface/source/browse/trunk/js/xssinterface.js + X_GadgetXHR_maxQueryLength = X_UA[ 'IE' ] ? 2000 : 6000, - X_NET_GIMR_requestOptions, + X_GadgetXHR_requestBatches, - X_NET_GIMR_requestOriginal, + X_GadgetXHR_requestOriginal, - X_NET_GIMR_timerID, + X_GadgetXHR_timerID, - X_NET_GIMR_phase = 0, + X_GadgetXHR_phase = 0, - X_NET_GIMR_lastHashString, + X_GadgetXHR_lastHashString, - X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString; + X_GadgetXHR_isReceiveBatches, X_GadgetXHR_receivedString = ''; -function X_NET_GIMR_detectImageOverIframe(){ - var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ], - iwin, ret, n, error, data = null, zero, e; +function X_GadgetXHR_detectImageOverIframe(){ + var raw = X_GadgetXHR[ '_rawObject' ], + iwin, frames, i, ret, n; if( raw ){ - iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ]; + iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_GadgetXHR_iframeName ]; - if( iwin && iwin.frames && iwin.frames.length ){ - ret = X_NET_GIMR_detection( iwin.frames ); - if( ret && ret !== X_NET_GIMR_lastHashString ){ - X_NET_GIMR_lastHashString = ret; + if( iwin && ( frames = iwin.frames ) && ( i = frames.length ) ){ + for( ; i; ){ + if( ret = X_Script_try( X_Object_find, [ frames[ --i ], 'location>hash' ] ) ) break; + }; + if( ret && ret !== X_GadgetXHR_lastHashString ){ + X_GadgetXHR_lastHashString = ret; //console.log( ret.length ); //console.log( '' + ret ); - switch( X_NET_GIMR_phase ){ - case 0 : // init - // TODO 分割 - iwin.location.href = X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent( X_NET_GIMR_toJSONString( X_NET_GIMR_requestOptions ) ); + switch( X_GadgetXHR_phase ){ + case 0 : // makeRequest + iwin.location.href = X_GadgetXHR_GADGET_URL + '#' + X_GadgetXHR_requestBatches.shift(); + if( X_GadgetXHR_requestBatches.length ) return; //TODO boost break; case 1 : // after makeRequest > :ok 待ち - iwin.location.href = X_NET_GIMR_GADGET_URL + '#_waiting_'; + iwin.location.href = X_GadgetXHR_GADGET_URL + '#_waiting_'; break; case 2 : // _waiting_ 通信結果待ち // 分割受信モードか? ret = ret.substr( 1 ); - n = parseInt( ret ); + n = parseFloat( ret ); - if( X_NET_GIMR_isReceiveBatches ){ - X_NET_GIMR_receivedString += ret; - if( --X_NET_GIMR_isReceiveBatches ){ - iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches; + if( X_GadgetXHR_isReceiveBatches ){ + X_GadgetXHR_receivedString += X_GadgetXHR_decodeLocationHash( ret ); + if( --X_GadgetXHR_isReceiveBatches ){ + iwin.location.href = X_GadgetXHR_GADGET_URL + '#_recived_' + X_GadgetXHR_isReceiveBatches; return; }; } else if( 1 < n ){ - X_NET_GIMR_receivedString = ret.substr( ( n + ':' ).length ); - X_NET_GIMR_isReceiveBatches = --n; - iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches; + ret = ret.substr( ( n + ':' ).length ); + X_GadgetXHR_receivedString = X_GadgetXHR_decodeLocationHash( ret ); + X_GadgetXHR_isReceiveBatches = --n; + iwin.location.href = X_GadgetXHR_GADGET_URL + '#_recived_' + X_GadgetXHR_isReceiveBatches; // speedup - X_NET_GIMR_timerID = X_Timer_add( 16, 0, X_NET_GIMR_detectImageOverIframe ); - return X_Callback_UN_LISTEN; + X_GadgetXHR_timerID = X_Timer_add( 16, 0, X_GadgetXHR_detectImageOverIframe ); + return X_CALLBACK_UN_LISTEN; } else { - X_NET_GIMR_receivedString = ret; + X_GadgetXHR_receivedString = X_GadgetXHR_decodeLocationHash( ret ); }; - zero = String.fromCharCode( 0 ); - console.log( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '--' ).split( zero + 'E0F' ).join( '--' ) ); - ret = X_String_parseTrustedJsonString( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '。' ).split( zero + 'F0E' ).join( '.' ) ); - - X_NET_GIMR_receivedString = ''; - - error = ret[ 'errors' ] && ret[ 'errors' ].length; - - switch( !error && X_NET_GIMR_requestOriginal[ 'dataType' ] ){ - case 'json' : - data = X_String_parseTrustedJsonString( ret[ 'json' ] || ret[ 'text' ] || '' ); - break; - }; - - //console.dir( data || ret ); - - X_NET_GIMRWrapper._busy = false; - - X_NET_GIMRWrapper - [ 'asyncDispatch' ]( e = { - type : error || ret[ 'rc' ] < 200 || 400 < ret[ 'rc' ] ? X_EVENT_ERROR : X_EVENT_SUCCESS, - status : ret[ 'rc' ] || ( error ? ret[ 'code' ] || 400 : 200 ), - data : data, - 'headers' : ret[ 'headers' ], - 'message' : error && ret[ 'errors' ].join( '\n' ) - }); - + X_GadgetXHR[ 'asyncDispatch' ]( X_JSON_parseTrustableString( X_GadgetXHR_receivedString ) ); + X_GadgetXHR_receivedString = ''; //console.dir( e ); - - X_NET_GIMR_timerID = X_NET_GIMR_phase = 0; - X_NET_GIMR_lastHashString = ''; - iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_'; + + X_GadgetXHR._busy = false; + X_GadgetXHR_timerID = X_GadgetXHR_phase = 0; + + X_GadgetXHR_lastHashString = ''; + iwin.location.href = X_GadgetXHR_GADGET_URL + '#_recived_'; - return X_Callback_UN_LISTEN; + return X_CALLBACK_UN_LISTEN; }; - ++X_NET_GIMR_phase; + ++X_GadgetXHR_phase; }; }; }; }; -// コマンドが長い場合、分割する -function X_NET_GIMR_toJSONString( obj ){ - var json = '', k, v; - for( k in obj ){ - if( json ) json += ','; - v = obj[ k ]; - v = v || v === 0 ? v : null; - json += '"' + k + '":' + ( X_Type_isObject( v ) ? X_NET_GIMR_toJSONString( v ) : X_Type_isString( v ) ? '"' + v + '"' : v ); - }; - console.log( json ); - return '{' + json + '}'; +// http://outcloud.blogspot.jp/2015/06/gecko-location-hash.html +function X_GadgetXHR_decodeLocationHash( str ){ + return X_UA[ 'Gecko' ] ? unescape( str ) : decodeURIComponent( str ); }; - -X_TEMP.X_Net_GIMR_init = function(){ - // TODO extend NinjaIframe - X_NET_GIMRWrapper = X_Class_override( - X_EventDispatcher(), - X_TEMP.X_Net_GIMR_props - ); - - delete X_TEMP.X_Net_GIMR_init; - delete X_TEMP.X_Net_GIMR_props; - - return X_NET_GIMRWrapper; +X_TEMP.X_GadgetXHR_init = function(){ + X_GadgetXHR = X_Class_override( + X_Node_systemNode + .create( 'iframe', { + className : 'hidden-iframe', + name : X_GadgetXHR_iframeName, + id : X_GadgetXHR_iframeName, + src : X_GadgetXHR_GADGET_URL + '#' + encodeURIComponent( + X_JSON_stringify( { + 'img' : X_URL_toAbsolutePath( X_GadgetXHR_IMAGE_URL ), + 'len' : X_GadgetXHR_maxQueryLength, + 'itv' : 333, + 'gck' : X_UA[ 'Gecko' ] ? 1 : 0, + 'err' : X_EVENT_ERROR, + 'suc' : X_EVENT_SUCCESS + } ) + ), + scrolling : 'no', + allowtransparency : 'no', + frameborder : 0, + tabindex : -1 + } ), + X_TEMP.X_GadgetXHR_props ); + + delete X_TEMP.X_GadgetXHR_init; + delete X_TEMP.X_GadgetXHR_props; + + X_GadgetXHR_requestBatches = []; + + return X_GadgetXHR; }; -X_TEMP.X_Net_GIMR_props = { +X_TEMP.X_GadgetXHR_props = { _busy : false, _canceled : false, _onloadCount : 0, load : function( obj ){ - var k, v; + var req = {}, + k, max, sendStr, l, str; //createURL - if( !X_NET_GIMR_gadgetIframe ){ - X_NET_GIMR_gadgetIframe = X_Node_systemNode - .create( 'iframe', { - className : 'hidden-iframe', - name : X_NET_GIMR_iframeName, - id : X_NET_GIMR_iframeName, - src : X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent( - X_NET_GIMR_toJSONString( { 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ), 'len' : 1000, 'itvl' : 200 } ) ), - scrolling : 'no', - allowtransparency : 'no', - frameborder : 0, - tabindex : -1 - } ); + + X_GadgetXHR_requestOriginal = obj; + + for( k in obj ){ + switch( k ){ + case 'url' : + case 'postdata' : + case 'method' : + case 'dataType' : + case 'headers' : + case 'cashe' : + req[ k ] = obj[ k ]; + break; + }; }; - X_NET_GIMR_timerID = X_Timer_add( 333, 0, X_NET_GIMR_detectImageOverIframe ); + max = X_GadgetXHR_maxQueryLength - X_GadgetXHR_GADGET_URL.length - 5; - X_NET_GIMR_requestOriginal = X_Object_deepCopy( obj ); - - //console.dir( obj ); + sendStr = /* X_JSON_stringify */X[ 'JSON' ].stringify( req ); - X_NET_GIMR_requestOptions = { - 'CONTENT_TYPE' : 'TEXT', - 'GET_FULL_HEADERS' : true, - 'REFRESH_INTERVAL' : 0, - 'url' : obj[ 'url' ] + while( sendStr.length ){ + l = max; + str = encodeURIComponent( sendStr.substr( 0, l ) ); + while( max < str.length ){ + l = l * ( 2 + l / str.length ) / 3 | 0; + str = encodeURIComponent( sendStr.substr( 0, l ) ); + //console.log( l ); + }; + X_GadgetXHR_requestBatches.push( str ); + sendStr = sendStr.substr( l ); + str = ''; }; - for( k in obj ){ - if( v = '' + obj[ k ] ){ - switch( k ){ - case 'postdata' : - X_NET_GIMR_requestOptions[ 'POST_DATA' ] = v; - break; - case 'method' : - X_NET_GIMR_requestOptions[ 'METHOD' ] = v; - break; - case 'dataType' : - // TEXT 以外は無視される? - switch( v = v.toUpperCase() ){ - case 'TEXT' : - case 'JSON' : - X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = v; - break; - case 'DOM' : - case 'HTML' : - case 'HTM' : - case 'XML' : - X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = 'DOM'; - break; - //case 'FEED' : - }; - break; - case 'headers' : - X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_NET_GIMR_requestOriginal[ k ]; - break; - case 'cashe' : - X_NET_GIMR_requestOptions[ 'REFRESH_INTERVAL' ] = 3600; - break; - }; - }; + sendStr = ''; + + if( 1 < X_GadgetXHR_requestBatches.length ){ + X_GadgetXHR_requestBatches[ 0 ] = X_GadgetXHR_requestBatches.length + ':' + X_GadgetXHR_requestBatches[ 0 ]; }; - this._busy = true; + X_GadgetXHR_timerID = X_Timer_add( 333, 0, X_GadgetXHR_detectImageOverIframe ); + + X_GadgetXHR._busy = true; }, cancel : function(){ - this._canceled = true; + X_GadgetXHR._canceled = true; }, reset : function(){ - this._busy = this._canceled = false; - this._onloadCount = 0; + X_GadgetXHR._busy = X_GadgetXHR._canceled = false; + X_GadgetXHR._onloadCount = 0; } }; +//}+xhrgadget \ No newline at end of file