about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-05-28 01:02:08 +0200
committerbptato <nincsnevem662@gmail.com>2024-05-28 01:02:08 +0200
commit03bbf7f451a638e2d1b4dff7ef659d70d576ff01 (patch)
treed2089990264d62c531d93cdc603418a73c9d4a53
parent6340e6a2c041abb9273241897c485aabe87ff5dd (diff)
downloadchawan-03bbf7f451a638e2d1b4dff7ef659d70d576ff01.tar.gz
stylednode: remove `text' field
This avoids some unnecessary string copying.
-rw-r--r--src/css/cascade.nim10
-rw-r--r--src/css/stylednode.nim12
-rw-r--r--src/html/dom.nim2
-rw-r--r--src/layout/engine.nim12
4 files changed, 20 insertions, 16 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim
index ab8e52de..cd80fb96 100644
--- a/src/css/cascade.nim
+++ b/src/css/cascade.nim
@@ -365,16 +365,18 @@ proc applyRulesFrameInvalid(frame: CascadeFrame; ua, user: CSSStylesheet;
           styledPseudo.children.add(styledPseudo.newStyledReplacement(content))
         styledParent.children.add(styledPseudo)
     of peInputText:
-      let content = HTMLInputElement(styledParent.node).inputString()
-      if content.len > 0:
+      let s = HTMLInputElement(styledParent.node).inputString()
+      if s.len > 0:
+        let content = styledParent.node.document.newText(s)
         let styledText = styledParent.newStyledText(content)
         # Note: some pseudo-elements (like input text) generate text nodes
         # directly, so we have to cache them like this.
         styledText.pseudo = pseudo
         styledParent.children.add(styledText)
     of peTextareaText:
-      let content = HTMLTextAreaElement(styledParent.node).textAreaString()
-      if content.len > 0:
+      let s = HTMLTextAreaElement(styledParent.node).textAreaString()
+      if s.len > 0:
+        let content = styledParent.node.document.newText(s)
         let styledText = styledParent.newStyledText(content)
         styledText.pseudo = pseudo
         styledParent.children.add(styledText)
diff --git a/src/css/stylednode.nim b/src/css/stylednode.nim
index 4d14123d..0cfc8c64 100644
--- a/src/css/stylednode.nim
+++ b/src/css/stylednode.nim
@@ -47,7 +47,7 @@ type
     pseudo*: PseudoElem
     case t*: StyledType
     of stText:
-      text*: string
+      discard
     of stElement:
       computed*: CSSComputedValues
       children*: seq[StyledNode]
@@ -57,13 +57,16 @@ type
       # replaced elements: quotes, or (TODO) markers, images
       content*: CSSContent
 
+func textData*(styledNode: StyledNode): string =
+  return Text(styledNode.node).data
+
 # For debugging
 func `$`*(node: StyledNode): string =
   if node == nil:
     return "nil"
   case node.t
   of stText:
-    return "#text " & node.text
+    return "#text " & node.textData
   of stElement:
     if node.node != nil:
       return $node.node
@@ -181,11 +184,8 @@ func newStyledElement*(parent: StyledNode; pseudo: PseudoElem;
     parent: parent
   )
 
-func newStyledText*(parent: StyledNode; text: string): StyledNode =
-  return StyledNode(t: stText, text: text, parent: parent)
-
 func newStyledText*(parent: StyledNode; text: Text): StyledNode =
-  return StyledNode(t: stText, text: text.data, node: text, parent: parent)
+  return StyledNode(t: stText, node: text, parent: parent)
 
 func newStyledReplacement*(parent: StyledNode; content: CSSContent):
     StyledNode =
diff --git a/src/html/dom.nim b/src/html/dom.nim
index 4f8b7cef..af839cea 100644
--- a/src/html/dom.nim
+++ b/src/html/dom.nim
@@ -2467,7 +2467,7 @@ func getSrc*(this: HTMLVideoElement|HTMLAudioElement): string =
         break
   src
 
-func newText(document: Document; data: string): Text =
+func newText*(document: Document; data: string): Text =
   return Text(
     document_internal: document,
     data: data,
diff --git a/src/layout/engine.nim b/src/layout/engine.nim
index f9a97754..0f98417f 100644
--- a/src/layout/engine.nim
+++ b/src/layout/engine.nim
@@ -2871,7 +2871,7 @@ proc buildInlineBoxes(ctx: var InnerBlockContext; styledNode: StyledNode) =
         ctx.iflush()
         lbox = ctx.reconstructInlineParents()
         ctx.ibox = lbox
-      lbox.text.add(child.text)
+      lbox.text.add(child.textData)
     of stReplacement:
       ctx.buildReplacement(child, styledNode)
   if ctx.ibox != lbox:
@@ -2909,8 +2909,9 @@ proc buildInnerBlockBox(ctx: var InnerBlockContext) =
       ctx.iflush()
       ctx.buildFromElem(child)
     of stText:
-      if canBuildAnonymousInline(ctx.blockgroup, box.computed, child.text):
-        ctx.buildAnonymousInlineText(child.text, ctx.styledNode)
+      let text = child.textData
+      if canBuildAnonymousInline(ctx.blockgroup, box.computed, text):
+        ctx.buildAnonymousInlineText(text, ctx.styledNode)
     of stReplacement:
       ctx.buildReplacement(child, ctx.styledNode)
   ctx.iflush()
@@ -2962,8 +2963,9 @@ proc buildFlex(styledNode: StyledNode; lctx: LayoutContext;
       else:
         ctx.buildFromElem(child)
     of stText:
-      if ctx.blockgroup.canBuildAnonymousInline(box.computed, child.text):
-        ctx.buildAnonymousInlineText(child.text, ctx.styledNode)
+      let text = child.textData
+      if ctx.blockgroup.canBuildAnonymousInline(box.computed, text):
+        ctx.buildAnonymousInlineText(text, ctx.styledNode)
     of stReplacement:
       ctx.buildReplacement(child, ctx.styledNode)
   ctx.iflush()