Rollup merge of #104577 - GuillaumeGomez:remove-focus-on-blur, r=notriddle

Don't focus on notable trait parent when hiding it

I clicked on a notable trait icon so the popup remained and then clicked on the settings menu. When the settings menu was blurred, it scrolled back to when the notable trait was, which isn't great.

r? `@notriddle`
This commit is contained in:
Matthias Krüger 2022-11-19 15:35:22 +01:00 committed by GitHub
commit e2dcc28d3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 10 deletions

View File

@ -795,7 +795,7 @@ function loadCss(cssUrl) {
// This means when the window is resized, we need to redo the layout. // This means when the window is resized, we need to redo the layout.
const base = window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE; const base = window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE;
const force_visible = base.NOTABLE_FORCE_VISIBLE; const force_visible = base.NOTABLE_FORCE_VISIBLE;
hideNotable(); hideNotable(false);
if (force_visible) { if (force_visible) {
showNotable(base); showNotable(base);
base.NOTABLE_FORCE_VISIBLE = true; base.NOTABLE_FORCE_VISIBLE = true;
@ -846,7 +846,7 @@ function loadCss(cssUrl) {
// Make this function idempotent. // Make this function idempotent.
return; return;
} }
hideNotable(); hideNotable(false);
const ty = e.getAttribute("data-ty"); const ty = e.getAttribute("data-ty");
const wrapper = document.createElement("div"); const wrapper = document.createElement("div");
wrapper.innerHTML = "<div class=\"docblock\">" + window.NOTABLE_TRAITS[ty] + "</div>"; wrapper.innerHTML = "<div class=\"docblock\">" + window.NOTABLE_TRAITS[ty] + "</div>";
@ -883,7 +883,7 @@ function loadCss(cssUrl) {
return; return;
} }
if (!e.NOTABLE_FORCE_VISIBLE && !elemIsInParent(event.relatedTarget, e)) { if (!e.NOTABLE_FORCE_VISIBLE && !elemIsInParent(event.relatedTarget, e)) {
hideNotable(); hideNotable(true);
} }
}; };
} }
@ -903,14 +903,16 @@ function loadCss(cssUrl) {
// To work around this, make sure the click finishes being dispatched before // To work around this, make sure the click finishes being dispatched before
// hiding the popover. Since `hideNotable()` is idempotent, this makes Safari behave // hiding the popover. Since `hideNotable()` is idempotent, this makes Safari behave
// consistently with the other two. // consistently with the other two.
setTimeout(hideNotable, 0); setTimeout(() => hideNotable(false), 0);
} }
} }
function hideNotable() { function hideNotable(focus) {
if (window.CURRENT_NOTABLE_ELEMENT) { if (window.CURRENT_NOTABLE_ELEMENT) {
if (window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.NOTABLE_FORCE_VISIBLE) { if (window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.NOTABLE_FORCE_VISIBLE) {
window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.focus(); if (focus) {
window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.focus();
}
window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.NOTABLE_FORCE_VISIBLE = false; window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.NOTABLE_FORCE_VISIBLE = false;
} }
const body = document.getElementsByTagName("body")[0]; const body = document.getElementsByTagName("body")[0];
@ -923,7 +925,7 @@ function loadCss(cssUrl) {
e.onclick = function() { e.onclick = function() {
this.NOTABLE_FORCE_VISIBLE = this.NOTABLE_FORCE_VISIBLE ? false : true; this.NOTABLE_FORCE_VISIBLE = this.NOTABLE_FORCE_VISIBLE ? false : true;
if (window.CURRENT_NOTABLE_ELEMENT && !this.NOTABLE_FORCE_VISIBLE) { if (window.CURRENT_NOTABLE_ELEMENT && !this.NOTABLE_FORCE_VISIBLE) {
hideNotable(); hideNotable(true);
} else { } else {
showNotable(this); showNotable(this);
window.CURRENT_NOTABLE_ELEMENT.setAttribute("tabindex", "0"); window.CURRENT_NOTABLE_ELEMENT.setAttribute("tabindex", "0");
@ -946,7 +948,7 @@ function loadCss(cssUrl) {
} }
if (!this.NOTABLE_FORCE_VISIBLE && if (!this.NOTABLE_FORCE_VISIBLE &&
!elemIsInParent(event.relatedTarget, window.CURRENT_NOTABLE_ELEMENT)) { !elemIsInParent(event.relatedTarget, window.CURRENT_NOTABLE_ELEMENT)) {
hideNotable(); hideNotable(true);
} }
}; };
}); });
@ -1057,7 +1059,7 @@ function loadCss(cssUrl) {
onEachLazy(document.querySelectorAll(".search-form .popover"), elem => { onEachLazy(document.querySelectorAll(".search-form .popover"), elem => {
elem.style.display = "none"; elem.style.display = "none";
}); });
hideNotable(); hideNotable(false);
}; };
/** /**

View File

@ -219,3 +219,33 @@ press-key: "Tab"
press-key: "Tab" press-key: "Tab"
press-key: "Tab" press-key: "Tab"
assert-count: ("//*[@class='notable popover']", 0) assert-count: ("//*[@class='notable popover']", 0)
assert: "#method\.create_an_iterator_from_read .notable-traits:focus"
// Now we check that the focus isn't given back to the wrong item when opening
// another popover.
store-window-property: (scroll, "scrollY")
click: "#method\.create_an_iterator_from_read .fnname"
// We ensure that the scroll position changed.
assert-window-property-false: {"scrollY": |scroll|}
// Store the new position.
store-window-property: (scroll, "scrollY")
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
wait-for: "//*[@class='notable popover']"
click: "#settings-menu a"
click: ".search-input"
// We ensure we didn't come back to the previous focused item.
assert-window-property-false: {"scrollY": |scroll|}
// Same but with Escape handling.
store-window-property: (scroll, "scrollY")
click: "#method\.create_an_iterator_from_read .fnname"
// We ensure that the scroll position changed.
assert-window-property-false: {"scrollY": |scroll|}
// Store the new position.
store-window-property: (scroll, "scrollY")
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
wait-for: "//*[@class='notable popover']"
click: "#settings-menu a"
press-key: "Escape"
// We ensure we didn't come back to the previous focused item.
assert-window-property-false: {"scrollY": |scroll|}