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:
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/