diff options
author | bptato <nincsnevem662@gmail.com> | 2022-07-28 18:55:13 +0200 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2022-07-28 18:57:43 +0200 |
commit | 053e1ac019bf48e1932af9edabec150f60ec467f (patch) | |
tree | 70ed1b7ffa463e6cefc86ac0a3d5271e49bc1c73 /src/css | |
parent | dd9cb39c7d6adfa02feb181dd629bb9a93b7250c (diff) | |
download | chawan-053e1ac019bf48e1932af9edabec150f60ec467f.tar.gz |
Fix cascading bugs & performance issues
Diffstat (limited to 'src/css')
-rw-r--r-- | src/css/cascade.nim | 13 | ||||
-rw-r--r-- | src/css/stylednode.nim | 6 | ||||
-rw-r--r-- | src/css/values.nim | 2 |
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) |