OSDN Git Service

Version 0.6.159, fix X.Class & X.XHR.Gadget.
authoritozyun <itozyun@user.sourceforge.jp>
Sat, 13 Jun 2015 04:09:45 +0000 (13:09 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Sat, 13 Jun 2015 04:09:45 +0000 (13:09 +0900)
15 files changed:
0.6.x/js/01_core/00_builtin.js
0.6.x/js/01_core/04_XObject.js
0.6.x/js/01_core/09_XPair.js
0.6.x/js/01_core/10_XCallback.js
0.6.x/js/01_core/11_XClass.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/02_dom/08_XNodeSelector.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/01_XNetXHR.js
0.6.x/js/06_net/02_XNetJSONP.js
0.6.x/js/06_net/03_XNetForm.js
0.6.x/js/06_net/04_XNetImage.js
0.6.x/js/06_net/05_XXHRGadget.js
0.6.x/js/06_net/10_XOAuth2.js
0.6.x/js/20_ui/08_Box.js

index 8af9798..2582d1e 100644 (file)
@@ -223,6 +223,7 @@ function _builtin_decodeURI( x ){
                        };\r
                };\r
        };\r
+       \r
        return result.join( '' );\r
 };\r
 \r
index c12c3bd..500ca49 100644 (file)
@@ -34,6 +34,8 @@ X[ 'Object' ] = {
        \r
        'override'   : X_Object_override,\r
        \r
+       'clear'      : X_Object_clear,\r
+       \r
        'deepCopy'   : X_Object_deepCopy,\r
        \r
        // TODO rename to X.Array.copy\r
@@ -86,6 +88,20 @@ function X_Object_override( target, src ){
 };\r
 \r
 /**\r
+ * オブジェクトの全てのメンバーを破棄します。\r
+ * @alias X.Object.clear\r
+ * @param {object} obj。\r
+ */\r
+function X_Object_clear( obj, k ){\r
+       if( obj ){\r
+               for( k in obj ){\r
+                       delete obj[ k ];\r
+               };\r
+       };\r
+};\r
+\r
+\r
+/**\r
  * オブジェクト(object, Array)のメンバーを探索して、ディープコピーしたオブジェクトを返します。\r
  * オブジェクトが循環参照している場合は、既にコピーしているオブジェクトが現れた時点で、先に作成しているコピーの参照を返すので無限にループすることはありません。\r
  * @alias X.Object.deepCopy\r
index 14cd864..c0c3cd8 100644 (file)
@@ -1,3 +1,8 @@
+/**\r
+ * Object(Array|Function)をキーにする、キーバリューストアを作る。js 自体にオブジェクトをキーとするハッシュの機能は無い為、内部はArrayで代用している。そのため値へのアクセスは低速。\r
+ * 値を隠蔽したい場合に加え、速度が問題にならないケースや、速度対策を実施したうえで使用する。\r
+ * @namespace X.Pair\r
+ */\r
 X[ 'Pair' ] = {\r
        'create'  : X_Pair_create,\r
        \r
@@ -6,7 +11,7 @@ X[ 'Pair' ] = {
        'release' : X_Pair_release\r
 };\r
 \r
-var X_Pair_SIZE            = 1000,\r
+var X_Pair_SIZE            = 1024,\r
        X_Pair_KEY_STORE_LIST  = [[]],\r
        X_Pair_PAIR_STORE_LIST = [[]],\r
        X_Pair_noChashe        = false,\r
@@ -27,12 +32,19 @@ var X_Pair_SIZE            = 1000,
        // TODO キャッシュするペアの数とヒット率、探索時間の記録\r
        X_Pair_lastKey, X_Pair_lastPair;\r
 \r
+/**\r
+ * Object(Array|Function)をキーとして値を登録。すでにキーが登録されている場合は登録できない。\r
+ * @alias X.Pair.create\r
+ * @param {object|function|array} key\r
+ * @param {*} pair == false な値は不可\r
+ * @return {boolean} true の場合、登録成功\r
+ */\r
 function X_Pair_create( key, pair ){\r
        var keyStore  = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length - 1 ],\r
                pairStore = X_Pair_PAIR_STORE_LIST[ X_Pair_PAIR_STORE_LIST.length - 1 ];\r
        \r
        X_Pair_noChashe = true;\r
-       if( X_Pair_get( key ) || !( X_Type_isObject( key ) || X_Type_isArray( key ) || X_Type_isFunction( key ) ) ) return;\r
+       if( !pair || X_Pair_get( key ) || !( X_Type_isObject( key ) || X_Type_isArray( key ) || X_Type_isFunction( key ) ) ) return false;\r
        \r
        if( keyStore.length === X_Pair_SIZE ){\r
                keyStore  = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length   ] = [];\r
@@ -41,8 +53,15 @@ function X_Pair_create( key, pair ){
        \r
        keyStore[  keyStore.length  ] = key;\r
        pairStore[ pairStore.length ] = pair;\r
+       return true;\r
 };\r
 \r
+/**\r
+ * キーとペアになっている値の取得。\r
+ * @alias X.Pair.get\r
+ * @param {object|function|array} key\r
+ * @return {*}\r
+ */\r
 function X_Pair_get( key ){\r
        var chashe = !X_Pair_noChashe, pair;\r
        \r
@@ -56,6 +75,13 @@ function X_Pair_get( key ){
        return pair;\r
 };\r
 \r
+/**\r
+ * キー/バリューのペアを解消する。バリューは指定しなくても可。\r
+ * @alias X.Pair.release\r
+ * @param {object|function|array} key\r
+ * @param {*} [pair=]\r
+ * @return {boolean} true の場合解除成功\r
+ */\r
 function X_Pair_release( key, opt_pair ){\r
        var i = 0,\r
                l = X_Pair_KEY_STORE_LIST.length,\r
@@ -71,7 +97,8 @@ function X_Pair_release( key, opt_pair ){
                        if( X_Pair_lastKey === key ){\r
                                X_Pair_lastKey = X_Pair_lastPair = null;\r
                        };\r
-                       break;\r
+                       return true;\r
                };\r
        };\r
+       return false;\r
 };\r
index d0a4d05..31c8a3c 100644 (file)
@@ -136,36 +136,43 @@ var __CallbackHash__ =
 /**\r
  * X.Timer と X.EventDispatcher からのコールバックの返り値を定義。\r
  * @namespace X.Callback\r
- * @alias X.Callback\r
  */\r
 X[ 'Callback' ] = {\r
        /**\r
         * このコールバックでは返り値による操作は無い。\r
+        * @alias X.Callback.NONE\r
         */\r
        'NONE'             : X_Callback_NONE,\r
        /**\r
         * X.Timer, X.EventDispatcher のコールバックでタイマーやイベントリスナの解除に使用。\r
+        * @alias X.Callback.UN_LISTEN\r
         */\r
        'UN_LISTEN'        : X_Callback_UN_LISTEN,\r
        /**\r
         * 上位階層へのイベント伝播のキャンセル。DOM イベントのコールバックの戻り値に指定すると e.stopPropagation() が呼ばれる。\r
+        * @alias X.Callback.STOP_PROPAGATION\r
         */\r
        'STOP_PROPAGATION' : X_Callback_STOP_PROPAGATION,\r
        /**\r
         * 以降のイベントのディスパッチを中断する。STOP_PROPAGATION との違いは、次に控えているコールバックもキャンセルされる点。但し system によって追加されたイベントはキャンセルされない。\r
+        * @alias X.Callback.STOP_NOW\r
         */\r
        'STOP_NOW'         : X_Callback_STOP_NOW,\r
        /**\r
         * DOM イベントのコールバックの戻り値に指定すると e.preventDefault() が呼ばれる。\r
         * またフレームワーク内で定義されたデフォルト動作の回避にも使用される。\r
+        * @alias X.Callback.PREVENT_DEFAULT\r
         */\r
        'PREVENT_DEFAULT'  : X_Callback_PREVENT_DEFAULT,\r
-       \r
        /**\r
-        * X.UI に於いて、ポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。\r
+        * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。\r
+        * @alias X.Callback.CAPTURE_POINTER\r
         */\r
        'CAPTURE_POINTER'  : X_Callback_CAPTURE_POINTER,\r
-       \r
+       /**\r
+        * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占を解除する。\r
+        * @alias X.Callback.RELEASE_POINTER\r
+        */\r
        'RELEASE_POINTER'  : X_Callback_RELEASE_POINTER\r
 };\r
 \r
index b7c2920..e4b556a 100644 (file)
@@ -5,7 +5,7 @@
 var\r
        /**\r
         * 全てのクラスのスーパークラスのようなもの。(ライブラリ内にカプセル化されているため、ユーザが触ることはありません)<br>\r
-        * X_Class.create() で定義されたクラスのインスタンスが共通で備えるメソッド を確認してください。\r
+        * X.Class.create() で定義されたクラスのインスタンスが共通で備えるメソッド を確認してください。\r
         * @class __ClassBase__\r
         * @private\r
         * @abstract\r
@@ -41,10 +41,7 @@ X_Class_CommonMethods =
         */\r
        // TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ\r
        'kill' : function(){\r
-               var instance = this,\r
-                       klass    = X_Class_getClass( instance ),\r
-                       def      = X_Class_getClassDef( klass ),\r
-                       data, p, i;\r
+               var def, listeners, p;\r
                \r
                // TODO kill 中の kill の呼び出しを防ぐ, 破棄済のインスタンスへの kill\r
                \r
@@ -54,30 +51,33 @@ X_Class_CommonMethods =
                                this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );\r
                                return;\r
                        };\r
-                       if( this[ '_listeners' ] && this[ '_listeners' ][ X_LISTENERS_DISPATCHING ] ){\r
-                               this[ '_listeners' ][ X_LISTENERS_KILL_RESERVED ] = true;\r
+                       \r
+                       listeners = this[ '_listeners' ];\r
+                       \r
+                       if( listeners && listeners[ X_LISTENERS_DISPATCHING ] ){\r
+                               listeners[ X_LISTENERS_KILL_RESERVED ] = true;\r
                                return;\r
                        };\r
 \r
                        // asyncDispatch の削除\r
                        for( p in X_EventDispatcher_LAZY_TIMERS ){\r
                                if( X_EventDispatcher_LAZY_TIMERS[ p ] === this ){\r
-                                       delete X_EventDispatcher_LAZY_TIMERS[ p ]; // 削除が先!理由は X.Timer.removeを確認。\r
-                                       X_Timer_remove( parseFloat( p ) );\r
+                                        // delete X_EventDispatcher_LAZY_TIMERS[ p ]; コレ不要\r
+                                       X_Timer_remove( p );\r
                                };\r
                        };\r
                        \r
                        this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE );\r
-                       this[ '_listeners' ] && X_EventDispatcher_unlistenAll( this );\r
+                       listeners && X_EventDispatcher_unlistenAll( this );\r
                };\r
                \r
-               for( p in instance ){\r
-                       if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;\r
-                       delete instance[ p ];\r
-               };\r
+               X_Object_clear( this );\r
+               \r
+               def = X_Class_getClassDef( this );\r
+               \r
                if( def.pool ){\r
-                       def.live && def.live.splice( def.live.indexOf( instance ), 1 );\r
-                       def.pool[ def.pool.length ] = instance;\r
+                       def.live.splice( def.live.indexOf( this ), 1 );\r
+                       def.pool[ def.pool.length ] = this;\r
                };\r
        },\r
        \r
@@ -307,7 +307,9 @@ X[ 'Class' ] = /** @lends X.Class */ {
                        privateDef,\r
                        props,\r
                        klass,\r
-                       classDef = {}, hash;\r
+                       classDef = {},\r
+                       cbHash = { proxy : X_Class_actualConstructor, classDef : classDef };\r
+\r
                if( X_Type_isString( displayName ) === true ){\r
                        classDef.displayName = displayName;\r
                        args.shift();\r
@@ -334,12 +336,18 @@ X[ 'Class' ] = /** @lends X.Class */ {
                        // クラスメンバ用オブジェクトが無しでもクラスは作成可能\r
                        props = {};\r
                } else\r
-               if( props[ 'Constructor' ] && X_Type_isFunction( props[ 'Constructor' ] ) ){\r
+               if( props[ 'Constructor' ] ){\r
+                       //{+dev\r
+                       if( !X_Type_isFunction( props[ 'Constructor' ] ) ){\r
+                               alert( '"Constructor" is not function.' );\r
+                               return;\r
+                       };\r
+                       //}+dev\r
                        classDef.Constructor = props[ 'Constructor' ];\r
                };\r
 \r
-               klass  = X_Callback_actualClosure( hash = { proxy : X_Class_actualConstructor } ); // TODO hash = classDef\r
-               hash.klass = klass;\r
+               klass  = X_Callback_actualClosure( cbHash ); // TODO callbackHash を class定義の置き場所にしてしまう!なるほど…\r
+               cbHash.klass = klass;\r
                klass[ 'superClassOf' ] = X_Class_superClassOf;\r
                klass[ 'subClassOf' ]   = X_Class_subClassOf;\r
                \r
@@ -523,17 +531,15 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
  */\r
 function X_Class_actualConstructor( f, args ){\r
        var klass    = f.klass,\r
-               def      = X_Class_getClassDef( klass ),\r
-               dataUser = def._tempUser,\r
-               instance, obj,\r
-               userDef;\r
+               def      = f.classDef,\r
+               instance, obj;\r
 \r
        if( def.Abstract ){\r
                X.Logger.critical( 'AbstractClass!' );\r
                return;\r
        };\r
        \r
-       instance = def.pool && def.pool.length > 0 ?\r
+       instance = def.pool && def.pool.length ?\r
                                        def.pool.pop() :\r
                                X_Class_useObjectCreate ?\r
                                        Object.create( klass.prototype ) :\r
index b2a0bdc..27649db 100644 (file)
@@ -346,10 +346,6 @@ function X_EventDispatcher_dispatch( e ){
                };\r
 \r
                if( listeners[ X_LISTENERS_KILL_RESERVED ] ){\r
-                       /*\r
-                       for( timerID in X_EventDispatcher_LAZY_TIMERS ){\r
-                               if( X_EventDispatcher_LAZY_TIMERS[ timerID ] === this ) return ret;\r
-                       }; */\r
                        this[ 'kill' ]();\r
                };\r
        };\r
index 9d33b14..727ac95 100644 (file)
@@ -78,10 +78,11 @@ function X_Node_Selector__parse( query, last ){
                chr, chrCode, nameChr, name1st,\r
                tmp, escape, quot, start,\r
                name, key, value, operator, a, b, not;\r
+\r
        query += ' ';\r
        while( i < l ){\r
                chr     = query.charAt( ++i );\r
-               chrCode = ALPHABET.indexOf( chr );\r
+               chrCode = ALPHABET.indexOf( chr ); // TODO この関数無くす!\r
                nameChr = chrCode !== -1;\r
                name1st = nameChr && chrCode < 52;\r
                switch( phase ){\r
index fdc66aa..6dbca99 100644 (file)
@@ -43,7 +43,7 @@
  * <dt>mimeType<dd>'text/xml', 'audio/mpeg' 等。xhr.overrideMimeType する値\r
  * <dt>auth<dd>X.OAuth2 インスタンス(OAuth2 サービスの定義)\r
  * <dt>getFullHeaders<dd>getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。XDR は Content-Type しか取得でいない。\r
- * <dt>canUse<dd>未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている\r
+ * <dt>canUse<dd>未実装。gadget proxy, YQL, <del>YPipes</del> 等のマッシュアップの許可。現在は test : 'gadget' としている\r
  * </dl>\r
  * \r
  * <h4>JSONP 用プロパティ</h4>\r
@@ -92,23 +92,31 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                var opt, url, type, auth;\r
                                \r
                                if( X_Type_isObject( opt = urlOrObject ) ){\r
+                                       //{+xhr\r
                                        if( X_Type_isString( url = opt[ 'xhr' ] ) ){\r
                                                type = X_NET_TYPE_XHR;\r
                                        } else\r
+                                       //}+xhr\r
+                                       //{+jsonp\r
                                        if( X_Type_isString( url = opt[ 'jsonp' ] ) ){\r
                                                type = X_NET_TYPE_JSONP;\r
                                        } else\r
+                                       //}+jsonp\r
+                                       //{+netimage\r
                                        if( X_Type_isString( url = opt[ 'img' ] || opt[ 'image' ] ) ){\r
                                                type = X_NET_TYPE_IMAGE;\r
                                        } else\r
+                                       //}+netimage\r
+                                       //{+netform\r
                                        if( X_Type_isString( url = opt[ 'form' ] ) ){\r
                                                type = X_NET_TYPE_FORM;\r
-                                       //{+dev\r
                                        } else\r
+                                       //}+netform\r
                                        if( !( type = X_NET_NAME_TO_ID[ opt[ 'type' ] ] ) ){\r
+                                               //{+dev\r
                                                alert( 'X.Net args error' );\r
+                                               //}+dev\r
                                                return;\r
-                                       //}+dev\r
                                        } else {\r
                                                url = opt[ 'url' ];\r
                                        };\r
index efe8c94..dad1597 100644 (file)
@@ -1,3 +1,5 @@
+//{+xhr"XHR,XDR,MSXMLによる通信"(XMLHTTPRequest, XDomainRequest, ActiveX-MSXML を使った通信)[+net]\r
+\r
 // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r
 // https://web.archive.org/web/20071101021832/http://web.paulownia.jp/script/ajax/xmlhttp4.html\r
 // https://web.archive.org/web/20091029170015/http://wiki.paulownia.jp/ajax/xmlhttprequest\r
@@ -42,7 +44,7 @@ TODO クライアント側にもリトライ機構を入れてみる
 \r
  */\r
 var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+\r
-       // ie7&8 ではローカルリソースには ActiveX の XHR を使う\r
+       // ie9- ではローカルリソースには MSXML を使う\r
        X_Net_XHR_createW3C   = window[ 'XMLHttpRequest' ] && function(){ return X_Net_XHR_w3c || ( X_Net_XHR_w3c = new XMLHttpRequest() ); },\r
        X_Net_XHR_w3c         = X_Net_XHR_createW3C && X_Net_XHR_createW3C(),\r
        X_Net_XHR_cors        = X_Net_XHR_w3c && X_Net_XHR_w3c.withCredentials !== undefined,\r
@@ -73,7 +75,8 @@ var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+
        \r
        X_Net_XHR_neverReuse  = X_UA[ 'IE' ] < 9, // ie7,8 の xhr はリユース不可。msxml はリユース可能。\r
        \r
-       X_Net_XHR_init;\r
+       X_Net_XHR_TYPE_FLASH  = 8,\r
+       X_Net_XHR_TYPE_GADGET = 16;\r
 \r
 if( X_Net_XHR_msXML ){\r
        X_Net_XHR_msXMLVer = X_Net_XHR_msXML[ 0 ];\r
@@ -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 ){\r
 \r
 X_TEMP.X_Net_XHR_init = function(){\r
+       X_NET_XHRWrapper = X_Class_override( X_EventDispatcher(), X_TEMP.X_Net_XHR_params, true );\r
        \r
        delete X_TEMP.X_Net_XHR_init;\r
+       delete X_TEMP.X_Net_XHR_params; \r
        \r
-       X_NET_XHRWrapper = X_Class_override(\r
-               X_EventDispatcher(),\r
-               {\r
+       return X_NET_XHRWrapper;\r
+};\r
+\r
+X_TEMP.X_Net_XHR_params = {\r
                        \r
                        '_rawType'   : X_EventDispatcher_EVENT_TARGET_XHR,\r
-                       // '_rawObject' : X_Net_XHR_w3c || X_Net_XHR_msXML,\r
                        \r
                        _isXDR       : false,\r
                        _isMsXML     : false,\r
@@ -264,7 +269,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                        \r
                                        for( p in headers ){\r
                                                if( X_EMPTY_OBJECT[ p ] ) continue;\r
-                                               console.log( headers[ p ] );\r
+                                               //console.log( headers[ p ] );\r
                                                headers[ p ] !== undefined && raw.setRequestHeader( p, headers[ p ] + '' ); // Opera8.01+, MSXML3+\r
                                        };\r
                                };\r
@@ -505,16 +510,10 @@ X_TEMP.X_Net_XHR_init = function(){
                                        states, data;\r
                                live && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent, 'uploadPercent' : ( e.loaded / e.total ) } );\r
                        }\r
-               },\r
-               true\r
-       );\r
+               };\r
        // 同期リクエストでなければならない場合, unload, beforeunload時\r
-       \r
-       return X_NET_XHRWrapper;\r
-};\r
 \r
 };\r
-\r
 /*\r
  * https://gist.github.com/mmazer/5404301\r
  * \r
index 6918382..2c259c5 100644 (file)
@@ -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
index 1dec5db..fffe714 100644 (file)
@@ -1,3 +1,5 @@
+//{+netform"<form>によるGETとPOST"(動的に生成したフォームによるGETとPOST。)[+net,+ninjaiframe]\r
+\r
 X[ 'Net' ][ 'Form' ] = {\r
        // 隠し iframe 使用の可否\r
 };\r
@@ -100,3 +102,5 @@ function X_NET_Form_iframeListener( e ){
        };\r
        return X_Callback_UN_LISTEN;\r
 };\r
+\r
+//}+netform
\ No newline at end of file
index 0375e74..1f9ac6d 100644 (file)
@@ -1,3 +1,4 @@
+//{+netimage"画像の読み込み監視"(Imageの読み込みを監視し画像表示のコントロールを行う)[+net,+utilimage]\r
 /* \r
  * original\r
  *  LICENSE: MIT?\r
@@ -5,7 +6,6 @@
  *  AUTHOR: uupaa.js@gmail.com\r
  * \r
  */\r
-\r
 var X_Net_Image_hasImage  = !!window[ 'Image' ],\r
        X_Net_Image_image     = X_Net_Image_hasImage && new Image(),\r
        // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
index 1d294e0..443d455 100644 (file)
@@ -1,3 +1,5 @@
+//{+xhrgadget"OpenSocialガジェット通信プロキシ"(Xドメインは元よりXプロトコルな擬似xhr通信を可能にする)[+xhr]\r
+\r
 /*\r
  * gadgets.io.makeRequest\r
  * \r
@@ -15,8 +17,6 @@
  * \r
  */\r
 \r
-\r
-\r
 var X_NET_GIMR_canUse         = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],\r
        \r
        X_NET_GIMR_iframeName     = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ),\r
@@ -42,7 +42,7 @@ var X_NET_GIMR_canUse         = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],
        \r
        X_NET_GIMR_lastHashString,\r
        \r
-       X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString;\r
+       X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString = '';\r
 \r
 \r
 function X_NET_GIMR_detectImageOverIframe(){\r
@@ -75,26 +75,26 @@ function X_NET_GIMR_detectImageOverIframe(){
                                                n   = parseInt( ret );\r
                                                \r
                                                if( X_NET_GIMR_isReceiveBatches ){\r
-                                                       X_NET_GIMR_receivedString += ret;\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
                                                                return;\r
                                                        };\r
                                                } else\r
                                                if( 1 < n ){\r
-                                                       X_NET_GIMR_receivedString   = ret.substr( ( n + ':' ).length );\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
                                                        // speedup\r
                                                        X_NET_GIMR_timerID = X_Timer_add( 16, 0, X_NET_GIMR_detectImageOverIframe );\r
                                                        return X_Callback_UN_LISTEN;\r
                                                } else {\r
-                                                       X_NET_GIMR_receivedString = ret;\r
+                                                       X_NET_GIMR_receivedString = X_Net_GIMR_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
+                                               ret = X_String_parseTrustedJsonString( X_NET_GIMR_receivedString );\r
+                                               \r
                                                \r
                                                X_NET_GIMR_receivedString = '';\r
                                                \r
@@ -132,6 +132,26 @@ function X_NET_GIMR_detectImageOverIframe(){
                };\r
        };\r
 };\r
+/*\r
+(function( i, l, res ){\r
+       var start = X.Timer.now(), loc = location, res = [], hash;\r
+       for( ; i < l; ++i ){\r
+               loc.replace = chr = '#' + String.fromCharCode( i );\r
+               hash = _builtin_decodeURI( loc.hash );\r
+               if( _builtin_decodeURI( chr ) !== hash ) res.push( i + ':' + _builtin_decodeURI( chr ) );\r
+               if( start + 16 < X.Timer.now() ){\r
+                       //console.log( i + ' / ' + l + ' ' + start + ' ' + X.Timer.now()  );\r
+                       X.Timer.once( 16, arguments.callee, [ ++i, l, res ] );\r
+                       return;\r
+               };\r
+       };\r
+       alert( res.length + '\n' + res.join() );\r
+})( 0xff, 0xffff, [] ); */\r
+\r
+// http://outcloud.blogspot.jp/2015/06/gecko-location-hash.html\r
+function X_Net_GIMR_decodeLocationHash( str ){\r
+       return X_UA[ 'Gecko' ] ? unescape( str ) : decodeURIComponent( str );\r
+};\r
 \r
 // コマンドが長い場合、分割する\r
 function X_NET_GIMR_toJSONString( obj ){\r
@@ -245,3 +265,4 @@ X_TEMP.X_Net_GIMR_props = {
                }\r
        };\r
 \r
+//}+xhrgadget
\ No newline at end of file
index ef18be5..8bdd18d 100644 (file)
@@ -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
index a030267..2c66217 100644 (file)
@@ -83,7 +83,7 @@ var XUI_Box = XUI_AbstractUINode.inherits(
                        \r
                        if( !user[ 'instanceOf' ]( X.UI.Box ) ){\r
                                //throw new Error( 'Box を継承したインスタンスだけが _Box のオーナーになれます' );\r
-                       };                      \r
+                       };\r
                        \r
                        this.User   = user;\r
                        \r