about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/css/cascade.nim11
-rw-r--r--src/layout/engine.nim33
2 files changed, 26 insertions, 18 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim
index dc11628f..0e481a10 100644
--- a/src/css/cascade.nim
+++ b/src/css/cascade.nim
@@ -25,13 +25,12 @@ proc applyProperty(elem: Element, d: CSSDeclaration, pseudo: PseudoElem) =
   else:
     parent = rootProperties()
 
-  case pseudo
-  of PSEUDO_NONE:
+  if pseudo == PSEUDO_NONE:
     elem.css.applyValue(parent, d)
-  of PSEUDO_BEFORE, PSEUDO_AFTER:
+  else:
     if elem.pseudo[pseudo] == nil:
       elem.pseudo[pseudo] = elem.css.inheritProperties()
-    elem.pseudo[pseudo].applyValue(parent, d)
+    elem.pseudo[pseudo].applyValue(elem.css, d)
 
   elem.cssapplied = true
 
@@ -111,10 +110,14 @@ proc checkRendered(element: Element, prev: CSSSpecifiedValues, ppseudo: array[PS
   if element.rendered:
     for p in PSEUDO_BEFORE..PSEUDO_AFTER:
       if ppseudo[p] != element.pseudo[p] and ppseudo[p] == nil:
+        if element.parentElement != nil:
+          element.parentElement.rendered = false
         element.rendered = false
         return
     for t in CSSPropertyType:
       if not element.css[t].equals(prev[t]):
+        if element.parentElement != nil:
+          element.parentElement.rendered = false
         element.rendered = false
         return
     for p in PSEUDO_BEFORE..PSEUDO_AFTER:
diff --git a/src/layout/engine.nim b/src/layout/engine.nim
index a0046f36..d11f1093 100644
--- a/src/layout/engine.nim
+++ b/src/layout/engine.nim
@@ -368,11 +368,16 @@ proc getTextBox(box: CSSBox): InlineBox =
   result.inlinelayout = true
   result.specified = box.specified.inheritProperties()
 
-proc getPseudoBox(specified: CSSSpecifiedValues): CSSBox =
+proc getPseudoBox(bctx: BlockContext, specified: CSSSpecifiedValues): CSSBox =
   let box = getBox(specified)
 
   if box == nil:
     return nil
+
+  if specified{"display"} in {DISPLAY_BLOCK, DISPLAY_LIST_ITEM}:
+    let box = BlockBox(box)
+    box.bctx = bctx.newBlockContext(box)
+
   box.inlinelayout = true
   if specified{"content"}.len > 0:
     let content = getTextBox(box)
@@ -442,13 +447,6 @@ proc generateBox(elem: Element, viewport: Viewport, bctx: BlockContext = nil): C
     marker.text.add(elem.css{"list-style-type"}.listMarker(ordinalvalue))
     add_box(marker)
 
-  let before = elem.pseudo[PSEUDO_BEFORE]
-  if before != nil:
-    let bbox = getPseudoBox(before)
-    bbox.node = elem
-    if bbox != nil:
-      add_box(bbox)
-
   for child in elem.childNodes:
     case child.nodeType
     of ELEMENT_NODE:
@@ -458,10 +456,23 @@ proc generateBox(elem: Element, viewport: Viewport, bctx: BlockContext = nil): C
         ibox = box.getTextBox()
         ibox.newline = true
 
+      let before = elem.pseudo[PSEUDO_BEFORE]
+      if before != nil:
+        let bbox = bctx.getPseudoBox(before)
+        bbox.node = elem
+        if bbox != nil:
+          add_box(bbox)
+
       let cbox = elem.generateBox(viewport, bctx)
       if cbox != nil:
         add_ibox()
         add_box(cbox)
+
+      let after = elem.pseudo[PSEUDO_AFTER]
+      if after != nil:
+        let abox = bctx.getPseudoBox(after)
+        if abox != nil:
+          add_box(abox)
     of TEXT_NODE:
       let text = Text(child)
       # Don't generate empty anonymous inline blocks between block boxes
@@ -475,12 +486,6 @@ proc generateBox(elem: Element, viewport: Viewport, bctx: BlockContext = nil): C
     else: discard
   add_ibox()
 
-  let after = elem.pseudo[PSEUDO_AFTER]
-  if after != nil:
-    let abox = getPseudoBox(after)
-    if abox != nil:
-      add_box(abox)
-
   viewport.map[elem.uid] = box
 
   return box