about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-01-23 19:23:24 +0100
committerbptato <nincsnevem662@gmail.com>2025-01-23 19:48:17 +0100
commite0b4b65b49eae641284fe8a87c25f506a1bac17a (patch)
tree5aa96f0d7d05881c8ec9ae49c26235659251be43 /src
parent6cf4612ff64ca154d837950392679177c2273ad9 (diff)
downloadchawan-e0b4b65b49eae641284fe8a87c25f506a1bac17a.tar.gz
chadombuilder: perform microtask checkpoint on script insertion
Diffstat (limited to 'src')
-rw-r--r--src/html/chadombuilder.nim12
-rw-r--r--src/html/dom.nim20
-rw-r--r--src/html/env.nim8
3 files changed, 26 insertions, 14 deletions
diff --git a/src/html/chadombuilder.nim b/src/html/chadombuilder.nim
index 676ae0d8..5f2913cf 100644
--- a/src/html/chadombuilder.nim
+++ b/src/html/chadombuilder.nim
@@ -200,13 +200,19 @@ proc associateWithFormImpl(builder: ChaDOMBuilder;
 
 proc elementPoppedImpl(builder: ChaDOMBuilder; element: Node) =
   let element = Element(element)
+  let document = builder.document
   if element of HTMLTextAreaElement:
     element.resetElement()
   elif element of HTMLScriptElement:
-    assert builder.poppedScript == nil or not builder.document.scriptingEnabled
+    if document.scriptingEnabled:
+      assert builder.poppedScript == nil
+      inc document.throwOnDynamicMarkupInsertion
+      #TODO I think this has to be moved for custom elements
+      document.window.performMicrotaskCheckpoint()
+      dec document.throwOnDynamicMarkupInsertion
     builder.poppedScript = HTMLScriptElement(element)
   elif element of SVGSVGElement:
-    let window = element.document.window
+    let window = document.window
     if window != nil:
       let svg = SVGSVGElement(element)
       window.loadResource(svg)
@@ -291,7 +297,6 @@ proc parseBuffer*(wrapper: HTML5ParserWrapper; buffer: openArray[char]):
   # set insertion point for when it's needed
   var ip = wrapper.parser.getInsertionPoint()
   while res == PRES_SCRIPT:
-    #TODO microtask
     let script = builder.poppedScript
     builder.poppedScript = nil
     document.writeBuffers.add(DocumentWriteBuffer())
@@ -328,7 +333,6 @@ proc parseDocumentWriteChunk(wrapper: RootRef) =
     document.writeBuffers.add(DocumentWriteBuffer())
     while true:
       buffer.i += wrapper.parser.getInsertionPoint()
-      #TODO microtask
       let script = builder.poppedScript
       builder.poppedScript = nil
       script.prepare()
diff --git a/src/html/dom.nim b/src/html/dom.nim
index afaa33dc..eef93341 100644
--- a/src/html/dom.nim
+++ b/src/html/dom.nim
@@ -115,6 +115,8 @@ type
     svgCache*: Table[string, SVGSVGElement]
     images*: bool
     styling*: bool
+    autofocus*: bool
+    inMicrotaskCheckpoint: bool
     # ID of the next image
     imageId: int
     # list of streams that must be closed for canvas rendering on load
@@ -122,7 +124,6 @@ type
     imageTypes*: Table[string, string]
     userAgent*: string
     referrer* {.jsget.}: string
-    autofocus*: bool
     maybeRestyle*: proc(element: Element)
     performance* {.jsget.}: Performance
 
@@ -210,7 +211,7 @@ type
     readyState* {.jsget.}: DocumentReadyState
     # document.write
     ignoreDestructiveWrites: int
-    throwOnDynamicMarkupInsertion: int
+    throwOnDynamicMarkupInsertion*: int
     activeParserWasAborted: bool
     writeBuffers*: seq[DocumentWriteBuffer]
     styleDependencies: array[DependencyType, DependencyMap]
@@ -4264,6 +4265,21 @@ proc loadResource*(window: Window; svg: SVGSVGElement) =
   )
   window.pendingResources.add(p)
 
+proc runJSJobs*(window: Window) =
+  while true:
+    let r = window.jsrt.runJSJobs()
+    if r.isSome:
+      break
+    let ctx = r.error
+    ctx.writeException(window.console.err)
+
+proc performMicrotaskCheckpoint*(window: Window) =
+  if window.inMicrotaskCheckpoint:
+    return
+  window.inMicrotaskCheckpoint = true
+  window.runJSJobs()
+  window.inMicrotaskCheckpoint = false
+
 proc reflectEvent(element: Element; target: EventTarget;
     name, ctype: StaticAtom; value: string) =
   let document = element.document
diff --git a/src/html/env.nim b/src/html/env.nim
index d4735a01..e5ec1ad9 100644
--- a/src/html/env.nim
+++ b/src/html/env.nim
@@ -395,14 +395,6 @@ proc addScripting*(window: Window) =
   ctx.addEncodingModule()
   ctx.addPerformanceModule()
 
-proc runJSJobs*(window: Window) =
-  while true:
-    let r = window.jsrt.runJSJobs()
-    if r.isSome:
-      break
-    let ctx = r.error
-    ctx.writeException(window.console.err)
-
 proc newWindow*(scripting: ScriptingMode; images, styling, autofocus: bool;
     attrsp: ptr WindowAttributes; factory: CAtomFactory; loader: FileLoader;
     url: URL; urandom: PosixStream; imageTypes: Table[string, string];