Merge pull request #16740 from calixteman/editor_keyevent_on_window
[Editor] Set keyboard events on window instead of the main container
This commit is contained in:
commit
e40fd171e9
@ -688,11 +688,13 @@ class AnnotationEditorUIManager {
|
||||
#addKeyboardManager() {
|
||||
// The keyboard events are caught at the container level in order to be able
|
||||
// to execute some callbacks even if the current page doesn't have focus.
|
||||
this.#container.addEventListener("keydown", this.#boundKeydown);
|
||||
window.addEventListener("keydown", this.#boundKeydown, { capture: true });
|
||||
}
|
||||
|
||||
#removeKeyboardManager() {
|
||||
this.#container.removeEventListener("keydown", this.#boundKeydown);
|
||||
window.removeEventListener("keydown", this.#boundKeydown, {
|
||||
capture: true,
|
||||
});
|
||||
}
|
||||
|
||||
#addCopyPasteListeners() {
|
||||
|
@ -143,10 +143,14 @@ describe("FreeText Editor", () => {
|
||||
await page.keyboard.press("a");
|
||||
await page.keyboard.up("Control");
|
||||
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
await page.keyboard.down("Control");
|
||||
await page.keyboard.press("Backspace");
|
||||
await page.keyboard.up("Control");
|
||||
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
for (const n of [0, 1, 2]) {
|
||||
const hasEditor = await page.evaluate(sel => {
|
||||
return !!document.querySelector(sel);
|
||||
@ -182,12 +186,17 @@ describe("FreeText Editor", () => {
|
||||
editorRect.x,
|
||||
editorRect.y + 2 * editorRect.height
|
||||
);
|
||||
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
// And select it again.
|
||||
await page.mouse.click(
|
||||
editorRect.x + editorRect.width / 2,
|
||||
editorRect.y + editorRect.height / 2
|
||||
);
|
||||
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
await waitForSelectedEditor(page, getEditorSelector(3));
|
||||
await copyPaste(page);
|
||||
|
||||
@ -300,10 +309,14 @@ describe("FreeText Editor", () => {
|
||||
await page.keyboard.press("a");
|
||||
await page.keyboard.up("Control");
|
||||
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
await page.keyboard.down("Control");
|
||||
await page.keyboard.press("Backspace");
|
||||
await page.keyboard.up("Control");
|
||||
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
const data = "Hello PDF.js World !!";
|
||||
await page.mouse.click(rect.x + 100, rect.y + 100);
|
||||
await page.type(`${getEditorSelector(8)} .internal`, data);
|
||||
@ -338,6 +351,7 @@ describe("FreeText Editor", () => {
|
||||
|
||||
// Escape.
|
||||
await page.keyboard.press("Escape");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
expect(await getSelectedEditors(page))
|
||||
.withContext(`In ${browserName}`)
|
||||
@ -385,6 +399,7 @@ describe("FreeText Editor", () => {
|
||||
editorRect.x,
|
||||
editorRect.y + 2 * editorRect.height
|
||||
);
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
if (i < 4) {
|
||||
// And select it again.
|
||||
@ -393,6 +408,7 @@ describe("FreeText Editor", () => {
|
||||
editorRect.y + editorRect.height / 2,
|
||||
{ clickCount: 2 }
|
||||
);
|
||||
await page.waitForTimeout(10);
|
||||
}
|
||||
}
|
||||
|
||||
@ -468,6 +484,7 @@ describe("FreeText Editor", () => {
|
||||
editorRect.x,
|
||||
editorRect.y + 2 * editorRect.height
|
||||
);
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
text = await page.$eval(`${getEditorSelector(9)} .internal`, el => {
|
||||
return el.innerText;
|
||||
@ -533,6 +550,7 @@ describe("FreeText Editor", () => {
|
||||
await page.keyboard.down("Control");
|
||||
await page.keyboard.press("a");
|
||||
await page.keyboard.up("Control");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
expect(await getSelectedEditors(page))
|
||||
.withContext(`In ${browserName}`)
|
||||
@ -540,6 +558,7 @@ describe("FreeText Editor", () => {
|
||||
|
||||
await page.keyboard.down("Control");
|
||||
await page.mouse.click(editorCenters[1].x, editorCenters[1].y);
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
expect(await getSelectedEditors(page))
|
||||
.withContext(`In ${browserName}`)
|
||||
@ -553,6 +572,7 @@ describe("FreeText Editor", () => {
|
||||
|
||||
await page.mouse.click(editorCenters[1].x, editorCenters[1].y);
|
||||
await page.keyboard.up("Control");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
expect(await getSelectedEditors(page))
|
||||
.withContext(`In ${browserName}`)
|
||||
@ -587,10 +607,12 @@ describe("FreeText Editor", () => {
|
||||
|
||||
// Delete 1 and 3.
|
||||
await page.keyboard.press("Backspace");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
await page.keyboard.down("Control");
|
||||
await page.keyboard.press("a");
|
||||
await page.keyboard.up("Control");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
expect(await getSelectedEditors(page))
|
||||
.withContext(`In ${browserName}`)
|
||||
@ -615,11 +637,13 @@ describe("FreeText Editor", () => {
|
||||
.toEqual([8]);
|
||||
// Dismiss it.
|
||||
await page.keyboard.press("Escape");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
// Select all.
|
||||
await page.keyboard.down("Control");
|
||||
await page.keyboard.press("a");
|
||||
await page.keyboard.up("Control");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
// Check that all the editors are correctly selected (and the focus
|
||||
// didn't move to the body when the empty editor was removed).
|
||||
@ -1235,6 +1259,7 @@ describe("FreeText Editor", () => {
|
||||
await Promise.all(
|
||||
pages.map(async ([browserName, page]) => {
|
||||
await page.keyboard.press("r");
|
||||
await page.waitForTimeout(10);
|
||||
await page.click("#editorFreeText");
|
||||
|
||||
const rect = await page.$eval(".annotationEditorLayer", el => {
|
||||
@ -1685,4 +1710,74 @@ describe("FreeText Editor", () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Keyboard shortcuts when the editor layer isn't focused", () => {
|
||||
let pages;
|
||||
|
||||
beforeAll(async () => {
|
||||
pages = await loadAndWait("empty.pdf", ".annotationEditorLayer");
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await closePages(pages);
|
||||
});
|
||||
|
||||
it("must check that the shortcuts are working correctly", async () => {
|
||||
await Promise.all(
|
||||
pages.map(async ([browserName, page]) => {
|
||||
await page.click("#editorFreeText");
|
||||
|
||||
const rect = await page.$eval(".annotationEditorLayer", el => {
|
||||
const { x, y } = el.getBoundingClientRect();
|
||||
return { x, y };
|
||||
});
|
||||
|
||||
const data = "Hello PDF.js World !!";
|
||||
await page.mouse.click(rect.x + 100, rect.y + 100);
|
||||
await page.type(`${getEditorSelector(0)} .internal`, data);
|
||||
|
||||
const editorRect = await page.$eval(getEditorSelector(0), el => {
|
||||
const { x, y, width, height } = el.getBoundingClientRect();
|
||||
return {
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
};
|
||||
});
|
||||
|
||||
// Commit.
|
||||
await page.mouse.click(
|
||||
editorRect.x,
|
||||
editorRect.y + 2 * editorRect.height
|
||||
);
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
await page.focus("#editorFreeTextColor");
|
||||
|
||||
await page.keyboard.down("Control");
|
||||
await page.keyboard.press("z");
|
||||
await page.keyboard.up("Control");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
let hasEditor = await page.evaluate(sel => {
|
||||
return !!document.querySelector(sel);
|
||||
}, getEditorSelector(0));
|
||||
|
||||
expect(hasEditor).withContext(`In ${browserName}`).toEqual(false);
|
||||
|
||||
await page.keyboard.down("Control");
|
||||
await page.keyboard.press("y");
|
||||
await page.keyboard.up("Control");
|
||||
await page.waitForTimeout(10);
|
||||
|
||||
hasEditor = await page.evaluate(sel => {
|
||||
return !!document.querySelector(sel);
|
||||
}, getEditorSelector(0));
|
||||
|
||||
expect(hasEditor).withContext(`In ${browserName}`).toEqual(true);
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user