about summary refs log tree commit diff stats
path: root/src/css
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2022-07-28 18:55:13 +0200
committerbptato <nincsnevem662@gmail.com>2022-07-28 18:57:43 +0200
commit053e1ac019bf48e1932af9edabec150f60ec467f (patch)
tree70ed1b7ffa463e6cefc86ac0a3d5271e49bc1c73 /src/css
parentdd9cb39c7d6adfa02feb181dd629bb9a93b7250c (diff)
downloadchawan-053e1ac019bf48e1932af9edabec150f60ec467f.tar.gz
Fix cascading bugs & performance issues
Diffstat (limited to 'src/css')
-rw-r--r--src/css/cascade.nim13
-rw-r--r--src/css/stylednode.nim6
-rw-r--r--src/css/values.nim2
3 files changed, 16 insertions, 5 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim
index 25866ac0..9d2e9d53 100644
--- a/src/css/cascade.nim
+++ b/src/css/cascade.nim
@@ -174,7 +174,7 @@ proc applyRules(document: Document, ua, user: CSSStylesheet, cachedTree: StyledN
   styledStack.add((nil, document.html, PSEUDO_NONE, cachedTree))
 
   while styledStack.len > 0:
-    let (styledParent, child, pseudo, cachedChild) = styledStack.pop()
+    var (styledParent, child, pseudo, cachedChild) = styledStack.pop()
 
     # Remove stylesheets on nil
     if pseudo == PSEUDO_NONE and child == nil:
@@ -200,6 +200,7 @@ proc applyRules(document: Document, ua, user: CSSStylesheet, cachedTree: StyledN
       else:
         styledParent.children.add(styledChild)
     else:
+      cachedChild = nil
       if pseudo != PSEUDO_NONE:
         let (ua, user, authordecls) = styledParent.calcRules(ua, user, author)
         case pseudo
@@ -255,7 +256,12 @@ proc applyRules(document: Document, ua, user: CSSStylesheet, cachedTree: StyledN
             if it.t == STYLED_ELEMENT and it.pseudo == ps:
               cached = it
               break
-          styledStack.add((styledParent, nil, ps, cached))
+          # When calculating pseudo-element rules, their dependencies are added
+          # to their parent's dependency list, which in turn invalidates the
+          # parent and thus recalculates all pseudo-elements.
+          # In other words, we can just do this:
+          if cached != nil:
+            styledStack.add((styledParent, nil, ps, cached))
         else:
           styledStack.add((styledParent, nil, ps, nil))
 
@@ -271,7 +277,8 @@ proc applyRules(document: Document, ua, user: CSSStylesheet, cachedTree: StyledN
       stack_append styledChild, PSEUDO_AFTER
 
       for i in countdown(elem.childNodes.high, 0):
-        stack_append styledChild, elem.childNodes[i]
+        if elem.childNodes[i].nodeType in {ELEMENT_NODE, TEXT_NODE}:
+          stack_append styledChild, elem.childNodes[i]
 
       if elem.tagType == TAG_INPUT:
         stack_append styledChild, PSEUDO_INPUT_TEXT
diff --git a/src/css/stylednode.nim b/src/css/stylednode.nim
index 6c306f21..8586bee4 100644
--- a/src/css/stylednode.nim
+++ b/src/css/stylednode.nim
@@ -93,7 +93,7 @@ func isValid*(styledNode: StyledNode): bool =
       of DEPEND_CHECKED:
         if child.depends.prev[d] != elem.checked:
           return false
-  return styledNode.parent == nil or styledNode.parent.isValid()
+  return true
 
 proc applyDependValues*(styledNode: StyledNode) =
   let elem = Element(styledNode.node)
@@ -104,9 +104,11 @@ proc applyDependValues*(styledNode: StyledNode) =
 func newStyledElement*(parent: StyledNode, element: Element, computed: CSSComputedValues, reg: sink DependencyInfo): StyledNode =
   result = StyledNode(t: STYLED_ELEMENT, computed: computed, node: element, parent: parent)
   result.depends = reg
+  result.parent = parent
 
 func newStyledElement*(parent: StyledNode, element: Element): StyledNode =
   result = StyledNode(t: STYLED_ELEMENT, node: element, parent: parent)
+  result.parent = parent
 
 # Root
 func newStyledElement*(element: Element): StyledNode =
@@ -118,6 +120,8 @@ func newStyledElement*(parent: StyledNode, pseudo: PseudoElem, computed: CSSComp
 
 func newStyledText*(parent: StyledNode, text: string): StyledNode =
   result = StyledNode(t: STYLED_TEXT, text: text, parent: parent)
+  result.parent = parent
 
 func newStyledText*(parent: StyledNode, text: Text): StyledNode =
   result = StyledNode(t: STYLED_TEXT, text: text.data, node: text, parent: parent)
+  result.parent = parent
diff --git a/src/css/values.nim b/src/css/values.nim
index ec172e8d..9c1a93c9 100644
--- a/src/css/values.nim
+++ b/src/css/values.nim
@@ -241,7 +241,7 @@ func em_to_px(em: float64, term: TermAttributes): int =
 func ch_to_px(ch: float64, term: TermAttributes): int =
   int(ch * float64(term.ppc))
 
-# 水 width, we assume it's 2 chars (TODO make width() work at comptime)
+# 水 width, we assume it's 2 chars
 func ic_to_px(ic: float64, term: TermAttributes): int =
   int(ic * float64(term.ppc) * 2)