diff --git a/.eslintrc b/.eslintrc index 972e2846c..bbac10924 100644 --- a/.eslintrc +++ b/.eslintrc @@ -145,6 +145,10 @@ "no-nested-ternary": "error", "no-new-object": "error", "no-restricted-syntax": ["error", + { + "selector": "CallExpression[callee.name='assert'][arguments.length!=2]", + "message": "`assert()` must always be invoked with two arguments.", + }, { "selector": "NewExpression[callee.name='Cmd']", "message": "Use `Cmd.get()` rather than `new Cmd()`.", diff --git a/src/core/document.js b/src/core/document.js index a3846515a..8f5872cd1 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -767,7 +767,15 @@ class PDFDocument { _getLinearizationPage(pageIndex) { const { catalog, linearization } = this; - assert(linearization && linearization.pageFirst === pageIndex); + if ( + typeof PDFJSDev === "undefined" || + PDFJSDev.test("!PRODUCTION || TESTING") + ) { + assert( + linearization && linearization.pageFirst === pageIndex, + "_getLinearizationPage - invalid pageIndex argument." + ); + } const ref = Ref.get(linearization.objectNumberFirst, 0); return this.xref diff --git a/src/core/obj.js b/src/core/obj.js index e4eb369bf..8d100e4d5 100644 --- a/src/core/obj.js +++ b/src/core/obj.js @@ -578,7 +578,11 @@ class Catalog { } break; default: - assert(typeof value === "boolean"); + if (typeof value !== "boolean") { + throw new FormatError( + `viewerPreferences - expected a boolean value for: ${key}` + ); + } prefValue = value; } diff --git a/src/core/parser.js b/src/core/parser.js index 272ec4548..06c8bd855 100644 --- a/src/core/parser.js +++ b/src/core/parser.js @@ -216,7 +216,7 @@ class Parser { } else if (state === 1) { state = ch === I ? 2 : 0; } else { - assert(state === 2); + assert(state === 2, "findDefaultInlineStreamEnd - invalid state."); if (ch === SPACE || ch === LF || ch === CR) { maybeEIPos = stream.pos; // Let's check that the next `n` bytes are ASCII... just to be sure. diff --git a/src/core/worker_stream.js b/src/core/worker_stream.js index f1f21d4c3..7e1c2f24b 100644 --- a/src/core/worker_stream.js +++ b/src/core/worker_stream.js @@ -26,7 +26,10 @@ class PDFWorkerStream { } getFullReader() { - assert(!this._fullRequestReader); + assert( + !this._fullRequestReader, + "PDFWorkerStream.getFullReader can only be called once." + ); this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); return this._fullRequestReader; } diff --git a/src/display/api.js b/src/display/api.js index 11511f130..6e8abb6e9 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -2023,7 +2023,10 @@ class WorkerTransport { const { messageHandler, loadingTask } = this; messageHandler.on("GetReader", (data, sink) => { - assert(this._networkStream); + assert( + this._networkStream, + "GetReader - no `IPDFStream` instance available." + ); this._fullReader = this._networkStream.getFullReader(); this._fullReader.onProgress = evt => { this._lastProgress = { @@ -2039,7 +2042,10 @@ class WorkerTransport { sink.close(); return; } - assert(isArrayBuffer(value)); + assert( + isArrayBuffer(value), + "GetReader - expected an ArrayBuffer." + ); // Enqueue data chunk into sink, and transfer it // to other side as `Transferable` object. sink.enqueue(new Uint8Array(value), 1, [value]); @@ -2085,7 +2091,10 @@ class WorkerTransport { }); messageHandler.on("GetRangeReader", (data, sink) => { - assert(this._networkStream); + assert( + this._networkStream, + "GetRangeReader - no `IPDFStream` instance available." + ); const rangeReader = this._networkStream.getRangeReader( data.begin, data.end @@ -2114,7 +2123,10 @@ class WorkerTransport { sink.close(); return; } - assert(isArrayBuffer(value)); + assert( + isArrayBuffer(value), + "GetRangeReader - expected an ArrayBuffer." + ); sink.enqueue(new Uint8Array(value), 1, [value]); }) .catch(reason => { diff --git a/src/display/fetch_stream.js b/src/display/fetch_stream.js index fc35effc7..c74483025 100644 --- a/src/display/fetch_stream.js +++ b/src/display/fetch_stream.js @@ -65,7 +65,10 @@ class PDFFetchStream { } getFullReader() { - assert(!this._fullRequestReader); + assert( + !this._fullRequestReader, + "PDFFetchStream.getFullReader can only be called once." + ); this._fullRequestReader = new PDFFetchStreamReader(this); return this._fullRequestReader; } diff --git a/src/display/network.js b/src/display/network.js index 048785c75..1333956bf 100644 --- a/src/display/network.js +++ b/src/display/network.js @@ -247,7 +247,10 @@ class PDFNetworkStream { } getFullReader() { - assert(!this._fullRequestReader); + assert( + !this._fullRequestReader, + "PDFNetworkStream.getFullReader can only be called once." + ); this._fullRequestReader = new PDFNetworkStreamFullRequestReader( this._manager, this._source diff --git a/src/display/node_stream.js b/src/display/node_stream.js index 17e29d4d7..79125524a 100644 --- a/src/display/node_stream.js +++ b/src/display/node_stream.js @@ -67,7 +67,10 @@ class PDFNodeStream { } getFullReader() { - assert(!this._fullRequestReader); + assert( + !this._fullRequestReader, + "PDFNodeStream.getFullReader can only be called once." + ); this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this); diff --git a/src/display/transport_stream.js b/src/display/transport_stream.js index e1355ff7d..e6a93ab8a 100644 --- a/src/display/transport_stream.js +++ b/src/display/transport_stream.js @@ -19,7 +19,10 @@ import { assert, createPromiseCapability } from "../shared/util.js"; /** @implements {IPDFStream} */ class PDFDataTransportStream { constructor(params, pdfDataRangeTransport) { - assert(pdfDataRangeTransport); + assert( + pdfDataRangeTransport, + 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.' + ); this._queuedChunks = []; this._progressiveDone = params.progressiveDone || false; @@ -73,7 +76,10 @@ class PDFDataTransportStream { rangeReader._enqueue(buffer); return true; }); - assert(found); + assert( + found, + "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found." + ); } } @@ -111,7 +117,10 @@ class PDFDataTransportStream { } getFullReader() { - assert(!this._fullRequestReader); + assert( + !this._fullRequestReader, + "PDFDataTransportStream.getFullReader can only be called once." + ); const queuedChunks = this._queuedChunks; this._queuedChunks = null; return new PDFDataTransportStreamReader( diff --git a/src/shared/util.js b/src/shared/util.js index 4485860c4..dcbf5b28d 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -516,7 +516,7 @@ function arrayByteLength(arr) { if (arr.length !== undefined) { return arr.length; } - assert(arr.byteLength !== undefined); + assert(arr.byteLength !== undefined, "arrayByteLength - invalid argument."); return arr.byteLength; } diff --git a/test/unit/clitests_helper.js b/test/unit/clitests_helper.js index 679316afd..398d6a336 100644 --- a/test/unit/clitests_helper.js +++ b/test/unit/clitests_helper.js @@ -21,8 +21,7 @@ import { setPDFNetworkStreamFactory } from "../../src/display/api.js"; // Ensure that this script only runs in Node.js environments. if (!isNodeJS) { throw new Error( - "The `gulp unittestcli` command can only be used in " + - "Node.js environments." + "The `gulp unittestcli` command can only be used in Node.js environments." ); } diff --git a/test/unit/jasmine-boot.js b/test/unit/jasmine-boot.js index 01ab57afc..cd6fe879f 100644 --- a/test/unit/jasmine-boot.js +++ b/test/unit/jasmine-boot.js @@ -92,8 +92,7 @@ function initializePDFJS(callback) { if (isNodeJS) { throw new Error( - "The `gulp unittest` command cannot be used in " + - "Node.js environments." + "The `gulp unittest` command cannot be used in Node.js environments." ); } // Set the network stream factory for unit-tests. diff --git a/test/unit/node_stream_spec.js b/test/unit/node_stream_spec.js index 232807676..5350e7519 100644 --- a/test/unit/node_stream_spec.js +++ b/test/unit/node_stream_spec.js @@ -14,12 +14,16 @@ */ /* globals __non_webpack_require__ */ -import { AbortException, assert } from "../../src/shared/util.js"; +import { AbortException } from "../../src/shared/util.js"; import { isNodeJS } from "../../src/shared/is_node.js"; import { PDFNodeStream } from "../../src/display/node_stream.js"; -// Make sure that we only running this script is Node.js environments. -assert(isNodeJS); +// Ensure that these test only runs in Node.js environments. +if (!isNodeJS) { + throw new Error( + 'The "node_stream" unit-tests can only be run in Node.js environments.' + ); +} const path = __non_webpack_require__("path"); const url = __non_webpack_require__("url");