OSDN Git Service

Version 0.6.158, fix X.Net.JSONP.
authoritozyun <itozyun@user.sourceforge.jp>
Tue, 9 Jun 2015 12:00:29 +0000 (21:00 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Tue, 9 Jun 2015 12:00:29 +0000 (21:00 +0900)
0.6.x/js/01_core/06_XURL.js
0.6.x/js/01_core/10_XCallback.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/02_dom/22_XTreeBuilder.js
0.6.x/js/05_util/01_XNinjaIframe.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/02_XNetJSONP.js
0.6.x/js/06_net/04_XNetImage.js
0.6.x/js/06_net/10_XOAuth2.js

index daa6a8e..a75aaaf 100644 (file)
@@ -35,6 +35,8 @@ X[ 'URL' ] = {
        \r
        'PARAMS'         : X_URL_PARAMS,\r
        \r
+       'create'         : X_URL_create,\r
+       \r
        'toAbsolutePath' : X_URL_toAbsolutePath,\r
        \r
        'isSameDomain'   : X_URL_isSameDomain,\r
@@ -113,16 +115,20 @@ function X_URL_objToParam( data ){
        return result.join( '' );\r
 };\r
 \r
+function X_URL_create( url, params ){\r
+       if( !X_Type_isObject( params ) || !( params = X_URL_objToParam( params ) ) ) return url;\r
+       \r
+       return url + ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) + params;\r
+};\r
+\r
 function X_URL_ParamToObj( str ){\r
-       var parts = str.split( '&' ),\r
-               i     = 0,\r
-               l     = parts.length,\r
-               obj   = {},\r
-               pair, p;\r
+       var i   = 0,\r
+               obj = {},\r
+               parts, l, pair, p;\r
 \r
        if( !str ) return obj;\r
        \r
-       for( ; i < l; ++i ){\r
+       for( parts = str.split( '&' ), l = parts.length; i < l; ++i ){\r
                pair = parts[ i ];\r
                p    = pair.indexOf( '=' );\r
                if( p === -1 ){\r
index 9094791..d0a4d05 100644 (file)
@@ -112,6 +112,11 @@ var __CallbackHash__ =
         */\r
        func : undefined,\r
        /**\r
+        * コールバック名。コールバック作成時に関数が無い、関数が入れ替わっていても動作する。\r
+        * @type {string|undefined} \r
+        */\r
+       name : undefined,\r
+       /**\r
         * コールバックの this コンテキスト。 \r
         * @type {listener|object|undefined}\r
         */\r
index 01ce6c7..b2a0bdc 100644 (file)
@@ -195,6 +195,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                                if( !listeners || !( list = listeners[ opt_type ] ) ) return false;\r
                                if( opt_arg1 === undefined ) return X_EventDispatcher_needsIndex ? 0 : true;\r
                                \r
+                               // TODO callbackHash か?判定が不十分!\r
                                if( opt_arg1.kind ){\r
                                        cbHash = opt_arg1;\r
                                } else {\r
index 7daff08..8a6c74a 100644 (file)
@@ -22,26 +22,27 @@ if( X_UA[ 'MacIE' ] ){
                        //node.data = '';\r
                        l = X_TEMP._removalTextNodes.length;\r
                        if( parent ){\r
-                               //!l && X_Timer_once( 0, X_TEMP._timerRemove );\r
-                               //X_TEMP._removalTextNodes[ l ] = node;\r
-                               //var str=[],p;\r
-                               //for( p in node ){\r
-                               //      str[str.length] = p;\r
-                               //};\r
-                               //alert( str.join( ',' ) + parent.innerHTML );\r
-                               //node.nodeValue = '';\r
-                               //parent.replaceChild( document.createElement( 'span' ), node );\r
-                               //var e;\r
-                               //var f = document.createDocumentFragment();\r
-                               //f.appendChild( e = document.createElement( 'span' ) );\r
-                               //f.replaceChild( node, e );\r
-                               //e.appendChild( f );\r
-                               //parent.appendChild( e = document.createElement( 'span' ) );\r
-                               //e.appendChild( node );\r
-                               //parent.removeChild( e );\r
-                               //node.parentNode = null;\r
-                               //document.body.appendChild( node );\r
-                               //parent.replaceChild( document.createComment( '' ), node );\r
+                               /*\r
+                               !l && X_Timer_once( 0, X_TEMP._timerRemove );\r
+                               X_TEMP._removalTextNodes[ l ] = node;\r
+                               var str=[],p;\r
+                               for( p in node ){\r
+                                       str[str.length] = p;\r
+                               };\r
+                               alert( str.join( ',' ) + parent.innerHTML );\r
+                               node.nodeValue = '';\r
+                               parent.replaceChild( document.createElement( 'span' ), node );\r
+                               var e;\r
+                               var f = document.createDocumentFragment();\r
+                               f.appendChild( e = document.createElement( 'span' ) );\r
+                               f.replaceChild( node, e );\r
+                               e.appendChild( f );\r
+                               parent.appendChild( e = document.createElement( 'span' ) );\r
+                               e.appendChild( node );\r
+                               parent.removeChild( e );\r
+                               node.parentNode = null;\r
+                               document.body.appendChild( node );\r
+                               parent.replaceChild( document.createComment( '' ), node ); */\r
                                document.body.appendChild( node );\r
                                return;\r
                                if( parent.parentNode !== document.body ){\r
@@ -105,7 +106,8 @@ if( X_UA[ 'Opera7' ] ){
  * http://kojs.sukobuto.com/docs/visible-binding\r
  * IE6 には、「空の span エレメントに続く空白は無視される」という謎な癖があります。 \r
  */\r
-X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,\r
+\r
+X_TEMP._onPreInit =\r
        X_UA_DOM.W3C ?\r
 (function(){\r
        var r    = X_Node_body,\r
@@ -121,7 +123,7 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
        // textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける\r
        //X_UA[ 'MacIE' ] && alert( body.innerHTML );\r
        // cleanup tree \r
-       (function/*cleanUpTree*/( elm, skip, head ){\r
+       function cleanUpTree( elm, skip, head ){\r
                var nodes      = X_Object_cloneArray( elm.childNodes ),\r
                        i          = 0,\r
                        l          = nodes.length,\r
@@ -141,7 +143,7 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
                                                continue;\r
                                        } else {\r
                                                // pre タグ以下はスペースの置換は行わない\r
-                                               node.childNodes && node.childNodes.length && /*cleanUpTree*/arguments.callee( node, skip || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ], head );\r
+                                               node.childNodes && node.childNodes.length && cleanUpTree( node, skip || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ], head );\r
                                        };\r
                                        textNode = null;\r
                                        break;\r
@@ -167,7 +169,9 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
                                        //++count;\r
                        };\r
                };\r
-       })( X_UA[ 'MacIE' ] ? ( copy = body.cloneNode( true ) ) : body );\r
+       };\r
+\r
+       cleanUpTree( X_UA[ 'MacIE' ] ? ( copy = body.cloneNode( true ) ) : body );\r
 \r
        if( X_UA[ 'MacIE' ] ){\r
                document.write( html = copy.innerHTML );\r
@@ -189,28 +193,18 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
                };              \r
        };\r
        \r
-       body.appendChild( elmProgress = document.createElement( 'div' ) );\r
+       body.appendChild( X_TEMP.elmProgress = elmProgress = document.createElement( 'div' ) );\r
        elmProgress.style.cssText = 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;';\r
        elmProgress.setAttribute( 'style', 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;' );\r
        \r
-       X_HTMLParser_asyncParse( html, true )\r
-               [ 'listen' ]( X_EVENT_PROGRESS,\r
-                       function( e ){\r
-                               elmProgress.style.width = ( e[ 'percent' ] * 100 | 0 ) + '%';\r
-                       }\r
-               )\r
-               [ 'listenOnce' ]( X_EVENT_SUCCESS,\r
-                       function( e ){\r
-                               var xnodes = X_Node_body[ '_xnodes' ] = [], t;\r
-                               xnodes.push.apply( xnodes, e.xnodes );\r
-                               elmProgress.style.width = '100%';\r
+       X_TEMP._body = body;\r
        \r
-                               X_TEMP.asyncCreateTree( X_Node_body, body.childNodes, elmProgress );\r
-                       }\r
-               );\r
+       X_HTMLParser_asyncParse( html, true )\r
+               [ 'listen' ]( X_EVENT_PROGRESS, X_TEMP._handleEvent )\r
+               [ 'listenOnce' ]( X_EVENT_SUCCESS, X_TEMP._handleEvent );\r
 \r
 }) :\r
-X_UA_DOM.IE4 ?\r
+// X_UA_DOM.IE4 ?\r
 (function(){\r
        var r    = X_Node_body,\r
                body = r[ '_rawObject' ],\r
@@ -218,7 +212,7 @@ X_UA_DOM.IE4 ?
                html;\r
 \r
        if( !X_TEMP.X_Dom_useBuilder ) return;\r
-\r
+       \r
        /*\r
         * http://support.microsoft.com/kb/812417/ja\r
         * PRB: outerHTML の HTML 要素のプロパティは、既定の属性は表示されません。\r
@@ -227,27 +221,39 @@ X_UA_DOM.IE4 ?
         */\r
        html = body.innerHTML;\r
        body.insertAdjacentHTML( 'BeforeEnd', '<div id="' + elmProgress + '" style="position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;"></div>' );\r
-       elmProgress = document.all[ elmProgress ];\r
+       X_TEMP.elmProgress = document.all[ elmProgress ];\r
+       \r
+       X_TEMP._body = body;\r
        \r
        X_HTMLParser_asyncParse( html, true )\r
-               [ 'listen' ]( X_EVENT_PROGRESS,\r
-                       function( e ){\r
-                               elmProgress.style.width = ( e.percent * 100 | 0 ) + '%';\r
-                       }\r
-               )\r
-               [ 'listenOnce' ]( X_EVENT_SUCCESS,\r
-                       function( e ){\r
-                               var xnodes = X_Node_body[ '_xnodes' ] = [], t;\r
-                               xnodes.push.apply( xnodes, e.xnodes );\r
-                               elmProgress.style.width = '100%';\r
-                               \r
-                               X_TEMP.asyncCreateTree( X_Node_body, body.childNodes || body.children, elmProgress );\r
-                       }\r
-               );\r
-}) :\r
-(function(){\r
+               [ 'listen' ]( X_EVENT_PROGRESS, X_TEMP._handleEvent )\r
+               [ 'listenOnce' ]( X_EVENT_SUCCESS, X_TEMP._handleEvent );\r
+});\r
+\r
+X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, X_TEMP._onPreInit );\r
+\r
+X_TEMP._handleEvent = function( e ){\r
+       var elmProgress = X_TEMP.elmProgress, xnodes;\r
        \r
-}) );\r
+       switch( e.type ){\r
+               case X_EVENT_PROGRESS :\r
+                       elmProgress.style.width = ( e.percent * 100 | 0 ) + '%';\r
+                       break;\r
+                       \r
+               case X_EVENT_SUCCESS :\r
+                       xnodes = X_Node_body[ '_xnodes' ] = [];\r
+                       \r
+                       xnodes.push.apply( xnodes, e.xnodes );\r
+                       elmProgress.style.width = '100%';\r
+                       \r
+                       X_TEMP.asyncCreateTree( X_Node_body, X_TEMP._body.childNodes || X_TEMP._body.children, elmProgress );\r
+                       \r
+                       delete X_TEMP._onPreInit;\r
+                       delete X_TEMP._body;\r
+                       delete X_TEMP.elmProgress;\r
+                       break;\r
+       };\r
+};\r
 \r
 X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){\r
        var xnodes      = async ? 0           : X_Object_cloneArray( parent[ '_xnodes' ] ),\r
@@ -311,6 +317,7 @@ X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){
        console.log( 'xtree 作成完了' );\r
        X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY );\r
        elmProgress.parentNode ? elmProgress.parentNode.removeChild( elmProgress ) : ( elmProgress.outerHTML = '' );\r
+       \r
        delete X_TEMP.asyncCreateTree;\r
        delete X_TEMP.bindElementToXnode;\r
        delete X_TEMP.X_Dom_useBuilder;\r
index 8507c5e..e16f550 100644 (file)
@@ -140,7 +140,8 @@ function X_Util_NinjaIframe_writeToIframe( that ){
        var raw  = that[ '_rawObject' ],\r
                idoc = raw.contentDocument || that._iwin.document,\r
                html = that._contentHTML;\r
-               \r
+       \r
+       that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明\r
        delete that._contentHTML;\r
 \r
        idoc.open();\r
index 55f0496..fdc66aa 100644 (file)
@@ -31,6 +31,7 @@
  * <h4>XHR 用プロパティ</h4>\r
  * <dl>\r
  * <dt>method<dd>'GET', 'POST' 未指定かつ postdata を設定している場合、'POST' になる。\r
+ * <dt>params<dd>url パラメータを object で渡すことが出来る。\r
  * <dt>postdata<dd>string, object の場合は X.String.serialize される。\r
  * <dt>async<dd>boolean\r
  * <dt>username<dd>BASIC 認証\r
  * <dt>canUse<dd>未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている\r
  * </dl>\r
  * \r
+ * <h4>JSONP 用プロパティ</h4>\r
+ * <dl>\r
+ * <dt>params<dd>url パラメータを object で渡すことが出来る。\r
+ * <dt>callbackName<dd>callback(json) コールバック名が固定されている際に指定。または &callback=hoge 以外の名前でコールバックを指定する場合に params と callbackName に書いておく。url パラメータに callback が無く、callbackName もない場合、フレームワーク内で自動で設定される\r
+ * <dt>charset<dd>ページと異なるjsonpを読み込む場合に指定 'EUC-JP', 'Shift-JIS' 等 script タグの charset に入る。https://code.google.com/p/ajaxzip3/issues/detail?id=5\r
+ * <dt>useFireWall<dd>異なるドメインに jsonp を読み込んだ後、xdomain iframe 通信を使ってデータを受け取る。不正なコードの実行を防ぐことが出来る、未実装\r
+ * </dl>\r
+ * \r
  * @alias X.Net\r
  * @class 各種ネットワーク機能をラップしインターフェイスを共通化する。\r
  * @constructs Net\r
  *             .listen( X.Event.PROGRESS )\r
  *             .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.CANCELED ] );\r
  * \r
+ * // XHR - GET \r
+ * var net = X.Net( urlString );\r
+ * \r
  * // XHR - POST \r
  * var net = X.Net( { xhr : urlString, postdata : myData } );\r
  * \r
  * // JSONP\r
- * var net = X.Net( { jsonp : urlString, staticCallbackName : callbackName, useXDomainWall : false } );\r
+ * var net = X.Net( { jsonp : urlString, params : params, callbackName : callbackName, charset : charset, useFireWall : false } );\r
  * \r
  * // Form\r
  * var net = X.Net( { form : urlString, method : 'POST', target : '_self', params : {} } ); // _self, _parent, _top の場合、ページから離脱する\r
@@ -77,53 +89,35 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                        'netVersion' : 0,\r
                        \r
                        'Constructor' : function( urlOrObject, opt_options ){\r
-                               var v, opt, url, type, auth;\r
+                               var opt, url, type, auth;\r
                                \r
                                if( X_Type_isObject( opt = urlOrObject ) ){\r
-                                       if( X_Type_isString( v = opt[ 'xhr' ] ) ){\r
-                                               url  = v;\r
+                                       if( X_Type_isString( url = opt[ 'xhr' ] ) ){\r
                                                type = X_NET_TYPE_XHR;\r
                                        } else\r
-                                       if( X_Type_isString( v = opt[ 'jsonp' ] ) ){\r
-                                               url  = v;\r
+                                       if( X_Type_isString( url = opt[ 'jsonp' ] ) ){\r
                                                type = X_NET_TYPE_JSONP;\r
                                        } else\r
-                                       if( X_Type_isString( v = opt[ 'img' ] || opt[ 'image' ] ) ){\r
-                                               url  = v;\r
+                                       if( X_Type_isString( url = opt[ 'img' ] || opt[ 'image' ] ) ){\r
                                                type = X_NET_TYPE_IMAGE;\r
                                        } else\r
-                                       if( X_Type_isString( v = opt[ 'form' ] ) ){\r
-                                               url  = v;\r
+                                       if( X_Type_isString( url = opt[ 'form' ] ) ){\r
                                                type = X_NET_TYPE_FORM;\r
+                                       //{+dev\r
                                        } else\r
-                                       if( X_Type_isString( v = opt[ 'type' ] ) ){\r
-\r
-                                               switch( v ){\r
-                                                       case 'xhr' :\r
-                                                               type = X_NET_TYPE_XHR;\r
-                                                               break;\r
-                                                       case 'jsonp' :\r
-                                                               type = X_NET_TYPE_JSONP;\r
-                                                               break;\r
-                                                       case 'img' :\r
-                                                       case 'image' :\r
-                                                               type = X_NET_TYPE_IMAGE;\r
-                                                               break;\r
-                                                       case 'from' :\r
-                                                               type = X_NET_TYPE_FORM;\r
-                                                               break;\r
-                                                       default :\r
-                                                               alert( 'X.Net args error' );\r
-                                                               return; \r
-                                               };\r
+                                       if( !( type = X_NET_NAME_TO_ID[ opt[ 'type' ] ] ) ){\r
+                                               alert( 'X.Net args error' );\r
+                                               return;\r
+                                       //}+dev\r
+                                       } else {\r
                                                url = opt[ 'url' ];\r
                                        };\r
-                                       \r
+                                       //{+dev\r
                                        if( !X_Type_isString( url ) ){\r
                                                alert( 'X.Net args error' );\r
                                                return;\r
                                        };\r
-                                       \r
+                                       //}+dev\r
                                } else\r
                                if( X_Type_isString( urlOrObject ) ){\r
                                        url = urlOrObject;\r
@@ -134,12 +128,14 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                                type = X_NET_TYPE_XHR;\r
                                                opt  = { 'url' : url, 'method' : 'GET' };\r
                                        };\r
-                                       \r
+                               //{+dev \r
                                } else {\r
                                        alert( 'X.Net args error' );\r
                                        return;\r
+                               //}+dev\r
                                };\r
                                \r
+                               // auth の退避\r
                                if( auth = opt[ 'auth' ] ){\r
                                        delete opt[ 'auth' ];\r
                                };\r
@@ -147,12 +143,16 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                if( auth ){\r
                                        opt[ 'auth' ] = auth; // auth は deep copy されるとまずい\r
                                };\r
-                               opt.netType   = type;\r
-                               opt[ 'url'  ] = url;                            \r
+                               \r
+                               // params を url に追加\r
+                               if( opt[ 'params' ] ){\r
+                                       url = X_URL_create( url, opt[ 'params' ] );\r
+                                       delete opt[ 'params' ];\r
+                               };                              \r
                                \r
                                if( type === X_NET_TYPE_XHR ){\r
                                        opt[ 'method' ] = opt[ 'method' ] || ( opt[ 'postdata' ] ? 'POST' : 'GET' );\r
-                                       \r
+\r
                                        // XDomain 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替?\r
                                        // PUT DELETE UPDATE 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替?\r
                                        // xプロトコル な binary のロード -> gadget 内で proxyURL による XHR\r
@@ -161,6 +161,9 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                        opt[ 'dataType' ] = opt[ 'dataType' ] || X_URL_getEXT( url );\r
                                };\r
                                \r
+                               opt.netType   = type;\r
+                               opt[ 'url'  ] = url;                            \r
+                               \r
                                X_Pair_create( this, opt );\r
                                \r
                                this[ 'listen' ]( [ X_EVENT_BEFORE_KILL_INSTANCE, X_EVENT_KILL_INSTANCE ], X_NET_proxyDispatch );\r
@@ -192,6 +195,14 @@ var X_NET_TYPE_XHR   = 1,
        X_NET_TYPE_FORM  = 3,\r
        X_NET_TYPE_IMAGE = 4,\r
 \r
+       X_NET_NAME_TO_ID = {\r
+               'xhr'   : X_NET_TYPE_XHR,\r
+               'jsonp' : X_NET_TYPE_JSONP,\r
+               'form'  : X_NET_TYPE_FORM,\r
+               'img'   : X_NET_TYPE_IMAGE,\r
+               'image' : X_NET_TYPE_IMAGE\r
+       },\r
+\r
        X_NET_QUEUE_LIST = [],\r
 \r
        X_NET_XHRWrapper,\r
index 7b1c4da..6918382 100644 (file)
@@ -66,10 +66,22 @@ X_TEMP.X_NET_JSONP_params = {
                        load : function( option ){
                                //createURL
                                var url           = option[ 'url' ],
-                                       json2Path     = 'js/libs/json2.js',
+                                       params        = option[ 'params' ],
+                                       callback      = option[ 'callbackName' ],
+                                       charset       = option[ 'charset' ],
+                                       json2Path     = window.RegExp ? 'js/libs/json2.js' : 'js/libs/json2_regfree.js',
                                        json2FileSize = 18103,
                                        html;
                                
+                               url = X_URL_create( url, params );
+                               
+                               if( !callback && !( callback = X_URL_ParamToObj( url.split( '?' )[ 1 ] )[ 'callback' ] ) ){
+                                       url += '&callback=cb';
+                                       callback = 'cb';
+                               };
+                               
+                               charset = charset ? ' charset="' + charset + '"' : '';
+                               
                                // TODO '<scr'+'ipt> 化 恐らくアンチウイルスソフトが反応しないための対策
                                // document.postMessage()→window.postMessage() (Opera 9.50 build 9841 -)
                                // http://d.hatena.ne.jp/cnrd/20080518/1211099169
@@ -81,9 +93,9 @@ X_TEMP.X_NET_JSONP_params = {
                                                '<script>',
                                                        'onunload=function(){im.onload=im.onerror=""};',
                                                        'nw=+new Date;',
-                                                       'function cb(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw', window[ 'JSON' ] ? json2FileSize : 0 ,');nw=0}}',
+                                                       'function ', callback, '(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw', window[ 'JSON' ] ? json2FileSize : 0 ,');nw=0}}',
                                                '</script>',    
-                                               '<script id="jp"></script>',
+                                               '<script', charset, ' id="jp"></script>',
                                                '<img id="im" src="', url, '" onload="jp.src=im.src" onerror="jp.src=im.src">'
                                        ];
                                        X_Net_JSONP_maxOnloadCount = 2;
@@ -96,19 +108,19 @@ X_TEMP.X_NET_JSONP_params = {
                                                // http://blog.livedoor.jp/dankogai/archives/51503830.html              
                                                // Ajax - IE8にもJSON入ってます。使えるとは限らないけど
                                                // Compatibility mode (別名Quirks mode) では、JSONオブジェクトは無効になります。iframeもだめです
-                                               '<script id="jp"></script>',
+                                               '<script', charset, ' id="jp"></script>',
                                                '<script>',
                                                        'onunload=function(){clearTimeout(id)};',
                                                        'nw=0;', // なぜか必要,,,
-                                                       'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),-nw)}',
-                                                       //'function cb(o){if(nw){nw-=+new Date;postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),"*");nw=0}}',                   
+                                                       'function ', callback, '(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),-nw)}',
+                                                       //'function ', callback, '(o){if(nw){nw-=+new Date;postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),"*");nw=0}}',                       
                                                        'function tm(){jp.src="', url ,'";nw=+new Date}',
                                                        'id=setTimeout(tm,16);',
                                                '</script>'
                                                
                                                /* 以下のコードは XP ie8 では動くけど、win8 IE11(8モード)で動かない 開発の便宜を取って,setTimeout を挟む
                                                '<script>',
-                                                       'function cb(o){window.parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',window.parent.JSON.stringify(o))}',
+                                                       'function ', callback, '(o){window.parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',window.parent.JSON.stringify(o))}',
                                                '</script>',
                                                '<script src="', url, '"></script>' */
                                        ];
@@ -116,10 +128,10 @@ X_TEMP.X_NET_JSONP_params = {
                                } else
                                if( X_UA[ 'IE9' ] ){
                                        html = [
-                                               '<script id="jp"></script>',
+                                               '<script', charset, ' id="jp"></script>',
                                                '<script>',
                                                        'onunload=function(){clearTimeout(id)};',
-                                                       'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw)}',
+                                                       'function ', callback, '(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw)}',
                                                        'function tm(){jp.src="', url ,'";nw=+new Date}',
                                                        'id=setTimeout(tm,16);',
                                                '</script>'
@@ -130,20 +142,20 @@ X_TEMP.X_NET_JSONP_params = {
                                        html = [        
                                                '<script>',
                                                        'nw=+new Date;',
-                                                       'function cb(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw);nw=0}}',
-                                                       //'function cb(o){if(nw){nw-=+new Date;parent.postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+JSON.stringify(o),"', location.origin, '");nw=0}}',
+                                                       'function ', callback, '(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw);nw=0}}',
+                                                       //'function ', callback, '(o){if(nw){nw-=+new Date;parent.postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+JSON.stringify(o),"', location.origin, '");nw=0}}',
                                                '</script>',
-                                               '<script src="', url, '"></script>'
+                                               '<script', charset, ' src="', url, '"></script>'
                                        ];
                                        X_Net_JSONP_maxOnloadCount = 1;
                                } else
                                if( X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ){
                                        html = [
                                                '<script id="jn"></script>',
-                                               '<script id="jp"></script>',
+                                               '<script', charset, ' id="jp"></script>',
                                                '<script>',
                                                        'onunload=function(){clearTimeout(id)};',
-                                                       'function cb(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw-16,', json2FileSize, ')}',
+                                                       'function ', callback, '(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw-16,', json2FileSize, ')}',
                                                        'function t1(){document.all.jn.src="', json2Path ,'";id=setTimeout("t2()",16);nw=+new Date}',
                                                        'id=setTimeout("t1()",16);',
                                                        'function t2(){if(window.JSON){document.all.jp.src="', url ,'"}else{id=setTimeout("t2()",16)}}',
@@ -154,10 +166,10 @@ X_TEMP.X_NET_JSONP_params = {
                                if( X_UA[ 'IE' ] < 8 ){ // ie5-7
                                        html = [
                                                '<script id="jn"></script>',
-                                               '<script id="jp"></script>',
+                                               '<script', charset, ' id="jp"></script>',
                                                '<script>',
                                                        'onunload=function(){clearTimeout(id)};',
-                                                       'function cb(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw-16,', json2FileSize, ')}',
+                                                       'function ', callback, '(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw-16,', json2FileSize, ')}',
                                                        'function t1(){jn.src="', json2Path ,'";id=setTimeout(t2,16);nw=+new Date}',
                                                        'id=setTimeout(t1,16);',
                                                        'function t2(){if(window.JSON){jp.src="', url ,'"}else{id=setTimeout(t2,16)}}',
@@ -167,11 +179,11 @@ X_TEMP.X_NET_JSONP_params = {
                                } else {
                                        html = [
                                                '<script>',
-                                                       'function cb(o){if(nw){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw,', json2FileSize, ');nw=0}}',
+                                                       'function ', callback, '(o){if(nw){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw,', json2FileSize, ');nw=0}}',
                                                        'nw=+new Date;',
                                                '</script>',
                                                '<script src="', json2Path, '"></script>',
-                                               '<script src="', url, '"></script>'
+                                               '<script', charset, ' src="', url, '"></script>'
                                        ];
                                        X_Net_JSONP_maxOnloadCount = 2;
                                };
index f788116..0375e74 100644 (file)
@@ -10,31 +10,28 @@ var X_Net_Image_hasImage  = !!window[ 'Image' ],
        X_Net_Image_image     = X_Net_Image_hasImage && new Image(),\r
        // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
        X_Net_Image_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_Net_Image_image );\r
-       \r
-\r
-if( !X_Net_Image_hasImage ){\r
-       alert( 'no Image!' );\r
-} else\r
-if( X_Net_Image_isElement ){\r
-       //alert( 'X_Net_Image_isElement ' + X_Net_Image_isElement );\r
-};\r
 \r
 /*\r
  * TODO\r
  * new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。\r
  * Image は、X.EventDispatcher で、<img> は X.Node で。 \r
- * \r
- * Opera7 では毎回 image を作る必要あり、src が異なればOK?\r
  */\r
 \r
 X_TEMP.X_NET_Image_init = function(){\r
+       X_NET_ImageWrapper = X_Class_override(\r
+               X_Net_Image_isElement ? Node( X_Net_Image_image ) : X_EventDispatcher( X_Net_Image_image ),\r
+               X_TEMP.X_NET_Image_params\r
+       );\r
+       \r
+       X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );\r
+       \r
+       delete X_TEMP.X_NET_Image_init;\r
+       delete X_TEMP.X_NET_Image_params;       \r
+       \r
+       return X_NET_ImageWrapper;\r
+};\r
 \r
-delete X_TEMP.X_NET_Image_init;\r
-\r
-X_NET_ImageWrapper = X_Class_override(\r
-       !X_Net_Image_isElement ? X_EventDispatcher( X_Net_Image_image ) : Node( X_Net_Image_image ),\r
-       {\r
-\r
+X_TEMP.X_NET_Image_params = {\r
                _busy      : false,\r
                tick       : 0,\r
                timerID    : 0,\r
@@ -59,8 +56,9 @@ X_NET_ImageWrapper = X_Class_override(
                },\r
                \r
                cancel : function(){\r
+                       var raw = this[ '_rawObject' ];\r
                        // abort がある?\r
-                       this[ '_rawObject' ] && this[ '_rawObject' ].abort && this[ '_rawObject' ].abort();\r
+                       raw && raw.abort && raw.abort();\r
                        // this[ '_rawObject' ].src = '';\r
                        this._busy  = false;\r
                        this.finish = true;\r
@@ -75,21 +73,16 @@ X_NET_ImageWrapper = X_Class_override(
                        this.finished = false;\r
                        this.abspath  = '';\r
                }\r
-       }\r
-);\r
-\r
-X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );\r
-\r
-return X_NET_ImageWrapper;\r
-\r
-};\r
+       };\r
 \r
 function X_NET_Image_detect(){\r
+       var raw = this[ '_rawObject' ];\r
+       \r
        if( this.finish ) return;\r
-       if( this[ '_rawObject' ] && this[ '_rawObject' ].complete ){\r
+       if( raw && raw.complete ){\r
                this._busy  = false;\r
                this.finish = true;\r
-               if( this[ '_rawObject' ].width ) return;\r
+               if( raw.width ) return;\r
                X_Timer_remove( this.timerID );\r
                this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
        } else\r
index ab34837..ef18be5 100644 (file)
@@ -105,14 +105,15 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                h   = pair[ 'authorizeWindowHeight' ] || 500;
                                
                                X_NET_OAUTH2_authorizationWindow = window.open(
-                                       url + ( ( url.indexOf( '?' ) !== -1 ) ? '&' : '?' ) + X_URL_objToParam(
+                                       X_URL_create( url,
                                                {
                                                        'response_type' : 'code',
                                                        'client_id'     : pair[ 'clientID' ],
                                                        'redirect_uri'  : pair[ 'redirectURI' ],
                                                        'scope'         : ( pair[ 'scopes' ] || []).join(' ')
                                                }
-                                       ), 'oauthauthorize',
+                                       ),
+                                       'oauthauthorize',
                                        'width=' + w
                                        + ',height=' + h
                                        + ',left=' + ( screen.width  - w ) / 2
@@ -352,7 +353,7 @@ function X_NET_OAUTH2_updateRequest( oauth2, request ){
                headers;
 
        if( token && mechanism === 'param' ){
-               request[ 'url' ] = url + ((url.indexOf('?') !== -1) ? '&' : '?') + 'bearer_token=' + encodeURIComponent( token );
+               request[ 'url' ] = X_URL_create( url, { 'bearer_token' : encodeURIComponent( token ) } );
        };
        
        if( token && ( !mechanism || mechanism === 'header' ) ){