OSDN Git Service

Version 0.6.130, fix X.Net & X.Audio.
authoritozyun <itozyun@user.sourceforge.jp>
Thu, 12 Feb 2015 14:26:32 +0000 (23:26 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Thu, 12 Feb 2015 14:26:32 +0000 (23:26 +0900)
0.6.x/js/01_core/01_X.js
0.6.x/js/01_core/02_XUA.js
0.6.x/js/01_core/16_XViewPort.js
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/06_XNodeCSS.js
0.6.x/js/02_dom/10_XNodeAnime.js
0.6.x/js/06_net/01_XNetXHR.js
0.6.x/js/06_net/02_XNetJSONP.js
0.6.x/js/07_audio/01_XWebAudio.js
0.6.x/js/07_audio/02_XHTMLAudio.js
0.6.x/js/07_audio/10_XAudioSprite.js

index f46ae28..81ed30d 100644 (file)
@@ -28,7 +28,7 @@ function X( v ){
        };\r
 };\r
 \r
-X.VERSION = '0.6.103';\r
+X.VERSION = '0.6.127';\r
                \r
 X.bootTime = + new Date;\r
 \r
index c0a1d4f..6f15535 100644 (file)
@@ -368,7 +368,7 @@ if( X_UA.Safari && X_UA.WebKit < 525.13 ){
 // ------------------------------------------------------------------------- //\r
 X.UA = X_UA;\r
 \r
-\r
+// TODO 構文のサポート instanceof, in, try catch\r
 \r
 if( X_UA.IE < 7 ){ // error @ NN7.2\r
        // bonus: hotfix for IE6 SP1 (bug KB823727)\r
index cdcdf72..e838bb0 100644 (file)
@@ -298,8 +298,9 @@ X.ViewPort = {
                        
                        html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prev = html.next =
                        html.create = html.createText = html.createAt = html.createTextAt = html.append = html.appendAt = html.empty = html.html = html.text =
+                       html.css = html.cssText =
                        head.appendTo = head.appendToRoot = head.before = head.after = head.clone = head.remove = head.destroy =
-                       head.empty = head.html = head.text =
+                       head.createText = head.createTextAt = head.empty = head.html = head.text = head.css = head.cssText =
                        body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = new Function( 'return this' );
 
                        X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, function(){
index da8f553..26060f5 100644 (file)
@@ -110,13 +110,14 @@ var
                _rect      : null, // \r
                _fontSize  : 0,\r
                \r
+               length     : 1,\r
                parent     : null, // remove された枝も親子構造は維持している。\r
                _xnodes    : null, // Array.<Node>\r
 \r
                _tag       : '',\r
                _text      : '',\r
-               _id        : '',\r
-               _className : '',\r
+               _id        : '', //\r
+               _className : '', //\r
 \r
                _attrs     : null, // see X_Node_Attr\r
                _newAttrs  : null,\r
@@ -131,12 +132,12 @@ var
         * TODO Node の継承ができない!\r
         */\r
                Constructor : function( v ){\r
-                       var css, xnodes, xnode, parent, uid = X_Node_CHASHE.length;\r
+                       var uid = X_Node_CHASHE.length,\r
+                               css, xnodes, xnode, parent;\r
                        \r
                        if( X_Node_newByTag ){\r
                                X_Node_newByTag = false;\r
                                this._tag       = v.toUpperCase();\r
-                               this._flags    |= X_Node_State.EXIST;\r
                                arguments[ 1 ] && this.attr( arguments[ 1 ] );\r
                                css = arguments[ 2 ];\r
                                css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css );\r
@@ -144,7 +145,6 @@ var
                        if( X_Node_newByText ){\r
                                X_Node_newByText = false;\r
                                this._text       = v;\r
-                               this._flags     |= X_Node_State.EXIST;\r
                        } else {\r
                                if( 1 < arguments.length ) return new X_NodeList( arguments );\r
                                if( X.Type.isArray( v ) && v.length ) return new X_NodeList( v );\r
@@ -158,11 +158,7 @@ var
                                                if( xnode = X_Node_getXNode( v ) ) return xnode;\r
                                                // v.parentNode || v.parentElement : dom1 || dom0\r
                                                this.parent     = ( parent = v.parentNode || v.parentElement ) && parent.tagName /* ie7- */ && X_Node_getXNode( parent );\r
-                                               if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
-                                                       this._flags |= X_Node_State.IN_TREE;\r
-                                               };\r
                                                this._rawObject = v;\r
-                                               this._flags    |= X_Node_State.EXIST;\r
                                                this._tag       = v.tagName.toUpperCase();\r
                                                this._id        = v.id;\r
                                                this._className = v.className;\r
@@ -170,7 +166,7 @@ var
                                                this.cssText( v.style.cssText );\r
                                                this._flags &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす\r
                                                \r
-                                               // TODO attr の回収は不可能、、、\r
+                                               // TODO attr の回収は不可能、、、?\r
                                                if( X_UA_DOM.IE4 ){\r
                                                        v.setAttribute( 'UID', '' + uid );\r
                                                } else {\r
@@ -182,11 +178,7 @@ var
                                        case X_Node_TYPE.RAW_TEXT :\r
                                                if( xnode = X_Node_getXNode( v ) ) return xnode;\r
                                                this.parent     = X_Node_getXNode( v.parentNode );\r
-                                               if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
-                                                       this._flags |= X_Node_State.IN_TREE;\r
-                                               };\r
                                                this._rawObject = v;\r
-                                               this._flags    |= X_Node_State.EXIST;\r
                                                this._text      = v.data;\r
                                                v.UID = uid;\r
                                                break;\r
@@ -198,11 +190,16 @@ var
                                                return X_Node_none;\r
 \r
                                        default :\r
+                                               this.length = 0;\r
                                                if( X_Node_none ) return X_Node_none;\r
                                                return;\r
                                };\r
                        };\r
                        \r
+                       if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
+                               this._flags |= X_Node_State.IN_TREE;\r
+                       };\r
+                       this._flags |= X_Node_State.EXIST;\r
                        X_Node_CHASHE[ this._uid = uid ] = this;\r
                },\r
                \r
@@ -768,7 +765,7 @@ function X_Node_className( v ){
        \r
        // setter\r
        if( this._className === v ) return this;\r
-       if( !v || typeof v !== 'string' ){\r
+       if( !v || !X.Type.isString( v ) ){\r
                delete this._className;\r
        } else {\r
                // cleanup\r
@@ -957,6 +954,12 @@ function X_Node_call( name /*, opt_args... */ ){
        raw  = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
        if( !raw ) return;\r
        \r
+       if( name === 'scrollTo' ){\r
+               raw.scrollLeft = arguments[ 1 ] || 0;\r
+               raw.scrollTop  = arguments[ 2 ] || 0;\r
+               return;\r
+       };\r
+       \r
        func = raw[ name ];\r
        if( X.Type.isFunction( func ) ){\r
                if( l ){\r
@@ -1115,8 +1118,8 @@ var X_Node__commitUpdate =
                                        return nextElement;\r
                                };\r
                                elm && ( elm.style.display = 'none' );\r
-                               return elm || nextElement;\r
-                       };                      \r
+                               return elm.nextSibling === nextElement ? elm : nextElement;\r
+                       };\r
                        \r
                        // 5. ie5 非表示fixフラグ\r
                        accumulatedFlags |= that._flags;\r
@@ -1132,6 +1135,9 @@ var X_Node__commitUpdate =
                                if( !that._tag ){\r
                                        that._flags &= X_Node_BitMask_RESET_DIRTY;\r
                                        that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
+                                       if( !X.UA.IE ){\r
+                                               elm.UID = that._uid;\r
+                                       };\r
                                } else\r
                                if( X_Node_strictElmCreation ){\r
                                        that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
@@ -1154,13 +1160,13 @@ var X_Node__commitUpdate =
                                        nextElement ?\r
                                                parentElement.insertBefore( elm, nextElement ) :\r
                                                parentElement.appendChild( elm );\r
-                                       //elm.UID = that._uid;\r
-                                       // src の onload があるので先ではないか?\r
-                                       // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
-                                       X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
                                };\r
 \r
                                if( that._tag ){\r
+                                       // src の onload があるので先ではないか?\r
+                                       // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
+                                       X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰                                \r
+                                       \r
                                        if( X_Node_documentFragment ){\r
                                                //( frg = X_Node_documentFragment ).appendChild( elm );\r
                                        };\r
@@ -1173,6 +1179,7 @@ var X_Node__commitUpdate =
                                        } else {\r
                                                elm.UID = that._uid;\r
                                                that._newAttrs = that._attrs;\r
+                                               that._flags &= X_Node_BitMask_RESET_DIRTY;\r
                                                that._flags |= X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME | X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER;\r
                                                \r
                                                // http://outcloud.blogspot.jp/2010/09/iframe.html\r
@@ -1232,7 +1239,10 @@ var X_Node__commitUpdate =
                                        parentElement.insertBefore( elm, nextElement ) :\r
                                        parentElement.appendChild( elm );\r
                                \r
-                               X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
+                               if( X_UA.Gecko && that._tag === 'IFRAME' && elm.contentWindow ){\r
+                                       // tree に追加されるまで contentWindow は存在しない。\r
+                                       elm.contentWindow.location.replace = elm.src;\r
+                               };\r
                        };\r
 \r
                        return elm;\r
@@ -1256,7 +1266,7 @@ var X_Node__commitUpdate =
                                                return prevElement;\r
                                        };\r
                                };\r
-                               return elm || prevElement;\r
+                               return elm || nextElement;\r
                        };\r
                        \r
                        if( !elm ){\r
@@ -1351,7 +1361,7 @@ var X_Node__updateRawNode =
                        };\r
                        // className\r
                        if( that._flags & X_Node_State.DIRTY_CLASSNAME ){\r
-                               that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-?                         \r
+                               that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE < 8 ? 'className' : 'class' ) ); // className は ie7-                  \r
                        };\r
                        \r
                        // attr\r
@@ -1375,7 +1385,7 @@ var X_Node__updateRawNode =
                                                case 'IFRAMEsrc' :\r
                                                        // http://outcloud.blogspot.jp/2010/09/iframe.html\r
                                                        // この問題は firefox3.6 で確認\r
-                                                       if( X_UA.Gecko ){\r
+                                                       if( X_UA.Gecko && elm.contentWindow ){\r
                                                                elm.contentWindow.location.replace = elm.src = v || '';\r
                                                                continue;\r
                                                        };\r
index 674212a..1445907 100644 (file)
@@ -508,7 +508,7 @@ Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){
        var args = arguments,
                css  = this._css,
                p, name, v, plain, camelize, flags;
-       if( !this._tag ) return this;
+       if( !this._tag || X_Dom_DTD_MOVE_TO_HEAD[ this._tag ] || this._tag === 'SCRIPT' ) return this;
 // setter:object
        if( X.Type.isObject( nameOrObj ) ){
                if( !css ) css = this._css = {};
index 9a3078c..140f78a 100644 (file)
@@ -281,7 +281,7 @@ function X_Node_Anime_updateAnimation( xnode ){
                        X_ViewPort.unlisten( X.Event.AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased );\r
                        \r
                        xnode.css({\r
-                               willChange               : X_Node_Anime_transitionProps + ',opacity,width,height',\r
+                               //willChange               : X_Node_Anime_transitionProps + ',opacity,width,height',\r
                                backfaceVisibility       : 'hidden',\r
                                transitionTimingFunction : obj.easing.style,\r
                                transitionDelay          : '0s' // 0.001 にすると transitionend のタイミングが狂う、、、\r
@@ -326,7 +326,7 @@ function X_Node_Anime_updateAnimation( xnode ){
 \r
                case 10 :\r
                        // アニメーションは停止・GPUレイヤーは解除していない(再アニメーションに備えて待機)\r
-                       X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動?\r
+                       //X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動?\r
                        if( !obj.gpuTimerID ){\r
                                if( obj.wait ){\r
                                        obj.gpuTimerID = X.Timer.once( obj.wait, xnode, X_Node_Anime_releaseGPULayer );\r
@@ -427,6 +427,7 @@ function X_Node_Anime_releaseGPULayer(){
                console.log( '_anime無' );\r
                return;\r
        };\r
+       X_Node_Anime_clearTransition( this );\r
        X_Node_Anime_updatePosition( this, obj.destX, obj.destY, obj.destA, false );\r
        X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 );\r
        delete obj.gpuTimerID;\r
@@ -448,7 +449,7 @@ function X_Node_Anime_clearTransition( xnode ){
        xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd );\r
 \r
        xnode.css({\r
-               willChange               : '',\r
+               //willChange               : '',\r
                backfaceVisibility       : '',\r
                transitionTimingFunction : '',\r
                transitionDelay          : '',\r
index f488350..71d4770 100644 (file)
@@ -105,7 +105,7 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){
                                        async    = obj[ 'async' ],\r
                                        user     = obj[ 'user' ],\r
                                        password = obj[ 'password' ],\r
-                                       headers  = obj[ 'headers' ],\r
+                                       headers  = obj[ 'headers' ] || {},\r
                                        postbody = obj[ 'postbody' ],\r
                                        timeout  = obj[ 'timeout' ] || 20000,\r
                                        temp;\r
@@ -168,6 +168,11 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){
                                // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html\r
                                // raw.overrideMimeType()\r
                                if( !X_Net_XHR_ACTIVE_X && X.Type.isFunction( raw.setRequestHeader ) ){\r
+                                       \r
+                                       // http://nakigao.sitemix.jp/blog/?p=2040\r
+                                       // SafariでHTTP/412のエラー\r
+                                       headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
+                                       \r
                                        for( p in headers ){\r
                                                if( X_EMPTY_OBJECT[ p ] ) continue;\r
                                                raw.setRequestHeader( p, headers[ p ] ); // Opera8.01+, MSXML3+\r
index 0355d58..9e1eac2 100644 (file)
@@ -28,7 +28,7 @@ X.Net.JSONP = {
                        X_NET_JSONPWrapper
                                .asyncDispatch( {
                                        type : jsonString ? X.Event.SUCCESS : X.Event.ERROR,
-                                       data : jsonString //window.JSON ? JSON.parse( jsonString ) : eval( jsonString )
+                                       data : window.JSON ? JSON.parse( jsonString ) : eval( 'var a=' + jsonString + ';a' )
                                } );
                        
                        console.log( 'ms : ' + time + ' speed : ' + ( ( jsonString.length + ( opt_json2FileSize || 0 ) ) / time * 1000 ) + ' バイト/秒.' );
index 84216ed..d50aaa4 100644 (file)
@@ -91,7 +91,8 @@ if( X_Audio_WebAudio_context ){
                                        // http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1
                                        // iOS 7.1 で decodeAudioData に処理が入った瞬間にスクリーンを長押しする(スクロールを繰り返す)と
                                        // decoeAudioData の処理がキャンセルされることがある(エラーやコールバックの発火もなく、ただ処理が消滅する)。
-                                               if( X_Audio_WebAudio_context.createBuffer && X_UA.iOS ){
+                                       // ただし iOS 8.1.2 では エラーになる
+                                               if( X_Audio_WebAudio_context.createBuffer && X_UA.iOS < 8 ){
                                                        this._onDecodeSuccess( X_Audio_WebAudio_context.createBuffer( e.data, false ) );
                                                } else
                                                if( X_Audio_WebAudio_context.decodeAudioData ){
index 3c721fc..df0024b 100644 (file)
@@ -5,11 +5,13 @@
  */\r
 \r
 var X_Audio_HTMLAudio_playTrigger =\r
+               6 <= X_UA.iOS ? 'loadeddata' :\r
                X_UA.iOS ? 'suspend' :\r
                X_UA.AndroidBrowser2 ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,,\r
                X_UA.AndroidBrowser4 ? 'loadeddata' : \r
                X_UA.OperaMobile || X_UA.OperaTablet ? 'loadeddata' : 'canplay',\r
        X_Audio_HTMLAudioWrapper,\r
+       X_Audio_constructor = window.Audio || window.HTMLAudioElement,\r
        X_Audio_rawAudio,\r
        // Opera Mobile 12 android4.4.4 & 2.3.5 は 2回目以降の currentTime へのセットで currentTime が更新されなくなるため、タイマーを使用する\r
        X_Audio_HTMLAudioWrapper_currentTimeFix  = !!X_UA.OperaMobile || !!X_UA.OperaTablet, // || ( X_UA.WinPhone && X_UA.IE9 ),\r
@@ -31,31 +33,42 @@ var X_Audio_HTMLAudio_playTrigger =
        \r
        X_Audio_codecs;\r
 \r
-if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){\r
+if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){\r
        //http://himaxoff.blog111.fc2.com/blog-entry-97.html\r
        //引数なしで new Audio() とすると、Operaでエラーになるそうなので注意。\r
-       X_Audio_rawAudio = new Audio( '' );\r
-       \r
-       X_Audio_codecs = {\r
-      mp3  : X_Audio_rawAudio.canPlayType('audio/mpeg'),\r
-      opus : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="opus"'),\r
-      ogg  : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="vorbis"'),\r
-      wav  : X_Audio_rawAudio.canPlayType('audio/wav; codecs="1"'),\r
-      aac  : X_Audio_rawAudio.canPlayType('audio/aac'),\r
-      m4a  : X_Audio_rawAudio.canPlayType('audio/x-m4a') + X_Audio_rawAudio.canPlayType('audio/m4a') + X_Audio_rawAudio.canPlayType('audio/aac'),\r
-      mp4  : X_Audio_rawAudio.canPlayType('audio/x-mp4') + X_Audio_rawAudio.canPlayType('audio/mp4') + X_Audio_rawAudio.canPlayType('audio/aac'),\r
-      weba : X_Audio_rawAudio.canPlayType('audio/webm; codecs="vorbis"')\r
-       };\r
-       \r
-       (function( k, v ){\r
-               for( k in X_Audio_codecs ){\r
-                       if( X_EMPTY_OBJECT[ k ] ) continue;\r
-                       v = X_Audio_codecs[ k ];\r
-                       X_Audio_codecs[ k ] = v && v.split( 'no' ).join( '' );\r
-                       console.log( k + ' ' + X_Audio_codecs[ k ] );\r
+       X_Audio_rawAudio = new X_Audio_constructor( '' );\r
+\r
+       if( X_Audio_rawAudio.canPlayType ){\r
+               X_Audio_codecs = {\r
+             mp3  : X_Audio_rawAudio.canPlayType('audio/mpeg'),\r
+             opus : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="opus"'),\r
+             ogg  : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="vorbis"'),\r
+             wav  : X_Audio_rawAudio.canPlayType('audio/wav; codecs="1"'),\r
+             aac  : X_Audio_rawAudio.canPlayType('audio/aac'),\r
+             m4a  : X_Audio_rawAudio.canPlayType('audio/x-m4a') + X_Audio_rawAudio.canPlayType('audio/m4a') + X_Audio_rawAudio.canPlayType('audio/aac'),\r
+             mp4  : X_Audio_rawAudio.canPlayType('audio/x-mp4') + X_Audio_rawAudio.canPlayType('audio/mp4') + X_Audio_rawAudio.canPlayType('audio/aac'),\r
+             weba : X_Audio_rawAudio.canPlayType('audio/webm; codecs="vorbis"')\r
                };\r
-       })();\r
-       \r
+               (function( k, v ){\r
+                       for( k in X_Audio_codecs ){\r
+                               if( X_EMPTY_OBJECT[ k ] ) continue;\r
+                               v = X_Audio_codecs[ k ];\r
+                               X_Audio_codecs[ k ] = v && v.split( 'no' ).join( '' );\r
+                               console.log( k + ' ' + X_Audio_codecs[ k ] );\r
+                       };\r
+               })();\r
+       } else {\r
+               // iOS3.2.3\r
+               X_Audio_codecs = {\r
+             mp3  : X_UA.IE || X_UA.Chrome || ( X_UA.Windows && X_UA.Safari ),\r
+             ogg  : 5 <= X_UA.Gecko || X_UA.Chrome || X_UA.Opera,\r
+             wav  : X_UA.Gecko || X_UA.Opera || ( X_UA.Windows && X_UA.Safari ),\r
+             aac  : X_UA.IE || X_UA.WebKit,\r
+             m4a  : X_UA.IE || X_UA.WebKit,\r
+             mp4  : X_UA.IE || X_UA.WebKit,\r
+             weba : 2 <= X_UA.Gecko || 10.6 <= X_UA.Opera // firefox4+(Gecko2+)\r
+               };\r
+       };\r
        \r
        X_Audio_HTMLAudioWrapper = X.EventDispatcher.inherits(\r
                'X.AV.HTML5AudioWrapper',\r
@@ -107,7 +120,7 @@ if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                        document.body.appendChild( this._rawObject );\r
                                        //this._rawObject.load();\r
                                } else {\r
-                                       this._rawObject = X_Audio_rawAudio || new Audio( source );// X_Doc_create( 'audio', { src : source } ).appendToRoot();//( X.X_Node_systemNode );\r
+                                       this._rawObject = X_Audio_rawAudio || new X_Audio_constructor( source );// X_Doc_create( 'audio', { src : source } ).appendToRoot();//( X.X_Node_systemNode );\r
                                        this._rawObject.autobuffer = false;\r
                                        this._src = source;\r
                                };\r
@@ -124,13 +137,13 @@ if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                        if( X_Audio_HTMLAudioWrapper_badOperaAndroid ){\r
                                                X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( 12 );\r
                                                X_EventDispatcher_toggleAllEvents( this, false );\r
-                                               this._rawObject = new Audio( X_URL_toAbsolutePath( source ) );\r
+                                               this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) );\r
                                                //X_EventDispatcher_toggleAllEvents( this, true );\r
                                        } else {\r
                                                X_Audio_rawAudio.src = source;\r
                                        };\r
 \r
-                                       //this._rawObject = new Audio( X_URL_toAbsolutePath( source ) );\r
+                                       //this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) );\r
                                        /*!X_Audio_Sprite_needTouchFirst && */ X_Audio_rawAudio.load(); // 要る?\r
                                        X_Audio_rawAudio = null;\r
                                };\r
index 717a7c4..6cdc290 100644 (file)
@@ -7,7 +7,7 @@
 var X_Audio_Sprite_shouldUse        = window.HTMLAudioElement && ( X_UA.iOS || X_UA.AndroidBrowser || X_UA.OperaMobile || X_UA.OperaTablet ), // Flash がない\r
        X_Audio_Sprite_useVideoForMulti = 4 <= X_UA.AndroidBrowser && 534.3 < X_UA.AndroidBrowserWebkit, // ドスパラパッドはビデオのインライン再生が不可 \r
        X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti,      \r
-       X_Audio_Sprite_needTouchFirst   = !!X_UA.iOS || X_Audio_Sprite_needTouchAndroid || ( X_UA.WinPhone && X_UA.IE9 ),\r
+       X_Audio_Sprite_needTouchFirst   = X_UA.iOS || X_Audio_Sprite_needTouchAndroid || ( X_UA.WinPhone && X_UA.IE9 ),\r
        X_Audio_Sprite_enableMultiTrack = !( X_UA.iOS && !X_Audio_WebAudio_context ) && !( X_UA.AndroidBrowser4 && X_UA.AndroidBrowserWebkit <= 534.3 ),\r
        X_Audio_Sprite_enableVolume     = window.HTMLAudioElement && ( !X_UA.iOS && !X_UA.AndroidBrowser && !X_UA.OperaMobile && !X_UA.OperaTablet ), // TODO fennec は 25以上\r
        X_Audio_Sprite_maxTracks        = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9,\r
@@ -205,7 +205,7 @@ X_Audio_Sprite_members = {
                                                track = X_Audio_Sprite_TEMP.bgmTrack = tracks[ 0 ];\r
                                        };\r
                                        \r
-                                       if( track.listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ).isPlaying() ){\r
+                                       if( track.listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){\r
                                                track\r
                                                        .state( {\r
                                                                loop          : true,\r
@@ -227,7 +227,7 @@ X_Audio_Sprite_members = {
                                        if( 1 < tracks.length ){\r
                                                track = X_Audio_Sprite_getTrackEnded( X_Audio_Sprite_TEMP.bgmPlaying );\r
                                                track\r
-                                                       .listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent )\r
+                                                       .listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent )\r
                                                        .state( { looped : false } )\r
                                                        .play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence );\r
                                        } else {\r
@@ -239,7 +239,7 @@ X_Audio_Sprite_members = {
                                                };\r
                                                track = tracks[ 0 ];\r
                                        \r
-                                               if( track.listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ).isPlaying() ){\r
+                                               if( track.listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){\r
                                                        track\r
                                                                .state( {\r
                                                                        loop          : true,\r
@@ -267,8 +267,8 @@ X_Audio_Sprite_members = {
                                X_Audio_Sprite_TEMP.bgmPlaying  = false;\r
                                X_Audio_Sprite_TEMP.bgmTrack    = null;\r
                        };\r
-                       console.log( 'pause' );\r
                        track && track.play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 );\r
+                       this.asyncDispatch( X.Event.MEDIA_PAUSED );\r
                        return this;\r
                },\r
                \r
@@ -352,16 +352,20 @@ function X_Audio_Sprite_handleEvent( e ){
                        break;\r
                \r
                case X.Event.READY :\r
+                       console.log( 'X.AudioSprite - Ready!' );\r
                        if( X_Audio_Sprite_needTouchAndroid ){\r
                                for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){\r
                                        X_Audio_Sprite_instance.pause( i );\r
                                };\r
-                               e.target.listenOnce( X.Event.MEDIA_PLAYING, this, X_Audio_Sprite_handleEvent ); // Android 標準ブラウザ\r
+                               e.target.listenOnce( X.Event.MEDIA_PLAYING, this, this.asyncDispatch, [ X.Event.READY ] ); // Android 標準ブラウザ\r
                                return;\r
                        };\r
-               case X.Event.MEDIA_PLAYING :\r
                        this.asyncDispatch( X.Event.READY );\r
                        break;\r
+                       \r
+               case X.Event.MEDIA_PLAYING :\r
+                       ( e.target === X_Audio_Sprite_TEMP.bgmTrack || !e.target.state().looped ) && this.asyncDispatch( X.Event.MEDIA_PLAYING );\r
+                       break;\r
                \r
                case X.Event.MEDIA_BEFORE_LOOP :\r
                        if( e.target === X_Audio_Sprite_TEMP.bgmTrack ){\r