diff options
-rw-r--r-- | src/css/layout.nim | 2 | ||||
-rw-r--r-- | src/html/dom.nim | 2 | ||||
-rw-r--r-- | src/local/pager.nim | 14 | ||||
-rw-r--r-- | src/server/loader.nim | 2 | ||||
-rw-r--r-- | src/server/loaderiface.nim | 7 | ||||
-rw-r--r-- | src/types/bitmap.nim | 2 |
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 |