OSDN Git Service

Version 0.6.48, fix X.UA for s60 Safari.
authoritozyun <itozyun@user.sourceforge.jp>
Mon, 23 Jun 2014 21:52:46 +0000 (06:52 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Mon, 23 Jun 2014 21:52:46 +0000 (06:52 +0900)
14 files changed:
0.6.x/js/core/00_builtin.js
0.6.x/js/core/01_XUa.js
0.6.x/js/core/04_XClass.js
0.6.x/js/dom/10_XDom.js
0.6.x/js/dom/11_XDomNode.js
0.6.x/js/dom/12_XDomEvent.js
0.6.x/js/dom/13_XDomBoxModel.js
0.6.x/js/dom/14_XDomAttr.js
0.6.x/js/dom/15_XDomStyle.js
0.6.x/js/dom/22_XDomBuilder.js
0.6.x/js/ui/06_AbstractUINode.js
0.6.x/js/ui/08_Box.js
0.6.x/js/ui/11_VBox.js
0.6.x/js/ui/12_HBox.js

index da90d1a..3f8f676 100644 (file)
@@ -223,49 +223,44 @@ if (window.ActiveXObject ? !Number.prototype.toFixed : (!navigator.taintEnabled
  * https://web.archive.org/web/20070526063400/http://web.paulownia.jp/script/oop/closure.html\r
  * MacOSX 10.3のsafariにはhasOwnPropertyが実装されていないので、独自に追加する必要があります。\r
  */\r
-/*-----------------\r
-result  |  1  |  2  |  3  |\r
-this    | NaN |     |     | NaN | NaN | NaN |\r
-_proto_ |     | NaN |     | NaN |     | NaN |\r
-_super_ |     |     | NaN |     | NaN | NaN |\r
-*/\r
-\r
 /*\r
 Object.prototype.hasOwnProperty || (Object.prototype.hasOwnProperty = function( p ){\r
-               var _proto_ = this.constructor && this.constructor.prototype,\r
-                       v       = this[ p ],\r
-                       nan     = v !== v; // isNaN\r
-                       save, r = false;\r
+               var proto = this.constructor && this.constructor.prototype,\r
+                       __p__ = proto && ( '__proto__' in proto ) && proto.__proto__,\r
+                       v     = this[ p ],\r
+                       nan   = v !== v, // isNaN\r
+                       r = false, save;\r
+               \r
+               if( __p__ ) proto.__proto__ = v === null ? undefined : null;\r
+               \r
                if( nan ){\r
-                       // NaN の判定は完全に chain を辿る必要がある\r
-                       save = _proto_[ p ];\r
-                       _proto_[ p ] = true;\r
-                       r = this[ p ] !== this[ p ]; // isNaN\r
-                       \r
-                       delete _proto_[ p ];\r
-                       // もっと深い chain で定義されていた.\r
-                       if( this[ p ] !== this[ p ] ) return r; // 1\r
-                       // __proto__ で定義されていた.\r
-                       _proto_[ p ] = save;\r
+                       if( proto[ p ] !== proto[ p ] ){ // proto is NaN\r
+                               proto[ p ] = 0; // different value\r
+                               r = this[ p ] !== this[ p ]; // isNaN\r
+                               proto[ p ] = NaN; // proto で定義されていた.\r
+                       } else {\r
+                               r = true;\r
+                       };\r
                } else\r
                if( p in this ){\r
-                       if(\r
-                               !_proto_ ||\r
-                               !( p in _proto_ ) ||\r
-                               ( _proto_[ p ] !== v )\r
-                       ) return true;\r
-                       \r
-                       // this と __proto__ に同名で同値が書かれている可能性あり\r
-\r
-                       save = _proto_[ p ];\r
-                       _proto_[ p ] = v + ' ';\r
-                       r = v === this[ p ];\r
+                       if( !proto || !( p in proto ) || ( proto[ p ] !== v ) ){\r
+                               r = true;\r
+                       } else {\r
+                               // this と proto に同名で同値が書かれている可能性あり\r
+                               save = proto[ p ];\r
+                               proto[ p ] = v + ' '; // different value\r
+                               r = v === this[ p ];\r
+                               \r
+                               delete proto[ p ];\r
                        \r
-                       delete _proto_[ p ];\r
-                       // もっと深い chain で定義されていた.\r
-                       if( _proto_[ p ] === v ) return r;\r
-                       // __proto__ で定義されていた.\r
-                       _proto_[ p ] = save;\r
+                               if( proto[ p ] !== v ){\r
+                                       // proto で定義されていた.\r
+                                       proto[ p ] = save;                              \r
+                               };\r
+                       };\r
                };\r
+               \r
+               if( __p__ ) proto.__proto__ = __p__;\r
+               \r
                return r;\r
-  }); */
\ No newline at end of file
+  });*/\r
index 3c374ae..c3be09d 100644 (file)
@@ -15,20 +15,26 @@ X.UA = (function( n, undefined ){
                        i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0,\r
                        j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0,\r
                        tv );\r
-               acme.Opera7 = acme.Opera < 8;\r
+               // closure compiler で minify するとOpera7で動かない \r
+               // --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く\r
+               acme.Opera7      = acme.Opera < 8;\r
+               acme.Opera78     = acme.Opera < 9;\r
                acme.OperaMini   = 0 < dua.indexOf("Opera Mini");\r
                acme.OperaMobile = 0 < dua.indexOf("Opera Mobi");\r
                acme.OperaTablet = 0 < dua.indexOf("Opera Tablet");\r
+               // TODO NDS\r
                return acme;\r
        };\r
        \r
        // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\r
        if( document.all ){\r
                acme.ActiveX  = !!window[ 'ActiveXObject' ];\r
-               acme.IE       = document.documentMode || parseFloat(dav.split("MSIE ")[1]) || parseFloat(dua.split("rv:")[1]) || 0;\r
-               acme.MacIE    = dav.indexOf( 'Mac_PowerPC' ) !== -1 || dav.indexOf( 'Mac_PPC' ) !== -1 || dav.indexOf( 'Mac_68K' ) !== -1;\r
-               acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 ||\r
-                                               dua.toLowerCase().indexOf( 'windows phone' ) !== -1;\r
+               acme.IE       = document.documentMode || parseFloat(dua.split("MSIE ")[1]) || parseFloat(dua.split("rv:")[1]) || parseFloat(dav.split("MSIE ")[1]) || 0;\r
+               acme.IE4      = acme.IE && acme.IE < 5;\r
+               acme.IE5678   = 5 <= acme.IE && acme.IE < 9;\r
+               acme.MacIE    = dua.indexOf( 'Mac_PowerPC' ) !== -1 || dua.indexOf( 'Mac_PPC' ) !== -1 || dua.indexOf( 'Mac_68K' ) !== -1;\r
+               acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1;\r
+               acme.WinPhone = dua.toLowerCase().indexOf( 'windows phone' ) !== -1;\r
                return acme;\r
        };\r
        \r
@@ -37,6 +43,22 @@ X.UA = (function( n, undefined ){
                return acme;\r
        };\r
        \r
+       // http://www.useragentstring.com/pages/Playstation%203/\r
+       // Mozilla/5.0 (PLAYSTATION 3; 3.55)\r
+    // Mozilla/4.0 (PS3 (PlayStation 3); 1.00)\r
+       if( ( i = dua.toUpperCase().indexOf( 'PLAYSTATION 3' ) !== -1 ) ){\r
+               acme.PS3 = parseFloat( dua.substr( i + 15 ) ) || 0;\r
+               return acme;\r
+       };\r
+       \r
+       // http://www.useragentstring.com/pages/iCab/\r
+       // iCab/3.0.2 (Macintosh; U; PPC Mac OS X)\r
+       // Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3\r
+       if( ( i = dua.indexOf( 'iCab' ) !== -1 ) ){\r
+               acme.iCab = parseFloat( dua.substr( i + 5 ) ) || 0;\r
+               return acme;\r
+       };\r
+       \r
        if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){\r
                v = dua.substr( i + 3 ).split( '.' );\r
                acme.Gecko = parseFloat( v[ 0 ] ) || 0 +\r
@@ -44,33 +66,70 @@ X.UA = (function( n, undefined ){
                        ( parseFloat( v[ 2 ] ) || 0 ) / 100;\r
                \r
                //Fennec\r
+               if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){\r
+                       acme.Fennec = parseFloat( dua.substr( i + 7 ) );\r
+               };\r
                //Firefox\r
+               \r
                //Netscape\r
+               //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3\r
+               if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 10 ) ) ) ){\r
+                       acme.NN = v;\r
+                       acme.NN6 = true;\r
+                       return acme;\r
+               } else\r
+               //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)\r
+               //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3\r
+               if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 9 ) ) ) ){\r
+                       acme.NN = v;\r
+                       return acme;\r
+               } else\r
+               //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6\r
+               if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 10 ) ) ) ){\r
+                       acme.NN = v;\r
+                       return acme;\r
+               };\r
        };\r
        \r
-       // Blink\r
-       // iCab\r
+       // TODO Blink\r
        acme.Khtml  = ( dav.indexOf("Konqueror") >= 0 ) ? tv : undefined;\r
-       acme.WebKit = parseFloat(dua.split("WebKit\/")[1]) || undefined;\r
+       acme.WebKit = i = parseFloat(dua.split("WebKit\/")[1]) || undefined;\r
        acme.Chrome = parseFloat(dua.split("Chrome\/")[1]) || undefined;\r
-       i = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);\r
-       if( i && !acme.Chrome ){\r
-               acme.Safari = parseFloat( dav.split("Version/")[1] );\r
-               i = parseFloat(dav.substr( i + 7 ));\r
-               if( !acme.Safari && i < 100 ){\r
-                       acme.Safari = 1;\r
-               };\r
-               if( !acme.Safari && i < 125 ){\r
-                       acme.Safari = 1.1;\r
-               };\r
-               if( !acme.Safari && i < 312 ){\r
-                       acme.Safari = 1.2;\r
-               };\r
-               if( !acme.Safari && i < 412 ){\r
-                       acme.Safari = 1.3;\r
-               };\r
-               if( !acme.Safari && i <= 419.3 ){\r
-                       acme.Safari = 2;\r
+\r
+       if( i && !acme.Chrome && dua.indexOf( 'Safari' ) !== -1 ){\r
+               if( dav.indexOf( 'Version/' ) !== -1 ){\r
+                       acme.Safari = parseFloat( dav.split("Version/")[1] );\r
+               } else {\r
+                       if( i < 73 ){\r
+                               acme.Safari = 0.8;\r
+                       } else\r
+                       if( i < 85 ){\r
+                               acme.Safari = 0.9;\r
+                       } else\r
+                       if( i < 100 ){\r
+                               acme.Safari = 1;\r
+                       } else\r
+                       if( i < 125 ){\r
+                               acme.Safari = 1.1;\r
+                       } else\r
+                       if( i < 312 ){\r
+                               acme.Safari = 1.2;\r
+                       } else\r
+                       if( i < 412 ){\r
+                               acme.Safari = 1.3;\r
+                       } else\r
+                       if( i <= 419.3 ){\r
+                               acme.Safari = 2;\r
+                       } else\r
+                       if( i <= 525.13 ){\r
+                               acme.Safari = 3;\r
+                       } else\r
+                       if( i <= 525.25 ){\r
+                               acme.Safari = 3.1;\r
+                       } else\r
+                       if( i <= 528.16 ){\r
+                               acme.Safari = 3.2;\r
+                       };\r
                };\r
        };\r
        \r
@@ -96,6 +155,8 @@ X.UA = (function( n, undefined ){
        return acme;\r
 })( navigator );\r
 \r
+//alert(X.UA.Safari + ' ' + X.UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );\r
+\r
 // Safari 3.1 未満は開発コンソールがない!\r
 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
 \r
index 34c603a..f8ec3e0 100644 (file)
@@ -344,7 +344,7 @@ X.Class = ( function(){
                _override : function ( target, src, force ){\r
                        var p;\r
                        for( p in src ){\r
-                               if( p === 'Super' || p === 'SuperConstructor' ){\r
+                               if( p === 'Super' || p === 'SuperConstructor' || p === '__proto__' || p === 'prototype' || p === 'constructor' ){\r
                                        X.Notification.critical( 'Super & SuperConstructor is reserved!' );\r
                                        return;\r
                                };\r
index e39e4eb..19a6720 100644 (file)
@@ -65,8 +65,7 @@ X.Dom = X.Class._override(
                        delete X.Dom._init;\r
                        X.Dom.readyState = X.Dom.Event.DOM_PRE_INIT;\r
                        \r
-                       /* if( X.UA.IE ) */\r
-                       X.Dom._root = ( document.compatMode !== 'CSS1Compat' ? document.body : document.documentElement );\r
+                       X.Dom._root = document.compatMode !== 'CSS1Compat' ? document.body : document.documentElement || document.body;\r
 \r
                        h = Node._html = document.documentElement ?\r
                                        new Node( document.documentElement ) :\r
@@ -262,7 +261,19 @@ if( !X.UA.IE || 9 <= X.UA.IE ){
        };\r
 };\r
 \r
-if( document.getElementById && ( !X.UA.IEMobile || 5 <= X.UA.IE ) ){\r
+/*\r
+ * http://d.hatena.ne.jp/t-uchima/20051003/p1\r
+ * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。\r
+ */\r
+if( X.UA.MacIE ){\r
+       X.Dom.DOM_W3C    = true;\r
+       X.Dom.EVENT_DOM0 = true;\r
+} else\r
+if( X.UA.IE4 ){ // ie4 & iemobi4\r
+       X.Dom.DOM_IE4    = true;\r
+       X.Dom.EVENT_DOM0 = true;\r
+} else\r
+if( document.getElementById ){\r
        X.Dom.DOM_W3C = true;\r
        if( document.addEventListener ){\r
                X.Dom.EVENT_W3C = true;\r
@@ -276,10 +287,17 @@ if( document.getElementById && ( !X.UA.IEMobile || 5 <= X.UA.IE ) ){
 if( document.all ){\r
        X.Dom.DOM_IE4    = true;\r
        X.Dom.EVENT_DOM0 = true;\r
+} else\r
+if( document.layers ){\r
+       \r
+} else {\r
+       \r
 };\r
 \r
 X.Dom.moveToHead = {\r
        STYLE   : true,\r
+       LINK    : true,\r
+       TITLE   : true,\r
        BGSOUND : true,\r
        AREA    : true,\r
        BASE    : true,\r
index bff2627..11bb2eb 100644 (file)
@@ -6,7 +6,7 @@ X.Dom.Dirty = {
        CLASSNAME        :  8, // _getCharSize, width, height, x, y\r
        ATTR             : 16, // _getCharSize, width, height, x, y\r
        CSS              : 32, // _getCharSize, width, height, x, y\r
-       IE_FILTER        : X.UA.IE && X.UA.IE < 9 ? 64 : 0,\r
+       IE_FILTER        : X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE ? 64 : 0,\r
        UNKNOWN_TAG_FIX  : 128,\r
        IE4_TEXTNODE_FIX : 256\r
 };\r
@@ -25,10 +25,12 @@ X.Dom.State = {
        HAS_HEIGHT_LENGTH  : 512,\r
        HAS_HEIGHT_PERCENT : 1024,\r
        IE4_ONLY_TEXT      : 2048,\r
-       IE5_DISPLAY_NONE_FIX : 5 <= X.UA.IE && X.UA.IE < 5.5 ? 4096 : 0 // MacIE5.2- は ?\r
+       IE5_DISPLAY_NONE_FIX : !X.UA.MacIE && 5 <= X.UA.IE && X.UA.IE < 5.5 ? 4096 : 0 // filterがかかっていると不可? MacIE5.2- は ?\r
 };\r
 \r
-X.Dom._strictElmCreation = X.UA.IE && X.UA.IE < 9;// && !X.UA.MacIE;\r
+X.Dom._strictElmCreation = !X.UA.MacIE && X.UA.IE5678;// && !X.UA.MacIE;\r
+\r
+X.Dom._useDocumentFragment = document.createDocumentFragment && ( !X.UA.IE || 5.5 <= X.UA.IE ) && document.createDocumentFragment();\r
 \r
 /*\r
  * Node( rawElement | rawTextnode | htmlString | textString )\r
@@ -167,8 +169,6 @@ Node.IS_WINDOW      = 8;
 Node.IS_DOCUMENT    = 9;\r
 Node.IS_IMAGE       = 10;\r
 \r
-Node._useDocumentFragment = document.createDocumentFragment && ( !X.UA.IE || 5.5 <= X.UA.IE ) && document.createDocumentFragment();\r
-\r
 Node._getType = function( v ){\r
        if( v === '' ) return Node.IS_STRING;\r
        if( !v ) return 0;\r
@@ -881,7 +881,7 @@ Node.prototype._commitUpdate =
                        } else\r
                        if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ) {\r
                                \r
-                               /*if( elm.childNodes.length !== l && ( frg = Node._useDocumentFragment ) ){\r
+                               /*if( elm.childNodes.length !== l && ( frg = X.Dom._useDocumentFragment ) ){\r
                                        for( i = 0; i < l; ++i ){\r
                                                frg.appendChild( xnodes[ i ]._actualCreate( true ) );\r
                                        };\r
@@ -967,7 +967,7 @@ Node.prototype._updateRawNode =
                        };\r
                        // className\r
                        if( this._dirty & X.Dom.Dirty.CLASSNAME ){\r
-                               this._className ? ( elm.className = this._className ) : ( elm.className && elm.removeAttribute( 'class' ) );                                    \r
+                               this._className ? ( elm.className = this._className ) : ( elm.className && elm.removeAttribute( X.UA.IE ? 'className' : 'class' ) );                                    \r
 \r
                                // ie5 only\r
                                if( X.Dom.State.IE5_DISPLAY_NONE_FIX && elm.currentStyle.display === 'none' ){\r
@@ -979,7 +979,7 @@ Node.prototype._updateRawNode =
                        // style\r
                        if( this._dirty & X.Dom.Dirty.CSS ){\r
                                if( this._cssText !== null || ( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
-                                       X.UA.Opera && X.UA.Opera < 9 ?\r
+                                       X.UA.Opera78 || X.UA.NN6 ?\r
                                                elm.setAttribute( 'style', this._cssText ) : // opera8用\r
                                                ( elm.style.cssText = this._cssText );\r
                                } else {\r
@@ -997,7 +997,7 @@ Node.prototype._updateRawNode =
                        if( this._dirty & X.Dom.Dirty.ATTR && ( attrs = this._newAttrs || this._attrs ) ){\r
                                rename = X.Dom.Attr.renameForDOM;\r
                                for( k in attrs ){\r
-                                       if( 5 <= X.UA.IE && X.UA.IE < 6 ){ // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
+                                       if( !X.UA.MacIE && 5 <= X.UA.IE && X.UA.IE < 6 ){ // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
                                                if( this._tag === 'TEXTAREA' && k === 'value' ){\r
                                                        elm.firstChild ?\r
                                                                ( elm.firstChild.data = attrs[ k ] ) :\r
@@ -1112,9 +1112,9 @@ Node.prototype._actualCreate =
                                                '>' ].join( '' ) ) :\r
                                        document.createElement( this._tag );\r
                };\r
-               if( Node._useDocumentFragment ){\r
+               if( X.Dom._useDocumentFragment ){\r
                        if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
-                               !isChild && ( frg = Node._useDocumentFragment ).appendChild( elm );\r
+                               !isChild && ( frg = X.Dom._useDocumentFragment ).appendChild( elm );\r
                                for( i = 0; i < l; ++i ){\r
                                        elm.appendChild( xnodes[ i ]._actualCreate( true ) );\r
                                };\r
@@ -1171,9 +1171,7 @@ Node.prototype._actualCreate =
 Node.prototype._afterActualCreate =\r
        X.Dom.DOM_W3C ? (function(){\r
                var elm = this._rawNode, xnodes, l, attrs, k, i;\r
-               if( !this.parent ){\r
-                       alert( 'afterActualCreate : ' + this._tag );\r
-               };\r
+\r
                this._root  = this.parent._root;\r
                \r
                if( this._xnodeType === 3 ){\r
@@ -1185,7 +1183,7 @@ Node.prototype._afterActualCreate =
                l      = xnodes && xnodes.length;\r
                \r
                if( this._isNew ){\r
-                       if( !Node._useDocumentFragment && l ){// docFrg が使えない場合、doc 追加後に子を追加\r
+                       if( !X.Dom._useDocumentFragment && l ){// docFrg が使えない場合、doc 追加後に子を追加\r
                                for( i = 0; i < l; ++i ){\r
                                        elm.appendChild( xnodes[ i ]._actualCreate( true ) );\r
                                };\r
@@ -1251,16 +1249,16 @@ Node.prototype._actualRemove =
                        if( !elm ) return;\r
                        this._xnodeType === 1 && this._migrateEvent();// イベントの退避\r
                        // elm.parentNode.tagName for ie7\r
-                       //if( !X.UA.Opera7 ){\r
+                       if( !X.UA.MacIE ){\r
                                !isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
-                       //} else {\r
-                       //      !isChild && elm.parentNode && X.Dom._o7_remove( elm );\r
-                       //};\r
+                       } else {\r
+                               !isChild && elm.parentNode && elm.parentNode.tagName && X.Dom._fixed_remove( elm, this );\r
+                       };\r
                }) :\r
        X.Dom.DOM_IE4 ?\r
                ( function( isChild ){\r
                        var xnodes = this._xnodes,\r
-                               elm    = this._rawNode || this._ie4getRawNode(),\r
+                               elm    = this._rawNode || this._xnodeType === 1 && this._ie4getRawNode(),\r
                                i, l, xnode;\r
                        if( xnodes && ( l = xnodes.length ) ){\r
                                for( i = 0; i < l; ++i ){\r
index 10d79c3..8ffb26d 100644 (file)
@@ -239,7 +239,7 @@ X.Dom.Node.prototype._addEvent =
                        this._rawNode.attachEvent( 'on' + type, this._handleEvent );\r
                }) :\r
                (function( type ){\r
-                       var elm = this._rawNode || this._ie4getRawNode && this._ie4getRawNode();\r
+                       var elm = this._rawNode || ( this._ie4getRawNode && this._ie4getRawNode() );\r
                        if( !elm ) return;\r
                        this._handleEvent = elm[ 'on' + type ] = this._handleEvent || X.Callback.create( this );\r
                });\r
@@ -304,7 +304,7 @@ X.Dom.Node.prototype._removeEvent =
                        };\r
                }) :\r
                (function( type ){\r
-                       var elm = this._rawNode || this._ie4getRawNode && this._ie4getRawNode();\r
+                       var elm = this._rawNode || ( this._ie4getRawNode && this._ie4getRawNode() );\r
                        if( !elm ) return;\r
                        elm[ 'on' + type ] = X.emptyFunction;\r
                        elm[ 'on' + type ] = '';\r
@@ -408,7 +408,6 @@ if( X.UA.WebKit || ( X.UA.Safari && X.UA.Safari < 3 ) ){ // sniff
 \r
 /* for other browsers */\r
 Node._window.listenOnce( 'load', X.Dom._init );\r
-\r
 //\r
 X.Dom.listenOnce( X.Dom.Event.XDOM_READY, function(e){\r
        console.log( 'X.Dom XDomReady ' + X.Dom.readyState );\r
index 0e77c47..49a0288 100644 (file)
@@ -51,6 +51,9 @@ X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){
  * Width, Height\r
  *  display:blobk かつ overflow:hidden かつ size(px,em)が設定されていたら、再描画しないでその値を返す\r
  *  display:none なら 0\r
+ * \r
+ * getBoxObjectFor\r
+ * getBoundingClientRect\r
  */\r
 Node.prototype.width = function(){\r
        if( !this.parent ){// todo : _state で tree に所属しているか?判定\r
index a0009ff..cecb84c 100644 (file)
@@ -122,7 +122,20 @@ X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){
        } else\r
        if( typeof nameOrObj === 'string' && attrs ){\r
                // getter\r
-               return attrs[ nameOrObj ];\r
+               switch( nameOrObj ){\r
+                       case 'id' :\r
+                               return this._tag;\r
+                       case 'class' :\r
+                       case 'className' :\r
+                               return this._className;\r
+                       case 'tag' :\r
+                       case 'tagName' :\r
+                               return this._tag;\r
+                       case 'style' :\r
+                       case 'cssText' :\r
+                               return this.cssText();\r
+               };\r
+               return attrs[ X.Dom.Attr.renameForTag[ nameOrObj ] || nameOrObj ];\r
        };\r
 };\r
 X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
index 62f57fd..2dbaa55 100644 (file)
@@ -134,7 +134,7 @@ _GRNERAL
        },
        
        IE_FILTER_FIX :
-               X.UA.IE && X.UA.IE < 9 ?
+               X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE ?
                        {
                                opacity : 1,
                                textShadow : 1
@@ -873,7 +873,7 @@ X.Dom.Style._GET_VALUE_WITH_UNIT = {
        
 X.Dom.Style.SPECIAL_FIX =
        // ~IE8
-       X.UA.IE && X.UA.IE < 9 ?
+       X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE?
                (function( obj ){
                        var test    = X.Dom.Style.SPECIAL_FIX_PROP,
                                filters = [],
@@ -1220,7 +1220,7 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT, function(){
        
        X.Dom.Style.SPECIAL_FIX_PROP =
                // ~IE8
-               X.UA.IE && X.UA.IE < 9 ?
+               X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE ?
                        {
                                filter          : 1,
                                opacity         : 2//, uinode ChromeNode で行う
index 6061808..84e510b 100644 (file)
@@ -5,15 +5,95 @@ X.Dom._isCleanupTarget = function( elm ){
        var cname = ' ' + elm.className + ' ',\r
                tag   = ( elm.tagName || '' ).toUpperCase();\r
        return cname.indexOf( ' skip-cleanup ' ) === -1 &&\r
-               ( X.Dom.cleanupTagNames[ tag ] || 0 < cname.indexOf( ' cleanup-target ' ) );\r
+               ( X.Dom.cleanupTagNames[ tag ] || cname.indexOf( ' cleanup-target ' ) !== -1 );\r
 };\r
 \r
-X.Dom._o7_remove = function( node ){\r
-       var parent   = node.parentNode;\r
-       if( node.nodeType === 1 || node.nodeType === 3 ){\r
-               parent && parent.removeChild( node );\r
-       } else {\r
-               node.data = '';\r
+if( X.UA.MacIE ){\r
+\r
+       X.Dom._fixed_remove = function( node, xnode ){\r
+               var parent   = node.parentNode, l;\r
+\r
+               node.nodeType !== 3 && alert( node.nodeType + '\n' + ( node.outerHTML || node.data ) );\r
+               if( node.nodeType === 1 ){\r
+                       //node.outerHTML = '';\r
+                       parent && parent.removeChild( node );\r
+               } else\r
+               if( node.nodeType === 3 ){\r
+                       //node.data = '';\r
+                       l = X.Dom._removalTextNodes.length;\r
+                       if( parent ){\r
+                               //!l && X.Timer.once( 0, X.Dom._timer_remove );\r
+                               //X.Dom._removalTextNodes[ l ] = node;\r
+                               //var str=[],p;\r
+                               //for( p in node ){\r
+                               //      str[str.length] = p;\r
+                               //};\r
+                               //alert( str.join( ',' ) + parent.innerHTML );\r
+                               //node.nodeValue = '';\r
+                               //parent.replaceChild( document.createElement( 'span' ), node );\r
+                               //var e;\r
+                               //var f = document.createDocumentFragment();\r
+                               //f.appendChild( e = document.createElement( 'span' ) );\r
+                               //f.replaceChild( node, e );\r
+                               //e.appendChild( f );\r
+                               //parent.appendChild( e = document.createElement( 'span' ) );\r
+                               //e.appendChild( node );\r
+                               //parent.removeChild( e );\r
+                               //node.parentNode = null;\r
+                               //document.body.appendChild( node );\r
+                               //parent.replaceChild( document.createComment( '' ), node );\r
+                               document.body.appendChild( node );\r
+                               return;\r
+                               if( parent.parentNode !== document.body ){\r
+                                       var clone = parent.cloneNode( true );\r
+                                       for( var i = 0, l = parent.childNodes.length; i < l; ++i ){\r
+                                               if( parent.childNodes[ i ] !== node ){\r
+                                                       clone.removeChild( clone.childNodes[ i ] );\r
+                                               };\r
+                                       };                                      \r
+                                       //parent.parentNode.insertBefore( clone, parent );\r
+                                       //parent.parentNode.removeChild( parent );\r
+                                       parent.parentNode.insertBefore( clone, parent );\r
+                                       parent.style.display = 'none';\r
+                                       if( xnode ){\r
+                                               xnode.parent.parent._rawNode = clone;\r
+                                       };\r
+                               } else {\r
+                                       // ignore\r
+                               };\r
+\r
+                       };\r
+                       //if( !node.ownerDocument ) alert( 'no owner' );\r
+               } else {\r
+                       //node.data = '';\r
+               };\r
+       };\r
+       \r
+       X.Dom._removalTextNodes = [];\r
+       \r
+       X.Dom._timer_remove = function(){\r
+               var nodes = X.Dom._removalTextNodes,\r
+                       i = 0, node;\r
+               while( i < 5 && nodes.length ){\r
+                       node = nodes.shift();\r
+                       if( node.parentNode ){\r
+                               //node.parentNode.removeChild( node );\r
+                               ++i;\r
+                       };\r
+               };\r
+               \r
+               //nodes.length && X.Timer.once( 1000, X.Dom._timer_remove );\r
+       };\r
+       \r
+} else\r
+if( X.UA.Opera7 ){\r
+\r
+       X.Dom._fixed_remove = function( node ){\r
+               if( node.nodeType === 1 || node.nodeType === 3 ){\r
+                       node.parentNode && node.parentNode.removeChild( node );\r
+               } else {\r
+                       //node.data = '';\r
+               };\r
        };\r
 };\r
 \r
@@ -30,14 +110,13 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT,
 (function(){\r
        var r    = Node.root,\r
                body = r._rawNode,\r
-               i, n = 0,\r
-               html,\r
+               copy, i, l, node, html,\r
                elmProgress;\r
        // TODO\r
        // textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける\r
-\r
+       //X.UA.MacIE && alert( body.innerHTML );\r
        // cleanup tree \r
-       X.UA.MacIE || (function/*cleanUpTree*/( elm, skip, head ){\r
+       (function/*cleanUpTree*/( elm, skip, head ){\r
                var nodes      = X.copyArray( elm.childNodes ),\r
                        i          = 0,\r
                        l          = nodes.length,\r
@@ -52,7 +131,7 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT,
                                                head.appendChild( node );\r
                                                continue;\r
                                        } else\r
-                                       if( X.Dom.cleanupTagNames[ tag ] ){\r
+                                       if( X.Dom._isCleanupTarget( node ) ){\r
                                                elm.removeChild( node );\r
                                                continue;\r
                                        } else {\r
@@ -75,18 +154,31 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT,
                                        // ブロック要素直下のスペースだけは削除??\r
                                default :\r
                                        //console.log( 'Remove type: ' + node.nodeType + ' value: ' + node.nodeValue );\r
-                                       if( !X.UA.Opera7 ){\r
+                                       if( !X.UA.Opera7 /*&& !X.UA.MacIE */ ){\r
                                                elm.removeChild( node );\r
                                        } else {\r
-                                               X.Dom._o7_remove( node );\r
+                                               X.Dom._fixed_remove( node );\r
                                        };\r
                                        //++count;\r
                        };\r
                };\r
-       })( body );\r
+       })( X.UA.MacIE ? ( copy = body.cloneNode( true ) ) : body );\r
 \r
-       // body の属性値の取得\r
-       html = body.innerHTML;\r
+       if( X.UA.MacIE ){\r
+               document.write( html = copy.innerHTML );\r
+       } else {\r
+               // body の属性値の取得\r
+               html = body.innerHTML;\r
+               \r
+               // Nokia s60 Safari\r
+               if( html === 'fastinnerhtml!' ){\r
+                       html = '';\r
+                       for( i = 0, l = body.childNodes.length; i < l; ++i ){\r
+                               node = body.childNodes[ i ];\r
+                               html += ( node.outerHTML || node.data );\r
+                       };\r
+               };              \r
+       };\r
        \r
        body.appendChild( elmProgress = document.createElement( 'div' ) );\r
        elmProgress.style.cssText = 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;';\r
@@ -226,10 +318,10 @@ X.Dom._bindElementToXnode =
                                elm = elems[ current.j ];\r
                                tag = elm.tagName && elm.tagName.toUpperCase();\r
                                if( ( elm.nodeType !== 1 && elm.nodeType !== 3 ) || tag === '!' || ( tag && tag.charAt( 0 ) === '/' ) ){\r
-                                       if( !X.UA.Opera7 ){\r
+                                       if( !X.UA.Opera7 && !X.UA.MacIE ){\r
                                                elm.parentNode.removeChild( elm );\r
                                        } else {\r
-                                               X.Dom._o7_remove( elm );\r
+                                               X.Dom._fixed_remove( elm );\r
                                        };\r
                                        continue;\r
                                };\r
@@ -238,15 +330,19 @@ X.Dom._bindElementToXnode =
                                        if( elm.nodeType === 3 ){\r
                                                if( !( text = elm.data ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
                                                        //alert( text.charCodeAt( 0 ) );\r
-                                                       if( !X.UA.Opera7 ){\r
+                                                       if( !X.UA.Opera7 && !X.UA.MacIE ){\r
                                                                elm.parentNode.removeChild( elm );\r
                                                        } else {\r
-                                                               X.Dom._o7_remove( elm );\r
+                                                               X.Dom._fixed_remove( elm );\r
                                                        };\r
                                                        continue;\r
                                                };\r
                                                alert( '1:[' +parent._tag + '>' +xnode._tag + '] !== ' + elm.nodeType + '\n' + ( elm.data ) );\r
                                        } else\r
+                                       if( X.Dom.moveToHead[ tag ] ){\r
+                                               alert( tag );\r
+                                               continue;\r
+                                       } else\r
                                        if( xnode._tag !== tag ){\r
                                                alert( '2:[' +parent._tag + '>' +xnode._tag + ' len:' + (xnode._xnodes ? xnode._xnodes.length : '' ) + '] !== ' + tag + ' ' + (elm.childNodes ? elm.childNodes.length : '' ) + '\n' + elm.outerHTML );\r
                                        } else {\r
@@ -262,7 +358,7 @@ X.Dom._bindElementToXnode =
                                                        xnode.attr( 'value', xnode.html() ).empty();\r
                                                        current.xtext = null;\r
                                                } else\r
-                                               if( !xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){ // ie で body 内の script が2度よばれるのに対処\r
+                                               if( X.Dom._isCleanupTarget( elm ) ){// !xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){ // ie で body 内の script が2度よばれるのに対処\r
                                                        //alert( '[' +parent._tag + '>' + xnode._tag + '] remove ... ' );\r
                                                        xnode.destroy();\r
                                                } else\r
@@ -385,7 +481,7 @@ X.Dom._bindElementToXnode =
                                        xnode._rawNode = elm;\r
                                        xnode._root    = parent._root;\r
                                        //xnode._tag     = X.Dom.DTD.TAG_FIX[ tag ] || tag;\r
-                                       if( !xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){\r
+                                       if( X.Dom._isCleanupTarget( elm ) ){ //!xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){\r
                                                xnode.destroy();\r
                                                break;\r
                                        };\r
index 8a356d0..933ada1 100644 (file)
@@ -354,7 +354,7 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                getAttr : function( name ){\r
                        var attrs   = this.attrObject || this.attrClass.prototype || X.UI.AttrClass,\r
                                support = this.supportAttrs[ name ],\r
-                               v;\r
+                v, type, list;\r
                        if( !support ) return;\r
                        \r
                        if( name.indexOf( 'border' ) === 0 ){\r
@@ -566,11 +566,19 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                mesure : function(){\r
                        var dirty = this.dirty,\r
                                w, h, xnode;\r
+                       \r
+                       if( dirty === X.UI.Dirty.CLEAN ){\r
+                               if( this.percentWidth || this.percentHeight ){\r
+                                       \r
+                               };\r
+                       };\r
+                       \r
                        switch( dirty ){\r
                                \r
                                case X.UI.Dirty.CONTENT : // コンテンツが変更された\r
-                               case X.UI.Dirty.FONT   : // フォントサイズが変更された\r
-                                       delete this.lastContentWidth;\r
+                               case X.UI.Dirty.FONT    : // フォントサイズが変更された\r
+                                       delete this.lastContentWidth;   \r
+                                       \r
                                case X.UI.Dirty.LAYOUT : // レイアウトの再計算が必要\r
                                \r
                                default : // TODO レイアウト崩れに対処 パフォーマンス悪い!\r
index 34846c0..d85c23f 100644 (file)
@@ -20,7 +20,7 @@ X.UI.Layout.Canvas = X.UI.Layout.create( {
        },\r
        \r
        calculate : function( data, isNeedsDetection, x, y, w, h ){\r
-               var uinodes, l, _x, _y, _w, _h, node;\r
+               var uinodes, l, i, _x, _y, _w, _h, node;\r
 \r
                data.preMesure( w, h );\r
                \r
index 87b2009..de9006f 100644 (file)
@@ -22,7 +22,8 @@ X.UI.Layout.Vertical = X.UI.Layout.create( {
                        uinodes = data.uinodes,\r
                        l       = uinodes && uinodes.length,            \r
                        childW, childH, gapY,\r
-                       i, _x, _y, _w, node;\r
+                       i, _x, _y, _w, node,\r
+            contentW, contentH, autoW, autoH, detectionPhase;\r
 \r
                data.preMesure( w, h );\r
                \r
index c29b084..fa9dbd2 100644 (file)
@@ -21,7 +21,8 @@ X.UI.Layout.Horizontal = X.UI.Layout.create( {
                        uinodes = data.uinodes,\r
                        l       = uinodes && uinodes.length,            \r
                        childW, childH, gapX,\r
-                       i, _x, _y, _h, node;\r
+                       i, _x, _y, _h, node,\r
+            contentW, contentH, autoW, autoH, detectionPhase;\r
 \r
                data.preMesure( w, h );\r
                \r