{"record":{"id":"b225acd33761723d","repo":"mozilla/pdf.js","slug":"invalid-spread-mode-mode","errorCode":null,"errorMessage":"Invalid spread mode: ${mode}","messagePattern":"Invalid spread mode: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"web/pdf_viewer.js","lineNumber":2382,"sourceCode":"   * @param {number} mode - Group the pages in spreads, starting with odd- or\n   *   even-number pages (unless `SpreadMode.NONE` is used).\n   *   The constants from {SpreadMode} should be used.\n   */\n  set spreadMode(mode) {\n    if (\n      typeof PDFJSDev === \"undefined\"\n        ? window.isGECKOVIEW\n        : PDFJSDev.test(\"GECKOVIEW\")\n    ) {\n      // NOTE: Always ignore the pageLayout in GeckoView since there's\n      // no UI available to change Scroll/Spread modes for the user.\n      return;\n    }\n    if (this._spreadMode === mode) {\n      return; // The Spread mode didn't change.\n    }\n    if (!isValidSpreadMode(mode)) {\n      throw new Error(`Invalid spread mode: ${mode}`);\n    }\n    this.clearSelection();\n    this._spreadMode = mode;\n    this.eventBus.dispatch(\"spreadmodechanged\", { source: this, mode });\n\n    this._updateSpreadMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateSpreadMode(pageNumber = null) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const viewer = this.viewer,\n      pages = this._pages;\n\n    if (this._scrollMode === ScrollMode.PAGE) {\n      this.#ensurePageViewVisible();\n    } else {","sourceCodeStart":2364,"sourceCodeEnd":2400,"githubUrl":"https://github.com/mozilla/pdf.js/blob/5903d58d58e4dd9ce6ffa3834aea8480f06b4ada/web/pdf_viewer.js#L2364-L2400","documentation":"Thrown by PDFViewer.spreadMode setter when mode fails isValidSpreadMode: must be an integer in SpreadMode enum excluding UNKNOWN. Valid values are SpreadMode.NONE(0), ODD(1), EVEN(2).","triggerScenarios":"Setting viewer.spreadMode = 3, -1 (UNKNOWN), NaN, or a non-integer. From a corrupted persisted preference or out-of-range toolbar value.","commonSituations":"Saved spread-mode preference from a future/older version with different enum numbering; custom control indexing incorrectly; NaN from failed parse.","solutions":["Use the SpreadMode enum constants instead of magic numbers.","Validate against Object.values(SpreadMode) excluding UNKNOWN before assigning.","Default to SpreadMode.NONE when input is invalid."],"exampleFix":"// before\nviewer.spreadMode = Number(savedPref);\n\n// after\nimport { SpreadMode } from 'pdfjs-dist/web/ui_utils.js';\nconst mode = Number(savedPref);\nconst valid = Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;\nviewer.spreadMode = valid ? mode : SpreadMode.NONE;","handlingStrategy":"validation","validationCode":"const valid = Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;\nif (Number.isInteger(mode) && valid) {\n  viewer.spreadMode = mode;\n} else {\n  viewer.spreadMode = SpreadMode.NONE;\n}","typeGuard":"function isValidSpreadMode(mode) {\n  return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;\n}","tryCatchPattern":null,"preventionTips":["Use SpreadMode enum constants, not magic numbers.","Validate persisted preferences before applying.","Default to SpreadMode.NONE on invalid input."],"tags":["spread-mode","validation","enum","setter"],"backgroundTag":null,"analyzedSha":"5903d58d58e4dd9ce6ffa3834aea8480f06b4ada","analyzedAt":"2026-08-13T02:28:27.364Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}