-//{+xhrgadget"OpenSocialガジェット通信プロキシ"(Xドメインは元よりXプロトコルな擬似xhr通信を可能にする)[+xhr]\r
+//{+xhrgadget"OpenSocialガジェット通信プロキシ"(クロスドメインは元よりクロスプロトコルな擬似xhr通信を可能にする)[+xhr]\r
\r
/*\r
* gadgets.io.makeRequest\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
+ 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_IMAGE_URL = 'img/opacity0.gif',\r
+ X_GadgetXHR_IMAGE_URL = 'img/opacity0.gif',\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
+ // 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_gadgetIframe,\r
+ X_GadgetXHR_requestBatches,\r
\r
- X_NET_GIMR_requestOptions,\r
+ X_GadgetXHR_requestOriginal,\r
\r
- X_NET_GIMR_requestOriginal,\r
+ X_GadgetXHR_timerID,\r
\r
- X_NET_GIMR_timerID,\r
+ X_GadgetXHR_phase = 0,\r
\r
- X_NET_GIMR_phase = 0,\r
+ X_GadgetXHR_lastHashString,\r
\r
- X_NET_GIMR_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_JSON_stringify( 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 += X_Net_GIMR_decodeLocationHash( 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
ret = ret.substr( ( n + ':' ).length );\r
- X_NET_GIMR_receivedString = X_Net_GIMR_decodeLocationHash( ret );\r
- X_NET_GIMR_isReceiveBatches = --n;\r
- iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\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 = X_Net_GIMR_decodeLocationHash( ret );\r
+ X_GadgetXHR_receivedString = X_GadgetXHR_decodeLocationHash( ret );\r
};\r
\r
- ret = X_String_parseTrustedJsonString( X_NET_GIMR_receivedString );\r
- \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
- response : data,\r
- 'headers' : ret[ 'headers' ],\r
- 'message' : error && ret[ 'errors' ].join( '\n' )\r
- });\r
- \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
+ X_GadgetXHR[ 'asyncDispatch' ]( X_JSON_parseTrustableString( X_GadgetXHR_receivedString ) );\r
+ X_GadgetXHR_receivedString = '';\r
+ //console.dir( e );\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
// http://outcloud.blogspot.jp/2015/06/gecko-location-hash.html\r
-function X_Net_GIMR_decodeLocationHash( str ){\r
+function X_GadgetXHR_decodeLocationHash( str ){\r
return X_UA[ 'Gecko' ] ? unescape( str ) : decodeURIComponent( str );\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_JSON_stringify( { '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