Compare commits

...

4 Commits

Author SHA1 Message Date
calixteman
3da8901f26
Merge pull request #19728 from calixteman/bug1956513
[Editor] Set an aria-description for an added signature (bug 1956513)
2025-03-27 21:31:02 +01:00
Jonas Jenwald
f23087ca7e
Merge pull request #19726 from Snuffleupagus/_setDefaultAppearance-bbox
Use `Util.rectBoundingBox` more in the annotation code (PR 19713 follow-up)
2025-03-27 21:30:01 +01:00
Calixte Denizet
7d8c64b2ff [Editor] Set an aria-description for an added signature (bug 1956513)
NVDA behaves differently depending if the user is hovering or focusing an added signature.
An aria-description is read in both cases while an aria-label is not.
2025-03-27 18:14:06 +01:00
Jonas Jenwald
29788eb0b8 Use Util.rectBoundingBox more in the annotation code (PR 19713 follow-up)
By changing the return format of the various `pointsCallback` functions we can use the `Util.rectBoundingBox` helper in the `MarkupAnnotation.prototype._setDefaultAppearance` method as well, thus shortening the code slightly.
2025-03-27 13:46:36 +01:00
4 changed files with 36 additions and 28 deletions

View File

@ -332,8 +332,13 @@ pdfjs-editor-highlight-editor =
# “Drawing” is a noun, the string is used on the editor for drawings.
pdfjs-editor-ink-editor =
.aria-label = Drawing editor
pdfjs-editor-signature-editor =
.aria-label = Signature editor
# Used when a signature editor is selected/hovered.
# Variables:
# $description (String) - a string describing/labeling the signature.
pdfjs-editor-signature-editor1 =
.aria-description = Signature editor: { $description }
pdfjs-editor-stamp-editor =
.aria-label = Image editor

View File

@ -1699,10 +1699,7 @@ class MarkupAnnotation extends Annotation {
fillAlpha,
pointsCallback,
}) {
let minX = Number.MAX_VALUE;
let minY = Number.MAX_VALUE;
let maxX = Number.MIN_VALUE;
let maxY = Number.MIN_VALUE;
const bbox = (this.data.rect = [Infinity, Infinity, -Infinity, -Infinity]);
const buffer = ["q"];
if (extra) {
@ -1732,14 +1729,8 @@ class MarkupAnnotation extends Annotation {
]);
for (let i = 0, ii = pointsArray.length; i < ii; i += 8) {
const [mX, MX, mY, MY] = pointsCallback(
buffer,
pointsArray.subarray(i, i + 8)
);
minX = Math.min(minX, mX);
maxX = Math.max(maxX, MX);
minY = Math.min(minY, mY);
maxY = Math.max(maxY, MY);
const points = pointsCallback(buffer, pointsArray.subarray(i, i + 8));
Util.rectBoundingBox(...points, bbox);
}
buffer.push("Q");
@ -1771,7 +1762,6 @@ class MarkupAnnotation extends Annotation {
const appearanceDict = new Dict(xref);
appearanceDict.set("Resources", resources);
const bbox = (this.data.rect = [minX, minY, maxX, maxY]);
appearanceDict.set("BBox", bbox);
this.appearance = new StringStream("/GS0 gs /Fm0 Do");
@ -4162,8 +4152,8 @@ class LineAnnotation extends MarkupAnnotation {
);
return [
points[0] - borderWidth,
points[2] + borderWidth,
points[7] - borderWidth,
points[2] + borderWidth,
points[3] + borderWidth,
];
},
@ -4214,7 +4204,7 @@ class SquareAnnotation extends MarkupAnnotation {
} else {
buffer.push("S");
}
return [points[0], points[2], points[7], points[3]];
return [points[0], points[7], points[2], points[3]];
},
});
}
@ -4278,7 +4268,7 @@ class CircleAnnotation extends MarkupAnnotation {
} else {
buffer.push("S");
}
return [points[0], points[2], points[7], points[3]];
return [points[0], points[7], points[2], points[3]];
},
});
}
@ -4349,7 +4339,7 @@ class PolylineAnnotation extends MarkupAnnotation {
);
}
buffer.push("S");
return [points[0], points[2], points[7], points[3]];
return [points[0], points[7], points[2], points[3]];
},
});
}
@ -4456,7 +4446,7 @@ class InkAnnotation extends MarkupAnnotation {
}
buffer.push("S");
}
return [points[0], points[2], points[7], points[3]];
return [points[0], points[7], points[2], points[3]];
},
});
}
@ -4688,7 +4678,7 @@ class HighlightAnnotation extends MarkupAnnotation {
`${points[4]} ${points[5]} l`,
"f"
);
return [points[0], points[2], points[7], points[3]];
return [points[0], points[7], points[2], points[3]];
},
});
}
@ -4813,7 +4803,7 @@ class UnderlineAnnotation extends MarkupAnnotation {
`${points[6]} ${points[7] + 1.3} l`,
"S"
);
return [points[0], points[2], points[7], points[3]];
return [points[0], points[7], points[2], points[3]];
},
});
}
@ -4857,7 +4847,7 @@ class SquigglyAnnotation extends MarkupAnnotation {
buffer.push(`${x} ${y + shift} l`);
} while (x < xEnd);
buffer.push("S");
return [points[4], xEnd, y - 2 * dy, y + 2 * dy];
return [points[4], y - 2 * dy, xEnd, y + 2 * dy];
},
});
}
@ -4896,7 +4886,7 @@ class StrikeOutAnnotation extends MarkupAnnotation {
`${(points[3] + points[7]) / 2} l`,
"S"
);
return [points[0], points[2], points[7], points[3]];
return [points[0], points[7], points[2], points[3]];
},
});
}

View File

@ -79,7 +79,7 @@ class SignatureEditor extends DrawingEditor {
this._willKeepAspectRatio = true;
this.#signatureData = params.signatureData || null;
this.#description = null;
this.defaultL10nId = "pdfjs-editor-signature-editor";
this.defaultL10nId = "pdfjs-editor-signature-editor1";
}
/** @inheritdoc */
@ -158,6 +158,13 @@ class SignatureEditor extends DrawingEditor {
super.render();
if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("MOZCENTRAL")) {
// TODO: remove this check once
// https://github.com/projectfluent/fluent.js/pull/640
// is merged and released.
this.div.setAttribute("data-l10n-attrs", "aria-description");
}
if (this._drawId === null) {
if (this.#signatureData) {
const {
@ -183,6 +190,12 @@ class SignatureEditor extends DrawingEditor {
});
this.addSignature(outline, heightInPage, description, uuid);
} else {
// Avoid Firefox crashing (with a local build) because the description
// parameter is missing.
this.div.setAttribute(
"data-l10n-args",
JSON.stringify({ description: "" })
);
this.div.hidden = true;
this._uiManager.getSignature(this);
}
@ -259,7 +272,7 @@ class SignatureEditor extends DrawingEditor {
const { outline } = (this.#signatureData = data);
this.#isExtracted = outline instanceof ContourDrawOutline;
this.#description = description;
this.div.setAttribute("aria-description", description);
this.div.setAttribute("data-l10n-args", JSON.stringify({ description }));
let drawingOptions;
if (this.#isExtracted) {
drawingOptions = SignatureEditor.getDefaultDrawingOptions();

View File

@ -184,9 +184,9 @@ describe("Signature Editor", () => {
`.altText.editDescription[title="Hello World"]`
);
// Check the aria label.
// Check the aria description.
await page.waitForSelector(
`${editorSelector}[aria-description="Hello World"]`
`${editorSelector}[aria-description="Signature editor: \u2068Hello World\u2069"]`
);
// Edit the description.