UNPKG

4.37 kBJavaScriptView Raw
1/**
2 * @licstart The following is the entire license notice for the
3 * JavaScript code in this page
4 *
5 * Copyright 2022 Mozilla Foundation
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * @licend The above is the entire license notice for the
20 * JavaScript code in this page
21 */
22"use strict";
23
24Object.defineProperty(exports, "__esModule", {
25 value: true
26});
27exports.PDFRenderingQueue = void 0;
28
29var _pdf = require("../pdf");
30
31var _ui_utils = require("./ui_utils.js");
32
33const CLEANUP_TIMEOUT = 30000;
34
35class PDFRenderingQueue {
36 constructor() {
37 this.pdfViewer = null;
38 this.pdfThumbnailViewer = null;
39 this.onIdle = null;
40 this.highestPriorityPage = null;
41 this.idleTimeout = null;
42 this.printing = false;
43 this.isThumbnailViewEnabled = false;
44 }
45
46 setViewer(pdfViewer) {
47 this.pdfViewer = pdfViewer;
48 }
49
50 setThumbnailViewer(pdfThumbnailViewer) {
51 this.pdfThumbnailViewer = pdfThumbnailViewer;
52 }
53
54 isHighestPriority(view) {
55 return this.highestPriorityPage === view.renderingId;
56 }
57
58 hasViewer() {
59 return !!this.pdfViewer;
60 }
61
62 renderHighestPriority(currentlyVisiblePages) {
63 if (this.idleTimeout) {
64 clearTimeout(this.idleTimeout);
65 this.idleTimeout = null;
66 }
67
68 if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {
69 return;
70 }
71
72 if (this.isThumbnailViewEnabled && this.pdfThumbnailViewer?.forceRendering()) {
73 return;
74 }
75
76 if (this.printing) {
77 return;
78 }
79
80 if (this.onIdle) {
81 this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);
82 }
83 }
84
85 getHighestPriority(visible, views, scrolledDown, preRenderExtra = false) {
86 const visibleViews = visible.views,
87 numVisible = visibleViews.length;
88
89 if (numVisible === 0) {
90 return null;
91 }
92
93 for (let i = 0; i < numVisible; i++) {
94 const view = visibleViews[i].view;
95
96 if (!this.isViewFinished(view)) {
97 return view;
98 }
99 }
100
101 const firstId = visible.first.id,
102 lastId = visible.last.id;
103
104 if (lastId - firstId + 1 > numVisible) {
105 const visibleIds = visible.ids;
106
107 for (let i = 1, ii = lastId - firstId; i < ii; i++) {
108 const holeId = scrolledDown ? firstId + i : lastId - i;
109
110 if (visibleIds.has(holeId)) {
111 continue;
112 }
113
114 const holeView = views[holeId - 1];
115
116 if (!this.isViewFinished(holeView)) {
117 return holeView;
118 }
119 }
120 }
121
122 let preRenderIndex = scrolledDown ? lastId : firstId - 2;
123 let preRenderView = views[preRenderIndex];
124
125 if (preRenderView && !this.isViewFinished(preRenderView)) {
126 return preRenderView;
127 }
128
129 if (preRenderExtra) {
130 preRenderIndex += scrolledDown ? 1 : -1;
131 preRenderView = views[preRenderIndex];
132
133 if (preRenderView && !this.isViewFinished(preRenderView)) {
134 return preRenderView;
135 }
136 }
137
138 return null;
139 }
140
141 isViewFinished(view) {
142 return view.renderingState === _ui_utils.RenderingStates.FINISHED;
143 }
144
145 renderView(view) {
146 switch (view.renderingState) {
147 case _ui_utils.RenderingStates.FINISHED:
148 return false;
149
150 case _ui_utils.RenderingStates.PAUSED:
151 this.highestPriorityPage = view.renderingId;
152 view.resume();
153 break;
154
155 case _ui_utils.RenderingStates.RUNNING:
156 this.highestPriorityPage = view.renderingId;
157 break;
158
159 case _ui_utils.RenderingStates.INITIAL:
160 this.highestPriorityPage = view.renderingId;
161 view.draw().finally(() => {
162 this.renderHighestPriority();
163 }).catch(reason => {
164 if (reason instanceof _pdf.RenderingCancelledException) {
165 return;
166 }
167
168 console.error(`renderView: "${reason}"`);
169 });
170 break;
171 }
172
173 return true;
174 }
175
176}
177
178exports.PDFRenderingQueue = PDFRenderingQueue;
\No newline at end of file