Merge pull request #17719 from calixteman/bug1881692
[Editor] In caret browsing mode, get the caret position in the text layer (bug 1881692)
This commit is contained in:
commit
b8b8f1af66
@ -1030,4 +1030,67 @@ describe("Highlight Editor", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("Highlight and caret browsing", () => {
|
||||||
|
let pages;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
pages = await loadAndWait(
|
||||||
|
"tracemonkey.pdf",
|
||||||
|
".annotationEditorLayer",
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
highlightEditorColors: "red=#AB0000",
|
||||||
|
supportsCaretBrowsingMode: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await closePages(pages);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("must check that the caret can move a highlighted text", async () => {
|
||||||
|
await Promise.all(
|
||||||
|
pages.map(async ([browserName, page]) => {
|
||||||
|
await page.click("#editorHighlight");
|
||||||
|
await page.waitForSelector(".annotationEditorLayer.highlightEditing");
|
||||||
|
|
||||||
|
const rect = await getSpanRectFromText(page, 1, "Abstract");
|
||||||
|
const x = rect.x + rect.width / 2;
|
||||||
|
const y = rect.y + rect.height / 2;
|
||||||
|
await page.mouse.click(x, y, { count: 2 });
|
||||||
|
|
||||||
|
await page.waitForSelector(`${getEditorSelector(0)}`);
|
||||||
|
await page.keyboard.press("Escape");
|
||||||
|
await page.waitForSelector(
|
||||||
|
`${getEditorSelector(0)}:not(.selectedEditor)`
|
||||||
|
);
|
||||||
|
|
||||||
|
await page.evaluate(() => {
|
||||||
|
const text =
|
||||||
|
"Dynamic languages such as JavaScript are more difficult to com-";
|
||||||
|
for (const el of document.querySelectorAll(
|
||||||
|
`.page[data-page-number="${1}"] > .textLayer > span`
|
||||||
|
)) {
|
||||||
|
if (el.textContent === text) {
|
||||||
|
window.getSelection().setPosition(el.firstChild, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.keyboard.press("ArrowUp");
|
||||||
|
const [text, offset] = await page.evaluate(() => {
|
||||||
|
const selection = window.getSelection();
|
||||||
|
return [selection.anchorNode.textContent, selection.anchorOffset];
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(text).withContext(`In ${browserName}`).toEqual("Abstract");
|
||||||
|
expect(offset).withContext(`In ${browserName}`).toEqual(1);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -329,6 +329,12 @@ const PDFViewerApplication = {
|
|||||||
params.get("highlighteditorcolors")
|
params.get("highlighteditorcolors")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (params.has("supportscaretbrowsingmode")) {
|
||||||
|
AppOptions.set(
|
||||||
|
"supportsCaretBrowsingMode",
|
||||||
|
params.get("supportscaretbrowsingmode") === "true"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -130,11 +130,29 @@ class CaretBrowsingMode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const midY = rect.y + rect.height / 2;
|
const midY = rect.y + rect.height / 2;
|
||||||
const caretPosition = CaretBrowsingMode.#caretPositionFromPoint(
|
let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);
|
||||||
caretX,
|
let parentElement = caretPosition.offsetNode?.parentElement;
|
||||||
midY
|
if (parentElement && parentElement !== element) {
|
||||||
);
|
// There is an element on top of the one in the text layer, so we
|
||||||
if (caretPosition.offsetNode?.parentElement !== element) {
|
// need to hide all the elements (except the one in the text layer)
|
||||||
|
// at this position in order to get the correct caret position.
|
||||||
|
const elementsAtPoint = document.elementsFromPoint(caretX, midY);
|
||||||
|
const savedVisibilities = [];
|
||||||
|
for (const el of elementsAtPoint) {
|
||||||
|
if (el === element) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const { style } = el;
|
||||||
|
savedVisibilities.push([el, style.visibility]);
|
||||||
|
style.visibility = "hidden";
|
||||||
|
}
|
||||||
|
caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);
|
||||||
|
parentElement = caretPosition.offsetNode?.parentElement;
|
||||||
|
for (const [el, visibility] of savedVisibilities) {
|
||||||
|
el.style.visibility = visibility;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (parentElement !== element) {
|
||||||
// The element targeted by caretPositionFromPoint isn't in the text
|
// The element targeted by caretPositionFromPoint isn't in the text
|
||||||
// layer.
|
// layer.
|
||||||
if (select) {
|
if (select) {
|
||||||
|
Loading…
Reference in New Issue
Block a user