OSDN Git Service

Version 0.6.172, bugfix...
authoritozyun <itozyun@user.sourceforge.jp>
Tue, 22 Sep 2015 03:11:49 +0000 (12:11 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Tue, 22 Sep 2015 03:11:49 +0000 (12:11 +0900)
14 files changed:
0.6.x/js/01_core/02_XUA.js
0.6.x/js/01_core/13_XClass.js
0.6.x/js/01_core/16_XTimer.js
0.6.x/js/01_core/21_XViewPort.js
0.6.x/js/02_dom/02_XNodeFlags.js
0.6.x/js/02_dom/04_XBoxModel.js
0.6.x/js/02_dom/05_XNodeAttr.js
0.6.x/js/02_dom/20_XNode.js
0.6.x/js/05_util/04_XXML.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/04_XNetImage.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 94799e4..fafe846 100644 (file)
@@ -502,7 +502,8 @@ var X_UA = X[ 'UA' ] = {},
                console.log( '>> Gecko : ' + X_UA[ 'Gecko' ] );\r
        };\r
        \r
-       if( dua.indexOf( 'Linux; U; Android ' ) !== -1 || dua.indexOf( 'Linux; Android ' ) !== -1 ){\r
+       if( ( dua.indexOf( 'Linux; U; Android ' ) !== -1 || dua.indexOf( 'Linux; Android ' ) !== -1 ) &&\r
+               ( dua.indexOf( 'Chrome\/' ) === -1 || dua.indexOf( 'Version\/' ) !== -1 ) ){ // Chrome/ を含まない または Version/ を含む\r
                /**\r
                 * Android 標準ブラウザ\r
                 * @alias X.UA.AndroidBrowser\r
index 6cf56b8..b475f11 100644 (file)
@@ -130,12 +130,13 @@ X_Class_CommonMethods =
        'Super' : function( var_args ){\r
                var sClass = this,\r
                        i      = X_Class_CALLING_SUPER.indexOf( sClass ),\r
-                       n      = -1,\r
                        l, sList, def, sConst, ret;\r
        \r
                if( i === -1 ){\r
                        X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;\r
                        X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
+                       def = X_Class_getClassDef( sClass );\r
+                       if( !def.Constructor ) sClass = def.SuperClass;// 現在のクラスがコンストラクタを持たない場合 SuperConstructor を new で呼んでいるため再び呼ばないようにする\r
                } else {\r
                        sList = X_Class_CALL_SUPER_STACK[ i ];\r
                };\r
@@ -144,8 +145,9 @@ X_Class_CommonMethods =
                        def    = X_Class_getClassDef( sClass );\r
                        sClass = def.SuperClass;\r
                        sConst = def.SuperConstructor;\r
-                       if( sConst && sList[ ++n ] !== sConst ){\r
-                               sList[ n ] = sConst;\r
+                       if( !sConst ) break;\r
+                       if( sList.indexOf( sConst ) === -1 ){\r
+                               sList[ sList.length ] = sConst;\r
                                ret = sConst.apply( this, arguments );\r
                                --sList.length;\r
                                if( !sList.length ){\r
index 4df6372..faa9031 100644 (file)
@@ -374,7 +374,7 @@ function X_Timer_update(){
        \r
        1 < i && list.sort( X_Timer_compareQueue );\r
        \r
-    n = list[ i - 1 ].last;\r
+    n = list[ 0 ].last;\r
     \r
     if( n < X_Timer_waitTime || X_Timer_timerId === 0 ){\r
        if( X_Timer_timerId ){\r
@@ -390,7 +390,7 @@ function X_Timer_update(){
 \r
 // 大きい -> 小さい\r
 function X_Timer_compareQueue( a, b ){\r
-       return a.last < b.last ? 1 : a.last === b.last ? 0 : -1;\r
+       return a.last < b.last ? -1 : a.last === b.last ? 0 : 1;\r
 };\r
 \r
 // http://havelog.ayumusato.com/develop/javascript/e528-ios6_scrolling_timer_notcall.html\r
index 2349dde..aa8cdc3 100644 (file)
@@ -1,6 +1,6 @@
 
 var X_ViewPort_readyState,
-       X_ViewPort_active = !!window.parent || !!document.activeElement, // parent は frameに読み込まれた場合のieのerror回避
+       X_ViewPort_active = ( window.parent === window ) || !window.parent, // parent は frameに読み込まれた場合のieのerror回避
        X_ViewPort_activeTimerID,
        X_ViewPort_rootElement,
        X_ViewPort_lock,
@@ -58,17 +58,19 @@ X_ViewPort = X_Class_override(
 
                                case 'visibilitychange' :
                                        console.log( e.type + ':' + document[ 'hidden' ] );
-                                       X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'hidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE );
+                                       X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = !document[ 'hidden' ] ) ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE );
                                        break;
                                case 'msvisibilitychange' :
-                                       X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'msHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE );
+                                       console.log( e.type + ':' + document[ 'msHidden' ] );
+                                       X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = !document[ 'msHidden' ] ) ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE );
                                        break;
                                case 'mozvisibilitychange' :
-                                       X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'mozHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE );
+                                       console.log( e.type + ':' + document[ 'mozHidden' ] );
+                                       X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = !document[ 'mozHidden' ] ) ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE );
                                        break;
                                case 'webkitvisibilitychange' :
                                        console.log( e.type + ':' + document[ 'webkitHidden' ] );
-                                       X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'webkitHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE );
+                                       X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = !document[ 'webkitHidden' ] ) ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE );
                                        break;
        
                                case 'blur' :
@@ -76,7 +78,7 @@ X_ViewPort = X_Class_override(
                                        if( X_UA[ 'IE' ] < 9 ){
                                                xnode = X_Node_getXNode( document.activeElement );
                                                if( xnode ){
-                                                       xnode[ 'listen' ]( [ 'focus', 'blur' ], X_ViewPort_detectFocusForIE );
+                                                       xnode[ 'listenOnce' ]( [ 'focus', 'blur' ], X_ViewPort_detectFocusForIE );
                                                        //break;
                                                };
                                                if( X_ViewPort_activeTimerID ){
@@ -308,6 +310,22 @@ X[ 'ViewPort' ] = {
                        return X_ViewPort_baseFontSize = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight;
                };
                return X_ViewPort_baseFontSize;
+       },
+       
+       /**
+        * キーボードイベントを受け付ける
+        * @alias X.ViewPort.isActive
+        */
+       'isActive' : function(){
+               return X_ViewPort_active;
+       },
+       
+       /**
+        * 可視である。iframe 内のhtmlも
+        * @alias X.ViewPort.isVisible
+        */
+       'isVisible' : function(){
+               return X_ViewPort_active;
        }
        
 };
@@ -573,21 +591,21 @@ console.log( 'X.Dom dom:w3c=' + X_UA_DOM.W3C + ' ev:w3c=' + X_UA_EVENT.W3C );
 if( X_UA_EVENT.W3C ){
        X_ViewPort_document[ 'listenOnce' ]( 'DOMContentLoaded', X_TEMP.onDomContentLoaded );
 } else
-if( 6 <= X_UA[ 'IE' ] && X[ 'inHead' ] ){
+if( 6 <= X_UA[ 'IE' ] && X[ 'inHead' ] && !X_UA[ 'ieExeComError' ] ){ // standalone の除外 ->  && !X_UA[ 'ieExeComError' ]
        // if this script in Head
-       //document.write( '<script id="__ie_onload" defer src="javascript:void(0)"></script>' );
-       //X_TEMP._script = document.getElementById( '__ie_onload' );
+       document.write( '<script id=__ieonload defer src=javascript:void(0)></script>' );
+       X_TEMP._script = document.getElementById( '__ieonload' );
        
        // 上のコードはスタンドアローン版ie6でエラー
-    X_TEMP._script = document.createElement( '<script id="__ie_onload" defer src="javascript:void(0)"></script>' ) ;
-    document.getElementsByTagName("head")[ 0 ].appendChild( X_TEMP._script );
+    //X_TEMP._script = document.createElement( '<script id=__ieonload defer src=javascript:void(0)></script>' ) ;
+    //document.getElementsByTagName( 'head' )[ 0 ].appendChild( X_TEMP._script );
     
        X_TEMP._script.onreadystatechange = function(){
                var s = X_TEMP._script;
                if( s && s.readyState === 'complete' ){
                        s.onreadystatechange = X_emptyFunction;
                        s.onreadystatechange = null;
-                       s.parentNode.removeChild( s );
+                       s.removeNode( true );
                        delete X_TEMP._script;
                        X_TEMP.onDomContentLoaded && X_TEMP.onDomContentLoaded();
                };
index ff3ac0f..0a9fad8 100644 (file)
@@ -43,16 +43,21 @@ var X_NodeFlags_DESTROYED              = 0x0,
 \r
        // http://modernizr.com/downloads/modernizr.js\r
        // Thanks to Erik Dahlstrom\r
-       X_NodeFlags_IS_SVG                 = document.createElementNS && document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' ).createSVGRect ? 2 << 25 : 0,\r
+       X_NodeFlags_IS_SVG                 = document.createElementNS && document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' )[ 'createSVGRect' ] ? 2 << 25 : 0,\r
        X_NodeFlags_IS_VML                 =\r
                        ( function(){\r
-                               if( !X_UA[ 'ActiveX' ] || X_UA[ 'IE' ] < 5 || 9 < X_UA[ 'IE' ] ) return 0;\r
+                               if( !X_UA[ 'ActiveX' ] || X_UA[ 'IE' ] < 5 || 9 < X_UA[ 'IE' ] || X_UA[ 'ieExeComError' ] ) return 0; // standalone の除外 -> X_UA[ 'ieExeComError' ]\r
 \r
-                               document.write( '<!--[if gte vml 1]><script id=vmltest>window.vml=1;<\/script><![endif]-->' );\r
+                               document.write(\r
+                                       '<!--[if vml]><script id=vmltest1>__vml=1;</script><![endif]-->' +\r
+                                       '<!--[if gte vml 1]><script id=vmltest2>__vml=2;</script><![endif]-->' );\r
                                \r
-                               if( window[ 'vml' ] === 1 ){\r
-                                       document.getElementById( 'vmltest' ).removeNode( true );\r
-                                       return 2 << 26;\r
+                               switch( window[ '__vml' ] ){\r
+                                       case 2 :\r
+                                               document.getElementById( 'vmltest2' ).removeNode( true );\r
+                                       case 1 :\r
+                                               document.getElementById( 'vmltest1' ).removeNode( true );\r
+                                               return 2 << 26;\r
                                };\r
                                return 0;\r
                        })(),\r
index acb0939..a609fc4 100644 (file)
@@ -213,43 +213,49 @@ function X_Node_y(){
 };\r
 \r
 /**\r
- * 要素の親要素に対する位置。\r
+ * 要素の文書内の位置。引数に xnode を与えた場合、\r
  * @alias Node.prototype.offset\r
  * @return {object} { x: {number}, y : {number} }\r
  * @example node.offset();\r
  */\r
-function X_Node_offset( /* xnodeParent */ ){\r
-       var flags = this[ '_flags' ], elm;\r
+function X_Node_offset( xnode ){\r
+       var flags  = this[ '_flags' ],\r
+               offset = { x : 0, y : 0 },\r
+               obj, parent, elm;\r
        \r
-       if( ( flags & X_NodeFlags_IN_TREE ) === 0 || flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) return { x : 0, y : 0 };\r
-       \r
-       if( X_Node_body === this || X_Node_html === this ){\r
-               return { x : 0, y : 0 };\r
-       };\r
+       if( ( flags & X_NodeFlags_IN_TREE ) === 0 || flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) return offset;\r
        \r
+       if( X_Node_body === this || X_Node_html === this ) return offset;\r
+\r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       \r
+\r
        elm = this[ '_rawObject' ] || X_Node__ie4getRawNode && X_Node__ie4getRawNode( this );\r
        \r
-       return elm ? X_Node_getPosition( elm ) : { x : 0, y : 0 };\r
+       return elm ? X_Node_getPosition( elm ) : offset;\r
 };\r
 \r
 // エレメントの座標取得 ~スクロール要素~\r
-// http://n-yagi.0r2.net/script/2009/06/post_14.html\r
+// http://n-yagi.0r2.net/script/2009/07/post_16.html\r
 \r
 //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\r
 //  エレメントの絶対座標を得たい\r
 //------------------------------------------------------------------------------\r
 //  座標取得\r
 var X_Node_getPosition =\r
-       document.documentElement && document.documentElement.getBoundingClientRect ?\r
-               function( el ){\r
-               var pos  = el.getBoundingClientRect(),\r
-                       html = document.documentElement,\r
-                       body = document.body;\r
-               return  {   x:(pos.left +   (body.scrollLeft||html.scrollLeft)  -   html.clientLeft)\r
-                       ,   y:(pos.top  +   (body.scrollTop||html.scrollTop)    -   html.clientTop) };\r
-               } :\r
+       !X_UA[ 'IE4' ] && document.createElement( 'div' ).getBoundingClientRect ?\r
+               (\r
+                       document.compatMode === 'CSS1Compat' && !X_UA[ 'Webkit' ] ? function( el ){\r
+                       var pos  = el.getBoundingClientRect(),\r
+                               html = document.documentElement;\r
+                       return  {   x:(pos.left + html.scrollLeft - html.clientLeft)\r
+                               ,   y:(pos.top  + html.scrollTop  - html.clientTop) };\r
+                       } :\r
+                       function( el ){\r
+                       var pos  = el.getBoundingClientRect();\r
+                   return  {   x:(pos.left +   window.pageXOffset)\r
+                           ,   y:(pos.top  +   window.pageYOffset)   };\r
+                       }\r
+               ) :\r
        X_UA[ 'Opera' ] < 10 ?\r
                function( el ){\r
             var ex  =   0;\r
index a438590..6dcd5c7 100644 (file)
@@ -241,10 +241,10 @@ function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){
                case 'ns' :\r
                case 'NS' :\r
                        if( v === 'svg' || v === 'SVG' ){\r
-                               that[ '_flags' ] |= XX_NodeFlags_IS_SVG;\r
+                               that[ '_flags' ] |= X_NodeFlags_IS_SVG;\r
                        };\r
                        if( v === 'vml' || v === 'VML' ){\r
-                               that[ '_flags' ] |= XX_NodeFlags_IS_VML;\r
+                               that[ '_flags' ] |= X_NodeFlags_IS_VML;\r
                        };\r
                        return;\r
                \r
index aad360f..b7f8ce9 100644 (file)
@@ -1174,10 +1174,20 @@ function X_Node_text( text ){
  * @example node.call( 'focus' );
  */
 function X_Node_call( name /*, opt_args... */ ){
-       var l = arguments.length - 1,
-               v, raw, func, args, params, i;
+       var args = arguments,
+               l    = args.length - 1,
+               v, raw, parent, body,
+               childX, childY, childW, childH,
+               parentW, parentH,
+               parentSX, parentSY, parentSW, parentSH,
+               visibleX, visibleY, visibleW, visibleH,
+               visiblePartX, visiblePartY, func, args, params, i;
 
        switch( name ){
+               case 'isSVG' :
+                       return !!( this[ '_flags' ] & X_NodeFlags_IS_SVG );
+               case 'isVML' :
+                       return !!( this[ '_flags' ] & X_NodeFlags_IS_VML );
                case 'nodeType' :
                        return this[ '_tag' ] ? 1 : 3;
                case 'outerHTML' :
@@ -1196,28 +1206,79 @@ function X_Node_call( name /*, opt_args... */ ){
        X_Node_updateTimerID && X_Node_startUpdate();
        
        raw  = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );
+       
        if( !raw ) return;
        
        if( name === 'scrollTo' ){
-               raw.scrollLeft = arguments[ 1 ] || 0;
-               raw.scrollTop  = arguments[ 2 ] || 0;
+               raw.scrollLeft = args[ 1 ] || 0;
+               raw.scrollTop  = args[ 2 ] || 0;
                return;
        };
        
+       if( name === 'inView' ){
+               body   = document.body;
+               child  = raw;
+               visibleX = visibleY = visibleW = visibleH = 0;
+               while( child !== body ){
+                       parent   = child.parentNode || child.parentElement;
+                       parentH  = parent.clientHeight;
+                       parentW  = parent.clientWidth;
+                       parentSW = parent.scrollHeight;
+                       parentSH = parent.scrollWidth;
+                       // 親がスクロール領域を持つ
+                       if( parentH < parentSH || parentW < parentSW ){
+                               childX   = child.offsetLeft + visibleX;
+                               childY   = child.offsetTop  + visibleY;
+                               childW   = visibleW || child.offsetWidth;
+                               childH   = visibleH || child.offsetHeight;
+                               parentSX = parent.scrollLeft;
+                               parentSY = parent.scrollTop;
+                               // 子が表示領域内
+                               if( parentSY < childY   + childH &&
+                           childY   < parentSY + parentH &&
+                           parentSX < childX   + childW  &&
+                           childX   < parentSX + parentW ){
+                               
+                           // right:子の左側が見えている left:子の左側が見えている both:完全に見えている
+                                       visiblePartX =
+                                               childX < parentSX ? 'right' :
+                                               ( parentSX + parentW ) < ( childX + childW ) ? 'left' : 'both';
+                                       visiblePartY = 
+                                               childY < parentSY ? 'bottom' :
+                                               ( parentSY + parentH ) < ( childY + childH ) ? 'top' : 'both';
+
+                                       // 子が見える領域
+                                       visibleX = visiblePartX === 'right'  ? 0 : childX - parentSX;
+                                       visibleY = visiblePartX === 'bottom' ? 0 : childY - parentSY;
+                                       visibleW =
+                                               visiblePartX === 'both'   ? childW :
+                                               visiblePartX === 'right'  ? ( parentSX + parentW - childX ) : ( childX + childW - parentSX );
+                                       visibleH =
+                                               visiblePartY === 'both'   ? childH :
+                                               visiblePartY === 'bottom' ? ( parentSY + parentH - childY ) : ( childY + childH - parentSY );           
+                   } else {
+                       return { 'isInView' : false };
+                   };
+                       };
+                       child = parent;         
+               };
+               return { 'isInView' : true };
+       };
+       
        func = raw[ name ];
        if( X_Type_isFunction( func ) ){
                if( l ){
-                       args = X_Array_copy( arguments );
+                       args = X_Array_copy( args );
                        args.shift();
                        return func.apply( raw, args );
                };
                return raw[ name ]();           
        } else
-       if( X_Type_isUnknown( func ) || ( X_UA[ 'IE' ] < 9 && X_Type_isObject( func ) ) ){
+       if( X_UA[ 'IE' ] < 9 && ( X_Type_isUnknown( func ) || X_Type_isObject( func ) ) ){
                // typeof func === unknown に対策
                // http://la.ma.la/blog/diary_200509031529.htm          
                if( l ){
-                       args = X_Array_copy( arguments );
+                       args = X_Array_copy( args );
                        args.shift();
                        
                params = [];
@@ -1412,7 +1473,7 @@ var X_Node__commitUpdate =
                                                        '>' ].join( '' ) );
                                } else {
                                        if( that[ '_flags' ] & X_NodeFlags_IS_SVG ){
-                                               that[ '_rawObject' ] = elm = document.createElementNS( 'http://www.w3.org/2000/svg', that[ '_tag' ] );
+                                               that[ '_rawObject' ] = elm = document.createElementNS( 'http://www.w3.org/2000/svg', that[ '_tag' ].toLowerCase() );
                                        } else {
                                                that[ '_rawObject' ] = elm = document.createElement( that[ '_tag' ] );
                                        };
@@ -1619,11 +1680,21 @@ var X_Node__updateRawNode =
                        };
                        // id
                        if( that[ '_flags' ] & X_NodeFlags_DIRTY_ID ){
-                               that[ '_id' ] ? ( elm.id = that[ '_id' ] ) : ( elm.id && elm.removeAttribute( 'id' ) );         
+                               that[ '_id' ] ?
+                                       ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ?
+                                               elm.setAttribute( 'id', that[ '_id' ] ) :
+                                               ( elm.id = that[ '_id' ] )
+                                       ) :
+                                       ( elm.id && elm.removeAttribute( 'id' ) );              
                        };
                        // className
                        if( that[ '_flags' ] & X_NodeFlags_DIRTY_CLASSNAME ){
-                               that[ '_className' ] ? ( elm.className = that[ '_className' ] ) : ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7-                   
+                               that[ '_className' ] ?
+                                       ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ?
+                                               elm.setAttribute( 'class', that[ '_className' ] ) :
+                                               ( elm.className = that[ '_className' ] )
+                                       ) :
+                                       ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7-                     
                        };
                        
                        // attr
@@ -1665,7 +1736,10 @@ var X_Node__updateRawNode =
                                        // TODO IE では input, なぜか button, object も type, name の変更が出来ない、同値で置き換えようとしても不可
                                        v === undefined ?
                                                elm.removeAttribute( rename[ k ] || k ) :
-                                               ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v );
+                                       ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ?
+                                               elm.setAttribute( k, v ) :
+                                               ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v )
+                                       );
                                };
                                delete that[ '_newAttrs' ];
                        };
index 6ef1908..39e2b0c 100644 (file)
@@ -315,7 +315,7 @@ function XMLWrapper_val( queryString, type ){
 \r
                                                for( i = 0, n = -1, l = xmlList.length; i < l; ++i ){\r
                                                        xml  = xmlList[ i ];\r
-                                                       attr = elem.getAttribute( key, 2 );\r
+                                                       attr = xml.getAttribute( key, 2 );\r
                                                        flag = attr != null;// && ( !useName || attr !== '' );\r
                                                        if( flag && op ){\r
                                                                //if( toLower ) attr = attr.toLowerCase();\r
index d69d68a..af64b4d 100644 (file)
@@ -299,8 +299,11 @@ function X_NET_shiftQueue(){
                X_NET_currentQueue = X_NET_currentWrapper = X_NET_currentData = null;\r
        };\r
        \r
+       console.log( '■■------------ X_NET_shiftQueue ' + X_NET_QUEUE_LIST.length );\r
+       \r
        if( !X_NET_QUEUE_LIST.length ) return;\r
 \r
+\r
        X_NET_currentQueue = X_NET_QUEUE_LIST.shift();\r
        X_NET_currentData  = X_Pair_get( X_NET_currentQueue );\r
        \r
index c7d95d5..63174a4 100644 (file)
@@ -65,6 +65,8 @@ X_TEMP.X_NET_Image_params = {
                },\r
                \r
                reset : function(){\r
+                       console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID );\r
+                       \r
                        this.timerID && X_Timer_remove( this.timerID );\r
                        //X_Net_Image_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' );\r
                        this[ '_rawObject' ].src = '';\r
@@ -82,6 +84,7 @@ function X_NET_Image_detect(){
        if( raw && raw.complete ){\r
                this._busy  = false;\r
                this.finish = true;\r
+               console.log( 'X.Net.Image:detect ' + raw.width );\r
                if( raw.width ) return;\r
                X_Timer_remove( this.timerID );\r
                this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
@@ -97,6 +100,8 @@ function X_NET_Image_detect(){
 function X_NET_Image_handleEvent( e ){\r
        var size;\r
        \r
+       console.log( 'X.Net.Image:handleEvent ' + e.type );\r
+       \r
        switch( e.type ){\r
                case 'error' :\r
                //case 'abort' : // TODO ??\r
index f1bc2bd..08eb781 100644 (file)
@@ -2,6 +2,8 @@
 var X_Audio_WebAudio_context = !X_UA[ 'iPhone_4s' ]  && !X_UA[ 'iPad_2Mini1' ]  && !X_UA[ 'iPod_4' ]  &&
                                                                // TODO なんで fennec を禁止?
                                                                !( X_UA[ 'Gecko' ] && X_UA[ 'Android' ] ) &&
+                                                               // Firefox40.0.5 + Windows8 で音声が鳴らない
+                                                               !( X_UA[ 'Gecko' ] === 40 && X_UA[ 'Windows' ] ) &&
                                                                ( window[ 'AudioContext' ] || window[ 'webkitAudioContext' ] ),
        X_Audio_BUFFER_LIST      = [],
        X_Audio_WebAudioWrapper,
@@ -292,8 +294,8 @@ if( X_Audio_WebAudio_context ){
                                        if( time < 0 ) return;
                                } else {
                                        if( time < 0 ){
-                                               console.log( '> onEnd crt:' + ( X_Audio_WebAudio_context.currentTime * 1000 ) + ' startTime:' + this._startTime +
-                                                       ' from:' + this._startPos + ' to:' + this._endPosition );
+                                               //console.log( '> onEnd crt:' + ( X_Audio_WebAudio_context.currentTime * 1000 ) + ' startTime:' + this._startTime +
+                                               //      ' from:' + this._startPos + ' to:' + this._endPosition );
                                                this._timerID = X_Timer_once( -time, this, this._onEnded );
                                                return;
                                        };
index dd71bde..0a8060d 100644 (file)
@@ -12,7 +12,6 @@ var X_Audio_HTMLAudio_playTrigger =
                // Android 2.3.5(SBM101SH) では stalled は発生しない,,, ので必ず loadeddata もチェックする\r
                X_UA[ 'AndroidBrowser' ] ? 'stalled' :\r
                X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ? 'loadeddata' :\r
-               //X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ? 'canplay' :\r
                        'loadeddata', //'canplay',\r
        X_Audio_HTMLAudioWrapper,\r
        X_Audio_constructor = window[ 'Audio' ] || window.HTMLAudioElement,\r
@@ -20,7 +19,7 @@ var X_Audio_HTMLAudio_playTrigger =
        // onended イベント時に再生を継続する場合、audio.play() を呼ぶ必要がある\r
        X_Audio_HTMLAudioWrapper_needPlayOnended = !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser' ],\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
+       X_Audio_HTMLAudioWrapper_currentTimeFix  = !!X_UA[ 'OperaMobile' ] || !!X_UA[ 'OperaTablet' ],\r
        // Android1.6+MobileOpera12では無理っぽい、、、\r
        X_Audio_HTMLAudioWrapper_badOperaAndroid = X_Audio_HTMLAudioWrapper_currentTimeFix && X_UA[ 'Android' ] < 2,\r
 \r
@@ -298,7 +297,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                    if( this.playing ){\r
                                        end = X_AudioWrapper_getEndTime( this ) + this.shortPlayFix;\r
                                        now = this.getActualCurrentTime();\r
-                                       console.log( now + ' / ' + end );\r
+                                       //console.log( now + ' / ' + end );\r
                                        if( 0 + end <= 0 + now ){ // 0+ なぜか iem9 で必要,,,\r
                                                if( this.autoLoop ){\r
                                                        if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){\r
@@ -373,7 +372,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                };\r
                                \r
                                if( !loaded && type ){\r
-                                       console.log( '(2) ' + e.type + ' d:' + ( this.duration | 0 ) );\r
+                                       // console.log( '(2) ' + e.type + ' d:' + ( this.duration | 0 ) );\r
                                        this.target[ 'dispatch' ]( type );\r
                                        type === X_EVENT_ERROR && this[ 'kill' ]();\r
                                };\r
@@ -448,6 +447,8 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                        actualPause : function(){\r
                                if( !this.playing ) return;\r
                                \r
+                               console.log( '[HTMLAudio] pause' );\r
+                               \r
                                this.seekTime = this.getActualCurrentTime();\r
 \r
                                delete this._playTime;\r
index 53f5ed0..0aa4206 100644 (file)
@@ -11,8 +11,8 @@ var X_Audio_Sprite_shouldUse        = window.HTMLAudioElement && ( X_UA[ 'iOS' ]
                                                                          false, //X_UA[ 'AndroidChromeBrowser' ],\r
        X_Audio_Sprite_needTouchAndroid = X_UA[ 'AndroidChromeBrowser' ] && !X_Audio_WebAudioWrapper,\r
        X_Audio_Sprite_needTouchFirst   = X_UA[ 'iOS' ] || X_Audio_Sprite_needTouchAndroid || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
-       X_Audio_Sprite_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) || ( !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\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_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) || ( !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 12 ),\r
+       X_Audio_Sprite_enableVolume     = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上\r
        // http://tukumemo.com/html5-audio-sp/\r
        // iOS6、Android4.1から同時再生が可能になりました。\r
        X_Audio_Sprite_maxTracks        = X_Audio_Sprite_useVideoForMulti ? 2 : X_Audio_Sprite_disableMultiTrack ? 1 : 9,\r
@@ -256,11 +256,12 @@ X_Audio_Sprite_members = {
                \r
                'seek' : function( uid, position ){\r
                        var track = X_Audio_Sprite_TEMP.tracks[ uid ],\r
-                               end;\r
+                               end, strat;\r
                        if( track ){\r
                                delete track.seekTime;\r
-                               end = X_AudioWrapper_getEndTime( track );\r
-                               position <= end && X_AudioWrapper_getStartTime( track, end ) <= position && track.seek( postion );\r
+                               end   = X_AudioWrapper_getEndTime( track );\r
+                               start = X_AudioWrapper_getStartTime( track, end );\r
+                               0 <= position && position <= ( end - start ) && track.seek( start + position );\r
                        };\r
                        return this;\r
                },\r
@@ -321,7 +322,7 @@ function X_AudioSprite_backendHandler( e ){
                        this[ 'source' ]      = src = e[ 'source' ];\r
                        this[ 'backendName' ] = name = backend.backendName;\r
                \r
-                       console.log( i + ' / ' + X_Audio_Sprite_numTracks );\r
+                       //console.log( i + ' / ' + X_Audio_Sprite_numTracks );\r
                \r
                        for( i = 0; i < X_Audio_Sprite_numTracks; ++i ){\r
                                if( X_Audio_Sprite_useVideo || ( i === 1 && X_Audio_Sprite_useVideoForMulti ) ){\r
@@ -332,8 +333,8 @@ function X_AudioSprite_backendHandler( e ){
                                X_Audio_Sprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option ) );\r
                                \r
                                \r
-                               console.dir( backend );\r
-                               console.dir( last );\r
+                               //console.dir( backend );\r
+                               //console.dir( last );\r
                        };\r
 \r
                        _e = {\r