Bug 1545700 - Eagerly render <menu> inserted into already-opened menupopup r=surkov

Differential Revision: https://phabricator.services.mozilla.com/D28198

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Brian Grinstead 2019-04-19 16:27:37 +00:00
parent 2eece48676
commit 77c278c728
2 changed files with 20 additions and 6 deletions

View File

@ -10,7 +10,7 @@
<script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
<menu id="menu">
<menupopup onpopupshown="this.firstChild.open = true" onpopuphidden="if (event.target == this) done()">
<menupopup onpopuphidden="if (event.target == this) done()">
<menu id="submenu" label="One">
<menupopup onpopupshown="submenuOpened();">
<menuitem label="Two"/>
@ -26,12 +26,25 @@ SimpleTest.waitForExplicitFinish();
function runTests()
{
$("menu").open = true;
var menu = $("menu");
menu.menupopup.addEventListener("popupshown", () => {
var submenu = $("submenu");
is(submenu.querySelector(".menu-text").value, "One", "submenu has rendered.");
var submenuDynamic = document.createXULElement("menu");
submenuDynamic.setAttribute("label", "Dynamic");
ok(!submenuDynamic.querySelector(".menu-text"), "dynamic subment hasn't rendered yet.");
menu.menupopup.append(submenuDynamic);
is(submenuDynamic.querySelector(".menu-text").value, "Dynamic", "dynamic submenu has rendered.");
menu.menupopup.firstElementChild.open = true;
}, { once: true });
menu.open = true;
}
function submenuOpened()
{
var submenu = $("submenu")
var submenu = $("submenu");
is(submenu.getAttribute('_moz-menuactive'), "true", "menu highlighted");
submenu.hidden = true;
$("menu").open = false;

View File

@ -144,6 +144,7 @@ window.addEventListener("popupshowing", (e) => {
if (e.originalTarget.ownerDocument != document) {
return;
}
e.originalTarget.setAttribute("hasbeenopened", "true");
for (let menu of e.originalTarget.querySelectorAll("menu")) {
menu.render();
}
@ -167,7 +168,7 @@ class MozMenu extends MozMenuBaseMixin(MozElements.MozElementMixin(XULMenuElemen
}
get needsEagerRender() {
return this.isMenubarChild || this.isSizingPopup || !this.isInMenupopup;
return this.isMenubarChild || this.isSizingPopup || !this.isInHiddenMenupopup;
}
get isMenubarChild() {
@ -178,8 +179,8 @@ class MozMenu extends MozMenuBaseMixin(MozElements.MozElementMixin(XULMenuElemen
return this.matches("[sizetopopup] menu") || this.matches("menulist menu");
}
get isInMenupopup() {
return this.matches("menupopup menu");
get isInHiddenMenupopup() {
return this.matches("menupopup:not([hasbeenopened]) menu");
}
get isIconic() {