Merge pull request #16905 from calixteman/bug1851517
Only call the focus/blur callbacks when it's necessary (bug 1851517)
This commit is contained in:
commit
03eabae613
@ -1013,7 +1013,7 @@ class WidgetAnnotationElement extends AnnotationElement {
|
|||||||
return (isWin && event.ctrlKey) || (isMac && event.metaKey);
|
return (isWin && event.ctrlKey) || (isMac && event.metaKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
_setEventListener(element, baseName, eventName, valueGetter) {
|
_setEventListener(element, elementData, baseName, eventName, valueGetter) {
|
||||||
if (baseName.includes("mouse")) {
|
if (baseName.includes("mouse")) {
|
||||||
// Mouse events
|
// Mouse events
|
||||||
element.addEventListener(baseName, event => {
|
element.addEventListener(baseName, event => {
|
||||||
@ -1029,8 +1029,24 @@ class WidgetAnnotationElement extends AnnotationElement {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Non mouse event
|
// Non-mouse events
|
||||||
element.addEventListener(baseName, event => {
|
element.addEventListener(baseName, event => {
|
||||||
|
if (baseName === "blur") {
|
||||||
|
if (!elementData.focused || !event.relatedTarget) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
elementData.focused = false;
|
||||||
|
} else if (baseName === "focus") {
|
||||||
|
if (elementData.focused) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
elementData.focused = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valueGetter) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
|
this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
|
||||||
source: this,
|
source: this,
|
||||||
detail: {
|
detail: {
|
||||||
@ -1043,10 +1059,25 @@ class WidgetAnnotationElement extends AnnotationElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_setEventListeners(element, names, getter) {
|
_setEventListeners(element, elementData, names, getter) {
|
||||||
for (const [baseName, eventName] of names) {
|
for (const [baseName, eventName] of names) {
|
||||||
if (eventName === "Action" || this.data.actions?.[eventName]) {
|
if (eventName === "Action" || this.data.actions?.[eventName]) {
|
||||||
this._setEventListener(element, baseName, eventName, getter);
|
if (eventName === "Focus" || eventName === "Blur") {
|
||||||
|
elementData ||= { focused: false };
|
||||||
|
}
|
||||||
|
this._setEventListener(
|
||||||
|
element,
|
||||||
|
elementData,
|
||||||
|
baseName,
|
||||||
|
eventName,
|
||||||
|
getter
|
||||||
|
);
|
||||||
|
if (eventName === "Focus" && !this.data.actions?.Blur) {
|
||||||
|
// Ensure that elementData will have the correct value.
|
||||||
|
this._setEventListener(element, elementData, "blur", "Blur", null);
|
||||||
|
} else if (eventName === "Blur" && !this.data.actions?.Focus) {
|
||||||
|
this._setEventListener(element, elementData, "focus", "Focus", null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1178,6 +1209,7 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||||||
formattedValue: fieldFormattedValues,
|
formattedValue: fieldFormattedValues,
|
||||||
lastCommittedValue: null,
|
lastCommittedValue: null,
|
||||||
commitKey: 1,
|
commitKey: 1,
|
||||||
|
focused: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (this.data.multiLine) {
|
if (this.data.multiLine) {
|
||||||
@ -1238,12 +1270,16 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||||||
|
|
||||||
if (this.enableScripting && this.hasJSActions) {
|
if (this.enableScripting && this.hasJSActions) {
|
||||||
element.addEventListener("focus", event => {
|
element.addEventListener("focus", event => {
|
||||||
|
if (elementData.focused) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const { target } = event;
|
const { target } = event;
|
||||||
if (elementData.userValue) {
|
if (elementData.userValue) {
|
||||||
target.value = elementData.userValue;
|
target.value = elementData.userValue;
|
||||||
}
|
}
|
||||||
elementData.lastCommittedValue = target.value;
|
elementData.lastCommittedValue = target.value;
|
||||||
elementData.commitKey = 1;
|
elementData.commitKey = 1;
|
||||||
|
elementData.focused = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
element.addEventListener("updatefromsandbox", jsEvent => {
|
element.addEventListener("updatefromsandbox", jsEvent => {
|
||||||
@ -1349,9 +1385,10 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||||||
const _blurListener = blurListener;
|
const _blurListener = blurListener;
|
||||||
blurListener = null;
|
blurListener = null;
|
||||||
element.addEventListener("blur", event => {
|
element.addEventListener("blur", event => {
|
||||||
if (!event.relatedTarget) {
|
if (!elementData.focused || !event.relatedTarget) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
elementData.focused = false;
|
||||||
const { value } = event.target;
|
const { value } = event.target;
|
||||||
elementData.userValue = value;
|
elementData.userValue = value;
|
||||||
if (elementData.lastCommittedValue !== value) {
|
if (elementData.lastCommittedValue !== value) {
|
||||||
@ -1431,6 +1468,7 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||||||
|
|
||||||
this._setEventListeners(
|
this._setEventListeners(
|
||||||
element,
|
element,
|
||||||
|
elementData,
|
||||||
[
|
[
|
||||||
["focus", "Focus"],
|
["focus", "Focus"],
|
||||||
["blur", "Blur"],
|
["blur", "Blur"],
|
||||||
@ -1540,6 +1578,7 @@ class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||||||
|
|
||||||
this._setEventListeners(
|
this._setEventListeners(
|
||||||
element,
|
element,
|
||||||
|
null,
|
||||||
[
|
[
|
||||||
["change", "Validate"],
|
["change", "Validate"],
|
||||||
["change", "Action"],
|
["change", "Action"],
|
||||||
@ -1630,6 +1669,7 @@ class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||||||
|
|
||||||
this._setEventListeners(
|
this._setEventListeners(
|
||||||
element,
|
element,
|
||||||
|
null,
|
||||||
[
|
[
|
||||||
["change", "Validate"],
|
["change", "Validate"],
|
||||||
["change", "Action"],
|
["change", "Action"],
|
||||||
@ -1894,6 +1934,7 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||||||
|
|
||||||
this._setEventListeners(
|
this._setEventListeners(
|
||||||
selectElement,
|
selectElement,
|
||||||
|
null,
|
||||||
[
|
[
|
||||||
["focus", "Focus"],
|
["focus", "Focus"],
|
||||||
["blur", "Blur"],
|
["blur", "Blur"],
|
||||||
|
@ -2154,4 +2154,50 @@ describe("Interaction", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("Textfields and focus", () => {
|
||||||
|
let pages;
|
||||||
|
let otherPages;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
otherPages = await Promise.all(
|
||||||
|
global.integrationSessions.map(async session =>
|
||||||
|
session.browser.newPage()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
pages = await loadAndWait("evaljs.pdf", getSelector("55R"));
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await closePages(pages);
|
||||||
|
await Promise.all(otherPages.map(page => page.close()));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("must check that focus/blur callbacks aren't called", async () => {
|
||||||
|
await Promise.all(
|
||||||
|
pages.map(async ([browserName, page], i) => {
|
||||||
|
await page.waitForFunction(
|
||||||
|
"window.PDFViewerApplication.scriptingReady === true"
|
||||||
|
);
|
||||||
|
|
||||||
|
await page.click(getSelector("55R"));
|
||||||
|
await page.type(getSelector("55R"), "Hello", { delay: 10 });
|
||||||
|
await page.click(getSelector("56R"));
|
||||||
|
await page.waitForTimeout(10);
|
||||||
|
|
||||||
|
await page.click(getSelector("55R"));
|
||||||
|
await page.type(getSelector("55R"), " World", { delay: 10 });
|
||||||
|
await page.waitForTimeout(10);
|
||||||
|
|
||||||
|
await otherPages[i].bringToFront();
|
||||||
|
await otherPages[i].waitForTimeout(100);
|
||||||
|
await page.bringToFront();
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
|
||||||
|
const text = await page.$eval(getSelector("55R"), el => el.value);
|
||||||
|
expect(text).withContext(`In ${browserName}`).toEqual("Hello World");
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user