about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/css/layout.nim2
-rw-r--r--src/html/dom.nim2
-rw-r--r--src/local/pager.nim14
-rw-r--r--src/server/loader.nim2
-rw-r--r--src/server/loaderiface.nim7
-rw-r--r--src/types/bitmap.nim2
6 files changed, 20 insertions, 9 deletions
diff --git a/src/css/layout.nim b/src/css/layout.nim
index 0e0edb88..76444256 100644
--- a/src/css/layout.nim
+++ b/src/css/layout.nim
@@ -3169,7 +3169,7 @@ proc buildReplacement(ctx: var BlockBuilderContext; child, parent: StyledNode;
     let text = newCharacterData(child.content.s)
     ctx.pushInlineText(computed, parent, text)
   of ContentImage:
-    if child.content.bmp != nil:
+    if child.content.bmp != nil and child.content.bmp.cacheId != -1:
       ctx.pushInline(InlineBox(
         t: ibtBitmap,
         computed: computed,
diff --git a/src/html/dom.nim b/src/html/dom.nim
index 69479e80..11a91ef1 100644
--- a/src/html/dom.nim
+++ b/src/html/dom.nim
@@ -3650,6 +3650,7 @@ proc newElement*(document: Document; localName, namespaceURI, prefix: CAtom):
       NetworkBitmap(
         contentType: "image/x-cha-canvas",
         imageId: imageId,
+        cacheId: -1,
         width: 300,
         height: 150
       )
@@ -4416,6 +4417,7 @@ proc reflectAttr(element: Element; name: CAtom; value: Option[string]) =
           canvas.bitmap = NetworkBitmap(
             contentType: "image/x-cha-canvas",
             imageId: window.getImageId(),
+            cacheId: -1,
             width: w,
             height: h
           )
diff --git a/src/local/pager.nim b/src/local/pager.nim
index 388818f5..ca85b5df 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -1005,8 +1005,10 @@ proc loadCachedImage(pager: Pager; container: Container; image: PosBitmap;
     erry: erry,
     dispw: dispw
   )
-  pager.loader.shareCachedItem(bmp.cacheId, pager.loader.clientPid,
-    container.process)
+  if not pager.loader.shareCachedItem(bmp.cacheId, pager.loader.clientPid,
+      container.process):
+    pager.alert("Error: received incorrect cache ID from buffer")
+    return
   let imageMode = pager.term.imageMode
   pager.loader.fetch(newRequest(
     newURL("img-codec+" & bmp.contentType.after('/') & ":decode").get,
@@ -2694,11 +2696,11 @@ proc connected3(pager: Pager; container: Container; stream: SocketStream;
       # loading from cache; now both the buffer and us hold a new reference
       # to the cached item, but it's only shared with the buffer. add a
       # pager ref too.
-      loader.shareCachedItem(container.cacheId, loader.clientPid)
+      discard loader.shareCachedItem(container.cacheId, loader.clientPid)
     let pid = container.process
     var outCacheId = container.cacheId
     if not redirected:
-      loader.shareCachedItem(container.cacheId, pid)
+      discard loader.shareCachedItem(container.cacheId, pid)
       loader.resume(istreamOutputId)
     else:
       outCacheId = loader.addCacheFile(ostreamOutputId, pid)
@@ -2714,10 +2716,10 @@ proc connected3(pager: Pager; container: Container; stream: SocketStream;
     stream.withPacketWriter w:
       w.sendAux.add(cstream.fd)
     # buffer is cloned, just share the parent's cached source
-    loader.shareCachedItem(container.cacheId, container.process)
+    discard loader.shareCachedItem(container.cacheId, container.process)
     # also add a reference here; it will be removed when the container is
     # deleted
-    loader.shareCachedItem(container.cacheId, loader.clientPid)
+    discard loader.shareCachedItem(container.cacheId, loader.clientPid)
     container.setCloneStream(bufStream)
   cstream.sclose()
   loader.put(ContainerData(stream: stream, container: container))
diff --git a/src/server/loader.nim b/src/server/loader.nim
index 31bd2d50..dd9b1057 100644
--- a/src/server/loader.nim
+++ b/src/server/loader.nim
@@ -1459,6 +1459,8 @@ proc shareCachedItem(ctx: LoaderContext; stream: SocketStream;
     let item = sourceClient.cacheMap[n]
     inc item.refc
     targetClient.cacheMap.add(item)
+  stream.withPacketWriter w:
+    w.swrite(n != -1)
 
 proc openCachedItem(ctx: LoaderContext; stream: SocketStream;
     client: ClientHandle; r: var BufferedReader) =
diff --git a/src/server/loaderiface.nim b/src/server/loaderiface.nim
index 5db77b00..e92586d6 100644
--- a/src/server/loaderiface.nim
+++ b/src/server/loaderiface.nim
@@ -405,13 +405,18 @@ proc doRequest*(loader: FileLoader; request: Request): Response =
     stream.sclose()
   return response
 
-proc shareCachedItem*(loader: FileLoader; id, targetPid: int; sourcePid = -1) =
+proc shareCachedItem*(loader: FileLoader; id, targetPid: int; sourcePid = -1):
+    bool =
   let sourcePid = if sourcePid != -1: sourcePid else: loader.clientPid
   loader.withPacketWriterFire w:
     w.swrite(lcShareCachedItem)
     w.swrite(sourcePid)
     w.swrite(targetPid)
     w.swrite(id)
+  var success: bool
+  loader.withPacketReader r:
+    r.sread(success)
+  return success
 
 proc openCachedItem*(loader: FileLoader; cacheId: int): PosixStream =
   loader.withPacketWriter w, nil:
diff --git a/src/types/bitmap.nim b/src/types/bitmap.nim
index 55a7794f..17653437 100644
--- a/src/types/bitmap.nim
+++ b/src/types/bitmap.nim
@@ -2,6 +2,6 @@ type
   NetworkBitmap* = ref object
     width*: int
     height*: int
-    cacheId*: int
+    cacheId*: int = -1
     imageId*: int
     contentType*: string