{"record":{"id":"8b091aead77f127e","repo":"mozilla/pdf.js","slug":"invalid-scroll-mode-mode","errorCode":null,"errorMessage":"Invalid scroll mode: ${mode}","messagePattern":"Invalid scroll mode: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"web/pdf_viewer.js","lineNumber":2311,"sourceCode":"   * @param {number} mode - The direction in which the document pages should be\n   *   laid out within the scrolling container.\n   *   The constants from {ScrollMode} should be used.\n   */\n  set scrollMode(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._scrollMode === mode) {\n      return; // The Scroll mode didn't change.\n    }\n    if (!isValidScrollMode(mode)) {\n      throw new Error(`Invalid scroll mode: ${mode}`);\n    }\n    if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) {\n      return; // Disabled for performance reasons.\n    }\n    this._previousScrollMode = this._scrollMode;\n\n    this.clearSelection();\n    this._scrollMode = mode;\n    this.eventBus.dispatch(\"scrollmodechanged\", { source: this, mode });\n\n    this._updateScrollMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateScrollMode(pageNumber = null) {\n    const scrollMode = this._scrollMode,\n      viewer = this.viewer;\n\n    viewer.classList.toggle(","sourceCodeStart":2293,"sourceCodeEnd":2329,"githubUrl":"https://github.com/mozilla/pdf.js/blob/5903d58d58e4dd9ce6ffa3834aea8480f06b4ada/web/pdf_viewer.js#L2293-L2329","documentation":"Thrown by PDFViewer.scrollMode setter when mode fails isValidScrollMode: must be an integer in ScrollMode enum excluding UNKNOWN. Valid values are ScrollMode.VERTICAL(0), HORIZONTAL(1), WRAPPED(2), PAGE(3).","triggerScenarios":"Setting viewer.scrollMode = 5, -1 (UNKNOWN), NaN, or a non-integer. Also from a corrupted persisted preference or a UI control returning an out-of-range value.","commonSituations":"Deserializing a saved scroll-mode preference that no longer maps to a valid enum; custom toolbar sending arbitrary indices; enum renumbering across versions.","solutions":["Use the ScrollMode enum constants instead of magic numbers.","Validate against Object.values(ScrollMode) excluding UNKNOWN before assigning.","Default to ScrollMode.VERTICAL when input is invalid."],"exampleFix":"// before\nviewer.scrollMode = Number(savedPref);\n\n// after\nimport { ScrollMode } from 'pdfjs-dist/web/ui_utils.js';\nconst mode = Number(savedPref);\nconst valid = Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;\nviewer.scrollMode = valid ? mode : ScrollMode.VERTICAL;","handlingStrategy":"validation","validationCode":"const valid = Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;\nif (Number.isInteger(mode) && valid) {\n  viewer.scrollMode = mode;\n} else {\n  viewer.scrollMode = ScrollMode.VERTICAL;\n}","typeGuard":"function isValidScrollMode(mode) {\n  return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;\n}","tryCatchPattern":null,"preventionTips":["Use ScrollMode enum constants, not magic numbers.","Validate persisted preferences before applying.","Default to ScrollMode.VERTICAL on invalid input."],"tags":["scroll-mode","validation","enum","setter"],"backgroundTag":null,"analyzedSha":"5903d58d58e4dd9ce6ffa3834aea8480f06b4ada","analyzedAt":"2026-08-13T02:28:27.364Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}