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;
};