diff options
author | bptato <nincsnevem662@gmail.com> | 2025-01-23 19:23:24 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2025-01-23 19:48:17 +0100 |
commit | e0b4b65b49eae641284fe8a87c25f506a1bac17a (patch) | |
tree | 5aa96f0d7d05881c8ec9ae49c26235659251be43 /src | |
parent | 6cf4612ff64ca154d837950392679177c2273ad9 (diff) | |
download | chawan-e0b4b65b49eae641284fe8a87c25f506a1bac17a.tar.gz |
chadombuilder: perform microtask checkpoint on script insertion
Diffstat (limited to 'src')
-rw-r--r-- | src/html/chadombuilder.nim | 12 | ||||
-rw-r--r-- | src/html/dom.nim | 20 | ||||
-rw-r--r-- | src/html/env.nim | 8 |
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]; |