Commit e3eaa9a1 authored by Cathie Chen's avatar Cathie Chen
Browse files

Bug 1829385 - Popover: The element calling hidePopover is not always on the...

Bug 1829385 - Popover: The element calling hidePopover is not always on the top of auto popover list, r=emilio

Differential Revision: https://phabricator.services.mozilla.com/D176150
parent d56e15d2
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -15047,7 +15047,17 @@ void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement,
    // TODO: we can't always guarantee:
    // The last item in document's auto popover list is popoverHTMLEl.
    // See, https://github.com/whatwg/html/issues/9197
    MOZ_ASSERT(GetTopmostAutoPopover() == popoverHTMLEl);
    // If popoverHTMLEl is not on top, hide popovers again without firing
    // events.
    if (NS_WARN_IF(GetTopmostAutoPopover() != popoverHTMLEl)) {
      HideAllPopoversUntil(*popoverHTMLEl, aFocusPreviousElement, false);
      if (!popoverHTMLEl->CheckPopoverValidity(PopoverVisibilityState::Showing,
                                               nullptr, aRv)) {
        return;
      }
      MOZ_ASSERT(GetTopmostAutoPopover() == popoverHTMLEl,
                 "popoverHTMLEl should be on top of auto popover list");
    }
  }
  aPopover.SetHasPopoverInvoker(false);
+25 −0
Original line number Diff line number Diff line
<!DOCTYPE html>
<html class='reftest-wait'>
<meta charset='utf-8' />
<title>Popover hide crash test</title>
<link rel='author' href="mailto:cathiechen@iglaia.com">
<link rel=help href="https://github.com/whatwg/html/issues/9197">

<p>This test passes if it does not crash.</p>
<div id='popover1' popover='auto'>
    <div id='popover2' popover='auto'></div>
    <div id='popover3' popover='auto'></div>
</div>

<script>
var showedPopover2 = false;
popover1.showPopover();
popover3.showPopover();
popover3.addEventListener('beforetoggle', (e) => {
    if (e.newState != 'open' && !showedPopover2) {
        showedPopover2 = true;
        popover2.showPopover();
    }
});
popover1.hidePopover();
</script>