[Sie-announce] SIEコード [3040] getComputedStyleメソッドをリスト結合方式から、クロージャを活用したリンク方式に変更した

Back to archive index

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




Sie-announce メーリングリストの案内
Back to archive index