diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index 0ea77452a753c..3ffe250eccbda 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -133,13 +133,33 @@ var PDFPageView = (function PDFPageViewClosure() { }, destroy: function PDFPageView_destroy() { - this.zoomLayer = null; this.reset(); if (this.pdfPage) { this.pdfPage.cleanup(); } }, + /** + * @private + */ + _resetZoomLayer: function(removeFromDOM) { + if (!this.zoomLayer) { + return; + } + var zoomLayerCanvas = this.zoomLayer.firstChild; + this.paintedViewportMap.delete(zoomLayerCanvas); + // Zeroing the width and height causes Firefox to release graphics + // resources immediately, which can greatly reduce memory consumption. + zoomLayerCanvas.width = 0; + zoomLayerCanvas.height = 0; + + if (removeFromDOM) { + // Note: ChildNode.remove doesn't throw if the parentNode is undefined. + this.zoomLayer.remove(); + } + this.zoomLayer = null; + }, + reset: function PDFPageView_reset(keepZoomLayer, keepAnnotations) { this.cancelRendering(); @@ -168,13 +188,16 @@ var PDFPageView = (function PDFPageViewClosure() { this.annotationLayer = null; } - if (this.canvas && !currentZoomLayerNode) { - this.paintedViewportMap.delete(this.canvas); - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - this.canvas.width = 0; - this.canvas.height = 0; - delete this.canvas; + if (!currentZoomLayerNode) { + if (this.canvas) { + this.paintedViewportMap.delete(this.canvas); + // Zeroing the width and height causes Firefox to release graphics + // resources immediately, which can greatly reduce memory consumption. + this.canvas.width = 0; + this.canvas.height = 0; + delete this.canvas; + } + this._resetZoomLayer(); } if (this.svg) { this.paintedViewportMap.delete(this.svg); @@ -429,23 +452,7 @@ var PDFPageView = (function PDFPageViewClosure() { div.removeChild(self.loadingIconDiv); delete self.loadingIconDiv; } - - if (self.zoomLayer) { - var zoomLayerCanvas = self.zoomLayer.firstChild; - self.paintedViewportMap.delete(zoomLayerCanvas); - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - zoomLayerCanvas.width = 0; - zoomLayerCanvas.height = 0; - - if (div.contains(self.zoomLayer)) { - // Prevent "Node was not found" errors if the `zoomLayer` was - // already removed. This may occur intermittently if the scale - // changes many times in very quick succession. - div.removeChild(self.zoomLayer); - } - self.zoomLayer = null; - } + self._resetZoomLayer(/* removeFromDOM = */ true); self.error = error; self.stats = pdfPage.stats;