| /** |
| * @licstart The following is the entire license notice for the |
| * Javascript code in this page |
| * |
| * Copyright 2020 Mozilla Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * @licend The above is the entire license notice for the |
| * Javascript code in this page |
| */ |
| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.PDFRenderingQueue = exports.RenderingStates = void 0; |
| const CLEANUP_TIMEOUT = 30000; |
| const RenderingStates = { |
| INITIAL: 0, |
| RUNNING: 1, |
| PAUSED: 2, |
| FINISHED: 3 |
| }; |
| exports.RenderingStates = RenderingStates; |
| |
| class PDFRenderingQueue { |
| constructor() { |
| this.pdfViewer = null; |
| this.pdfThumbnailViewer = null; |
| this.onIdle = null; |
| this.highestPriorityPage = null; |
| this.idleTimeout = null; |
| this.printing = false; |
| this.isThumbnailViewEnabled = false; |
| } |
| |
| setViewer(pdfViewer) { |
| this.pdfViewer = pdfViewer; |
| } |
| |
| setThumbnailViewer(pdfThumbnailViewer) { |
| this.pdfThumbnailViewer = pdfThumbnailViewer; |
| } |
| |
| isHighestPriority(view) { |
| return this.highestPriorityPage === view.renderingId; |
| } |
| |
| renderHighestPriority(currentlyVisiblePages) { |
| if (this.idleTimeout) { |
| clearTimeout(this.idleTimeout); |
| this.idleTimeout = null; |
| } |
| |
| if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { |
| return; |
| } |
| |
| if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) { |
| if (this.pdfThumbnailViewer.forceRendering()) { |
| return; |
| } |
| } |
| |
| if (this.printing) { |
| return; |
| } |
| |
| if (this.onIdle) { |
| this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); |
| } |
| } |
| |
| getHighestPriority(visible, views, scrolledDown) { |
| const visibleViews = visible.views; |
| const numVisible = visibleViews.length; |
| |
| if (numVisible === 0) { |
| return null; |
| } |
| |
| for (let i = 0; i < numVisible; ++i) { |
| const view = visibleViews[i].view; |
| |
| if (!this.isViewFinished(view)) { |
| return view; |
| } |
| } |
| |
| if (scrolledDown) { |
| const nextPageIndex = visible.last.id; |
| |
| if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) { |
| return views[nextPageIndex]; |
| } |
| } else { |
| const previousPageIndex = visible.first.id - 2; |
| |
| if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) { |
| return views[previousPageIndex]; |
| } |
| } |
| |
| return null; |
| } |
| |
| isViewFinished(view) { |
| return view.renderingState === RenderingStates.FINISHED; |
| } |
| |
| renderView(view) { |
| switch (view.renderingState) { |
| case RenderingStates.FINISHED: |
| return false; |
| |
| case RenderingStates.PAUSED: |
| this.highestPriorityPage = view.renderingId; |
| view.resume(); |
| break; |
| |
| case RenderingStates.RUNNING: |
| this.highestPriorityPage = view.renderingId; |
| break; |
| |
| case RenderingStates.INITIAL: |
| this.highestPriorityPage = view.renderingId; |
| view.draw().finally(() => { |
| this.renderHighestPriority(); |
| }).catch(reason => { |
| console.error(`renderView: "${reason}"`); |
| }); |
| break; |
| } |
| |
| return true; |
| } |
| |
| } |
| |
| exports.PDFRenderingQueue = PDFRenderingQueue; |