• R/O
  • HTTP
  • SSH
  • HTTPS

clientJs: コミット

クライアント側 js 開発用


コミットメタ情報

リビジョン4e4ab3be10850546063d4a4b93250ed142bb8cd2 (tree)
日時2016-05-13 07:45:05
作者itozyun <itozyun@user...>
コミッターitozyun

ログメッセージ

Version 0.6.217, add #switch for X.Audio.

変更サマリ

差分

--- a/0.6.x/js/01_core/09_XURL.js
+++ b/0.6.x/js/01_core/09_XURL.js
@@ -68,7 +68,11 @@ X[ 'URL' ] = {
6868
6969 'cleanup' : X_URL_cleanup,
7070
71- 'getEXT' : X_URL_getEXT
71+ 'getEXT' : X_URL_getEXT,
72+
73+ 'getSearch' : X_URL_getSearch,
74+
75+ 'getHash' : X_URL_getHash
7276 };
7377
7478 // ------------------------------------------------------------------------- //
@@ -152,6 +156,29 @@ function X_URL_getEXT( path ){
152156 return path.length ? path.pop() : '';
153157 };
154158 /**
159+ * サーチクエリを返します。
160+ * @alias X.URL.getSearch
161+ * @param {string}
162+ * @return {string}
163+ */
164+function X_URL_getSearch( path ){
165+ path = path.split( '#' )[ 0 ].split( '?' );
166+ path.splice( 0, 1 );
167+ return path.join( '?' );
168+}
169+/**
170+ * ハッシュフラグメントを返します。
171+ * @alias X.URL.getHash
172+ * @param {string}
173+ * @return {string}
174+ */
175+function X_URL_getHash( path ){
176+ path = path.split( '#' );
177+ path.splice( 0, 1 );
178+ return path.join( '#' );
179+}
180+
181+/**
155182 * object を url パラメータにします。値が object の場合、データは失われます。
156183 * @alias X.URL.objToParam
157184 * @param {object}
--- a/0.6.x/js/01_core/14_XEvent.js
+++ b/0.6.x/js/01_core/14_XEvent.js
@@ -112,7 +112,7 @@ var // 内部イベント
112112 X_EVENT_MEDIA_ENDED = 46,
113113 X_EVENT_MEDIA_WAITING = 47,
114114 X_EVENT_MEDIA_SEEKING = 48,
115- X_EVENT_MEDIA_TOUCH_FOR_LOAD = 49,
115+ X_EVENT_MEDIA_WAIT_FOR_TOUCH = 49,
116116
117117 X_EVENT_NEED_AUTH = 50,
118118
@@ -228,7 +228,7 @@ X[ 'Event' ] = /** @lends X.Event */
228228 'MEDIA_ENDED' : X_EVENT_MEDIA_ENDED,
229229 'MEDIA_WAITING' : X_EVENT_MEDIA_WAITING,
230230 'MEDIA_SEEKING' : X_EVENT_MEDIA_SEEKING,
231- 'MEDIA_TOUCH_FOR_LOAD' : X_EVENT_MEDIA_TOUCH_FOR_LOAD,
231+ 'MEDIA_WAIT_FOR_TOUCH' : X_EVENT_MEDIA_WAIT_FOR_TOUCH,
232232
233233 'NEED_AUTH' : X_EVENT_NEED_AUTH,
234234
--- a/0.6.x/js/02_dom/30_XTextRange.js
+++ b/0.6.x/js/02_dom/30_XTextRange.js
@@ -131,11 +131,11 @@ function X_TextRange_getRawRange( tr ){
131131 range.selectNodeContents( text ); // selectNodeContents は TextNode のみ?? Firefox
132132 l = text.data.length;
133133
134- for( j = 0, x = tr.v1, y = tr.v2; j < l; ++j ) {
134+ for( j = 0, x = tr.v1, y = tr.v2; j < l; ++j ){
135135 if( range ){
136136 range.setStart( text, j );
137137 range.setEnd( text, j + 1 );
138- rect = range.getBoundingClientRect();
138+ rect = range.getBoundingClientRect();
139139 };
140140 if( rect.left <= x && x <= rect.right && rect.top <= y && y <= rect.bottom ){
141141 return {
@@ -146,7 +146,7 @@ function X_TextRange_getRawRange( tr ){
146146 };
147147 };
148148 };
149- offset += l;
149+ offset += l;
150150 };
151151 range = null;
152152 } else {
@@ -186,7 +186,7 @@ function X_TextRange_getRect(){
186186 'width' : rect.width,
187187 'height' : rect.height
188188 };
189- //range.detach && range.detach();
189+ //range.detach && range.detach();
190190 } else {
191191 ret = {
192192 'x' : result.boundingLeft,
--- a/0.6.x/js/06_net/00_XNet.js
+++ b/0.6.x/js/06_net/00_XNet.js
@@ -176,7 +176,7 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
176176 };
177177
178178 opt.netType = type;
179- opt[ 'url' ] = url;
179+ opt[ 'url' ] = url;
180180
181181 X_Pair_create( this, opt );
182182
--- a/0.6.x/js/06_net/01_XNetXHR.js
+++ b/0.6.x/js/06_net/01_XNetXHR.js
@@ -228,8 +228,7 @@ if( X_XHR_w3c || X_XHR_msXML ){
228228
229229 // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html
230230 if( !X_XHR._isMsXML && raw.overrideMimeType ){
231- type = X_URL_getEXT( url ) || dataType;
232- switch( type ){
231+ switch( type = dataType ){
233232 case 'html' :
234233 case 'htm' :
235234 case 'xml' :
--- a/0.6.x/js/07_audio/00_XAudio.js
+++ b/0.6.x/js/07_audio/00_XAudio.js
@@ -34,7 +34,7 @@ X_TEMP.onSystemReady.push(
3434 * <dt>X.Event.BACKEND_READY <dd>音声(src リスト)を再生可能なバックエンドが見つかった。
3535 * <dt>X.Event.BACKEND_NONE <dd>音声を再生可能なバックエンドが見つからなかった。Audio は kill されます。
3636 * <dt>X.Event.MEDIA_CAN_TOUCH <dd>モバイル端末の制約で音声の再生またはロードに、タッチを必要とする場合、タッチイベント内で play を呼び出す準備が出来たことを通知する。
37- * <dt>X.Event.READY <dd>再生可能、実際の状態は canplay から loadeddata まで様々、、、
37+ * <dt>X.Event.READY <dd>再生可能、実際の状態は canplay から loadeddata まで様々、、、モバイル端末の場合、タッチして再生が開始された場合に
3838 * <dt>X.Event.ERROR <dd><ul>
3939 * <li> 1 : ユーザーによってメディアの取得が中断された
4040 * <li> 2 : ネットワークエラー
@@ -49,6 +49,12 @@ X_TEMP.onSystemReady.push(
4949 * <dt>X.Event.MEDIA_WAITING <dd>再生中に音声が待機状態に。
5050 * <dt>X.Event.MEDIA_SEEKING <dd>シーク中に音声が待機状態に。
5151 * </dl>
52+ * <h4>ソースリストに与える url 文字列</h4>
53+ * <p>ハッシュフラグメント以下にデータを書くことで、各オーディオバックエンドが再生可能性の判断にあたって参考にするデータを渡すことができます。
54+ * <dl>
55+ * <dt>CBR=1<dd>audio が固定ビットレートであることを示す。Android 用 Opera12- は可変ビットレートの mp3 を正しくシークできない。
56+ * [ 'snd.mp3', 'snd.mp3#CBR=1' ] と指定すると、Android 用 Opera12- では CBR な mp3 が、他の環境ではよりファイルサイズの小さい VBR な mp3 が使用される。(未実装)
57+ * <dt>ext=mp3<dd>パスに拡張子が含まれない場合、または上書き指定したい場合に指定する
5258 *
5359 * @alias X.Audio
5460 * @class 各種オーディオ機能をラップしインターフェイスを共通化する。
@@ -211,7 +217,7 @@ audio.setState(
211217 );
212218
213219 function X_Audio_handleEvent( e ){
214- var backend, pair;
220+ var backend, src, pair;
215221
216222 switch( e.type ){
217223 case X_EVENT_BACKEND_READY :
@@ -252,8 +258,9 @@ function X_Audio_handleEvent( e ){
252258 */
253259
254260 function X_Audio_startDetectionBackend( backend, xaudio, sourceList, option ){
255- var source = sourceList[ 0 ] || '',
256- ext = X_URL_getEXT( source ),
261+ var source = sourceList[ 0 ] || '',
262+ hash = X_URL_paramToObj( X_URL_getHash( source ) ),
263+ ext = hash[ 'ext' ] || X_URL_getEXT( source ),
257264 sup;
258265
259266 if( source && backend ){
@@ -261,29 +268,36 @@ function X_Audio_startDetectionBackend( backend, xaudio, sourceList, option ){
261268 sup[ 5 ] = sup;
262269
263270 xaudio[ 'listenOnce' ]( X_EVENT_COMPLETE, backend, X_Audio_onEndedDetection, sup );
264- backend.detect( xaudio, source, ext );
271+ backend.detect( xaudio, ext, hash );
265272 } else {
266273 xaudio[ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );
267274 };
268275 };
269276
270277 function X_Audio_onEndedDetection( e, xaudio, sourceList, option, source, ext, sup ){
271- var i = X_Audio_BACKENDS.indexOf( this ), backend;
278+ var i = X_Audio_BACKENDS.indexOf( this ), _e, hash, backend;
272279
273280 if( e.canPlay ){
274- xaudio[ 'asyncDispatch' ]( {
281+ _e = {
275282 type : X_EVENT_BACKEND_READY,
276283 'option' : option,
277284 'source' : source,
278- 'backendName' : this[ 'backendName' ],
285+ 'backendName' : this.backendName,
279286 'backendID' : i
280- } );
287+ };
288+ // WebAudio
289+ if( this.backendID === 1 ) _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch;
290+ // HTMLAudio
291+ if( this.backendID === 2 ) _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch;
292+
293+ xaudio[ 'asyncDispatch' ]( _e );
281294 } else {
282- console.log( 'No ' + source + ' ' + this[ 'backendName' ] );
295+ console.log( 'No ' + source + ' ' + this.backendName );
283296 if( sup[ 3 ] = source = sourceList[ sourceList.indexOf( source ) + 1 ] ){
284- sup[ 4 ] = ext = X_URL_getEXT( source );
297+ hash = X_URL_paramToObj( X_URL_getHash( source ) );
298+ sup[ 4 ] = ext = hash[ 'ext' ] || X_URL_getEXT( source );
285299 xaudio[ 'listenOnce' ]( X_EVENT_COMPLETE, this, X_Audio_onEndedDetection, sup );
286- this.detect( xaudio, source, ext );
300+ this.detect( xaudio, ext, hash );
287301 } else
288302 if( backend = X_Audio_BACKENDS[ i + 1 ] ){
289303 X_Audio_startDetectionBackend( backend, xaudio, sourceList, option );
--- a/0.6.x/js/07_audio/01_XWebAudio.js
+++ b/0.6.x/js/07_audio/01_XWebAudio.js
@@ -306,7 +306,7 @@ if( X_WebAudio_context ){
306306 this.audioBuffer = buffer;
307307 this.duration = buffer.duration * 1000;
308308
309- this.disatcher[ 'asyncDispatch' ]( X_WebAudio_touchState ? X_EVENT_MEDIA_TOUCH_FOR_LOAD : X_EVENT_READY );
309+ this.disatcher[ 'asyncDispatch' ]( X_WebAudio_touchState ? X_EVENT_MEDIA_WAIT_FOR_TOUCH : X_EVENT_READY );
310310 },
311311
312312 actualPlay : function(){
@@ -462,7 +462,7 @@ if( X_WebAudio_context ){
462462
463463 canPlay : X_Audio_codecs,
464464
465- detect : function( proxy, source, ext ){
465+ detect : function( proxy, ext /* hash */ ){
466466 proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : X_Audio_codecs[ ext ] } );
467467 },
468468
--- a/0.6.x/js/07_audio/02_XHTMLAudio.js
+++ b/0.6.x/js/07_audio/02_XHTMLAudio.js
@@ -177,11 +177,11 @@ if( X_Audio_constructor ){
177177 if( X_HTMLAudio_need1stTouch ){
178178 raw.src = source;
179179 } else {
180- // if( this.autoplay ){
180+ if( this.autoplay ){
181181 raw.preload = 'auto';
182182 raw.autoplay = true; // Android 4.0-4.1.x で必要
183183 //raw.autobuffer = true;
184- //};
184+ };
185185 raw.src = source;
186186 raw.load(); // Android4.1.1 HTL21 では必要!
187187 };
@@ -379,7 +379,7 @@ if( X_Audio_constructor ){
379379 if( this._touchState === 1 ){
380380 if( e.type === X_HTMLAudio_playTrigger ){
381381 this._touchState = 2;
382- this.disatcher[ 'asyncDispatch' ]( X_EVENT_MEDIA_TOUCH_FOR_LOAD );
382+ this.disatcher[ 'asyncDispatch' ]( X_EVENT_MEDIA_WAIT_FOR_TOUCH );
383383 };
384384 } else
385385 if( ended ){
@@ -407,7 +407,7 @@ if( X_Audio_constructor ){
407407
408408 actualPlay : function( forcePlay, forceReload ){
409409 var raw = this[ '_rawObject' ],
410- e, begin, end;
410+ begin, end;
411411
412412 if( !raw ) return;
413413
@@ -425,11 +425,13 @@ if( X_Audio_constructor ){
425425 };
426426
427427 if( this._touchState === 2 ){
428- e = X_EventDispatcher_CURRENT_EVENTS[ X_EventDispatcher_CURRENT_EVENTS.length - 1 ];
428+ //@dev{
429+ var e = X_EventDispatcher_CURRENT_EVENTS[ X_EventDispatcher_CURRENT_EVENTS.length - 1 ];
429430 if( !e || !e[ 'pointerType' ] ){
430431 alert( 'タッチイベント以外での play! ' + ( e ? e.type : '' ) );
431432 return;
432433 };
434+ //@}
433435 this._touchState = 3;
434436 } else
435437 if( this._readyState !== 3 && this._durationFixPhase < 2 ){
@@ -578,7 +580,9 @@ if( X_Audio_constructor ){
578580 * - volume, muted iPhone(iOS4-6)、Android(2.3.6)では動作せず。
579581 * - FireFox3.6, Android 2.3.6については、src変更後、load()を呼び出さないと切り替わらなかった。iPhoneはload()が不要。
580582 */
581- detect : function( proxy, source, ext ){
583+ detect : function( proxy, ext, hash ){
584+ // TODO hash.CBR
585+ // 得意度で返す
582586 proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : X_Audio_codecs[ ext ] } );
583587 },
584588
--- a/0.6.x/js/07_audio/03_XSilverlightAudio.js
+++ b/0.6.x/js/07_audio/03_XSilverlightAudio.js
@@ -412,9 +412,7 @@ if( X_Plugin_SILVER_LIGHT_VERSION ){
412412 'wav' : true
413413 },
414414
415- detect : function( proxy, source, ext ){
416- // TODO source = .mp3#CBR
417- // 得意度で返す
415+ detect : function( proxy, ext, hash ){
418416 proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : ext === 'mp3' || ext === 'm4a' || ext === 'wma' || ext === 'wav' } );
419417 },
420418
--- a/0.6.x/js/07_audio/05_XWMPAudio.js
+++ b/0.6.x/js/07_audio/05_XWMPAudio.js
@@ -223,7 +223,7 @@ if( X_Plugin_WMP_VERSION ){ // IETester で 6.x は不可
223223 'aicf' : true
224224 },
225225
226- detect : function( proxy, source, ext ){
226+ detect : function( proxy, ext /* hash */ ){
227227 proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : 0 <= 'mp3 m4a wma wav midi snd au aiff aicf'.indexOf( ext ) } );
228228 },
229229
--- a/0.6.x/js/07_audio/10_XAudioSprite.js
+++ b/0.6.x/js/07_audio/10_XAudioSprite.js
@@ -365,12 +365,12 @@ function X_AudioSprite_backendHandler( e ){
365365 // TODO 今は touch 可能で backend ready
366366 if(
367367 // WebAudio
368- ( backend.backendID === 1 && ( _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch ) ) ||
368+ ( e[ 'needTouchForPlay' ] && ( _e[ 'needTouchForPlay' ] = true ) ) ||
369369 // HTMLAudio
370- ( backend.backendID === 2 && ( _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch ) )
370+ ( e[ 'needTouchForLoad' ] && ( _e[ 'needTouchForLoad' ] = true ) )
371371 ){
372372 X_AudioSprite_TEMP.event = _e;
373- last[ 'listenOnce' ]( X_EVENT_MEDIA_TOUCH_FOR_LOAD, X_AudioSprite_backendHandler );
373+ last[ 'listenOnce' ]( X_EVENT_MEDIA_WAIT_FOR_TOUCH, X_AudioSprite_backendHandler );
374374 } else {
375375 X_AudioSprite[ 'asyncDispatch' ]( _e );
376376 };
@@ -386,8 +386,8 @@ function X_AudioSprite_backendHandler( e ){
386386 [ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );
387387 return X_CALLBACK_STOP_NOW;
388388
389- case X_EVENT_MEDIA_TOUCH_FOR_LOAD :
390- // TODO 全ての track の MEDIA_TOUCH_FOR_LOAD で!
389+ case X_EVENT_MEDIA_WAIT_FOR_TOUCH :
390+ // TODO 全ての track の MEDIA_WAIT_FOR_TOUCH で!
391391 X_AudioSprite[ 'asyncDispatch' ]( X_AudioSprite_TEMP.event );
392392 delete X_AudioSprite_TEMP.event;
393393 break;
旧リポジトリブラウザで表示