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);
P . . # copy ESP to EBP # . save registers 50/push-EAX 51/push-ECX 52/push-EDX 56/push-ESI 57/push-EDI # ESI = f 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI # ECX = f->read 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 8/disp8 . # copy *(ESI+8) to ECX # EDI = s 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to EDI # EDX = s->write 8b/copy 0/mod/indirect 7/rm32/EDI . . . 2/r32/EDX . . # copy *EDI to EDX $read-line-buffered:loop: # if (s->write >= s->length) abort 3b/compare 1/mod/*+disp8 7/rm32/EDI . . . 2/r32/EDX 8/disp8 . # compare EDX with *(EDI+8) 7d/jump-if-greater-or-equal $read-line-buffered:abort/disp8 # if (f->read >= f->write) populate stream from file 3b/compare 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 4/disp8 . # compare ECX with *(ESI+4) 7c/jump-if-lesser $read-line-buffered:from-stream/disp8 # . clear-stream(stream = f+4) # . . push args 8d/copy-address 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 . # copy ESI+4 to EAX 50/push-EAX # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # . f->read must now be 0; update its cache at ECX 31/xor 3/mod/direct 1/rm32/ECX . . . 1/r32/ECX . . # clear ECX # . EAX = read(f->fd, stream = f+4) # . . push args 50/push-EAX ff 6/subop/push 0/mod/indirect 6/rm32/ESI . . . . . . # push *ESI # . . call e8/call read/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # if (f->write == 0) break # since f->read was initially 0, EAX is the same as f->write # . if (EAX == 0) return true 3d/compare-EAX-and 0/imm32 74/jump-if-equal $read-line-buffered:end/disp8 $read-line-buffered:from-stream: # AL = f->data[f->read] 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX . 0/r32/AL 0x10/disp8 . # copy byte at *(ESI+ECX+16) to AL # s->data[s->write] = AL 88/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/EDI 2/index/EDX . 0/r32/AL 0xc/disp8 . # copy AL to *(EDI+EDX+12) # ++f->read 41/increment-ECX # ++s->write 42/increment-EDX # if (AL == '\n') return 3d/compare-EAX-and 0xa/imm32 75/jump-if-not-equal $read-line-buffered:loop/disp8 $read-line-buffered:end: # save f->read 89/copy 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 8/disp8 . # copy ECX to *(ESI+8) # save s->write 89/copy 0/mod/indirect 7/rm32/EDI . . . 2/r32/EDX . . # copy EDX to *EDI # . restore registers 5f/pop-to-EDI 5e/pop-to-ESI 5a/pop-to-EDX 59/pop-to-ECX 58/pop-to-EAX # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return $read-line-buffered:abort: # . _write(2/stderr, error) # . . push args 68/push "read-line-buffered: line too long\n"/imm32 68/push 2/imm32/stderr # . . call e8/call _write/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # . syscall(exit, 1) bb/copy-to-EBX 1/imm32 b8/copy-to-EAX 1/imm32/exit cd/syscall 0x80/imm8 # never gets here test-read-line-buffered: # - check that read-line-buffered stops at a newline # setup # . clear-stream(_test-stream) # . . push args 68/push _test-stream/imm32 # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # . clear-stream(_test-buffered-file+4) # . . push args b8/copy-to-EAX _test-buffered-file/imm32 05/add-to-EAX 4/imm32 50/push-EAX # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # . clear-stream(_test-tmp-stream) # . . push args 68/push _test-tmp-stream/imm32 # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # write(_test-stream, "ab\ncd") # . . push args 68/push "ab\ncd"/imm32 68/push _test-stream/imm32 # . . call e8/call write/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream # . EAX = read-line-buffered(_test-buffered-file, _test-tmp-stream) # . . push args 68/push _test-tmp-stream/imm32 68/push _test-buffered-file/imm32 # . . call e8/call read-line-buffered/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # check-next-stream-line-equal(_test-tmp-stream, "ab", msg) # . . push args 68/push "F - test-read-line-buffered"/imm32 68/push "ab"/imm32 68/push _test-tmp-stream/imm32 # . . call e8/call check-next-stream-line-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP # end c3/return test-read-line-buffered-reads-final-line-until-Eof: # setup # . clear-stream(_test-stream) # . . push args 68/push _test-stream/imm32 # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # . clear-stream(_test-buffered-file+4) # . . push args b8/copy-to-EAX _test-buffered-file/imm32 05/add-to-EAX 4/imm32 50/push-EAX # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # . clear-stream(_test-tmp-stream) # . . push args 68/push _test-tmp-stream/imm32 # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # write(_test-stream, "cd") # . . push args 68/push "cd"/imm32 68/push _test-stream/imm32 # . . call e8/call write/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream # . EAX = read-line-buffered(_test-buffered-file, _test-tmp-stream) # . . push args 68/push _test-tmp-stream/imm32 68/push _test-buffered-file/imm32 # . . call e8/call read-line-buffered/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # check-stream-equal(_test-tmp-stream, "cd", msg) # . . push args 68/push "F - test-read-line-buffered-reads-final-line-until-Eof"/imm32 68/push "cd"/imm32 68/push _test-tmp-stream/imm32 # . . call e8/call check-stream-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP # end c3/return # . . vim:nowrap:textwidth=0