X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F06_net%2F05_XXHRGadget.js;h=7a9d4d2aa6fd42b16e3b62198da46fed5e59a77c;hb=20c3a948b20e52efc28fd103fc075d787c6d65d2;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..7a9d4d2 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ガジェット通信プロキシ"(Xドメインは元よりXプロトコルな擬似xhr通信を可能にする)[+xhr] + /* * gadgets.io.makeRequest * @@ -15,8 +17,6 @@ * */ - - var X_NET_GIMR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ], X_NET_GIMR_iframeName = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ), @@ -28,11 +28,12 @@ var X_NET_GIMR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ], X_NET_GIMR_IMAGE_URL = 'img/opacity0.gif', - X_NET_GIMR_detection = new Function( 'f,j,i', 'for(j=f.length;j;)try{i=f[--j];return i.location.hash}catch(e){}' ), + // https://code.google.com/p/xssinterface/source/browse/trunk/js/xssinterface.js + X_NET_GIMR_maxQueryLength = X_UA[ 'IE' ] ? 2000 : 6000, - X_NET_GIMR_gadgetIframe, + 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_NET_GIMR_requestOptions, + X_NET_GIMR_requestBatches, X_NET_GIMR_requestOriginal, @@ -42,12 +43,12 @@ var X_NET_GIMR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ], X_NET_GIMR_lastHashString, - X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString; + X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString = ''; function X_NET_GIMR_detectImageOverIframe(){ - var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ], - iwin, ret, n, error, data = null, zero, e; + var raw = this[ '_rawObject' ], + iwin, ret, n; if( raw ){ iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ]; @@ -60,9 +61,9 @@ function X_NET_GIMR_detectImageOverIframe(){ //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 ) ); + case 0 : // makeRequest + iwin.location.href = X_NET_GIMR_GADGET_URL + '#' + X_NET_GIMR_requestBatches.shift(); + if( X_NET_GIMR_requestBatches.length ) return; //TODO boost break; case 1 : // after makeRequest > :ok 待ち @@ -75,54 +76,32 @@ function X_NET_GIMR_detectImageOverIframe(){ n = parseInt( ret ); if( X_NET_GIMR_isReceiveBatches ){ - X_NET_GIMR_receivedString += ret; + X_NET_GIMR_receivedString += X_Net_GIMR_decodeLocationHash( ret ); if( --X_NET_GIMR_isReceiveBatches ){ iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches; return; }; } else if( 1 < n ){ - X_NET_GIMR_receivedString = ret.substr( ( n + ':' ).length ); + ret = ret.substr( ( n + ':' ).length ); + X_NET_GIMR_receivedString = X_Net_GIMR_decodeLocationHash( ret ); X_NET_GIMR_isReceiveBatches = --n; iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches; // speedup - X_NET_GIMR_timerID = X_Timer_add( 16, 0, X_NET_GIMR_detectImageOverIframe ); + X_NET_GIMR_timerID = X_Timer_add( 16, 0, this, X_NET_GIMR_detectImageOverIframe ); return X_Callback_UN_LISTEN; } else { - X_NET_GIMR_receivedString = ret; + X_NET_GIMR_receivedString = X_Net_GIMR_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_GIMRWrapper[ 'asyncDispatch' ]( X_String_parseTrustedJsonString( X_NET_GIMR_receivedString ) ); 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' ) - }); - //console.dir( e ); - + + X_NET_GIMRWrapper._busy = false; X_NET_GIMR_timerID = X_NET_GIMR_phase = 0; - X_NET_GIMR_lastHashString = ''; + + X_NET_GIMR_lastHashString = ''; iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_'; return X_Callback_UN_LISTEN; @@ -133,30 +112,40 @@ function X_NET_GIMR_detectImageOverIframe(){ }; }; -// コマンドが長い場合、分割する -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_Net_GIMR_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 - ); + 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_JSON_stringify( { + 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ), + 'len' : X_NET_GIMR_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_Net_GIMR_props ); delete X_TEMP.X_Net_GIMR_init; delete X_TEMP.X_Net_GIMR_props; + X_NET_GIMR_requestBatches = []; + return X_NET_GIMRWrapper; }; @@ -167,71 +156,50 @@ X_TEMP.X_Net_GIMR_props = { _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_NET_GIMR_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_NET_GIMR_maxQueryLength - X_NET_GIMR_GADGET_URL.length - 5; - X_NET_GIMR_requestOriginal = X_Object_deepCopy( obj ); - - //console.dir( obj ); + sendStr = 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_NET_GIMR_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_NET_GIMR_requestBatches.length ){ + X_NET_GIMR_requestBatches[ 0 ] = X_NET_GIMR_requestBatches.length + ':' + X_NET_GIMR_requestBatches[ 0 ]; }; + X_NET_GIMR_timerID = X_Timer_add( 333, 0, this, X_NET_GIMR_detectImageOverIframe ); + this._busy = true; }, @@ -245,3 +213,4 @@ X_TEMP.X_Net_GIMR_props = { } }; +//}+xhrgadget \ No newline at end of file