about summary refs log tree commit diff stats
path: root/src/server/buffer.nim
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-01-09 20:00:05 +0100
committerbptato <nincsnevem662@gmail.com>2025-01-09 20:00:05 +0100
commit36c280848e85595166e51bacb215a4d1eb550e0d (patch)
tree1a7c8f4d8bd1865cad0ae052045c3a641c0d573c /src/server/buffer.nim
parent86129e41a258cdbab4d9cccd86709e2ab02a3645 (diff)
downloadchawan-36c280848e85595166e51bacb215a4d1eb550e0d.tar.gz
buffer: make iframes clickable
better than nothing
Diffstat (limited to 'src/server/buffer.nim')
-rw-r--r--src/server/buffer.nim19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/server/buffer.nim b/src/server/buffer.nim
index d32e96c7..43d2f689 100644
--- a/src/server/buffer.nim
+++ b/src/server/buffer.nim
@@ -332,7 +332,7 @@ func getTitleAttr(buffer: Buffer; element: Element): string =
 
 const ClickableElements = {
   TAG_A, TAG_INPUT, TAG_OPTION, TAG_BUTTON, TAG_TEXTAREA, TAG_LABEL,
-  TAG_VIDEO, TAG_AUDIO
+  TAG_VIDEO, TAG_AUDIO, TAG_IFRAME
 }
 
 proc isClickable(element: Element): bool =
@@ -401,6 +401,12 @@ proc getClickHover(buffer: Buffer; element: Element): string =
         let url = clickable.document.parseURL(src)
         if url.isSome:
           return $url.get
+    elif clickable of HTMLIFrameElement:
+      let src = clickable.attr(satSrc)
+      if src != "":
+        let url = clickable.document.parseURL(src)
+        if url.isSome:
+          return $url.get
   ""
 
 proc getCachedImageHover(buffer: Buffer; element: Element): string =
@@ -1546,6 +1552,15 @@ proc click(buffer: Buffer; video: HTMLVideoElement): ClickResult =
       )
   return ClickResult(repaint: repaint)
 
+proc click(buffer: Buffer; iframe: HTMLIFrameElement): ClickResult =
+  let repaint = buffer.restoreFocus()
+  let src = iframe.attr(satSrc)
+  if src != "":
+    let url = iframe.document.parseURL(src)
+    if url.isSome:
+      return ClickResult(repaint: repaint, open: newRequest(url.get))
+  return ClickResult(repaint: repaint)
+
 const InputTypePrompt = [
   itText: "TEXT",
   itButton: "",
@@ -1632,6 +1647,8 @@ proc click(buffer: Buffer; clickable: Element): ClickResult =
     return buffer.click(HTMLAudioElement(clickable))
   of TAG_VIDEO:
     return buffer.click(HTMLVideoElement(clickable))
+  of TAG_IFRAME:
+    return buffer.click(HTMLIFrameElement(clickable))
   else:
     return ClickResult(repaint: buffer.restoreFocus())