From 8e74cf066ea48ec8cf34efb2b5e84725c10c813a Mon Sep 17 00:00:00 2001 From: itozyun Date: Sat, 13 Jun 2015 13:09:45 +0900 Subject: [PATCH] Version 0.6.159, fix X.Class & X.XHR.Gadget. --- 0.6.x/js/01_core/00_builtin.js | 1 + 0.6.x/js/01_core/04_XObject.js | 16 ++++++++++ 0.6.x/js/01_core/09_XPair.js | 33 +++++++++++++++++-- 0.6.x/js/01_core/10_XCallback.js | 15 ++++++--- 0.6.x/js/01_core/11_XClass.js | 56 ++++++++++++++++++--------------- 0.6.x/js/01_core/13_XEventDispatcher.js | 4 --- 0.6.x/js/02_dom/08_XNodeSelector.js | 3 +- 0.6.x/js/06_net/00_XNet.js | 14 +++++++-- 0.6.x/js/06_net/01_XNetXHR.js | 27 ++++++++-------- 0.6.x/js/06_net/02_XNetJSONP.js | 2 ++ 0.6.x/js/06_net/03_XNetForm.js | 4 +++ 0.6.x/js/06_net/04_XNetImage.js | 2 +- 0.6.x/js/06_net/05_XXHRGadget.js | 39 +++++++++++++++++------ 0.6.x/js/06_net/10_XOAuth2.js | 2 ++ 0.6.x/js/20_ui/08_Box.js | 2 +- 15 files changed, 155 insertions(+), 65 deletions(-) diff --git a/0.6.x/js/01_core/00_builtin.js b/0.6.x/js/01_core/00_builtin.js index 8af9798..2582d1e 100644 --- a/0.6.x/js/01_core/00_builtin.js +++ b/0.6.x/js/01_core/00_builtin.js @@ -223,6 +223,7 @@ function _builtin_decodeURI( x ){ }; }; }; + return result.join( '' ); }; diff --git a/0.6.x/js/01_core/04_XObject.js b/0.6.x/js/01_core/04_XObject.js index c12c3bd..500ca49 100644 --- a/0.6.x/js/01_core/04_XObject.js +++ b/0.6.x/js/01_core/04_XObject.js @@ -34,6 +34,8 @@ X[ 'Object' ] = { 'override' : X_Object_override, + 'clear' : X_Object_clear, + 'deepCopy' : X_Object_deepCopy, // TODO rename to X.Array.copy @@ -86,6 +88,20 @@ function X_Object_override( target, src ){ }; /** + * オブジェクトの全てのメンバーを破棄します。 + * @alias X.Object.clear + * @param {object} obj。 + */ +function X_Object_clear( obj, k ){ + if( obj ){ + for( k in obj ){ + delete obj[ k ]; + }; + }; +}; + + +/** * オブジェクト(object, Array)のメンバーを探索して、ディープコピーしたオブジェクトを返します。 * オブジェクトが循環参照している場合は、既にコピーしているオブジェクトが現れた時点で、先に作成しているコピーの参照を返すので無限にループすることはありません。 * @alias X.Object.deepCopy diff --git a/0.6.x/js/01_core/09_XPair.js b/0.6.x/js/01_core/09_XPair.js index 14cd864..c0c3cd8 100644 --- a/0.6.x/js/01_core/09_XPair.js +++ b/0.6.x/js/01_core/09_XPair.js @@ -1,3 +1,8 @@ +/** + * Object(Array|Function)をキーにする、キーバリューストアを作る。js 自体にオブジェクトをキーとするハッシュの機能は無い為、内部はArrayで代用している。そのため値へのアクセスは低速。 + * 値を隠蔽したい場合に加え、速度が問題にならないケースや、速度対策を実施したうえで使用する。 + * @namespace X.Pair + */ X[ 'Pair' ] = { 'create' : X_Pair_create, @@ -6,7 +11,7 @@ X[ 'Pair' ] = { 'release' : X_Pair_release }; -var X_Pair_SIZE = 1000, +var X_Pair_SIZE = 1024, X_Pair_KEY_STORE_LIST = [[]], X_Pair_PAIR_STORE_LIST = [[]], X_Pair_noChashe = false, @@ -27,12 +32,19 @@ var X_Pair_SIZE = 1000, // TODO キャッシュするペアの数とヒット率、探索時間の記録 X_Pair_lastKey, X_Pair_lastPair; +/** + * Object(Array|Function)をキーとして値を登録。すでにキーが登録されている場合は登録できない。 + * @alias X.Pair.create + * @param {object|function|array} key + * @param {*} pair == false な値は不可 + * @return {boolean} true の場合、登録成功 + */ function X_Pair_create( key, pair ){ var keyStore = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length - 1 ], pairStore = X_Pair_PAIR_STORE_LIST[ X_Pair_PAIR_STORE_LIST.length - 1 ]; X_Pair_noChashe = true; - if( X_Pair_get( key ) || !( X_Type_isObject( key ) || X_Type_isArray( key ) || X_Type_isFunction( key ) ) ) return; + if( !pair || X_Pair_get( key ) || !( X_Type_isObject( key ) || X_Type_isArray( key ) || X_Type_isFunction( key ) ) ) return false; if( keyStore.length === X_Pair_SIZE ){ keyStore = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length ] = []; @@ -41,8 +53,15 @@ function X_Pair_create( key, pair ){ keyStore[ keyStore.length ] = key; pairStore[ pairStore.length ] = pair; + return true; }; +/** + * キーとペアになっている値の取得。 + * @alias X.Pair.get + * @param {object|function|array} key + * @return {*} + */ function X_Pair_get( key ){ var chashe = !X_Pair_noChashe, pair; @@ -56,6 +75,13 @@ function X_Pair_get( key ){ return pair; }; +/** + * キー/バリューのペアを解消する。バリューは指定しなくても可。 + * @alias X.Pair.release + * @param {object|function|array} key + * @param {*} [pair=] + * @return {boolean} true の場合解除成功 + */ function X_Pair_release( key, opt_pair ){ var i = 0, l = X_Pair_KEY_STORE_LIST.length, @@ -71,7 +97,8 @@ function X_Pair_release( key, opt_pair ){ if( X_Pair_lastKey === key ){ X_Pair_lastKey = X_Pair_lastPair = null; }; - break; + return true; }; }; + return false; }; diff --git a/0.6.x/js/01_core/10_XCallback.js b/0.6.x/js/01_core/10_XCallback.js index d0a4d05..31c8a3c 100644 --- a/0.6.x/js/01_core/10_XCallback.js +++ b/0.6.x/js/01_core/10_XCallback.js @@ -136,36 +136,43 @@ var __CallbackHash__ = /** * X.Timer と X.EventDispatcher からのコールバックの返り値を定義。 * @namespace X.Callback - * @alias X.Callback */ X[ 'Callback' ] = { /** * このコールバックでは返り値による操作は無い。 + * @alias X.Callback.NONE */ 'NONE' : X_Callback_NONE, /** * X.Timer, X.EventDispatcher のコールバックでタイマーやイベントリスナの解除に使用。 + * @alias X.Callback.UN_LISTEN */ 'UN_LISTEN' : X_Callback_UN_LISTEN, /** * 上位階層へのイベント伝播のキャンセル。DOM イベントのコールバックの戻り値に指定すると e.stopPropagation() が呼ばれる。 + * @alias X.Callback.STOP_PROPAGATION */ 'STOP_PROPAGATION' : X_Callback_STOP_PROPAGATION, /** * 以降のイベントのディスパッチを中断する。STOP_PROPAGATION との違いは、次に控えているコールバックもキャンセルされる点。但し system によって追加されたイベントはキャンセルされない。 + * @alias X.Callback.STOP_NOW */ 'STOP_NOW' : X_Callback_STOP_NOW, /** * DOM イベントのコールバックの戻り値に指定すると e.preventDefault() が呼ばれる。 * またフレームワーク内で定義されたデフォルト動作の回避にも使用される。 + * @alias X.Callback.PREVENT_DEFAULT */ 'PREVENT_DEFAULT' : X_Callback_PREVENT_DEFAULT, - /** - * X.UI に於いて、ポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。 + * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。 + * @alias X.Callback.CAPTURE_POINTER */ 'CAPTURE_POINTER' : X_Callback_CAPTURE_POINTER, - + /** + * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占を解除する。 + * @alias X.Callback.RELEASE_POINTER + */ 'RELEASE_POINTER' : X_Callback_RELEASE_POINTER }; diff --git a/0.6.x/js/01_core/11_XClass.js b/0.6.x/js/01_core/11_XClass.js index b7c2920..e4b556a 100644 --- a/0.6.x/js/01_core/11_XClass.js +++ b/0.6.x/js/01_core/11_XClass.js @@ -5,7 +5,7 @@ var /** * 全てのクラスのスーパークラスのようなもの。(ライブラリ内にカプセル化されているため、ユーザが触ることはありません)
- * X_Class.create() で定義されたクラスのインスタンスが共通で備えるメソッド を確認してください。 + * X.Class.create() で定義されたクラスのインスタンスが共通で備えるメソッド を確認してください。 * @class __ClassBase__ * @private * @abstract @@ -41,10 +41,7 @@ X_Class_CommonMethods = */ // TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ 'kill' : function(){ - var instance = this, - klass = X_Class_getClass( instance ), - def = X_Class_getClassDef( klass ), - data, p, i; + var def, listeners, p; // TODO kill 中の kill の呼び出しを防ぐ, 破棄済のインスタンスへの kill @@ -54,30 +51,33 @@ X_Class_CommonMethods = this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED ); return; }; - if( this[ '_listeners' ] && this[ '_listeners' ][ X_LISTENERS_DISPATCHING ] ){ - this[ '_listeners' ][ X_LISTENERS_KILL_RESERVED ] = true; + + listeners = this[ '_listeners' ]; + + if( listeners && listeners[ X_LISTENERS_DISPATCHING ] ){ + listeners[ X_LISTENERS_KILL_RESERVED ] = true; return; }; // asyncDispatch の削除 for( p in X_EventDispatcher_LAZY_TIMERS ){ if( X_EventDispatcher_LAZY_TIMERS[ p ] === this ){ - delete X_EventDispatcher_LAZY_TIMERS[ p ]; // 削除が先!理由は X.Timer.removeを確認。 - X_Timer_remove( parseFloat( p ) ); + // delete X_EventDispatcher_LAZY_TIMERS[ p ]; コレ不要 + X_Timer_remove( p ); }; }; this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE ); - this[ '_listeners' ] && X_EventDispatcher_unlistenAll( this ); + listeners && X_EventDispatcher_unlistenAll( this ); }; - for( p in instance ){ - if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue; - delete instance[ p ]; - }; + X_Object_clear( this ); + + def = X_Class_getClassDef( this ); + if( def.pool ){ - def.live && def.live.splice( def.live.indexOf( instance ), 1 ); - def.pool[ def.pool.length ] = instance; + def.live.splice( def.live.indexOf( this ), 1 ); + def.pool[ def.pool.length ] = this; }; }, @@ -307,7 +307,9 @@ X[ 'Class' ] = /** @lends X.Class */ { privateDef, props, klass, - classDef = {}, hash; + classDef = {}, + cbHash = { proxy : X_Class_actualConstructor, classDef : classDef }; + if( X_Type_isString( displayName ) === true ){ classDef.displayName = displayName; args.shift(); @@ -334,12 +336,18 @@ X[ 'Class' ] = /** @lends X.Class */ { // クラスメンバ用オブジェクトが無しでもクラスは作成可能 props = {}; } else - if( props[ 'Constructor' ] && X_Type_isFunction( props[ 'Constructor' ] ) ){ + if( props[ 'Constructor' ] ){ + //{+dev + if( !X_Type_isFunction( props[ 'Constructor' ] ) ){ + alert( '"Constructor" is not function.' ); + return; + }; + //}+dev classDef.Constructor = props[ 'Constructor' ]; }; - klass = X_Callback_actualClosure( hash = { proxy : X_Class_actualConstructor } ); // TODO hash = classDef - hash.klass = klass; + klass = X_Callback_actualClosure( cbHash ); // TODO callbackHash を class定義の置き場所にしてしまう!なるほど… + cbHash.klass = klass; klass[ 'superClassOf' ] = X_Class_superClassOf; klass[ 'subClassOf' ] = X_Class_subClassOf; @@ -523,17 +531,15 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props */ function X_Class_actualConstructor( f, args ){ var klass = f.klass, - def = X_Class_getClassDef( klass ), - dataUser = def._tempUser, - instance, obj, - userDef; + def = f.classDef, + instance, obj; if( def.Abstract ){ X.Logger.critical( 'AbstractClass!' ); return; }; - instance = def.pool && def.pool.length > 0 ? + instance = def.pool && def.pool.length ? def.pool.pop() : X_Class_useObjectCreate ? Object.create( klass.prototype ) : diff --git a/0.6.x/js/01_core/13_XEventDispatcher.js b/0.6.x/js/01_core/13_XEventDispatcher.js index b2a0bdc..27649db 100644 --- a/0.6.x/js/01_core/13_XEventDispatcher.js +++ b/0.6.x/js/01_core/13_XEventDispatcher.js @@ -346,10 +346,6 @@ function X_EventDispatcher_dispatch( e ){ }; if( listeners[ X_LISTENERS_KILL_RESERVED ] ){ - /* - for( timerID in X_EventDispatcher_LAZY_TIMERS ){ - if( X_EventDispatcher_LAZY_TIMERS[ timerID ] === this ) return ret; - }; */ this[ 'kill' ](); }; }; diff --git a/0.6.x/js/02_dom/08_XNodeSelector.js b/0.6.x/js/02_dom/08_XNodeSelector.js index 9d33b14..727ac95 100644 --- a/0.6.x/js/02_dom/08_XNodeSelector.js +++ b/0.6.x/js/02_dom/08_XNodeSelector.js @@ -78,10 +78,11 @@ function X_Node_Selector__parse( query, last ){ chr, chrCode, nameChr, name1st, tmp, escape, quot, start, name, key, value, operator, a, b, not; + query += ' '; while( i < l ){ chr = query.charAt( ++i ); - chrCode = ALPHABET.indexOf( chr ); + chrCode = ALPHABET.indexOf( chr ); // TODO この関数無くす! nameChr = chrCode !== -1; name1st = nameChr && chrCode < 52; switch( phase ){ diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index fdc66aa..6dbca99 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -43,7 +43,7 @@ *
mimeType
'text/xml', 'audio/mpeg' 等。xhr.overrideMimeType する値 *
auth
X.OAuth2 インスタンス(OAuth2 サービスの定義) *
getFullHeaders
getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。XDR は Content-Type しか取得でいない。 - *
canUse
未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている + *
canUse
未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている * * *

JSONP 用プロパティ

@@ -92,23 +92,31 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ]( var opt, url, type, auth; if( X_Type_isObject( opt = urlOrObject ) ){ + //{+xhr if( X_Type_isString( url = opt[ 'xhr' ] ) ){ type = X_NET_TYPE_XHR; } else + //}+xhr + //{+jsonp if( X_Type_isString( url = opt[ 'jsonp' ] ) ){ type = X_NET_TYPE_JSONP; } else + //}+jsonp + //{+netimage if( X_Type_isString( url = opt[ 'img' ] || opt[ 'image' ] ) ){ type = X_NET_TYPE_IMAGE; } else + //}+netimage + //{+netform if( X_Type_isString( url = opt[ 'form' ] ) ){ type = X_NET_TYPE_FORM; - //{+dev } else + //}+netform if( !( type = X_NET_NAME_TO_ID[ opt[ 'type' ] ] ) ){ + //{+dev alert( 'X.Net args error' ); + //}+dev return; - //}+dev } else { url = opt[ 'url' ]; }; diff --git a/0.6.x/js/06_net/01_XNetXHR.js b/0.6.x/js/06_net/01_XNetXHR.js index efe8c94..dad1597 100644 --- a/0.6.x/js/06_net/01_XNetXHR.js +++ b/0.6.x/js/06_net/01_XNetXHR.js @@ -1,3 +1,5 @@ +//{+xhr"XHR,XDR,MSXMLによる通信"(XMLHTTPRequest, XDomainRequest, ActiveX-MSXML を使った通信)[+net] + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest // https://web.archive.org/web/20071101021832/http://web.paulownia.jp/script/ajax/xmlhttp4.html // https://web.archive.org/web/20091029170015/http://wiki.paulownia.jp/ajax/xmlhttprequest @@ -42,7 +44,7 @@ TODO クライアント側にもリトライ機構を入れてみる */ var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+ - // ie7&8 ではローカルリソースには ActiveX の XHR を使う + // ie9- ではローカルリソースには MSXML を使う X_Net_XHR_createW3C = window[ 'XMLHttpRequest' ] && function(){ return X_Net_XHR_w3c || ( X_Net_XHR_w3c = new XMLHttpRequest() ); }, X_Net_XHR_w3c = X_Net_XHR_createW3C && X_Net_XHR_createW3C(), X_Net_XHR_cors = X_Net_XHR_w3c && X_Net_XHR_w3c.withCredentials !== undefined, @@ -73,7 +75,8 @@ var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+ X_Net_XHR_neverReuse = X_UA[ 'IE' ] < 9, // ie7,8 の xhr はリユース不可。msxml はリユース可能。 - X_Net_XHR_init; + X_Net_XHR_TYPE_FLASH = 8, + X_Net_XHR_TYPE_GADGET = 16; if( X_Net_XHR_msXML ){ X_Net_XHR_msXMLVer = X_Net_XHR_msXML[ 0 ]; @@ -115,15 +118,17 @@ if( X_Net_XHR_msXMLVer ) X[ 'XHR' ][ 'MSXML_VERSION' ] = X_Net_XHR_msXMLVer; if( X_Net_XHR_w3c || X_Net_XHR_msXML ){ X_TEMP.X_Net_XHR_init = function(){ + X_NET_XHRWrapper = X_Class_override( X_EventDispatcher(), X_TEMP.X_Net_XHR_params, true ); delete X_TEMP.X_Net_XHR_init; + delete X_TEMP.X_Net_XHR_params; - X_NET_XHRWrapper = X_Class_override( - X_EventDispatcher(), - { + return X_NET_XHRWrapper; +}; + +X_TEMP.X_Net_XHR_params = { '_rawType' : X_EventDispatcher_EVENT_TARGET_XHR, - // '_rawObject' : X_Net_XHR_w3c || X_Net_XHR_msXML, _isXDR : false, _isMsXML : false, @@ -264,7 +269,7 @@ X_TEMP.X_Net_XHR_init = function(){ for( p in headers ){ if( X_EMPTY_OBJECT[ p ] ) continue; - console.log( headers[ p ] ); + //console.log( headers[ p ] ); headers[ p ] !== undefined && raw.setRequestHeader( p, headers[ p ] + '' ); // Opera8.01+, MSXML3+ }; }; @@ -505,16 +510,10 @@ X_TEMP.X_Net_XHR_init = function(){ states, data; live && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent, 'uploadPercent' : ( e.loaded / e.total ) } ); } - }, - true - ); + }; // 同期リクエストでなければならない場合, unload, beforeunload時 - - return X_NET_XHRWrapper; -}; }; - /* * https://gist.github.com/mmazer/5404301 * diff --git a/0.6.x/js/06_net/02_XNetJSONP.js b/0.6.x/js/06_net/02_XNetJSONP.js index 6918382..2c259c5 100644 --- a/0.6.x/js/06_net/02_XNetJSONP.js +++ b/0.6.x/js/06_net/02_XNetJSONP.js @@ -1,3 +1,5 @@ +//{+jsonp"jsonpによるajax"(jsonpによるクロスドメイン通信。)[+net,+ninjaiframe] + /* * Operaでも非同期リクエストが並列処理できる img-JSONP * http://developer.cybozu.co.jp/takesako/2007/06/opera_img-jsonp.html diff --git a/0.6.x/js/06_net/03_XNetForm.js b/0.6.x/js/06_net/03_XNetForm.js index 1dec5db..fffe714 100644 --- a/0.6.x/js/06_net/03_XNetForm.js +++ b/0.6.x/js/06_net/03_XNetForm.js @@ -1,3 +1,5 @@ +//{+netform"
によるGETとPOST"(動的に生成したフォームによるGETとPOST。)[+net,+ninjaiframe] + X[ 'Net' ][ 'Form' ] = { // 隠し iframe 使用の可否 }; @@ -100,3 +102,5 @@ function X_NET_Form_iframeListener( e ){ }; return X_Callback_UN_LISTEN; }; + +//}+netform \ No newline at end of file diff --git a/0.6.x/js/06_net/04_XNetImage.js b/0.6.x/js/06_net/04_XNetImage.js index 0375e74..1f9ac6d 100644 --- a/0.6.x/js/06_net/04_XNetImage.js +++ b/0.6.x/js/06_net/04_XNetImage.js @@ -1,3 +1,4 @@ +//{+netimage"画像の読み込み監視"(Imageの読み込みを監視し画像表示のコントロールを行う)[+net,+utilimage] /* * original * LICENSE: MIT? @@ -5,7 +6,6 @@ * AUTHOR: uupaa.js@gmail.com * */ - var X_Net_Image_hasImage = !!window[ 'Image' ], X_Net_Image_image = X_Net_Image_hasImage && new Image(), // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する diff --git a/0.6.x/js/06_net/05_XXHRGadget.js b/0.6.x/js/06_net/05_XXHRGadget.js index 1d294e0..443d455 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 ), @@ -42,7 +42,7 @@ 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(){ @@ -75,26 +75,26 @@ 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 ); 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( '.' ) ); + ret = X_String_parseTrustedJsonString( X_NET_GIMR_receivedString ); + X_NET_GIMR_receivedString = ''; @@ -132,6 +132,26 @@ function X_NET_GIMR_detectImageOverIframe(){ }; }; }; +/* +(function( i, l, res ){ + var start = X.Timer.now(), loc = location, res = [], hash; + for( ; i < l; ++i ){ + loc.replace = chr = '#' + String.fromCharCode( i ); + hash = _builtin_decodeURI( loc.hash ); + if( _builtin_decodeURI( chr ) !== hash ) res.push( i + ':' + _builtin_decodeURI( chr ) ); + if( start + 16 < X.Timer.now() ){ + //console.log( i + ' / ' + l + ' ' + start + ' ' + X.Timer.now() ); + X.Timer.once( 16, arguments.callee, [ ++i, l, res ] ); + return; + }; + }; + alert( res.length + '\n' + res.join() ); +})( 0xff, 0xffff, [] ); */ + +// http://outcloud.blogspot.jp/2015/06/gecko-location-hash.html +function X_Net_GIMR_decodeLocationHash( str ){ + return X_UA[ 'Gecko' ] ? unescape( str ) : decodeURIComponent( str ); +}; // コマンドが長い場合、分割する function X_NET_GIMR_toJSONString( obj ){ @@ -245,3 +265,4 @@ X_TEMP.X_Net_GIMR_props = { } }; +//}+xhrgadget \ No newline at end of file diff --git a/0.6.x/js/06_net/10_XOAuth2.js b/0.6.x/js/06_net/10_XOAuth2.js index ef18be5..8bdd18d 100644 --- a/0.6.x/js/06_net/10_XOAuth2.js +++ b/0.6.x/js/06_net/10_XOAuth2.js @@ -1,4 +1,5 @@ +//{+oauth2"OAuth2 サービスの定義"(OAuth2外部サービスを定義し、認可プロセス・xhrの署名を自動化します)[+xhr] var X_NET_OAUTH2_detection = new Function( 'w', 'try{return w.location.search}catch(e){}' ), X_NET_OAUTH2_authorizationWindow, X_NET_OAUTH2_authorizationTimerID; @@ -399,3 +400,4 @@ function updateLocalStorage( cmd, that, name, value ){ return pair[ name ]; }; +//}+oauth2 \ No newline at end of file diff --git a/0.6.x/js/20_ui/08_Box.js b/0.6.x/js/20_ui/08_Box.js index a030267..2c66217 100644 --- a/0.6.x/js/20_ui/08_Box.js +++ b/0.6.x/js/20_ui/08_Box.js @@ -83,7 +83,7 @@ var XUI_Box = XUI_AbstractUINode.inherits( if( !user[ 'instanceOf' ]( X.UI.Box ) ){ //throw new Error( 'Box を継承したインスタンスだけが _Box のオーナーになれます' ); - }; + }; this.User = user; -- 2.11.0