tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 3ff7b558d46a55785907ae7d093cd58d65cfa975
parent c2035e8aff05849459beada51bcd99dee00e1921
Author: Updatebot <updatebot@mozilla.com>
Date:   Mon, 15 Dec 2025 08:09:24 +0000

Bug 2005879 - Update PDF.js to ff4529d127662e1e3e63797b047324811340d1ba r=pdfjs-reviewers,calixte

Differential Revision: https://phabricator.services.mozilla.com/D276343

Diffstat:
Mtoolkit/components/pdfjs/content/build/pdf.mjs | 65+++++++++++++++++++++++++++++++++++++----------------------------
Mtoolkit/components/pdfjs/content/build/pdf.scripting.mjs | 4++--
Mtoolkit/components/pdfjs/content/build/pdf.worker.mjs | 65++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Mtoolkit/components/pdfjs/content/web/viewer-geckoview.css | 257+++++--------------------------------------------------------------------------
Mtoolkit/components/pdfjs/content/web/viewer-geckoview.mjs | 65+++++++++++++++++++++++------------------------------------------
Mtoolkit/components/pdfjs/content/web/viewer.css | 234+++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Mtoolkit/components/pdfjs/content/web/viewer.mjs | 65+++++++++++++++++++++++------------------------------------------
Mtoolkit/components/pdfjs/moz.yaml | 4++--
8 files changed, 297 insertions(+), 462 deletions(-)

diff --git a/toolkit/components/pdfjs/content/build/pdf.mjs b/toolkit/components/pdfjs/content/build/pdf.mjs @@ -21,8 +21,8 @@ */ /** - * pdfjsVersion = 5.4.466 - * pdfjsBuild = 36de2d976 + * pdfjsVersion = 5.4.486 + * pdfjsBuild = ff4529d12 */ /******/ // The require scope /******/ var __webpack_require__ = {}; @@ -7090,7 +7090,7 @@ class FontFaceObject { } catch (ex) { warn(`getPathGenerator - ignoring character: "${ex}".`); } - const path = makePathFromDrawOPS(cmds); + const path = makePathFromDrawOPS(cmds.path); if (!this.fontExtraProperties) { objs.delete(objId); } @@ -7829,6 +7829,23 @@ class PatternInfo { throw new Error(`Unsupported pattern kind: ${kind}`); } } +class FontPathInfo { + static write(path) { + let data; + let buffer; + buffer = new ArrayBuffer(path.length * 2); + data = new Float16Array(buffer); + data.set(path); + return buffer; + } + #buffer; + constructor(buffer) { + this.#buffer = buffer; + } + get path() { + return new Float16Array(this.#buffer); + } +} ;// ./src/display/api_utils.js @@ -10772,14 +10789,17 @@ class CanvasGraphics { ctx.scale(textHScale, 1); } let patternFillTransform, patternStrokeTransform; - if (current.patternFill) { + const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const needsFill = fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE; + const needsStroke = fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE; + if (needsFill && current.patternFill) { ctx.save(); const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx); patternFillTransform = getCurrentTransform(ctx); ctx.restore(); ctx.fillStyle = pattern; } - if (current.patternStroke) { + if (needsStroke && current.patternStroke) { ctx.save(); const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx); patternStrokeTransform = getCurrentTransform(ctx); @@ -10789,8 +10809,7 @@ class CanvasGraphics { let lineWidth = current.lineWidth; const scale = current.textMatrixScale; if (scale === 0 || lineWidth === 0) { - const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; - if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (needsStroke) { lineWidth = this.getSinglePixelWidth(); } } else { @@ -12698,6 +12717,7 @@ class TextLayer { this.#pageWidth = pageWidth; this.#pageHeight = pageHeight; TextLayer.#ensureMinFontSizeComputed(); + container.style.setProperty("--min-font-size", TextLayer.#minFontSize); setLayerDimensions(container, viewport); this.#capability.promise.finally(() => { TextLayer.#pendingTextLayers.delete(this); @@ -12832,16 +12852,10 @@ class TextLayer { left = tx[4] + fontAscent * Math.sin(angle); top = tx[5] - fontAscent * Math.cos(angle); } - const scaleFactorStr = "calc(var(--total-scale-factor) *"; const divStyle = textDiv.style; - if (this.#container === this.#rootContainer) { - divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; - divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; - } else { - divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; - divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; - } - divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`; + divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; + divStyle.setProperty("--font-height", `${fontHeight.toFixed(2)}px`); divStyle.fontFamily = fontFamily; textDivProperties.fontSize = fontHeight; textDiv.setAttribute("role", "presentation"); @@ -12888,10 +12902,6 @@ class TextLayer { const { style } = div; - let transform = ""; - if (TextLayer.#minFontSize > 1) { - transform = `scale(${1 / TextLayer.#minFontSize})`; - } if (properties.canvasWidth !== 0 && properties.hasText) { const { fontFamily @@ -12905,14 +12915,11 @@ class TextLayer { width } = ctx.measureText(div.textContent); if (width > 0) { - transform = `scaleX(${canvasWidth * this.#scale / width}) ${transform}`; + style.setProperty("--scale-x", canvasWidth * this.#scale / width); } } if (properties.angle !== 0) { - transform = `rotate(${properties.angle}deg) ${transform}`; - } - if (transform.length > 0) { - style.transform = transform; + style.setProperty("--rotate", `${properties.angle}deg`); } } static cleanup() { @@ -13092,7 +13099,7 @@ function getDocument(src = {}) { } const docParams = { docId, - apiVersion: "5.4.466", + apiVersion: "5.4.486", data, password, disableAutoFetch, @@ -14279,6 +14286,8 @@ class WorkerTransport { } break; case "FontPath": + this.commonObjs.resolve(id, new FontPathInfo(exportedData)); + break; case "Image": this.commonObjs.resolve(id, exportedData); break; @@ -14681,8 +14690,8 @@ class InternalRenderTask { } } } -const version = "5.4.466"; -const build = "36de2d976"; +const version = "5.4.486"; +const build = "ff4529d12"; ;// ./src/display/editor/color_picker.js diff --git a/toolkit/components/pdfjs/content/build/pdf.scripting.mjs b/toolkit/components/pdfjs/content/build/pdf.scripting.mjs @@ -21,8 +21,8 @@ */ /** - * pdfjsVersion = 5.4.466 - * pdfjsBuild = 36de2d976 + * pdfjsVersion = 5.4.486 + * pdfjsBuild = ff4529d12 */ ;// ./src/scripting_api/constants.js diff --git a/toolkit/components/pdfjs/content/build/pdf.worker.mjs b/toolkit/components/pdfjs/content/build/pdf.worker.mjs @@ -21,8 +21,8 @@ */ /** - * pdfjsVersion = 5.4.466 - * pdfjsBuild = 36de2d976 + * pdfjsVersion = 5.4.486 + * pdfjsBuild = ff4529d12 */ /******/ // The require scope /******/ var __webpack_require__ = {}; @@ -9126,15 +9126,15 @@ function readSegmentHeader(data, start) { let referredToCount = referredFlags >> 5 & 7; const retainBits = [referredFlags & 31]; let position = start + 6; - if (referredFlags === 7) { + if (referredToCount === 7) { referredToCount = readUint32(data, position - 1) & 0x1fffffff; position += 3; - let bytes = referredToCount + 7 >> 3; + let bytes = referredToCount + 8 >> 3; retainBits[0] = data[position++]; while (--bytes > 0) { retainBits.push(data[position++]); } - } else if (referredFlags === 5 || referredFlags === 6) { + } else if (referredToCount === 5 || referredToCount === 6) { throw new Jbig2Error("invalid referred-to flags"); } segmentHeader.retainBits = retainBits; @@ -18924,6 +18924,39 @@ const getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { t[598] = 1068; t[599] = 1069; t[600] = 1070; + t[601] = 1071; + t[602] = 1072; + t[603] = 1073; + t[604] = 1074; + t[605] = 1075; + t[606] = 1076; + t[607] = 1077; + t[608] = 1078; + t[609] = 1079; + t[610] = 1080; + t[611] = 1081; + t[612] = 1082; + t[613] = 1083; + t[614] = 1084; + t[615] = 1085; + t[616] = 1086; + t[617] = 1087; + t[618] = 1088; + t[619] = 1089; + t[620] = 1090; + t[621] = 1091; + t[622] = 1092; + t[623] = 1093; + t[624] = 1094; + t[625] = 1095; + t[626] = 1096; + t[627] = 1097; + t[628] = 1098; + t[629] = 1099; + t[630] = 1100; + t[631] = 1101; + t[632] = 1102; + t[633] = 1103; t[672] = 1488; t[673] = 1489; t[674] = 1490; @@ -27868,6 +27901,23 @@ class PatternInfo { throw new Error(`Unsupported pattern kind: ${kind}`); } } +class FontPathInfo { + static write(path) { + let data; + let buffer; + buffer = new ArrayBuffer(path.length * 2); + data = new Float16Array(buffer); + data.set(path); + return buffer; + } + #buffer; + constructor(buffer) { + this.#buffer = buffer; + } + get path() { + return new Float16Array(this.#buffer); + } +} ;// ./src/core/pattern.js @@ -35098,7 +35148,8 @@ class PartialEvaluator { if (font.renderer.hasBuiltPath(fontChar)) { return; } - handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]); + const buffer = FontPathInfo.write(font.renderer.getPathJs(fontChar)); + handler.send("commonobj", [glyphName, "FontPath", buffer], [buffer]); } catch (reason) { if (evaluatorOptions.ignoreErrors) { warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); @@ -59757,7 +59808,7 @@ class WorkerMessageHandler { docId, apiVersion } = docParams; - const workerVersion = "5.4.466"; + const workerVersion = "5.4.486"; if (apiVersion !== workerVersion) { throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); } diff --git a/toolkit/components/pdfjs/content/web/viewer-geckoview.css b/toolkit/components/pdfjs/content/web/viewer-geckoview.css @@ -626,10 +626,24 @@ cursor:text; transform-origin:0% 0%; } + --min-font-size:1; + --text-scale-factor:calc(var(--total-scale-factor) * var(--min-font-size)); + --min-font-size-inv:calc(1 / var(--min-font-size)); > :not(.markedContent), .markedContent span:not(.markedContent){ z-index:1; + + --font-height:0; + font-size:calc(var(--text-scale-factor) * var(--font-height)); + + --scale-x:1; + --rotate:0deg; + transform:rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv)); + } + + .markedContent{ + display:contents; } span[role="img"]{ @@ -1400,239 +1414,6 @@ } } -.sidebar{ - --sidebar-bg-color:light-dark(#fff, #23222b); - --sidebar-border-color:light-dark( - rgb(21 20 26 / 0.1), - rgb(251 251 254 / 0.1) - ); - --sidebar-box-shadow:0 0.25px 0.75px light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 2px 6px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); - --sidebar-backdrop-filter:none; - --sidebar-border-radius:8px; - --sidebar-padding:5px; - --sidebar-min-width:180px; - --sidebar-max-width:632px; - --sidebar-width:239px; - --resizer-width:4px; - --resizer-hover-bg-color:light-dark(#0062fa, #00cadb); - - @media screen and (forced-colors: active){ - --sidebar-bg-color:Canvas; - --sidebar-border-color:CanvasText; - --sidebar-box-shadow:none; - --resizer-hover-bg-color:CanvasText; - } - - border-radius:var(--sidebar-border-radius); - box-shadow:var(--sidebar-box-shadow); - border:1px solid var(--sidebar-border-color); - background-color:var(--sidebar-bg-color); - inset-block-start:calc(100% + var(--doorhanger-height) - 2px); - padding-block:var(--sidebar-padding); - width:var(--sidebar-width); - min-width:var(--sidebar-min-width); - max-width:var(--sidebar-max-width); - backdrop-filter:var(--sidebar-backdrop-filter); - - .sidebarResizer{ - width:var(--resizer-width); - background-color:transparent; - forced-color-adjust:none; - cursor:ew-resize; - position:absolute; - inset-block:calc(var(--sidebar-padding) + var(--sidebar-border-radius)); - inset-inline-start:calc(0px - var(--resizer-width) / 2); - transition:background-color 0.5s ease-in-out; - box-sizing:border-box; - border:1px solid transparent; - border-block-width:0; - background-clip:content-box; - - &:hover{ - background-color:var(--resizer-hover-bg-color); - } - &:focus-visible{ - background-color:var(--resizer-hover-bg-color); - outline:none; - } - } - - &.resizing{ - cursor:ew-resize; - user-select:none; - - :not(.sidebarResizer){ - pointer-events:none; - } - - .sidebarResizer{ - background-color:var(--resizer-hover-bg-color); - } - } -} - -.popupMenu{ - --menuitem-checkmark-icon:url(images/checkmark.svg); - --menu-mark-icon-size:0; - --menu-icon-size:16px; - --menuitem-gap:5px; - --menuitem-border-color:transparent; - --menuitem-active-bg:color-mix( - in srgb, - var(--menu-text-color), - transparent 79% - ); - --menuitem-text-active-fg:var(--menu-text-color); - --menuitem-focus-bg:color-mix( - in srgb, - var(--menu-text-color), - transparent 93% - ); - --menuitem-focus-outline-color:light-dark(#0062fa, #00cadb); - --menuitem-focus-border-color:light-dark(white, black); - - @media screen and (forced-colors: active){ - --menu-bg:Canvas; - --menu-background-blend-mode:normal; - --menu-box-shadow:none; - --menu-backdrop-filter:none; - --menu-text-color:ButtonText; - --menu-border-color:CanvasText; - --menuitem-border-color:none; - --menuitem-hover-bg:SelectedItemText; - --menuitem-text-hover-fg:SelectedItem; - --menuitem-active-bg:SelectedItemText; - --menuitem-text-active-fg:SelectedItem; - --menuitem-focus-outline-color:CanvasText; - --menuitem-focus-border-color:none; - } - - display:flex; - flex-direction:column; - width:max-content; - height:auto; - position:relative; - left:0; - top:1px; - margin:0; - padding:5px; - - background:var(--menu-bg); - background-blend-mode:var(--menu-background-blend-mode); - box-shadow:var(--menu-box-shadow); - border-radius:6px; - border:1px solid var(--menu-border-color); - backdrop-filter:var(--menu-backdrop-filter); - - &.withMark{ - --menu-mark-icon-size:16px; - } - - > li{ - display:flex; - align-items:center; - list-style:none; - width:100%; - height:24px; - padding-inline:calc(var(--menu-mark-icon-size) + var(--menuitem-gap)) var(--menuitem-gap); - gap:var(--menuitem-gap); - box-sizing:border-box; - border-radius:var(--menuitem-border-radius); - border:1px solid var(--menuitem-border-color); - background:transparent; - - &:has(button.selected)::before{ - content:""; - display:inline-block; - width:11px; - height:11px; - mask-repeat:no-repeat; - mask-position:center; - mask-image:var(--menuitem-checkmark-icon); - background-color:var(--menu-text-color); - position:absolute; - margin-left:-16px; - } - - &:has(button:disabled){ - opacity:0.62; - pointer-events:none; - } - - &:hover{ - background:var(--menuitem-hover-bg); - background-blend-mode:var(--menuitem-hover-background-blend-mode); - > button{ - &:not(.noIcon)::before{ - background-color:var(--menuitem-text-hover-fg); - } - > span{ - color:var(--menuitem-text-hover-fg); - } - } - &:has(button.selected)::before{ - background-color:var(--menuitem-text-hover-fg); - } - } - - &:active{ - background-color:var(--menuitem-active-bg); - > button > span{ - color:var(--menuitem-text-active-fg); - } - } - - &:has(> button:focus-visible){ - border-color:var(--menuitem-focus-border-color); - background-color:var(--menuitem-focus-bg); - outline:2px solid var(--menuitem-focus-outline-color); - outline-offset:2px; - } - - > button{ - display:flex; - flex-direction:row; - align-items:center; - width:100%; - height:auto; - padding:var(--menuitem-gap); - gap:var(--menuitem-gap); - background:transparent; - border:none; - - &:not(.noIcon)::before{ - display:inline-block; - width:var(--menu-icon-size); - height:var(--menu-icon-size); - content:""; - mask-size:cover; - mask-position:center; - background-color:var(--menu-text-color); - } - - &:focus-visible{ - outline:none; - } - - > span{ - display:inline-block; - width:max-content; - height:auto; - text-align:left; - color:var(--menu-text-color); - user-select:none; - padding-inline-start:6px; - - font:menu; - font-size:13px; - font-style:normal; - font-weight:510; - line-height:normal; - } - } - } -} - :root{ color-scheme:light dark; @@ -1808,12 +1589,6 @@ } :root{ - --dir-factor:1; - --scale-select-width:140px; - - --toolbar-icon-opacity:1; - --doorhanger-icon-opacity:0.9; - --main-color:light-dark(rgb(12 12 13), rgb(249 249 250)); --body-bg-color:light-dark(rgb(212 212 215), rgb(42 42 46)); --scrollbar-color:light-dark(auto, rgb(121 121 123)); @@ -1838,10 +1613,6 @@ --toolbarButton-download-icon:url(images/gv-toolbarButton-download.svg); } -:root:dir(rtl){ - --dir-factor:-1; -} - @media screen and (forced-colors: active){ :root{ --dialog-button-border:1px solid Highlight; diff --git a/toolkit/components/pdfjs/content/web/viewer-geckoview.mjs b/toolkit/components/pdfjs/content/web/viewer-geckoview.mjs @@ -21,8 +21,8 @@ */ /** - * pdfjsVersion = 5.4.466 - * pdfjsBuild = 36de2d976 + * pdfjsVersion = 5.4.486 + * pdfjsBuild = ff4529d12 */ /******/ // The require scope /******/ var __webpack_require__ = {}; @@ -2465,7 +2465,8 @@ class Sidebar { #resizer; #isResizerOnTheLeft; #isKeyboardResizing = false; - #resizeObserver = null; + #resizeObserver; + #prevX = 0; constructor({ sidebar, resizer, @@ -2484,6 +2485,17 @@ class Sidebar { toggleButton.addEventListener("click", this.toggle.bind(this)); this._isOpen = false; sidebar.hidden = true; + this.#resizeObserver = new ResizeObserver(([{ + borderBoxSize: [{ + inlineSize + }] + }]) => { + if (!isNaN(this.#prevX)) { + this.#prevX += this.#coefficient * (inlineSize - this.#width); + } + this.#setWidth(inlineSize); + }); + this.#resizeObserver.observe(sidebar); } #makeSidebarResizable() { const sidebarStyle = this._sidebar.style; @@ -2493,10 +2505,9 @@ class Sidebar { this._sidebar.classList.remove("resizing"); pointerMoveAC?.abort(); pointerMoveAC = null; - this.#resizeObserver?.disconnect(); - this.#resizeObserver = null; this.#isKeyboardResizing = false; this.onStopResizing(); + this.#prevX = NaN; }; this.#resizer.addEventListener("pointerdown", e => { if (pointerMoveAC) { @@ -2508,7 +2519,7 @@ class Sidebar { clientX } = e; stopEvent(e); - let prevX = clientX; + this.#prevX = clientX; pointerMoveAC = new AbortController(); const { signal @@ -2517,16 +2528,6 @@ class Sidebar { sidebar.classList.add("resizing"); const parentStyle = sidebar.parentElement.style; parentStyle.minWidth = 0; - this.#resizeObserver?.disconnect(); - this.#resizeObserver = new ResizeObserver(([{ - borderBoxSize: [{ - inlineSize - }] - }]) => { - prevX += this.#width - inlineSize; - this.#setWidth(inlineSize); - }); - this.#resizeObserver.observe(sidebar); window.addEventListener("contextmenu", noContextMenu, { signal }); @@ -2535,7 +2536,7 @@ class Sidebar { return; } stopEvent(ev); - sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - prevX))}px`; + sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - this.#prevX))}px`; }, { signal, capture: true @@ -2561,15 +2562,6 @@ class Sidebar { if (!this.#isKeyboardResizing) { this._sidebar.classList.add("resizing"); this.#isKeyboardResizing = true; - this.#resizeObserver?.disconnect(); - this.#resizeObserver = new ResizeObserver(([{ - borderBoxSize: [{ - inlineSize - }] - }]) => { - this.#setWidth(inlineSize); - }); - this.#resizeObserver.observe(this._sidebar); this.onStartResizing(); } const base = e.ctrlKey || e.metaKey ? 10 : 1; @@ -2593,22 +2585,7 @@ class Sidebar { return this.#width; } set width(newWidth) { - if (!this.#resizeObserver) { - this.#resizeObserver = new ResizeObserver(([{ - borderBoxSize: [{ - inlineSize - }] - }]) => { - this.#setWidth(inlineSize); - }); - this.#resizeObserver.observe(this._sidebar); - } this._sidebar.style.width = `${newWidth}px`; - clearTimeout(this.#resizeTimeout); - this.#resizeTimeout = setTimeout(() => { - this.#resizeObserver.disconnect(); - this.#resizeObserver = null; - }, RESIZE_TIMEOUT); } onStartResizing() {} onStopResizing() {} @@ -2616,6 +2593,10 @@ class Sidebar { toggle(visibility = !this._isOpen) { this._sidebar.hidden = !(this._isOpen = visibility); } + destroy() { + this.#resizeObserver?.disconnect(); + this.#resizeObserver = null; + } } ;// ./web/comment_manager.js @@ -8442,7 +8423,7 @@ class PDFViewer { #textLayerMode = TextLayerMode.ENABLE; #viewerAlert = null; constructor(options) { - const viewerVersion = "5.4.466"; + const viewerVersion = "5.4.486"; if (version !== viewerVersion) { throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`); } diff --git a/toolkit/components/pdfjs/content/web/viewer.css b/toolkit/components/pdfjs/content/web/viewer.css @@ -626,10 +626,24 @@ cursor:text; transform-origin:0% 0%; } + --min-font-size:1; + --text-scale-factor:calc(var(--total-scale-factor) * var(--min-font-size)); + --min-font-size-inv:calc(1 / var(--min-font-size)); > :not(.markedContent), .markedContent span:not(.markedContent){ z-index:1; + + --font-height:0; + font-size:calc(var(--text-scale-factor) * var(--font-height)); + + --scale-x:1; + --rotate:0deg; + transform:rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv)); + } + + .markedContent{ + display:contents; } span[role="img"]{ @@ -1539,6 +1553,7 @@ --border-color-interactive:light-dark(#8f8f9d, #f9f9fa); --border-color-interactive-hover:var(--border-color-interactive); --border-color-interactive-active:var(--border-color-interactive); + --focus-outline-offset:2px; @media (forced-colors: active){ --color-accent-primary:ButtonText; @@ -4628,6 +4643,21 @@ --menuitem-focus-outline-color:light-dark(#0062fa, #00cadb); --menuitem-focus-border-color:light-dark(white, black); + --menu-bg:light-dark(white, #23222b); + --menu-background-blend-mode:normal; + --menu-box-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --menu-border-color:light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1)); + --menuitem-border-radius:8px; + --menu-backdrop-filter:none; + --menu-text-color:light-dark(#15141a, #fbfbfe); + --menuitem-text-hover-fg:var(--menu-text-color); + --menuitem-hover-bg:color-mix( + in srgb, + var(--menu-text-color), + transparent 86% + ); + --menuitem-hover-background-blend-mode:normal; + @media screen and (forced-colors: active){ --menu-bg:Canvas; --menu-background-blend-mode:normal; @@ -4770,6 +4800,114 @@ } } +.treeWithDeepNesting{ + --treeitem-color:light-dark(rgb(0 0 0 / 0.8), rgb(255 255 255 / 0.8)); + --treeitem-bg-color:light-dark(rgb(0 0 0 / 0.15), rgb(255 255 255 / 0.15)); + --treeitem-hover-color:light-dark(rgb(0 0 0 / 0.9), rgb(255 255 255 / 0.9)); + --treeitem-selected-color:light-dark( + rgb(0 0 0 / 0.9), + rgb(255 255 255 / 0.9) + ); + --treeitem-selected-bg-color:light-dark( + rgb(0 0 0 / 0.25), + rgb(255 255 255 / 0.25) + ); + --treeitem-expanded-icon:url(images/treeitem-expanded.svg); + --treeitem-collapsed-icon:url(images/treeitem-collapsed.svg); + + .treeItemToggler::before{ + position:absolute; + display:inline-block; + width:16px; + height:16px; + + content:""; + background-color:var(--toolbar-icon-bg-color); + mask-size:cover; + } + + &#layersView .treeItem > a{ + *{ + cursor:pointer; + } + + > label{ + padding-inline-start:4px; + > input{ + float:inline-start; + margin-top:1px; + } + } + } + + > .treeItem, + .treeItem > .treeItems{ + margin-inline-start:20px; + } + + .treeItem{ + > a{ + text-decoration:none; + display:inline-block; + min-width:calc(100% - 4px); + height:auto; + margin-bottom:1px; + padding:2px 0 5px; + padding-inline-start:4px; + border-radius:2px; + color:var(--treeitem-color); + font-size:13px; + line-height:15px; + user-select:none; + white-space:normal; + cursor:pointer; + + &:hover{ + background-color:var(--treeitem-bg-color); + background-clip:padding-box; + border-radius:2px; + color:var(--treeitem-hover-color); + } + } + + &.selected > a{ + background-color:var(--treeitem-selected-bg-color); + color:var(--treeitem-selected-color); + } + } + + .treeItemToggler{ + position:relative; + float:inline-start; + height:0; + width:0; + color:rgb(255 255 255 / 0.5); + + &::before{ + inset-inline-end:4px; + mask-image:var(--treeitem-expanded-icon); + } + + &.treeItemsHidden{ + &::before{ + mask-image:var(--treeitem-collapsed-icon); + transform:scaleX(var(--dir-factor)); + } + + ~ .treeItems{ + display:none; + } + } + + &:hover:is(+ a, ~ .treeItems){ + background-color:var(--treeitem-bg-color); + background-clip:padding-box; + border-radius:2px; + color:var(--treeitem-hover-color); + } + } +} + :root{ color-scheme:light dark; @@ -4992,17 +5130,6 @@ --field-color:light-dark(rgb(6 6 6), rgb(250 250 250)); --field-bg-color:light-dark(rgb(255 255 255), rgb(64 64 68)); --field-border-color:light-dark(rgb(187 187 188), rgb(115 115 115)); - --treeitem-color:light-dark(rgb(0 0 0 / 0.8), rgb(255 255 255 / 0.8)); - --treeitem-bg-color:light-dark(rgb(0 0 0 / 0.15), rgb(255 255 255 / 0.15)); - --treeitem-hover-color:light-dark(rgb(0 0 0 / 0.9), rgb(255 255 255 / 0.9)); - --treeitem-selected-color:light-dark( - rgb(0 0 0 / 0.9), - rgb(255 255 255 / 0.9) - ); - --treeitem-selected-bg-color:light-dark( - rgb(0 0 0 / 0.25), - rgb(255 255 255 / 0.25) - ); --thumbnail-hover-color:light-dark(rgb(0 0 0 / 0.1), rgb(255 255 255 / 0.1)); --thumbnail-selected-color:light-dark( rgb(0 0 0 / 0.2), @@ -5020,8 +5147,6 @@ ); --loading-icon:url(images/loading.svg); - --treeitem-expanded-icon:url(images/treeitem-expanded.svg); - --treeitem-collapsed-icon:url(images/treeitem-collapsed.svg); --toolbarButton-editorComment-icon:url(images/comment-editButton.svg); --toolbarButton-editorFreeText-icon:url(images/toolbarButton-editorFreeText.svg); --toolbarButton-editorHighlight-icon:url(images/toolbarButton-editorHighlight.svg); @@ -5413,17 +5538,6 @@ body{ box-sizing:border-box; } -.treeItemToggler::before{ - position:absolute; - display:inline-block; - width:16px; - height:16px; - - content:""; - background-color:var(--toolbar-icon-bg-color); - mask-size:cover; -} - #sidebarToggleButton::before{ mask-image:var(--toolbarButton-sidebarToggle-icon); transform:scaleX(var(--dir-factor)); @@ -5678,78 +5792,6 @@ body{ } } -.treeWithDeepNesting > .treeItem, -.treeItem > .treeItems{ - margin-inline-start:20px; -} - -.treeItem > a{ - text-decoration:none; - display:inline-block; - min-width:calc(100% - 4px); - height:auto; - margin-bottom:1px; - padding:2px 0 5px; - padding-inline-start:4px; - border-radius:2px; - color:var(--treeitem-color); - font-size:13px; - line-height:15px; - user-select:none; - white-space:normal; - cursor:pointer; -} - -#layersView .treeItem > a *{ - cursor:pointer; -} - -#layersView .treeItem > a > label{ - padding-inline-start:4px; -} - -#layersView .treeItem > a > label > input{ - float:inline-start; - margin-top:1px; -} - -.treeItemToggler{ - position:relative; - float:inline-start; - height:0; - width:0; - color:rgb(255 255 255 / 0.5); -} - -.treeItemToggler::before{ - inset-inline-end:4px; - mask-image:var(--treeitem-expanded-icon); -} - -.treeItemToggler.treeItemsHidden::before{ - mask-image:var(--treeitem-collapsed-icon); - transform:scaleX(var(--dir-factor)); -} - -.treeItemToggler.treeItemsHidden ~ .treeItems{ - display:none; -} - -.treeItem.selected > a{ - background-color:var(--treeitem-selected-bg-color); - color:var(--treeitem-selected-color); -} - -.treeItemToggler:hover, -.treeItemToggler:hover + a, -.treeItemToggler:hover ~ .treeItems, -.treeItem > a:hover{ - background-color:var(--treeitem-bg-color); - background-clip:padding-box; - border-radius:2px; - color:var(--treeitem-hover-color); -} - #outlineOptionsContainer{ display:none; diff --git a/toolkit/components/pdfjs/content/web/viewer.mjs b/toolkit/components/pdfjs/content/web/viewer.mjs @@ -21,8 +21,8 @@ */ /** - * pdfjsVersion = 5.4.466 - * pdfjsBuild = 36de2d976 + * pdfjsVersion = 5.4.486 + * pdfjsBuild = ff4529d12 */ /******/ // The require scope /******/ var __webpack_require__ = {}; @@ -3322,7 +3322,8 @@ class Sidebar { #resizer; #isResizerOnTheLeft; #isKeyboardResizing = false; - #resizeObserver = null; + #resizeObserver; + #prevX = 0; constructor({ sidebar, resizer, @@ -3341,6 +3342,17 @@ class Sidebar { toggleButton.addEventListener("click", this.toggle.bind(this)); this._isOpen = false; sidebar.hidden = true; + this.#resizeObserver = new ResizeObserver(([{ + borderBoxSize: [{ + inlineSize + }] + }]) => { + if (!isNaN(this.#prevX)) { + this.#prevX += this.#coefficient * (inlineSize - this.#width); + } + this.#setWidth(inlineSize); + }); + this.#resizeObserver.observe(sidebar); } #makeSidebarResizable() { const sidebarStyle = this._sidebar.style; @@ -3350,10 +3362,9 @@ class Sidebar { this._sidebar.classList.remove("resizing"); pointerMoveAC?.abort(); pointerMoveAC = null; - this.#resizeObserver?.disconnect(); - this.#resizeObserver = null; this.#isKeyboardResizing = false; this.onStopResizing(); + this.#prevX = NaN; }; this.#resizer.addEventListener("pointerdown", e => { if (pointerMoveAC) { @@ -3365,7 +3376,7 @@ class Sidebar { clientX } = e; stopEvent(e); - let prevX = clientX; + this.#prevX = clientX; pointerMoveAC = new AbortController(); const { signal @@ -3374,16 +3385,6 @@ class Sidebar { sidebar.classList.add("resizing"); const parentStyle = sidebar.parentElement.style; parentStyle.minWidth = 0; - this.#resizeObserver?.disconnect(); - this.#resizeObserver = new ResizeObserver(([{ - borderBoxSize: [{ - inlineSize - }] - }]) => { - prevX += this.#width - inlineSize; - this.#setWidth(inlineSize); - }); - this.#resizeObserver.observe(sidebar); window.addEventListener("contextmenu", noContextMenu, { signal }); @@ -3392,7 +3393,7 @@ class Sidebar { return; } stopEvent(ev); - sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - prevX))}px`; + sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - this.#prevX))}px`; }, { signal, capture: true @@ -3418,15 +3419,6 @@ class Sidebar { if (!this.#isKeyboardResizing) { this._sidebar.classList.add("resizing"); this.#isKeyboardResizing = true; - this.#resizeObserver?.disconnect(); - this.#resizeObserver = new ResizeObserver(([{ - borderBoxSize: [{ - inlineSize - }] - }]) => { - this.#setWidth(inlineSize); - }); - this.#resizeObserver.observe(this._sidebar); this.onStartResizing(); } const base = e.ctrlKey || e.metaKey ? 10 : 1; @@ -3450,22 +3442,7 @@ class Sidebar { return this.#width; } set width(newWidth) { - if (!this.#resizeObserver) { - this.#resizeObserver = new ResizeObserver(([{ - borderBoxSize: [{ - inlineSize - }] - }]) => { - this.#setWidth(inlineSize); - }); - this.#resizeObserver.observe(this._sidebar); - } this._sidebar.style.width = `${newWidth}px`; - clearTimeout(this.#resizeTimeout); - this.#resizeTimeout = setTimeout(() => { - this.#resizeObserver.disconnect(); - this.#resizeObserver = null; - }, RESIZE_TIMEOUT); } onStartResizing() {} onStopResizing() {} @@ -3473,6 +3450,10 @@ class Sidebar { toggle(visibility = !this._isOpen) { this._sidebar.hidden = !(this._isOpen = visibility); } + destroy() { + this.#resizeObserver?.disconnect(); + this.#resizeObserver = null; + } } ;// ./web/comment_manager.js @@ -11634,7 +11615,7 @@ class PDFViewer { #textLayerMode = TextLayerMode.ENABLE; #viewerAlert = null; constructor(options) { - const viewerVersion = "5.4.466"; + const viewerVersion = "5.4.486"; if (version !== viewerVersion) { throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`); } diff --git a/toolkit/components/pdfjs/moz.yaml b/toolkit/components/pdfjs/moz.yaml @@ -20,8 +20,8 @@ origin: # Human-readable identifier for this version/release # Generally "version NNN", "tag SSS", "bookmark SSS" - release: 36de2d976d52db5b4045722f7276145986c2b18f (2025-12-05T08:59:11Z). - revision: 36de2d976d52db5b4045722f7276145986c2b18f + release: ff4529d127662e1e3e63797b047324811340d1ba (2025-12-12T16:29:33Z). + revision: ff4529d127662e1e3e63797b047324811340d1ba # The package's license, where possible using the mnemonic from # https://spdx.org/licenses/