Loading dom/base/Document.cpp +1 −3 Original line number Diff line number Diff line Loading @@ -15046,9 +15046,7 @@ void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement, } } auto* data = popoverHTMLEl->GetPopoverData(); MOZ_ASSERT(data, "Should have popover data"); data->SetInvoker(nullptr); aPopover.SetHasPopoverInvoker(false); // Fire beforetoggle event and re-check popover validity. if (aFireEvents && !wasHiding) { Loading dom/base/Element.cpp +14 −2 Original line number Diff line number Diff line Loading @@ -4248,6 +4248,19 @@ void Element::ClearServoData(Document* aDoc) { } } bool Element::HasPopoverInvoker() const { auto* popoverData = GetPopoverData(); return popoverData && popoverData->HasPopoverInvoker(); } void Element::SetHasPopoverInvoker(bool aHasInvoker) { if (aHasInvoker) { EnsurePopoverData().SetHasPopoverInvoker(true); } else if (auto* popoverData = GetPopoverData()) { popoverData->SetHasPopoverInvoker(false); } } bool Element::IsAutoPopover() const { const auto* htmlElement = nsGenericHTMLElement::FromNode(this); return htmlElement && Loading Loading @@ -4292,9 +4305,8 @@ Element* Element::GetTopmostPopoverAncestor() const { checkAncestor(newPopover->GetFlattenedTreeParentElement()); // TODO: To handle the button invokers // https://github.com/whatwg/html/issues/9160 RefPtr<Element> invoker = newPopover->GetPopoverData()->GetInvoker(); checkAncestor(invoker); return topmostPopoverAncestor; } Loading dom/base/Element.h +4 −0 Original line number Diff line number Diff line Loading @@ -581,6 +581,10 @@ class Element : public FragmentOrElement { return CreatePopoverData(); } // https://html.spec.whatwg.org/multipage/popover.html#popover-invoker bool HasPopoverInvoker() const; void SetHasPopoverInvoker(bool); bool IsAutoPopover() const; bool IsPopoverOpen() const; Loading dom/base/PopoverData.h +6 −13 Original line number Diff line number Diff line Loading @@ -66,14 +66,10 @@ class PopoverData { mPreviouslyFocusedElement = aPreviouslyFocusedElement; } RefPtr<Element> GetInvoker() const { return do_QueryReferent(mInvokerElement); bool HasPopoverInvoker() const { return mHasPopoverInvoker; } void SetHasPopoverInvoker(bool aHasPopoverInvoker) { mHasPopoverInvoker = aHasPopoverInvoker; } void SetInvoker(Element* aInvokerElement) { mInvokerElement = do_GetWeakReference(static_cast<nsINode*>(aInvokerElement)); } PopoverToggleEventTask* GetToggleEventTask() const { return mTask; } void SetToggleEventTask(PopoverToggleEventTask* aTask) { mTask = aTask; } void ClearToggleEventTask() { mTask = nullptr; } Loading @@ -89,12 +85,9 @@ class PopoverData { // See, https://github.com/whatwg/html/issues/9063 nsWeakPtr mPreviouslyFocusedElement = nullptr; // https://html.spec.whatwg.org/#popover-invoker // Since having a popover invoker only makes a difference if the invoker // is in the document (in another open popover to be precise) we can make // this a weak reference, as if the element goes away it's necessarily not // connected to our document. nsWeakPtr mInvokerElement; // https://html.spec.whatwg.org/multipage/popover.html#popover-invoker, also // see https://github.com/whatwg/html/issues/9168. bool mHasPopoverInvoker = false; bool mIsHiding = false; RefPtr<PopoverToggleEventTask> mTask; }; Loading dom/html/nsGenericHTMLElement.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -2892,7 +2892,7 @@ void nsGenericHTMLFormControlElementWithState::HandlePopoverTargetAction() { if (canHide && target->IsPopoverOpen()) { target->HidePopover(IgnoreErrors()); } else if (canShow && !target->IsPopoverOpen()) { target->GetPopoverData()->SetInvoker(this); target->SetHasPopoverInvoker(true); target->ShowPopover(IgnoreErrors()); } } Loading Loading
dom/base/Document.cpp +1 −3 Original line number Diff line number Diff line Loading @@ -15046,9 +15046,7 @@ void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement, } } auto* data = popoverHTMLEl->GetPopoverData(); MOZ_ASSERT(data, "Should have popover data"); data->SetInvoker(nullptr); aPopover.SetHasPopoverInvoker(false); // Fire beforetoggle event and re-check popover validity. if (aFireEvents && !wasHiding) { Loading
dom/base/Element.cpp +14 −2 Original line number Diff line number Diff line Loading @@ -4248,6 +4248,19 @@ void Element::ClearServoData(Document* aDoc) { } } bool Element::HasPopoverInvoker() const { auto* popoverData = GetPopoverData(); return popoverData && popoverData->HasPopoverInvoker(); } void Element::SetHasPopoverInvoker(bool aHasInvoker) { if (aHasInvoker) { EnsurePopoverData().SetHasPopoverInvoker(true); } else if (auto* popoverData = GetPopoverData()) { popoverData->SetHasPopoverInvoker(false); } } bool Element::IsAutoPopover() const { const auto* htmlElement = nsGenericHTMLElement::FromNode(this); return htmlElement && Loading Loading @@ -4292,9 +4305,8 @@ Element* Element::GetTopmostPopoverAncestor() const { checkAncestor(newPopover->GetFlattenedTreeParentElement()); // TODO: To handle the button invokers // https://github.com/whatwg/html/issues/9160 RefPtr<Element> invoker = newPopover->GetPopoverData()->GetInvoker(); checkAncestor(invoker); return topmostPopoverAncestor; } Loading
dom/base/Element.h +4 −0 Original line number Diff line number Diff line Loading @@ -581,6 +581,10 @@ class Element : public FragmentOrElement { return CreatePopoverData(); } // https://html.spec.whatwg.org/multipage/popover.html#popover-invoker bool HasPopoverInvoker() const; void SetHasPopoverInvoker(bool); bool IsAutoPopover() const; bool IsPopoverOpen() const; Loading
dom/base/PopoverData.h +6 −13 Original line number Diff line number Diff line Loading @@ -66,14 +66,10 @@ class PopoverData { mPreviouslyFocusedElement = aPreviouslyFocusedElement; } RefPtr<Element> GetInvoker() const { return do_QueryReferent(mInvokerElement); bool HasPopoverInvoker() const { return mHasPopoverInvoker; } void SetHasPopoverInvoker(bool aHasPopoverInvoker) { mHasPopoverInvoker = aHasPopoverInvoker; } void SetInvoker(Element* aInvokerElement) { mInvokerElement = do_GetWeakReference(static_cast<nsINode*>(aInvokerElement)); } PopoverToggleEventTask* GetToggleEventTask() const { return mTask; } void SetToggleEventTask(PopoverToggleEventTask* aTask) { mTask = aTask; } void ClearToggleEventTask() { mTask = nullptr; } Loading @@ -89,12 +85,9 @@ class PopoverData { // See, https://github.com/whatwg/html/issues/9063 nsWeakPtr mPreviouslyFocusedElement = nullptr; // https://html.spec.whatwg.org/#popover-invoker // Since having a popover invoker only makes a difference if the invoker // is in the document (in another open popover to be precise) we can make // this a weak reference, as if the element goes away it's necessarily not // connected to our document. nsWeakPtr mInvokerElement; // https://html.spec.whatwg.org/multipage/popover.html#popover-invoker, also // see https://github.com/whatwg/html/issues/9168. bool mHasPopoverInvoker = false; bool mIsHiding = false; RefPtr<PopoverToggleEventTask> mTask; }; Loading
dom/html/nsGenericHTMLElement.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -2892,7 +2892,7 @@ void nsGenericHTMLFormControlElementWithState::HandlePopoverTargetAction() { if (canHide && target->IsPopoverOpen()) { target->HidePopover(IgnoreErrors()); } else if (canShow && !target->IsPopoverOpen()) { target->GetPopoverData()->SetInvoker(this); target->SetHasPopoverInvoker(true); target->ShowPopover(IgnoreErrors()); } } Loading