OSDN Git Service

Version 0.6.155, fix X.Callback.STOP_NOW, working X.Audio @iem9.
authoritozyun <itozyun@user.sourceforge.jp>
Mon, 25 May 2015 13:09:38 +0000 (22:09 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Mon, 25 May 2015 13:09:38 +0000 (22:09 +0900)
0.6.x/js/01_core/01_X.js
0.6.x/js/01_core/03_XType.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/05_util/04_XXML.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/07_audio/02_XHTMLAudio.js
0.6.x/js/07_audio/10_XAudioSprite.js
0.6.x/js/20_ui/11_VBox.js

index 2b20721..98e7f4c 100644 (file)
@@ -60,18 +60,20 @@ function X( v ){
 };\r
 \r
 //{+DEV\r
-if( !window['console'] || ( window.parent && window.parent.log ) )\r
+if( !window['console'] || ( window.parent && window.parent.log ) ){\r
        console = {\r
                log : function(a){\r
-                               var win, elm;\r
+                               var elm;\r
                                //alert(a);\r
                                if( window.parent ){\r
                                        elm = parent.document.all ? parent.document.all.log : parent.log || parent.document.getElementById( 'log' );\r
                                        elm && ( elm.innerHTML = a + '<br>' + elm.innerHTML );\r
                                };\r
-                       },\r
-               dir : function(){}\r
-       };\r
+                       }\r
+       };      \r
+};\r
+\r
+if( !console.dir ) console.dir = function(){};\r
 //+DEV}\r
 \r
 //{-AUDIO\r
index ed024ae..84bca3d 100644 (file)
@@ -102,7 +102,7 @@ X[ 'Type' ] = {
         * @alias X.Type.isFinite\r
         */\r
        function X_Type_isFinite( v ){\r
-               return typeof v === 'number' && isFinite( v );\r
+               return v + 0 === v && isFinite( v );\r
        };\r
        /**\r
         * NaN か?判定する。isNaN( 'NaN' ) === true に対策済。\r
index f798c2a..9fa9c80 100644 (file)
@@ -68,8 +68,8 @@ var X_EventDispatcher_once       = false,
  * <ol>\r
  * <li>as3 の EventDispatcher ライクなクラス。そのまま使ったり、継承したり。\r
  * <li>_rawObject メンバがいる場合、addEventListener, attachEvent, on 等で生のブラウザオブジェクトにリスナを登録する。\r
- *     window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject\r
- * <li>イベントディスパッチにリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。\r
+ *     window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject になる。\r
+ * <li>イベントディスパッチにリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。\r
  * </ol>\r
  * \r
  * <blockquot>\r
@@ -94,7 +94,7 @@ var X_EventDispatcher_once       = false,
  * \r
  * <p>またコールバックに対して、this コンテキストや、追加の引数を指定もできます。 this コンテキストを指定しなかった場合、EventDispatcher インスタンスがコールバックの this になります。 \r
  * \r
- * <p>unlisten() ã\81¯ã\80\81å¼\95æ\95°ã\82\92æ\8c\87å®\9aã\81\97ã\81ªã\81\8bã\81£ã\81\9få ´å\90\88ã\80\81å\85¨ã\81¦ã\81®ã\82¤ã\83\99ã\83³ã\83\88ã\82\92解é\99¤ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9fã\81 ã\81\97ã\80\81systemListen 経由で登録されたハンドラは解除されません。\r
+ * <p>unlisten() ã\81§ã\81¯ systemListen 経由で登録されたハンドラは解除されません。\r
  * \r
  * systemListen, systemUnlisten は、ライブラリ内のコードからしかアクセスできません。\r
  * \r
@@ -119,8 +119,8 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                        '_rawType'      : X_EventDispatcher_EVENT_TARGET_OTHER,\r
                \r
                /**\r
-                * イベントリスナをイベント名文字列や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。<br>\r
-                * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
+                * イベントリスナをイベント名文字列や数値(5以上、フレームワーク内で定義)をキーとするArrayで記憶します。<br>\r
+                * Arrayには、{kind:種類,context:コンテキスト(thisObject),func:コールバック関数,supplement:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
                 * \r
                 * @private\r
                 * @type {__X_EventDispatcher_Listeners__}\r
@@ -172,13 +172,13 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
 \r
                /**\r
                 * <p>イベントリスナの登録状況を真偽値で返す。戻り値が数値(index)の場合もあるが、これは内部のみで使用。\r
-                * <p>this[ 'listening' ](); のように type を省略した場合、一つでも登録があれば true を返す。\r
-                * <p>this[ 'listening' ]( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。\r
+                * <p>this.listening(); のように type を省略した場合、一つでも登録があれば true を返す。\r
+                * <p>this.listening( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。\r
                 * <p>type と イベントリスナの組み合わせが登録されているかを調べる場合は、listen 時の thisObject や args(Array) も一致させて渡す必要がある。\r
                 * \r
                 * @example \r
-                *  this[ 'listen' ]( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] );\r
-                *  this[ 'listening' ]( 'myevent', this, onMyEvent, args ) === true;\r
+                *  this.listen( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] );\r
+                *  this.listening( 'myevent', this, onMyEvent, args ) === true;\r
                 * \r
                 * @return {number|boolean}\r
                 * @param {string|number} opt_type\r
@@ -222,7 +222,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                 * kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。インスタンスが破棄された後にタイマーが呼ばれることがないので神経質にならなくても安全に使える。\r
                 * @example this[ 'asyncDispatch' ]( 'myevent' );\r
                 * // どちらのコードも同じ動作をする。\r
-                * this[ 'asyncDispatch' ]( 0, 'myevent' );\r
+                * this.asyncDispatch( 0, 'myevent' );\r
                 * @param {number|eventHash|string} delay ms 省略した場合は 0 として扱う asyncDispatch( 'myevent' ) -> asyncDispatch( 0, 'myevent' )\r
                 * @param {eventHash|string|number} e イベントを表す数値、文字列、{ type : XXX, ... } なオブジェクト\r
                 * @return {number} X.Timer.add() の戻り値\r
@@ -259,7 +259,7 @@ function X_EventDispatcher_dispatch( e ){
                type      = e[ 'type' ],\r
                list, unlistens, i, l, args, f, r, sysOnly, timerID;\r
        \r
-       if( !listeners || !( list = listeners[ type || e ] ) ) return ret;\r
+       if( !listeners || !( list = listeners[ type || e ] ) ) return X_Callback_NONE;\r
        \r
        // 数値, 文字が渡された場合\r
        if( !type ){\r
@@ -286,7 +286,7 @@ function X_EventDispatcher_dispatch( e ){
                };\r
                if( unlistens && unlistens.indexOf( f ) !== -1 ) continue;\r
                \r
-               r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) );\r
+               r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) ) || 0;\r
                \r
                if( f.once || r & X_Callback_UN_LISTEN ){\r
                        // dispatch 中に unlisten が作られることがある\r
@@ -298,10 +298,10 @@ function X_EventDispatcher_dispatch( e ){
                };\r
                ret |= X_Type_isFinite( r ) ? r : 0;\r
                \r
-               if( r & X_Callback_STOP_NOW === X_Callback_STOP_NOW ){\r
+               if( ( r & X_Callback_STOP_NOW ) === X_Callback_STOP_NOW ){ // iOS では ( & ) 括弧が無いと判定を誤る\r
                        sysOnly = true;\r
                        break;\r
-               };              \r
+               };\r
        };\r
        \r
        if( ( --listeners[ X_LISTENERS_DISPATCHING ] ) === 0 ){\r
index 696606c..18a71f2 100644 (file)
@@ -14,11 +14,11 @@ function XMLWrapper( xml ){
        this._rawXML = xml;\r
 };\r
 \r
-XMLWrapper.prototype.length = 1;\r
-XMLWrapper.prototype.has    = XMLWrapper_has;\r
-XMLWrapper.prototype.get    = XMLWrapper_get;\r
-XMLWrapper.prototype.val    = XMLWrapper_val;\r
-XMLWrapper.prototype.find   = XMLWrapper_find;\r
+XMLWrapper.prototype.length    = 1;\r
+XMLWrapper.prototype[ 'has' ]  = XMLWrapper_has;\r
+XMLWrapper.prototype[ 'get' ]  = XMLWrapper_get;\r
+XMLWrapper.prototype[ 'val' ]  = XMLWrapper_val;\r
+XMLWrapper.prototype[ 'find' ] = XMLWrapper_find;\r
 \r
 function XMLWrapper_has( queryString ){\r
        return !!this.find( queryString ).length;\r
@@ -567,9 +567,9 @@ function XMLListWrapper( xmlList ){
 \r
 var XMLListWrapper_0 = new XMLListWrapper();\r
 \r
-XMLListWrapper.prototype.length = 0;\r
-XMLListWrapper.prototype._wraps = null;\r
-XMLListWrapper.prototype.has    = XMLWrapper_has;\r
-XMLListWrapper.prototype.get    = XMLWrapper_get;\r
-XMLListWrapper.prototype.val    = XMLWrapper_val;\r
-XMLListWrapper.prototype.find   = XMLWrapper_find;\r
+XMLListWrapper.prototype.length    = 0;\r
+XMLListWrapper.prototype._wraps    = null;\r
+XMLListWrapper.prototype[ 'has' ]  = XMLWrapper_has;\r
+XMLListWrapper.prototype[ 'get' ]  = XMLWrapper_get;\r
+XMLListWrapper.prototype[ 'val' ]  = XMLWrapper_val;\r
+XMLListWrapper.prototype[ 'find' ] = XMLWrapper_find;\r
index 30a3034..cc402b0 100644 (file)
@@ -41,7 +41,8 @@
  * <dt>dataType<dd>'text', 'json', 'xml', 'blob', 'arraybuffer' 等。xhr.responseType に指定する値\r
  * <dt>mimeType<dd>'text/xml', 'audio/mpeg' 等。xhr.overrideMimeType する値\r
  * <dt>auth<dd>X.OAuth2 インスタンス(OAuth2 サービスの定義)\r
- * <dt>getFullHeaders<dd>getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。\r
+ * <dt>getFullHeaders<dd>getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。XDR は Content-Type しか取得でいない。\r
+ * <dt>canUse<dd>未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている\r
  * </dl>\r
  * \r
  * @alias X.Net\r
index c1258a3..a87c67c 100644 (file)
@@ -8,9 +8,11 @@ var X_Audio_HTMLAudio_playTrigger =
                6 <= X_UA[ 'iOS' ] ? 'loadeddata' :\r
                X_UA[ 'iOS' ] < 5  ? 'stalled' :\r
                X_UA[ 'iOS' ]      ? 'suspend' :\r
-               X_UA[ 'AndroidBrowser2' ] ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,,\r
+               X_UA[ 'AndroidBrowser2' ] || X_UA[ 'AndroidBrowser3' ] ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,,\r
                X_UA[ 'AndroidBrowser4' ] ? 'loadeddata' : \r
-               X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ? 'loadeddata' : 'loadeddata', //'canplay',\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
        X_Audio_rawAudio,\r
@@ -164,7 +166,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                \r
                                X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( e.type );\r
                                \r
-                               //console.log( e.type );\r
+                               X_Audio_HTMLAudioWrapper_ieMobile9Fix && e.type !== 'timeupdate' && console.log( e.type );\r
                                \r
                                switch( e.type ){\r
                                        case 'loadstart' :      //      ブラウザがコンテンツの検索を開始した場合に発生\r
@@ -264,7 +266,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                    if( this.playing ){\r
                                        end = X_AudioWrapper_getEndTime( this );\r
                                        now = this.getActualCurrentTime();\r
-                                       //console.log( end + ' / ' + now );\r
+                                       console.log( end + ' / ' + now );\r
                                        if( 0 + end <= 0 + now ){ // なぜか iem9 で必要,,,\r
                                                if( this.autoLoop ){\r
                                                        if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_Callback_PREVENT_DEFAULT ) ){\r
@@ -347,11 +349,11 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                \r
                                // もし kill 後に autoplayTimer で呼ばれても、_closed==true なので平気\r
                                if( this._closed ) return;\r
-                               if( !this._loaded /* && !X_Audio_Sprite_inTouchAction */ ){\r
+                               if( !this._loaded && !X_Audio_HTMLAudioWrapper_ieMobile9Fix /* && !X_Audio_Sprite_inTouchAction */ ){\r
                        this.autoplay = true;\r
                        return;\r
                                };\r
-\r
+                               \r
                                if( X_Audio_HTMLAudioWrapper_ieMobile9Fix && this._playForDuration === 0 ){\r
                                        console.log( 'DurationFix開始 - ' + this[ '_rawObject' ].duration );\r
                                        this._playForDuration = 1;\r
@@ -377,7 +379,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                        X_Timer_once( 0, this, this._fixForChrome );\r
                                        this[ '_rawObject' ].volume = 0;\r
                                    } else {\r
-                                       this[ '_rawObject' ].volume = this.gain;\r
+                                       this[ '_rawObject' ].volume = X_Audio_HTMLAudioWrapper_ieMobile9Fix ? 1 : this.gain;\r
                                    };\r
                                this[ '_rawObject' ].play();\r
                                this.playing = true;\r
@@ -438,7 +440,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                        this.actualPlay();\r
                                } else\r
                                if( result & 4 ){\r
-                      this[ '_rawObject' ].volume = this.gain;\r
+                      this[ '_rawObject' ].volume = X_Audio_HTMLAudioWrapper_ieMobile9Fix ? 1 : this.gain;\r
                                };                              \r
                        }\r
        \r
index d6a40b6..1ff87f6 100644 (file)
@@ -8,7 +8,7 @@ var X_Audio_Sprite_shouldUse        = window.HTMLAudioElement && ( X_UA[ 'iOS' ]
        X_Audio_Sprite_useVideoForMulti = 4 <= X_UA[ 'AndroidBrowser' ] && 534.3 < X_UA[ 'AndroidWebkit' ], // ドスパラパッドはビデオのインライン再生が不可 \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_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidWebkit' ] <= 534.3 ),\r
+       X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidWebkit' ] <= 534.3 ) && !( 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_maxTracks        = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9,\r
        X_Audio_Sprite_lengthSilence    = 10000, // 一番最初の無音部分の長さ\r
@@ -134,7 +134,7 @@ X_Audio_Sprite_members = {
                                i = 0, l = tracks.length;\r
                        for( ; i < l; ++i ){\r
                                if( X_UA[ 'WinPhone' ] ){\r
-                                       console.log( 'touch -> play()' );\r
+                                       console.log( 'WinPhone : touch -> play()' );\r
                                        //tracks[ i ].play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 );\r
                                        this[ 'pause' ]( i );\r
                                } else {\r
@@ -339,13 +339,11 @@ function X_AudioSprite_backendHandler( e ){
                        };\r
                        \r
                        return X_Callback_STOP_NOW;\r
-                       break;\r
 \r
                case X_EVENT_BACKEND_NONE :\r
                        this[ 'unlisten' ]( X_EVENT_BACKEND_READY, this, X_AudioSprite_backendHandler )\r
                                [ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );\r
                        return X_Callback_STOP_NOW;\r
-                       break;\r
                \r
                case X_EVENT_READY :\r
                        console.log( 'X.AudioSprite - Ready!' );\r
index 298565f..9c81e5a 100644 (file)
@@ -53,7 +53,7 @@ var XUI_Layout_Vertical = X[ 'UI' ][ 'Layout' ][ 'Vertical' ] = XUI_createLayout
                                node = uinodes[ i ];\r
                                node.calculate( detectionPhase, 0, _y, contentW, childH );\r
                                _y += node.boxHeight + gapY;\r
-                               console.dir( node );\r
+                               //console.dir( node );\r
                                // 概算のみ\r
                                if( autoW ){\r
                                        if( node.boxWidth !== XUI_Attr_AUTO ){\r