diff --git a/src/core/worker.js b/src/core/worker.js index eb819a2dfb5b7..5ec40561da80c 100644 --- a/src/core/worker.js +++ b/src/core/worker.js @@ -454,8 +454,8 @@ class WorkerMessageHandler { }); }); - handler.on("GetPageIndex", function wphSetupGetPageIndex({ ref }) { - const pageRef = Ref.get(ref.num, ref.gen); + handler.on("GetPageIndex", function wphSetupGetPageIndex(data) { + const pageRef = Ref.get(data.num, data.gen); return pdfManager.ensureCatalog("getPageIndex", [pageRef]); }); diff --git a/src/display/api.js b/src/display/api.js index de847bb503852..241db612e9a5d 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -2848,7 +2848,7 @@ class WorkerTransport { pageNumber <= 0 || pageNumber > this._numPages ) { - return Promise.reject(new Error("Invalid page request")); + return Promise.reject(new Error("Invalid page request.")); } const pageIndex = pageNumber - 1, @@ -2879,8 +2879,19 @@ class WorkerTransport { } getPageIndex(ref) { + if ( + typeof ref !== "object" || + ref === null || + !Number.isInteger(ref.num) || + ref.num < 0 || + !Number.isInteger(ref.gen) || + ref.gen < 0 + ) { + return Promise.reject(new Error("Invalid pageIndex request.")); + } return this.messageHandler.sendWithPromise("GetPageIndex", { - ref, + num: ref.num, + gen: ref.gen, }); } diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index 95cc8461ccad6..273aa4be09fc9 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -815,40 +815,23 @@ describe("api", function () { }); it("gets non-existent page", async function () { - let outOfRangePromise = pdfDocument.getPage(100); - let nonIntegerPromise = pdfDocument.getPage(2.5); - let nonNumberPromise = pdfDocument.getPage("1"); + const pageNumbers = [ + /* outOfRange = */ 100, + /* nonInteger = */ 2.5, + /* nonNumber = */ "1", + ]; - outOfRangePromise = outOfRangePromise.then( - function () { - throw new Error("shall fail for out-of-range pageNumber parameter"); - }, - function (reason) { - expect(reason instanceof Error).toEqual(true); - } - ); - nonIntegerPromise = nonIntegerPromise.then( - function () { - throw new Error("shall fail for non-integer pageNumber parameter"); - }, - function (reason) { - expect(reason instanceof Error).toEqual(true); - } - ); - nonNumberPromise = nonNumberPromise.then( - function () { - throw new Error("shall fail for non-number pageNumber parameter"); - }, - function (reason) { + for (const pageNumber of pageNumbers) { + try { + await pdfDocument.getPage(pageNumber); + + // Shouldn't get here. + expect(false).toEqual(true); + } catch (reason) { expect(reason instanceof Error).toEqual(true); + expect(reason.message).toEqual("Invalid page request."); } - ); - - await Promise.all([ - outOfRangePromise, - nonIntegerPromise, - nonNumberPromise, - ]); + } }); it("gets page, from /Pages tree with circular reference", async function () { @@ -907,18 +890,35 @@ describe("api", function () { }); it("gets invalid page index", async function () { - const ref = { num: 3, gen: 0 }; // Reference to a font dictionary. + const pageRefs = [ + /* fontRef = */ { num: 3, gen: 0 }, + /* invalidRef = */ { num: -1, gen: 0 }, + /* nonRef = */ "qwerty", + /* nullRef = */ null, + ]; + + const expectedErrors = [ + { + exception: UnknownErrorException, + message: "The reference does not point to a /Page dictionary.", + }, + { exception: Error, message: "Invalid pageIndex request." }, + { exception: Error, message: "Invalid pageIndex request." }, + { exception: Error, message: "Invalid pageIndex request." }, + ]; - try { - await pdfDocument.getPageIndex(ref); + for (let i = 0, ii = pageRefs.length; i < ii; i++) { + try { + await pdfDocument.getPageIndex(pageRefs[i]); - // Shouldn't get here. - expect(false).toEqual(true); - } catch (reason) { - expect(reason instanceof UnknownErrorException).toEqual(true); - expect(reason.message).toEqual( - "The reference does not point to a /Page dictionary." - ); + // Shouldn't get here. + expect(false).toEqual(true); + } catch (reason) { + const { exception, message } = expectedErrors[i]; + + expect(reason instanceof exception).toEqual(true); + expect(reason.message).toEqual(message); + } } });