OSDN Git Service

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