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=8e8386cdcda45b02841fcc5366b6d14b04625c67;hpb=24f935c7a129b0a00d800e4983da6491a913aeef;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 8e8386c..7a9d4d2 100644 --- a/0.6.x/js/06_net/05_XXHRGadget.js +++ b/0.6.x/js/06_net/05_XXHRGadget.js @@ -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, @@ -46,8 +47,8 @@ var X_NET_GIMR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ], 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_JSON_stringify( 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 待ち @@ -87,51 +88,20 @@ function X_NET_GIMR_detectImageOverIframe(){ 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 = X_Net_GIMR_decodeLocationHash( ret ); }; - ret = X_String_parseTrustedJsonString( X_NET_GIMR_receivedString ); - - + 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; - - if( error || ret[ 'rc' ] < 200 || 400 < ret[ 'rc' ] ){ - e = { - type : X_EVENT_ERROR, - status : ret[ 'rc' ] || ret[ 'code' ] || 400, - 'message' : error && ret[ 'errors' ].join( '\n' ) - }; - } else { - e = { - type : X_EVENT_SUCCESS, - status : ret[ 'rc' ] || 200, - response : data - }; - }; - - e[ 'headers' ] = ret[ 'headers' ]; - - X_NET_GIMRWrapper[ 'asyncDispatch' ]( e); - //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; @@ -148,15 +118,34 @@ function X_Net_GIMR_decodeLocationHash( 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,77 +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_JSON_stringify( { - 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ), - // https://code.google.com/p/xssinterface/source/browse/trunk/js/xssinterface.js - 'len' : X_UA[ 'IE' ] ? 2000 : 6000, - 'itvl' : 333 - } ) - ), - 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; },