From 6002fdac540134f01738f95246c0ea66302bd702 Mon Sep 17 00:00:00 2001 From: itozyun Date: Mon, 25 May 2015 22:09:38 +0900 Subject: [PATCH] Version 0.6.155, fix X.Callback.STOP_NOW, working X.Audio @iem9. --- 0.6.x/js/01_core/01_X.js | 12 +++++++----- 0.6.x/js/01_core/03_XType.js | 2 +- 0.6.x/js/01_core/13_XEventDispatcher.js | 28 ++++++++++++++-------------- 0.6.x/js/05_util/04_XXML.js | 22 +++++++++++----------- 0.6.x/js/06_net/00_XNet.js | 3 ++- 0.6.x/js/07_audio/02_XHTMLAudio.js | 18 ++++++++++-------- 0.6.x/js/07_audio/10_XAudioSprite.js | 6 ++---- 0.6.x/js/20_ui/11_VBox.js | 2 +- 8 files changed, 48 insertions(+), 45 deletions(-) diff --git a/0.6.x/js/01_core/01_X.js b/0.6.x/js/01_core/01_X.js index 2b20721..98e7f4c 100644 --- a/0.6.x/js/01_core/01_X.js +++ b/0.6.x/js/01_core/01_X.js @@ -60,18 +60,20 @@ function X( v ){ }; //{+DEV -if( !window['console'] || ( window.parent && window.parent.log ) ) +if( !window['console'] || ( window.parent && window.parent.log ) ){ console = { log : function(a){ - var win, elm; + var elm; //alert(a); if( window.parent ){ elm = parent.document.all ? parent.document.all.log : parent.log || parent.document.getElementById( 'log' ); elm && ( elm.innerHTML = a + '
' + elm.innerHTML ); }; - }, - dir : function(){} - }; + } + }; +}; + +if( !console.dir ) console.dir = function(){}; //+DEV} //{-AUDIO diff --git a/0.6.x/js/01_core/03_XType.js b/0.6.x/js/01_core/03_XType.js index ed024ae..84bca3d 100644 --- a/0.6.x/js/01_core/03_XType.js +++ b/0.6.x/js/01_core/03_XType.js @@ -102,7 +102,7 @@ X[ 'Type' ] = { * @alias X.Type.isFinite */ function X_Type_isFinite( v ){ - return typeof v === 'number' && isFinite( v ); + return v + 0 === v && isFinite( v ); }; /** * NaN か?判定する。isNaN( 'NaN' ) === true に対策済。 diff --git a/0.6.x/js/01_core/13_XEventDispatcher.js b/0.6.x/js/01_core/13_XEventDispatcher.js index f798c2a..9fa9c80 100644 --- a/0.6.x/js/01_core/13_XEventDispatcher.js +++ b/0.6.x/js/01_core/13_XEventDispatcher.js @@ -68,8 +68,8 @@ var X_EventDispatcher_once = false, *
    *
  1. as3 の EventDispatcher ライクなクラス。そのまま使ったり、継承したり。 *
  2. _rawObject メンバがいる場合、addEventListener, attachEvent, on 等で生のブラウザオブジェクトにリスナを登録する。 - * window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject - *
  3. イベントディスパッチにリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。 + * window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject になる。 + *
  4. イベントディスパッチ中にリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。 *
* * @@ -94,7 +94,7 @@ var X_EventDispatcher_once = false, * *

またコールバックに対して、this コンテキストや、追加の引数を指定もできます。 this コンテキストを指定しなかった場合、EventDispatcher インスタンスがコールバックの this になります。 * - *

unlisten() は、引数を指定しなかった場合、全てのイベントを解除します。ただし、systemListen 経由で登録されたハンドラは解除されません。 + *

unlisten() では systemListen 経由で登録されたハンドラは解除されません。 * * systemListen, systemUnlisten は、ライブラリ内のコードからしかアクセスできません。 * @@ -119,8 +119,8 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] = '_rawType' : X_EventDispatcher_EVENT_TARGET_OTHER, /** - * イベントリスナをイベント名文字列や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。
- * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。 + * イベントリスナをイベント名文字列や数値(5以上、フレームワーク内で定義)をキーとするArrayで記憶します。
+ * Arrayには、{kind:種類,context:コンテキスト(thisObject),func:コールバック関数,supplement:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。 * * @private * @type {__X_EventDispatcher_Listeners__} @@ -172,13 +172,13 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] = /** *

イベントリスナの登録状況を真偽値で返す。戻り値が数値(index)の場合もあるが、これは内部のみで使用。 - *

this[ 'listening' ](); のように type を省略した場合、一つでも登録があれば true を返す。 - *

this[ 'listening' ]( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。 + *

this.listening(); のように type を省略した場合、一つでも登録があれば true を返す。 + *

this.listening( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。 *

type と イベントリスナの組み合わせが登録されているかを調べる場合は、listen 時の thisObject や args(Array) も一致させて渡す必要がある。 * * @example - * this[ 'listen' ]( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] ); - * this[ 'listening' ]( 'myevent', this, onMyEvent, args ) === true; + * this.listen( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] ); + * this.listening( 'myevent', this, onMyEvent, args ) === true; * * @return {number|boolean} * @param {string|number} opt_type @@ -222,7 +222,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] = * kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。インスタンスが破棄された後にタイマーが呼ばれることがないので神経質にならなくても安全に使える。 * @example this[ 'asyncDispatch' ]( 'myevent' ); * // どちらのコードも同じ動作をする。 - * this[ 'asyncDispatch' ]( 0, 'myevent' ); + * this.asyncDispatch( 0, 'myevent' ); * @param {number|eventHash|string} delay ms 省略した場合は 0 として扱う asyncDispatch( 'myevent' ) -> asyncDispatch( 0, 'myevent' ) * @param {eventHash|string|number} e イベントを表す数値、文字列、{ type : XXX, ... } なオブジェクト * @return {number} X.Timer.add() の戻り値 @@ -259,7 +259,7 @@ function X_EventDispatcher_dispatch( e ){ type = e[ 'type' ], list, unlistens, i, l, args, f, r, sysOnly, timerID; - if( !listeners || !( list = listeners[ type || e ] ) ) return ret; + if( !listeners || !( list = listeners[ type || e ] ) ) return X_Callback_NONE; // 数値, 文字が渡された場合 if( !type ){ @@ -286,7 +286,7 @@ function X_EventDispatcher_dispatch( e ){ }; if( unlistens && unlistens.indexOf( f ) !== -1 ) continue; - r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) ); + r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) ) || 0; if( f.once || r & X_Callback_UN_LISTEN ){ // dispatch 中に unlisten が作られることがある @@ -298,10 +298,10 @@ function X_EventDispatcher_dispatch( e ){ }; ret |= X_Type_isFinite( r ) ? r : 0; - if( r & X_Callback_STOP_NOW === X_Callback_STOP_NOW ){ + if( ( r & X_Callback_STOP_NOW ) === X_Callback_STOP_NOW ){ // iOS では ( & ) 括弧が無いと判定を誤る sysOnly = true; break; - }; + }; }; if( ( --listeners[ X_LISTENERS_DISPATCHING ] ) === 0 ){ diff --git a/0.6.x/js/05_util/04_XXML.js b/0.6.x/js/05_util/04_XXML.js index 696606c..18a71f2 100644 --- a/0.6.x/js/05_util/04_XXML.js +++ b/0.6.x/js/05_util/04_XXML.js @@ -14,11 +14,11 @@ function XMLWrapper( xml ){ this._rawXML = xml; }; -XMLWrapper.prototype.length = 1; -XMLWrapper.prototype.has = XMLWrapper_has; -XMLWrapper.prototype.get = XMLWrapper_get; -XMLWrapper.prototype.val = XMLWrapper_val; -XMLWrapper.prototype.find = XMLWrapper_find; +XMLWrapper.prototype.length = 1; +XMLWrapper.prototype[ 'has' ] = XMLWrapper_has; +XMLWrapper.prototype[ 'get' ] = XMLWrapper_get; +XMLWrapper.prototype[ 'val' ] = XMLWrapper_val; +XMLWrapper.prototype[ 'find' ] = XMLWrapper_find; function XMLWrapper_has( queryString ){ return !!this.find( queryString ).length; @@ -567,9 +567,9 @@ function XMLListWrapper( xmlList ){ var XMLListWrapper_0 = new XMLListWrapper(); -XMLListWrapper.prototype.length = 0; -XMLListWrapper.prototype._wraps = null; -XMLListWrapper.prototype.has = XMLWrapper_has; -XMLListWrapper.prototype.get = XMLWrapper_get; -XMLListWrapper.prototype.val = XMLWrapper_val; -XMLListWrapper.prototype.find = XMLWrapper_find; +XMLListWrapper.prototype.length = 0; +XMLListWrapper.prototype._wraps = null; +XMLListWrapper.prototype[ 'has' ] = XMLWrapper_has; +XMLListWrapper.prototype[ 'get' ] = XMLWrapper_get; +XMLListWrapper.prototype[ 'val' ] = XMLWrapper_val; +XMLListWrapper.prototype[ 'find' ] = XMLWrapper_find; diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index 30a3034..cc402b0 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -41,7 +41,8 @@ *

dataType
'text', 'json', 'xml', 'blob', 'arraybuffer' 等。xhr.responseType に指定する値 *
mimeType
'text/xml', 'audio/mpeg' 等。xhr.overrideMimeType する値 *
auth
X.OAuth2 インスタンス(OAuth2 サービスの定義) - *
getFullHeaders
getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。 + *
getFullHeaders
getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。XDR は Content-Type しか取得でいない。 + *
canUse
未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている * * * @alias X.Net diff --git a/0.6.x/js/07_audio/02_XHTMLAudio.js b/0.6.x/js/07_audio/02_XHTMLAudio.js index c1258a3..a87c67c 100644 --- a/0.6.x/js/07_audio/02_XHTMLAudio.js +++ b/0.6.x/js/07_audio/02_XHTMLAudio.js @@ -8,9 +8,11 @@ var X_Audio_HTMLAudio_playTrigger = 6 <= X_UA[ 'iOS' ] ? 'loadeddata' : X_UA[ 'iOS' ] < 5 ? 'stalled' : X_UA[ 'iOS' ] ? 'suspend' : - X_UA[ 'AndroidBrowser2' ] ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,, + X_UA[ 'AndroidBrowser2' ] || X_UA[ 'AndroidBrowser3' ] ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,, X_UA[ 'AndroidBrowser4' ] ? 'loadeddata' : - X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ? 'loadeddata' : 'loadeddata', //'canplay', + X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ? 'loadeddata' : + //X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ? 'canplay' : + 'loadeddata', //'canplay', X_Audio_HTMLAudioWrapper, X_Audio_constructor = window[ 'Audio' ] || window.HTMLAudioElement, X_Audio_rawAudio, @@ -164,7 +166,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( e.type ); - //console.log( e.type ); + X_Audio_HTMLAudioWrapper_ieMobile9Fix && e.type !== 'timeupdate' && console.log( e.type ); switch( e.type ){ case 'loadstart' : // ブラウザがコンテンツの検索を開始した場合に発生 @@ -264,7 +266,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ if( this.playing ){ end = X_AudioWrapper_getEndTime( this ); now = this.getActualCurrentTime(); - //console.log( end + ' / ' + now ); + console.log( end + ' / ' + now ); if( 0 + end <= 0 + now ){ // なぜか iem9 で必要,,, if( this.autoLoop ){ if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_Callback_PREVENT_DEFAULT ) ){ @@ -347,11 +349,11 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ // もし kill 後に autoplayTimer で呼ばれても、_closed==true なので平気 if( this._closed ) return; - if( !this._loaded /* && !X_Audio_Sprite_inTouchAction */ ){ + if( !this._loaded && !X_Audio_HTMLAudioWrapper_ieMobile9Fix /* && !X_Audio_Sprite_inTouchAction */ ){ this.autoplay = true; return; }; - + if( X_Audio_HTMLAudioWrapper_ieMobile9Fix && this._playForDuration === 0 ){ console.log( 'DurationFix開始 - ' + this[ '_rawObject' ].duration ); this._playForDuration = 1; @@ -377,7 +379,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ X_Timer_once( 0, this, this._fixForChrome ); this[ '_rawObject' ].volume = 0; } else { - this[ '_rawObject' ].volume = this.gain; + this[ '_rawObject' ].volume = X_Audio_HTMLAudioWrapper_ieMobile9Fix ? 1 : this.gain; }; this[ '_rawObject' ].play(); this.playing = true; @@ -438,7 +440,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ this.actualPlay(); } else if( result & 4 ){ - this[ '_rawObject' ].volume = this.gain; + this[ '_rawObject' ].volume = X_Audio_HTMLAudioWrapper_ieMobile9Fix ? 1 : this.gain; }; } diff --git a/0.6.x/js/07_audio/10_XAudioSprite.js b/0.6.x/js/07_audio/10_XAudioSprite.js index d6a40b6..1ff87f6 100644 --- a/0.6.x/js/07_audio/10_XAudioSprite.js +++ b/0.6.x/js/07_audio/10_XAudioSprite.js @@ -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' ], // ドスパラパッドはビデオのインライン再生が不可 X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti, X_Audio_Sprite_needTouchFirst = X_UA[ 'iOS' ] || X_Audio_Sprite_needTouchAndroid || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ), - X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidWebkit' ] <= 534.3 ), + 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' ] ), X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上 X_Audio_Sprite_maxTracks = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9, X_Audio_Sprite_lengthSilence = 10000, // 一番最初の無音部分の長さ @@ -134,7 +134,7 @@ X_Audio_Sprite_members = { i = 0, l = tracks.length; for( ; i < l; ++i ){ if( X_UA[ 'WinPhone' ] ){ - console.log( 'touch -> play()' ); + console.log( 'WinPhone : touch -> play()' ); //tracks[ i ].play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 ); this[ 'pause' ]( i ); } else { @@ -339,13 +339,11 @@ function X_AudioSprite_backendHandler( e ){ }; return X_Callback_STOP_NOW; - break; case X_EVENT_BACKEND_NONE : this[ 'unlisten' ]( X_EVENT_BACKEND_READY, this, X_AudioSprite_backendHandler ) [ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE ); return X_Callback_STOP_NOW; - break; case X_EVENT_READY : console.log( 'X.AudioSprite - Ready!' ); diff --git a/0.6.x/js/20_ui/11_VBox.js b/0.6.x/js/20_ui/11_VBox.js index 298565f..9c81e5a 100644 --- a/0.6.x/js/20_ui/11_VBox.js +++ b/0.6.x/js/20_ui/11_VBox.js @@ -53,7 +53,7 @@ var XUI_Layout_Vertical = X[ 'UI' ][ 'Layout' ][ 'Vertical' ] = XUI_createLayout node = uinodes[ i ]; node.calculate( detectionPhase, 0, _y, contentW, childH ); _y += node.boxHeight + gapY; - console.dir( node ); + //console.dir( node ); // 概算のみ if( autoW ){ if( node.boxWidth !== XUI_Attr_AUTO ){ -- 2.11.0