about summary refs log tree commit diff stats
path: root/src/layout
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2022-01-23 11:20:27 +0100
committerbptato <nincsnevem662@gmail.com>2022-01-23 11:20:27 +0100
commiteeebe788fef445e6fb7f92596a47238205e33a10 (patch)
tree87a06fe31cb3bc4259d1bcb4e1669c8819331229 /src/layout
parent8e1ccfe2f2809b5bbae2d311e1b30f9ffe1833f6 (diff)
downloadchawan-eeebe788fef445e6fb7f92596a47238205e33a10.tar.gz
Fix ::before pseudo elem positioning
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/engine.nim33
1 files changed, 19 insertions, 14 deletions
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