OSDN Git Service

Version 0.6.221, Update the X.TextRange.
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 01_XNetXHR.js
index 411de41..7faa80c 100644 (file)
@@ -43,6 +43,17 @@ IE8 以下で xhr の失敗率が高い問題
 http://tkengo-totoro.blogspot.jp/2011/11/iexmlhttprequest.html\r
 TODO クライアント側にもリトライ機構を入れてみる\r
 \r
+\r
+TODO xml の取得には XMLDOM を使用する\r
+var activex = JKL.ParseXML.HTTP.ACTIVEX_XMLHTTP;    // IXMLHttpRequest\r
+if ( this.method == "GET" && ! this.textmode ) {\r
+    // use IXMLDOMElement to accept any mime types\r
+    // because overrideMimeType() is not available on IE6\r
+    activex = JKL.ParseXML.HTTP.ACTIVEX_XMLDOM;     // IXMLDOMElement\r
+};\r
+// debug.print( "new ActiveXObject( '"+activex+"' )" );\r
+this.req = new ActiveXObject( activex );\r
+\r
  */\r
 var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+\r
        // ie9- ではローカルリソースには MSXML を使う\r
@@ -73,8 +84,8 @@ var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+
 if( X_XHR_createMSXML ){\r
        ( function(){\r
                var x = '.XMLHTTP',\r
-                       m = 'MSXML2' + x,\r
-                       n = [ m + ".6.0", m + ".3.0", m + ".5.0", m + ".4.0", m, "Microsoft" + x ],\r
+                       m = 'Msxml2' + x,\r
+                       n = [ m + '.6.0', m + '.3.0', m + '.5.0', m + '.4.0', m, 'Microsoft' + x ],\r
                        v = [ 6, 3, 5, 4, 2, 1 ],\r
                        i = -1,\r
                        a;\r
@@ -103,7 +114,7 @@ X[ 'XHR' ] = {
  * http://hakuhin.jp/as/javascript.html\r
  * Flash から JavaScript にアクセスする(3+)\r
  */\r
-       'FLASH'       : X_Pulgin_FLASH_ENABLED && 4 <= X_Pulgin_FLASH_VERSION ? 8 : 0,\r
+       'FLASH'       : 4 <= X_Plugin_FLASH_VERSION ? 8 : 0,\r
        \r
        'GADGET'      : 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ] ? 16 : 0,\r
 \r
@@ -160,12 +171,11 @@ if( X_XHR_w3c || X_XHR_msXML ){
                                        postdata = obj[ 'postdata' ] || '',\r
                                        timeout  = obj[ 'timeout' ] || 20000,\r
                                        noCache  = obj[ 'cache' ] !== true,\r
+                                       dataType = X_XHR._dataType = obj[ 'dataType' ], // 明示され無い場合、ext が入っている\r
                                        xDomain  = !X_URL_isSameDomain( url ),\r
                                        isFile   = X_URL_isLocal( url ),\r
                                        init,\r
                                        type, tmp, p;\r
-\r
-                               X_XHR._dataType = obj[ 'dataType' ];\r
                                \r
                                if( !raw || xDomain !== X_XHR._isXDR || ( X_XHR_createMSXML && isFile !== X_XHR._isMsXML ) ){\r
                                        raw && X_XHR[ 'unlisten' ]( [ 'load', 'readystatechange', 'progress', 'error', 'timeout' ] );\r
@@ -192,59 +202,73 @@ if( X_XHR_w3c || X_XHR_msXML ){
                                raw.open( method, url, async, username, password );\r
                                \r
                                if( raw.responseType !== undefined ){\r
-                                       switch( X_XHR._dataType ){\r
+                                       switch( dataType ){\r
                                                case '' :\r
+                                               case 'txt' :\r
                                                case 'text' :\r
                                                // js, css\r
-                                                       raw.responseType = 'text';\r
+                                                       raw.responseType = X_XHR._dataType = 'text';\r
                                                        break;\r
                                                case 'json' : // firefox9- は moz-json\r
-                                                       raw.responseType = X_UA[ 'Gecko' ] < 10 ? 'moz-json' : X_UA[ 'Gecko' ] ? X_XHR._dataType : ''; // Iron 37 でエラー\r
+                                                       raw.responseType = X_UA[ 'Gecko' ] < 10 ? 'moz-json' : X_UA[ 'Gecko' ] ? dataType : ''; // Iron 37 でエラー\r
+                                                       X_XHR._dataType  = 'json';\r
                                                        break;\r
                                                case 'document' :\r
                                                case 'xml' :\r
                                                case 'html' :\r
                                                case 'htm' :\r
-                                               // svg\r
-                                                       raw.responseType = 'document';\r
+                                               case 'svg' :\r
+                                               case 'vml' :\r
+                                                       raw.responseType = X_XHR._dataType = 'document';\r
                                                        break;\r
                                                case 'blob' :\r
                                                case 'arraybuffer' :\r
                                                // jpeg,jpg,png,gif,mp3,ogg...\r
-                                                       raw.responseType = X_XHR._dataType;\r
+                                                       raw.responseType = X_XHR._dataType = dataType;\r
                                                        break;\r
                                        };\r
                                };\r
                                \r
                                // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html\r
                                if( !X_XHR._isMsXML && raw.overrideMimeType ){\r
-                                       type = X_URL_getEXT( url ) || X_XHR._dataType;\r
-                                       switch( type ){\r
+                                       switch( type = dataType ){\r
+                                               case 'document' :\r
+                                               case 'xml' :\r
                                                case 'html' :\r
                                                case 'htm' :\r
-                                               case 'xml' :\r
+                                               case 'svg' :\r
+                                               case 'vml' :\r
                                                        tmp = 'text/xml';\r
                                                        break;\r
                                                case 'json' :\r
                                                        tmp = 'application/json';\r
                                                        break;\r
                                                case 'mp3' :\r
-                                                       type = 'mpeg';  \r
+                                                       tmp = 'mpeg';   \r
                                                case 'weba' :\r
-                                                       type = type || 'webm';                  \r
+                                                       tmp = tmp || 'webm';                    \r
                                                case 'opus' :\r
-                                                       type = type || 'ogg';\r
+                                                       tmp = tmp || 'ogg';\r
                                                case 'ogg' :    \r
                                                case 'wav' :                                            \r
                                                case 'aac' :\r
-                                                       tmp = 'audio/' + type;\r
+                                                       tmp = 'audio/' + ( tmp || type );\r
                                                        break;\r
                                                case 'm4a' :\r
                                                case 'mp4' :\r
                                                        tmp = 'audio/x-' + type;\r
                                                        break;\r
+                                               case 'jpeg' :\r
+                                               case 'jpg' :\r
+                                               case 'png' :\r
+                                               case 'gif' :\r
+                                               case 'bmp' :\r
+                                               case 'ico' :\r
+                                                       tmp = 'text/plain; charset=x-user-defined';\r
+                                                       break;\r
+                                                       \r
                                        };\r
-                                       if( tmp = obj[ 'mimeType' ] || tmp ) raw.overrideMimeType( tmp );\r
+                                       if( obj[ 'mimeType' ] || tmp ) raw.overrideMimeType( obj[ 'mimeType' ] || tmp );\r
                                };\r
 \r
                                if( !X_XHR._isXDR && ( X_XHR._isMsXML ? 3 <= X_XHR_msXMLVer : raw.setRequestHeader ) ){ // msxml は setRequestHeader getter がいけない\r
@@ -255,11 +279,10 @@ if( X_XHR_w3c || X_XHR_msXML ){
                                                headers[ 'Cache-Control' ] = 'no-cache';\r
                                                headers[ 'If-Modified-Since' ] = 'Thu, 01 Jun 1970 00:00:00 GMT';\r
                                        } */\r
-               \r
-                                       // http://nakigao.sitemix.jp/blog/?p=2040\r
-                                       // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず\r
-                                       if( X_XHR._dataType === 'json' ){\r
-                                               headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
+\r
+                                       // http://8note.phpapps.jp/jquery-ajax%E3%81%A7%E3%81%AE412%E3%82%A8%E3%83%A9%E3%83%BC/\r
+                                       if( dataType === 'json' && X_UA[ 'Safari' ] ){\r
+                                               headers[ 'If-Modified-Since' ] = 'Thu, 01 Jun 1970 00:00:00 GMT';\r
                                        };\r
                                        \r
                                        // http://boscono.hatenablog.com/entry/2013/12/23/152851\r
@@ -369,7 +392,7 @@ if( X_XHR_w3c || X_XHR_msXML ){
                        handleEvent : function( e ){\r
                                var raw  = X_XHR[ '_rawObject' ],\r
                                        live = !X_XHR._canceled,\r
-                                       headers, status, data;\r
+                                       headers, status, text, data;\r
 \r
                                switch( e && e.type || 'readystatechange' ){\r
                                        /*\r
@@ -380,7 +403,7 @@ if( X_XHR_w3c || X_XHR_msXML ){
                                        2: リクエストを受信した\r
                                        3: リクエストの処理中\r
                                        4: リクエストは終了してレスポンスの準備が完了\r
-                                       status  200: "OK"\r
+                                       status  200: 'OK'\r
                                        404: Page not found\r
                                        \r
                                        If-Modified-Sinceヘッダを利用してWebページのキャッシュを行うXMLHttpRequestラッパー\r
@@ -424,7 +447,7 @@ if( X_XHR_w3c || X_XHR_msXML ){
                                                        headers = { 'Content-Type' : raw.contentType };\r
                                                } else\r
                                                if( ( X_XHR._isMsXML ? 3 <= X_XHR_msXMLVer : raw.setRequestHeader ) && ( headers = raw.getAllResponseHeaders() ) ){\r
-                                                       headers = X_NET_XHR_parseResponseHeaders( headers );\r
+                                                       headers = X_XHR_parseResponseHeaders( headers );\r
                                                };\r
                                                \r
                                                // https://code.google.com/p/fakeworker-js/source/browse/src/javascript/fakeworker.js\r
@@ -439,34 +462,44 @@ if( X_XHR_w3c || X_XHR_msXML ){
                                                ){\r
                                                        /*\r
                                                         * opera8, safari2, khtml3 で utf8 日本語文字列の文字化け\r
+                                                        * \r
+                                                        * http://www.kawa.net/works/js/jkl/parsexml.html\r
+                                                       \r
+                                                       text = raw[ 'responseText' ];\r
+                                                   //  Safari and Konqueror cannot understand the encoding of text files.\r
+                                                   if( text && ( X_UA[ 'Webkit' ] < 420 || X_UA[ 'KHTML' ] < 4 ) ){\r
+                                                       text = escape( text );\r
+                                                       if ( !text.match( '%u' ) && esc.match( '%' ) ){\r
+                                                           text = decodeURIComponent( text );\r
+                                                       };\r
+                                                   };\r
                                                         */\r
                                                        \r
                                                        // parse json, html, xml, text, script, css\r
                                                        switch( X_XHR._dataType ){\r
-                                                               case '' :\r
                                                                case 'text' :\r
-                                                                       data = raw[ 'responseText' ];\r
+                                                                       data = X_Script_try( X_Object_find, [ raw, 'responseText' ] );\r
                                                                        break;\r
                                                                case 'json' :\r
-                                                               case 'moz-json' :\r
-                                                                       data = raw[ 'response' ] || raw[ 'responseText' ];\r
+                                                                       data = X_Script_try( X_Object_find, [ raw, 'response' ] ) || X_Script_try( X_Object_find, [ raw, 'responseText' ] );\r
                                                                        // eval() を使っているけど JSON の無いブラウザは XDomain な XHR はできないのでよしとする。\r
                                                                        // XDomain な XHR の際は Flash 等で代替し、その中に Json parser も組み込む。\r
                                                                        // http://d.hatena.ne.jp/sshi/20060904/p1\r
-                                                                       if( !X_Type_isObject( data ) ) data = X_JSON_parseTrustableString( data );\r
+                                                                       if( X_Type_isString( data ) ) data = X_JSON_parseTrustableString( data );\r
                                                                        break;\r
                                                                case 'document' :\r
-                                                               case 'xml' :\r
-                                                               case 'html' :\r
-                                                               case 'htm' :\r
-                                                               // svg, vml, xaml, xul, mxml ??\r
                                                                        data = raw[ 'responseXML' ] || raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず\r
                                                                        break;\r
                                                                case 'blob' :\r
                                                                case 'arraybuffer' :\r
+                                                                       // TODO resoponceBody if( X_UA[ 'IE' ] < 10 )\r
+                                                                       // http://d.hatena.ne.jp/maachang/20130221/1361427565\r
                                                                        data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず\r
                                                                        break;\r
                                                        };\r
+                                               };\r
+                                               \r
+                                               if( data ){\r
                                                        X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, response : data, 'headers' : headers || null } );\r
                                                } else {\r
                                                        X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : status || 400, 'headers' : headers || null } );\r
@@ -494,7 +527,25 @@ if( X_XHR_w3c || X_XHR_msXML ){
                                                break;\r
                                };\r
                        },\r
-                       \r
+\r
+/*\r
+ * http://www.kawa.net/works/js/jkl/parsexml.html\r
+ * \r
+// ================================================================\r
+//  method: documentElement()\r
+//  return: XML DOM in response body\r
+\r
+JKL.ParseXML.HTTP.prototype.documentElement = function() {\r
+    // debug.print( 'documentElement: '+this.req );\r
+    if ( ! this.req ) return;\r
+    if ( this.req.responseXML ) {\r
+        return this.req.responseXML.documentElement;    // XMLHTTPRequest\r
+    } else {\r
+        return this.req.documentElement;                // IXMLDOMDocument\r
+    }\r
+};\r
+ */\r
+               \r
                        onTimeout : function(){\r
                                var raw  = X_XHR[ '_rawObject' ],\r
                                        live = !X_XHR._canceled || !X_XHR._busy;\r
@@ -529,7 +580,7 @@ if( X_XHR_w3c || X_XHR_msXML ){
  * 複数の情報が存在する場合、改行で区切られています。\r
  */\r
 \r
-function X_NET_XHR_parseResponseHeaders( headerStr ){\r
+function X_XHR_parseResponseHeaders( headerStr ){\r
        var headers = {}, headerPairs, i = 0, l, headerPair, index, key, val;\r
        \r
        if( !headerStr ) return headers;\r