svnno****@sourc*****
svnno****@sourc*****
2011年 10月 28日 (金) 22:31:31 JST
Revision: 3040 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=3040 Author: dhrname Date: 2011-10-28 22:31:30 +0900 (Fri, 28 Oct 2011) Log Message: ----------- getComputedStyleメソッドをリスト結合方式から、クロージャを活用したリンク方式に変更した Modified Paths: -------------- branches/08x/088/org/w3c/dom/css.js Modified: branches/08x/088/org/w3c/dom/css.js =================================================================== --- branches/08x/088/org/w3c/dom/css.js 2011-10-26 13:51:32 UTC (rev 3039) +++ branches/08x/088/org/w3c/dom/css.js 2011-10-28 13:31:30 UTC (rev 3040) @@ -745,50 +745,50 @@ /*キャッシュがあれば、それを返す*/ return (elt._currentStyle); } - var s = new CSSStyleDeclaration(); + var s = new CSSStyleDeclaration(), + ct, p; elt._currentStyle = s; //リストを連結することによって、カスケーディングを実現する var pelt = elt.parentNode; if (pelt) { - var p = this.getComputedStyle(pelt, pseudoElt)._list; + ct = this.getComputedStyle(pelt, pseudoElt); + p = ct._list; } else { - var p = {length:0, _opacity:1, _fontSize:12}; + ct = null + p = {length:0, _opacity:1, _fontSize:12}; } - var q = s._list; - if (!!elt.style) { - var estl = elt.style._list, easl = elt._attributeStyle._list, csi = /*CSSValue.CSS_INHERIT*/ 0; - for (var i=0,eli=estl.length;i<eli;++i) { - q[q.length] = estl[i]; + var td = this._defaultCSS; //デフォルト値の設定 + //クロージャを利用して、カスケーディングを実現する + s.getPropertyCSSValue = function( /*string*/ propertyName) { + if (elt._runtimeStyle && elt._runtimeStyle[propertyName]) { + var css = elt._runtimeStyle.getPropertyCSSValue(propertyName); } - for (var i=0,eli=easl.length;i<eli;++i) { - q[q.length] = easl[i]; //プレゼンテーション属性を結びつける + if (elt.style && elt.style[propertyName]) { + css = elt.style.getPropertyCSSValue(propertyName); } - estl = easl = void 0; - //スタイルシートのルールを結びつける - if (elt._rules) { + if (!css && elt._rules) { + //スタイルシートのルールを探す for (var i=0,eli=elt._rules.length;i<eli;++i) { - var ei = elt._rules[i].style._list; - for (var j=0,esli=ei.length;j<esli;++j) { - q[q.length] = ei[j]; - } + elt._rules[i].style[propertyName] && (css = elt._rules[i].style.getPropertyCSSValue(propertyName)); } } - //inheritの値があれば、削除しておく - for (var i=0,qli=q.length;i<qli;++i) { - if (q[i].cssValueType === csi) { - q.splice(i, 1); - --qli; + if (!css && elt._attributeStyle && elt._attributeStyle[propertyName]) { + //プレゼンテーション属性を探す + css = elt._attributeStyle.getPropertyCSSValue(propertyName); + } + if (!css || (css.cssValueType === /*CSSValue.CSS_INHERIT*/ 0)) { + //ctは親要素のcomputedStyle + ct && (css = ct.getPropertyCSSValue(propertyName)); + if (!css || (css.cssValueType === /*CSSValue.CSS_INHERIT*/ 0)) { + //デフォルト値を探す + td && (css = td[propertyName]); } } - } - for (var i=0,pli=p.length;i<pli;++i) { - q[q.length] = p[i]; - } - if (elt._runtimeStyle) { - q = elt._runtimeStyle._list.concat(q); - } - s._def = this._defaultCSS; //デフォルト値の設定 - s._list = q; + if (css && ((css.paintType === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) || (css.colorType === /*SVGColor.SVG_COLORTYPE_CURRENTCOLOR*/ 3))) { + css.setRGBColor && css.setRGBColor(s.getPropertyCSSValue("color")); + } + return css; + }; if (!!elt.style) { var eso = elt.style._list._opacity || elt._attributeStyle._list._opacity; } else { @@ -796,7 +796,7 @@ } s._list._opacity = p._opacity * (eso || 1); s._list._fontSize = p._fontSize; - pelt = eso = p = q = void 0; + pelt = eso = p = void 0; s._document = elt.ownerDocument; return s; };