Skip to content

Commit 2b95a8e

Browse files
Merge pull request #20634 from Snuffleupagus/progressiveDone-resolve-requests
Ensure that pending requests are resolved when calling `PDFDataTransportStreamReader.prototype.progressiveDone`
2 parents 025d658 + 0306e6c commit 2b95a8e

4 files changed

Lines changed: 36 additions & 49 deletions

File tree

src/display/fetch_stream.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* limitations under the License.
1414
*/
1515

16-
import { AbortException, assert, warn } from "../shared/util.js";
16+
import { AbortException, assert } from "../shared/util.js";
1717
import {
1818
BasePDFStream,
1919
BasePDFStreamRangeReader,
@@ -58,8 +58,7 @@ function getArrayBuffer(val) {
5858
if (val instanceof ArrayBuffer) {
5959
return val;
6060
}
61-
warn(`getArrayBuffer - unexpected data format: ${val}`);
62-
return new Uint8Array(val).buffer;
61+
throw new Error(`getArrayBuffer - unexpected data: ${val}`);
6362
}
6463

6564
class PDFFetchStream extends BasePDFStream {
@@ -194,4 +193,4 @@ class PDFFetchStreamRangeReader extends BasePDFStreamRangeReader {
194193
}
195194
}
196195

197-
export { PDFFetchStream };
196+
export { getArrayBuffer, PDFFetchStream };

src/display/network.js

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
getResponseOrigin,
2828
validateRangeRequestCapabilities,
2929
} from "./network_utils.js";
30+
import { endRequests } from "./transport_stream.js";
3031

3132
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
3233
throw new Error(
@@ -174,6 +175,8 @@ class PDFNetworkStream extends BasePDFStream {
174175
}
175176

176177
class PDFNetworkStreamReader extends BasePDFStreamReader {
178+
#endRequests = endRequests.bind(this);
179+
177180
_cachedChunks = [];
178181

179182
_done = false;
@@ -254,13 +257,9 @@ class PDFNetworkStreamReader extends BasePDFStreamReader {
254257
this._cachedChunks.push(chunk);
255258
}
256259
this._done = true;
257-
if (this._cachedChunks.length > 0) {
258-
return;
259-
}
260-
for (const capability of this._requests) {
261-
capability.resolve({ value: undefined, done: true });
260+
if (this._cachedChunks.length === 0) {
261+
this.#endRequests();
262262
}
263-
this._requests.length = 0;
264263
}
265264

266265
#onError(status) {
@@ -301,17 +300,16 @@ class PDFNetworkStreamReader extends BasePDFStreamReader {
301300
cancel(reason) {
302301
this._done = true;
303302
this._headersCapability.reject(reason);
304-
for (const capability of this._requests) {
305-
capability.resolve({ value: undefined, done: true });
306-
}
307-
this._requests.length = 0;
303+
this.#endRequests();
308304

309305
this._stream._abortRequest(this._fullRequestXhr);
310306
this._fullRequestXhr = null;
311307
}
312308
}
313309

314310
class PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader {
311+
#endRequests = endRequests.bind(this);
312+
315313
onClosed = null;
316314

317315
_done = false;
@@ -353,10 +351,7 @@ class PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader {
353351
this._queuedChunk = chunk;
354352
}
355353
this._done = true;
356-
for (const capability of this._requests) {
357-
capability.resolve({ value: undefined, done: true });
358-
}
359-
this._requests.length = 0;
354+
this.#endRequests();
360355
this.onClosed?.();
361356
}
362357

@@ -388,10 +383,7 @@ class PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader {
388383

389384
cancel(reason) {
390385
this._done = true;
391-
for (const capability of this._requests) {
392-
capability.resolve({ value: undefined, done: true });
393-
}
394-
this._requests.length = 0;
386+
this.#endRequests();
395387

396388
this._stream._abortRequest(this._requestXhr);
397389
this.onClosed?.();

src/display/node_stream.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@
1414
*/
1515
/* globals process */
1616

17-
import { AbortException, assert, warn } from "../shared/util.js";
17+
import { AbortException, assert } from "../shared/util.js";
1818
import {
1919
BasePDFStream,
2020
BasePDFStreamRangeReader,
2121
BasePDFStreamReader,
2222
} from "../shared/base_pdf_stream.js";
2323
import { createResponseError } from "./network_utils.js";
24+
import { getArrayBuffer } from "./fetch_stream.js";
2425

2526
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
2627
throw new Error(
@@ -44,17 +45,6 @@ function getReadableStream(readStream) {
4445
return polyfill.makeDefaultReadableStreamFromNodeReadable(readStream);
4546
}
4647

47-
function getArrayBuffer(val) {
48-
if (val instanceof Uint8Array) {
49-
return val.buffer;
50-
}
51-
if (val instanceof ArrayBuffer) {
52-
return val;
53-
}
54-
warn(`getArrayBuffer - unexpected data format: ${val}`);
55-
return new Uint8Array(val).buffer;
56-
}
57-
5848
class PDFNodeStream extends BasePDFStream {
5949
constructor(source) {
6050
super(source, PDFNodeStreamReader, PDFNodeStreamRangeReader);

src/display/transport_stream.js

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ function getArrayBuffer(val) {
2929
: new Uint8Array(val).buffer;
3030
}
3131

32+
function endRequests() {
33+
for (const capability of this._requests) {
34+
capability.resolve({ value: undefined, done: true });
35+
}
36+
this._requests.length = 0;
37+
}
38+
3239
class PDFDataTransportStream extends BasePDFStream {
3340
_progressiveDone = false;
3441

@@ -112,6 +119,8 @@ class PDFDataTransportStream extends BasePDFStream {
112119
}
113120

114121
class PDFDataTransportStreamReader extends BasePDFStreamReader {
122+
#endRequests = endRequests.bind(this);
123+
115124
_done = false;
116125

117126
_queuedChunks = null;
@@ -179,18 +188,21 @@ class PDFDataTransportStreamReader extends BasePDFStreamReader {
179188

180189
cancel(reason) {
181190
this._done = true;
182-
for (const capability of this._requests) {
183-
capability.resolve({ value: undefined, done: true });
184-
}
185-
this._requests.length = 0;
191+
this.#endRequests();
186192
}
187193

188194
progressiveDone() {
189195
this._done ||= true;
196+
197+
if (this._queuedChunks.length === 0) {
198+
this.#endRequests();
199+
}
190200
}
191201
}
192202

193203
class PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader {
204+
#endRequests = endRequests.bind(this);
205+
194206
onDone = null;
195207

196208
_begin = -1;
@@ -213,13 +225,10 @@ class PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader {
213225
if (this._requests.length === 0) {
214226
this._queuedChunk = chunk;
215227
} else {
216-
const firstCapability = this._requests.shift();
217-
firstCapability.resolve({ value: chunk, done: false });
228+
const capability = this._requests.shift();
229+
capability.resolve({ value: chunk, done: false });
218230

219-
for (const capability of this._requests) {
220-
capability.resolve({ value: undefined, done: true });
221-
}
222-
this._requests.length = 0;
231+
this.#endRequests();
223232
}
224233
this._done = true;
225234
this.onDone?.();
@@ -241,12 +250,9 @@ class PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader {
241250

242251
cancel(reason) {
243252
this._done = true;
244-
for (const capability of this._requests) {
245-
capability.resolve({ value: undefined, done: true });
246-
}
247-
this._requests.length = 0;
253+
this.#endRequests();
248254
this.onDone?.();
249255
}
250256
}
251257

252-
export { PDFDataTransportStream };
258+
export { endRequests, PDFDataTransportStream };

0 commit comments

Comments
 (0)