about summary refs log tree commit diff stats
path: root/src/local
diff options
context:
space:
mode:
Diffstat (limited to 'src/local')
-rw-r--r--src/local/container.nim47
-rw-r--r--src/local/pager.nim76
2 files changed, 60 insertions, 63 deletions
diff --git a/src/local/container.nim b/src/local/container.nim
index 90e00ebb..b64606a1 100644
--- a/src/local/container.nim
+++ b/src/local/container.nim
@@ -1,5 +1,4 @@
 import std/deques
-import std/net
 import std/options
 import std/os
 import std/posix
@@ -208,8 +207,8 @@ proc clone*(container: Container; newurl: URL; loader: FileLoader):
   let ssock = initServerSocket(loader.sockDir, loader.sockDirFd,
     loader.clientPid)
   SocketStream(container.iface.stream.source)
-    .sendFileHandle(FileHandle(ssock.sock.getFd()))
-  ssock.sock.close()
+    .sendFileHandle(FileHandle(ssock.getFd()))
+  ssock.close(unlink = false)
   return p.then(proc(pid: int): Container =
     if pid == -1:
       return nil
@@ -1371,6 +1370,23 @@ proc setLoadInfo(container: Container; msg: string) =
   container.loadinfo = msg
   container.triggerEvent(cetSetLoadInfo)
 
+proc onReadLine(container: Container; rl: ReadLineResult) =
+  case rl.t
+  of rltText:
+    container.triggerEvent(ContainerEvent(
+      t: cetReadLine,
+      prompt: rl.prompt,
+      value: rl.value,
+      password: rl.hide
+    ))
+  of rltArea:
+    container.triggerEvent(ContainerEvent(
+      t: cetReadArea,
+      tvalue: rl.value
+    ))
+  of rltFile:
+    container.triggerEvent(ContainerEvent(t: cetReadFile))
+
 #TODO this should be called with a timeout.
 proc onload(container: Container; res: int) =
   if container.loadState == lsCanceled:
@@ -1380,13 +1396,15 @@ proc onload(container: Container; res: int) =
     container.setLoadInfo("")
     container.triggerEvent(cetStatus)
     container.triggerEvent(cetLoaded)
-    if cfHasStart notin container.flags and container.url.anchor != "":
+    if cfHasStart notin container.flags and (container.url.anchor != "" or
+        container.config.autofocus):
       container.requestLines().then(proc(): Promise[GotoAnchorResult] =
         return container.iface.gotoAnchor()
       ).then(proc(res: GotoAnchorResult) =
-        if res.isSome:
-          let res = res.get
+        if res.found:
           container.setCursorXYCenter(res.x, res.y)
+          if res.focus != nil:
+            container.onReadLine(res.focus)
       )
     else:
       container.needslines = true
@@ -1522,22 +1540,7 @@ proc onclick(container: Container; res: ClickResult; save: bool) =
   if res.select.isSome and not save:
     container.displaySelect(res.select.get)
   if res.readline.isSome:
-    let rl = res.readline.get
-    case rl.t
-    of rltText:
-      container.triggerEvent(ContainerEvent(
-        t: cetReadLine,
-        prompt: rl.prompt,
-        value: rl.value,
-        password: rl.hide
-      ))
-    of rltArea:
-      container.triggerEvent(ContainerEvent(
-        t: cetReadArea,
-        tvalue: rl.value
-      ))
-    of rltFile:
-      container.triggerEvent(ContainerEvent(t: cetReadFile))
+    container.onReadLine(res.readline.get)
 
 proc click*(container: Container) {.jsfunc.} =
   if container.select.open:
diff --git a/src/local/pager.nim b/src/local/pager.nim
index 48856837..16cd20a0 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -952,16 +952,28 @@ proc windowChange*(pager: Pager) =
 proc applySiteconf(pager: Pager; url: var URL; charsetOverride: Charset;
     loaderConfig: var LoaderClientConfig): BufferConfig =
   let host = url.host
-  var referer_from = false
-  var cookieJar: CookieJar = nil
-  var headers = newHeaders(pager.config.network.default_headers)
-  var scripting = false
-  var images = false
-  var charsets = pager.config.encoding.document_charset
-  var userstyle = pager.config.css.stylesheet
-  var proxy = pager.config.network.proxy
   let ctx = pager.jsctx
-  var insecureSSLNoVerify = false
+  var res = BufferConfig(
+    userstyle: pager.config.css.stylesheet,
+    referer_from: false,
+    scripting: false,
+    charsets: pager.config.encoding.document_charset,
+    images: false,
+    isdump: pager.config.start.headless,
+    charsetOverride: charsetOverride,
+    protocol: pager.config.protocol
+  )
+  loaderConfig = LoaderClientConfig(
+    defaultHeaders: newHeaders(pager.config.network.default_headers),
+    cookiejar: nil,
+    proxy: pager.config.network.proxy,
+    filter: newURLFilter(
+      scheme = some(url.scheme),
+      allowschemes = @["data", "cache"],
+      default = true
+    ),
+    insecureSSLNoVerify: false
+  )
   for sc in pager.config.siteconf:
     if sc.url.isSome and not sc.url.get.match($url):
       continue
@@ -987,47 +999,29 @@ proc applySiteconf(pager: Pager; url: var URL; charsetOverride: Charset;
         if jarid notin pager.cookiejars:
           pager.cookiejars[jarid] = newCookieJar(url,
             sc.third_party_cookie)
-        cookieJar = pager.cookiejars[jarid]
+        loaderConfig.cookieJar = pager.cookiejars[jarid]
       else:
-        cookieJar = nil # override
+        loaderConfig.cookieJar = nil # override
     if sc.scripting.isSome:
-      scripting = sc.scripting.get
+      res.scripting = sc.scripting.get
     if sc.referer_from.isSome:
-      referer_from = sc.referer_from.get
+      res.referer_from = sc.referer_from.get
     if sc.document_charset.len > 0:
-      charsets = sc.document_charset
+      res.charsets = sc.document_charset
     if sc.images.isSome:
-      images = sc.images.get
+      res.images = sc.images.get
     if sc.stylesheet.isSome:
-      userstyle &= "\n"
-      userstyle &= sc.stylesheet.get
+      res.userstyle &= "\n"
+      res.userstyle &= sc.stylesheet.get
     if sc.proxy.isSome:
-      proxy = sc.proxy.get
+      loaderConfig.proxy = sc.proxy.get
     if sc.default_headers != nil:
-      headers = newHeaders(sc.default_headers[])
+      loaderConfig.defaultHeaders = newHeaders(sc.default_headers[])
     if sc.insecure_ssl_no_verify.isSome:
-      insecureSSLNoVerify = sc.insecure_ssl_no_verify.get
-  loaderConfig = LoaderClientConfig(
-    defaultHeaders: headers,
-    cookiejar: cookieJar,
-    proxy: proxy,
-    filter: newURLFilter(
-      scheme = some(url.scheme),
-      allowschemes = @["data", "cache"],
-      default = true
-    ),
-    insecureSSLNoVerify: insecureSSLNoVerify
-  )
-  return BufferConfig(
-    userstyle: userstyle,
-    referer_from: referer_from,
-    scripting: scripting,
-    charsets: charsets,
-    images: images,
-    isdump: pager.config.start.headless,
-    charsetOverride: charsetOverride,
-    protocol: pager.config.protocol
-  )
+      loaderConfig.insecureSSLNoVerify = sc.insecure_ssl_no_verify.get
+    if sc.autofocus.isSome:
+      res.autofocus = sc.autofocus.get
+  return res
 
 # Load request in a new buffer.
 proc gotoURL(pager: Pager; request: Request; prevurl = none(URL);