From 0231a4fe0d679b2959968193b0fbeebc44531aaf Mon Sep 17 00:00:00 2001 From: itozyun Date: Fri, 3 Apr 2015 18:46:02 +0900 Subject: [PATCH] Version 0.6.137, bugfix for X.NodeSelector. --- 0.6.x/js/01_core/16_XViewPort.js | 18 +++--- 0.6.x/js/02_dom/08_XNodeSelector.js | 115 +++++++++++++++++++++++++++--------- 0.6.x/js/03_plugin/00_XPlugin.js | 2 +- 0.6.x/js/05_util/01_XNinjaIframe.js | 2 +- 0.6.x/js/06_net/00_XNet.js | 29 +++++++-- 0.6.x/js/06_net/01_XNetXHR.js | 57 +++++++++++++----- 0.6.x/js/07_audio/01_XWebAudio.js | 6 +- 7 files changed, 169 insertions(+), 60 deletions(-) diff --git a/0.6.x/js/01_core/16_XViewPort.js b/0.6.x/js/01_core/16_XViewPort.js index bcc341a..0684d3f 100644 --- a/0.6.x/js/01_core/16_XViewPort.js +++ b/0.6.x/js/01_core/16_XViewPort.js @@ -21,7 +21,7 @@ var X_ViewPort_readyState, X_Dom_orientationchange = window[ 'orientation' ] !== undefined && function( e ){ X_ViewPort_orientationFlag = true; !X_UA[ 'Android' ] && X_ViewPort_resize(); - //console.log( '-- orientationchange : ' + X[ 'ViewPort' ].getSize[ 0 ] + ' ' + X[ 'ViewPort' ].getSize[ 1 ] ); + //console.log( '-- orientationchange : ' + X[ 'ViewPort' ][ 'getSize' ][ 0 ] + ' ' + X[ 'ViewPort' ][ 'getSize' ][ 1 ] ); }, X_ViewPort_document = X_EventDispatcher( document ), @@ -264,7 +264,7 @@ X[ 'ViewPort' ] = { X_ViewPort_lock = false; if( X_ViewPort_orientationFlag ){ X_ViewPort_orientationFlag = false; - X_ViewPort[ 'asyncDispatch' ]( 100, { type : X_EVENT_VIEW_TURNED, orientation : window.orientation } ); + X_ViewPort[ 'asyncDispatch' ]( 100, { type : X_EVENT_VIEW_TURNED, 'orientation' : window.orientation } ); }; }; }; @@ -303,12 +303,12 @@ X[ 'ViewPort' ] = { body[ 'parent ' ] = head[ 'parent' ] = html; html[ '_xnodes' ] = [ head, body ]; - html[ 'appendTo' ] = html[ 'before' ] = html[ 'after' ] = html[ 'clone' ] = html[ 'remove' ] = html[ 'destroy' ] = html[ 'prev' ] = html[ 'next' ] = + html[ 'appendTo' ] = html[ 'prev' ] = html[ 'next' ] = html[ 'clone' ] = html[ 'remove' ] = html[ 'destroy' ] = 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[ 'before' ] = head[ 'after' ] = head[ 'clone' ] = head[ 'remove' ] = head[ 'destroy' ] = + head[ 'appendTo' ] = head[ 'prev' ] = head[ 'next' ] = head[ 'clone' ] = head[ 'remove' ] = head[ 'destroy' ] = head[ 'createText' ] = head[ 'createTextAt' ] = head[ 'empty' ] = head[ 'html' ] = head[ 'text' ] = head[ 'css' ] = head[ 'cssText' ] = - body[ 'appendTo' ] = body[ 'before' ] = body[ 'after' ] = body[ 'clone' ] = body[ 'remove' ] = body[ 'destroy' ] = new Function( 'return this' ); + body[ 'appendTo' ] = body[ 'prev' ] = body[ 'next' ] = body[ 'clone' ] = body[ 'remove' ] = body[ 'destroy' ] = new Function( 'return this' ); X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, function(){ X_ViewPort_readyState = X_EVENT_XTREE_READY; @@ -336,6 +336,9 @@ X[ 'ViewPort' ] = { defaultOverflow = document.body.style.overflow, w, h; + X_ViewPort_width = size[ 0 ]; + X_ViewPort_height = size[ 1 ]; + body.style.overflow = 'hidden'; w = body.clientWidth; h = body.clientHeight; @@ -368,9 +371,8 @@ X[ 'ViewPort' ] = { }; X_ViewPort_baseFontSize = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight; - - X_ViewPort_readyState = X_EVENT_XDOM_READY; - X_ViewPort[ 'asyncDispatch' ]( { type : X_EVENT_XDOM_READY, w : X_ViewPort_width = size[ 0 ], h : X_ViewPort_height = size[ 1 ] } ); + + X_ViewPort[ 'asyncDispatch' ]( X_ViewPort_readyState = X_EVENT_XDOM_READY ); } ); X_ViewPort[ 'asyncDispatch' ]( X_EVENT_PRE_INIT ); diff --git a/0.6.x/js/02_dom/08_XNodeSelector.js b/0.6.x/js/02_dom/08_XNodeSelector.js index 1268ac3..578d9b2 100644 --- a/0.6.x/js/02_dom/08_XNodeSelector.js +++ b/0.6.x/js/02_dom/08_XNodeSelector.js @@ -119,6 +119,7 @@ function X_Node_Selector__parse( query, last ){ case 0x4 : // start attr filter name1st ? ( ( phase = 0x5 ) && ( start = i ) ) : + chr !== ' ' && ( phase = 0xf ); break; case 0x5 : // attr filter key @@ -169,7 +170,7 @@ function X_Node_Selector__parse( query, last ){ break; case 0xa : chr === ')' && ( phase = 0xe ) && ++i && ( b = parseFloat( query.substring( start, i ) ) || 0 ); - console.log( '0xa: ' + start + ' ' + i ); + //console.log( '0xa: ' + start + ' ' + i ); break; // contains, lang case 0xb : @@ -206,7 +207,7 @@ function X_Node_Selector__parse( query, last ){ break; } else { if( a !== a || b !== b ) return i; - result = [ not ? 0 : combinator, selector, name, a, b ]; + result = [ not ? 0 : combinator, SELECTOR[ name ] || selector, name, a, b ]; break; }; } else { @@ -245,6 +246,7 @@ function X_Node_Selector__parse( query, last ){ l, i, n, parsed, xnodes, // 一時保存用 merge, // 要素がコメントノードで汚染されている場合使う + parent, children, j, m, combinator, selector, name, tagName, uid, tmp, xnode, filter, key, op, val, toLower, useName, links, className, attr, flag; @@ -319,20 +321,40 @@ function X_Node_Selector__parse( query, last ){ // > TagName|* case 2 : for( ; i < l; ++i ){ - for( xnode = parents[ i ][ 'firstChild' ](); xnode; xnode = xnode[ 'next' ]() ){ - if( xnode[ '_tag' ] && ( isAll || tagName === xnode[ '_tag' ] ) ) xnodes[ ++n ] = xnode; - }; + parent = parents[ i ]; + if( ( children = parent[ '_xnodes' ] ) && ( m = children.length ) ){ + for( j = 0; j < m; ++j ){ + xnode = children[ j ]; + if( xnode[ '_tag' ] && ( isAll || tagName === xnode[ '_tag' ] ) ) xnodes[ ++n ] = xnode; + }; + }; }; break; // + TagName|* case 3 : for( ; i < l; ++i ){ + + xnode = parents[ i ]; + j = xnode[ 'getOrder' ]() + 1; + parent = xnode.parent; + if( parent && ( children = parent[ '_xnodes' ] ) && ( m = children.length ) ){ + for( ; j < m; ++j ){ + xnode = children[ j ]; + if( xnode[ '_tag' ] ){ + if( isAll || tagName === xnode[ '_tag' ] ){ + xnodes[ ++n ] = xnode; + }; + break; + }; + }; + }; + /* for( xnode = parents[ i ][ 'next' ](); xnode; xnode = xnode[ 'next' ]() ){ if( xnode[ '_tag' ] ){ if( isAll || tagName === xnode[ '_tag' ] ) xnodes[ ++n ] = xnode; break; }; - }; + }; */ }; break; // ~ TagName|* @@ -355,12 +377,28 @@ function X_Node_Selector__parse( query, last ){ // case 6 : 属性ノードは実装しない - default : + default : if( combinator === 1 || ( isStart && selector < 7 ) ){ + if( isStart ){ + if( tagName === 'HTML' ){ + xnodes[ 0 ] = X_Node_html; + break; + }; + if( tagName === 'HEAD' ){ + xnodes[ 0 ] = X_Node_head; + break; + }; + if( tagName === 'BODY' ){ + xnodes[ 0 ] = X_Node_body; + break; + }; + + }; //console.log( l + ' > ' + xnodes.length + ' tag:' + tagName ); + merge = {}; for( ; i < l; ++i ){ xnode = parents[ i ]; - xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length && X_Node_Selector__fetchElements( xnodes, xnode, isAll ? null : tagName ); + xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length && X_Node_Selector__fetchElements( xnodes, xnode, isAll ? '' : tagName, merge ); }; //console.log( l + ' >> ' + xnodes.length + ' tag:' + tagName ); }; @@ -390,7 +428,27 @@ function X_Node_Selector__parse( query, last ){ case 6 : isNot = true; parsed = parsed[ 2 ]; - continue; + name = parsed[ 2 ]; + switch( parsed[ 1 ] ) { + case 1 : + filter = [ 'tag', 1, isXML ? name : name.toUpperCase() ]; break; + // #, ID + case 2 : + filter = [ 'id', 1, name ]; break; + // ., class + case 3 : + filter = [ 'class', 3, name ]; break; + // :, 擬似クラス + case 4 : + if( !( filter = X_Node_Selector__filter[ name ] ) ){ + return []; + }; + break; + // [] 属性 + case 5 : + filter = [ name, parsed[ 3 ], parsed[ 4 ] ]; break; + }; + break; // scope case 7 : xnodes = scope; break; @@ -402,7 +460,7 @@ function X_Node_Selector__parse( query, last ){ case 9 : if( links = document.links ){ for( xnodes = [], i = links.length; i; ){ - xnodes[ --i ] = new Node( links[ i ] ); + xnodes[ --i ] = Node( links[ i ] ); }; } else { // area[href],a[href] @@ -457,6 +515,7 @@ function X_Node_Selector__parse( query, last ){ for( i = 0, n = -1, l = xnodes.length; i < l; ++i ){ xnode = xnodes[ i ]; attr = + key === 'tag' ? xnode[ '_tag' ] : key === 'id' ? xnode[ '_id' ] : key === 'class' ? xnode[ '_className' ] : xnode[ '_attrs' ] && xnode[ '_attrs' ][ key ]; @@ -465,7 +524,7 @@ function X_Node_Selector__parse( query, last ){ //useName ? // elem[ X_Node_Attr_renameForDOM[ key ] || key ] : // elem.getAttribute( key, 2 ); - flag = attr != null;// && ( !useName || attr !== '' ); + flag = !!attr;// && ( !useName || attr !== '' ); if( flag && op ){ if( toLower ) attr = attr.toLowerCase(); @@ -523,8 +582,7 @@ function X_Node_Selector__parse( query, last ){ xnodes[ ++n ] = xnode; }; }; - X_Node_Selector__sortElementOrder( ret = [], xnodes, hasRoot ? [ HTML ] : HTML[ '_xnodes' ] ); - xnodes = ret; + xnodes = X_Node_Selector__sortElementOrder( [], xnodes, hasRoot ? [ HTML ] : HTML[ '_xnodes' ] ); }; return xnodes.length === 1 ? xnodes[ 0 ] : new X_NodeList( xnodes ); @@ -537,34 +595,35 @@ function X_Node_Selector__parse( query, last ){ for( ; i < l; ++i ){ child = xnodes[ i ]; if( !child[ '_tag' ] ) continue; - //console.log( child[ '_tag' ] ); - if( ( j = list.indexOf( child ) ) !== -1 ){ + + j = list.indexOf( child ); + if( j !== -1 ){ newList[ newList.length ] = child; - list.splice( j, 1 ); - if( list.length === 1 ){ - newList[ newList.length ] = list[ 0 ]; - list.length = 0; - return true; + if( list.length === 2 ){ + newList[ newList.length ] = list[ j === 0 ? 1 : 0 ]; + return newList; }; - if( list.length === 0 ) return true; + list.splice( j, 1 ); }; + if( ( _xnodes = child[ '_xnodes' ] ) && X_Node_Selector__sortElementOrder( newList, list, _xnodes ) ){ - return true; + return newList; }; }; }; - function X_Node_Selector__fetchElements( list, parent, tag ){ + function X_Node_Selector__fetchElements( list, parent, tag, merge ){ var xnodes = parent[ '_xnodes' ], l = xnodes.length, i = 0, - child; + child, uid; for( ; i < l; ++i ){ child = xnodes[ i ]; - if( child[ '_tag' ] ){ + uid = child[ '_uid' ]; + if( !merge[ uid ] && child[ '_tag' ] ){ + merge[ uid ] = true; ( !tag || child[ '_tag' ] === tag ) && ( list[ list.length ] = child ); - //console.log( parent[ '_tag' ] + ' > ' + child[ '_tag' ] + ' == ' + tag+ ' l:' + list.length ); - child[ '_xnodes' ] && child[ '_xnodes' ].length && X_Node_Selector__fetchElements( list, child, tag ); + child[ '_xnodes' ] && X_Node_Selector__fetchElements( list, child, tag, merge ); }; }; }; @@ -704,7 +763,7 @@ var X_Node_Selector__filter = { checked = {}; flag_not = flags.not; for( i = 0; link = links[ i ]; ++i ){ - checked[ ( new Node( link ) )[ '_uid' ] ] = true; + checked[ ( Node( link ) )[ '_uid' ] ] = true; }; for( i = 0, n = -1; xnode = xnodes[ i ]; ++i ){ if( checked[ xnode[ '_uid' ] ] ^ flag_not ) res[ ++n ] = xnode; diff --git a/0.6.x/js/03_plugin/00_XPlugin.js b/0.6.x/js/03_plugin/00_XPlugin.js index e64422c..8b31533 100644 --- a/0.6.x/js/03_plugin/00_XPlugin.js +++ b/0.6.x/js/03_plugin/00_XPlugin.js @@ -55,7 +55,7 @@ var X_Pulgin_FLASH_VERSION = parseFloat( navigator.plugins[ 'Unity Player' ].version ) : !X_UA[ 'IE4' ] && !X_UA[ 'IE5' ] && X_UA[ 'ActiveX' ] ? (function(){ var obj = eval( 'var a,e;try{a=new ActiveXObject("UnityWebPlayer.UnityWebPlayer.1")}catch(e){}a' ); - return obj ? parseFloat( obj.GetPluginVersion() ) : 0; + return obj ? parseFloat( obj[ 'GetPluginVersion' ]() ) : 0; })() : 0, diff --git a/0.6.x/js/05_util/01_XNinjaIframe.js b/0.6.x/js/05_util/01_XNinjaIframe.js index e88cb34..b4ede0f 100644 --- a/0.6.x/js/05_util/01_XNinjaIframe.js +++ b/0.6.x/js/05_util/01_XNinjaIframe.js @@ -67,7 +67,7 @@ X[ 'Util' ][ 'NinjaIframe' ] = X_EventDispatcher[ 'inherits' ]( this._ready = true; return; }; - break; + //break; これあると IE8 で駄目! case 'readystatechange' : if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break; diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index 2d69294..30779d1 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -5,12 +5,33 @@ // がある場合、