Loading dom/base/Document.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -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); Loading testing/web-platform/tests/html/semantics/popovers/popover-hide-crash.html 0 → 100644 +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> Loading
dom/base/Document.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
testing/web-platform/tests/html/semantics/popovers/popover-hide-crash.html 0 → 100644 +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>