diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp
index 89d2d79665de..37d37405e93b 100644
--- a/dom/html/nsGenericHTMLElement.cpp
+++ b/dom/html/nsGenericHTMLElement.cpp
@@ -652,45 +652,47 @@ constexpr PopoverAttributeState ToPopoverAttributeState(
}
void nsGenericHTMLElement::AfterSetPopoverAttr() {
- const nsAttrValue* newValue = GetParsedAttr(nsGkAtoms::popover);
-
- const PopoverAttributeState newState = [&newValue]() {
- if (newValue) {
- MOZ_ASSERT(newValue->Type() == nsAttrValue::eEnum);
+ auto mapPopoverState = [](const nsAttrValue* value) -> PopoverAttributeState {
+ if (value) {
+ MOZ_ASSERT(value->Type() == nsAttrValue::eEnum);
const auto popoverAttributeKeyword =
- static_cast(newValue->GetEnumValue());
+ static_cast(value->GetEnumValue());
return ToPopoverAttributeState(popoverAttributeKeyword);
}
return PopoverAttributeState::None;
- }();
+ };
+
+ PopoverAttributeState newState =
+ mapPopoverState(GetParsedAttr(nsGkAtoms::popover));
const PopoverAttributeState oldState = GetPopoverAttributeState();
if (newState != oldState) {
- EnsurePopoverData().SetPopoverAttributeState(newState);
+ PopoverPseudoStateUpdate(false, true);
- HidePopoverInternal( true,
- true, IgnoreErrors());
+ if (IsPopoverOpen()) {
+ HidePopoverInternal( true,
+ true, IgnoreErrors());
+
+
+
+ newState = mapPopoverState(GetParsedAttr(nsGkAtoms::popover));
+ }
-
-
- if (newState == GetPopoverAttributeState()) {
- if (newState == PopoverAttributeState::None) {
-
-
-
-
+ if (newState == PopoverAttributeState::None) {
+
+
+ if (GetPopoverData()) {
OwnerDoc()->RemovePopoverFromTopLayer(*this);
-
- ClearPopoverData();
- RemoveStates(ElementState::POPOVER_OPEN);
- } else {
-
- PopoverPseudoStateUpdate(false, true);
}
+ ClearPopoverData();
+ RemoveStates(ElementState::POPOVER_OPEN);
+ } else {
+
+ EnsurePopoverData().SetPopoverAttributeState(newState);
}
}
}
@@ -3165,17 +3167,12 @@ bool nsGenericHTMLElement::PopoverOpen() const {
bool nsGenericHTMLElement::CheckPopoverValidity(
PopoverVisibilityState aExpectedState, Document* aExpectedDocument,
ErrorResult& aRv) {
- const PopoverData* data = GetPopoverData();
- if (!data ||
- data->GetPopoverAttributeState() == PopoverAttributeState::None) {
- MOZ_ASSERT(!HasAttr(nsGkAtoms::popover));
+ if (GetPopoverAttributeState() == PopoverAttributeState::None) {
aRv.ThrowNotSupportedError("Element is in the no popover state");
return false;
}
- MOZ_ASSERT(HasAttr(nsGkAtoms::popover));
-
- if (data->GetPopoverVisibilityState() != aExpectedState) {
+ if (GetPopoverData()->GetPopoverVisibilityState() != aExpectedState) {
return false;
}
diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-attribute-basic.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-attribute-basic.html.ini
index fdfe1f3da85f..69ab227520f4 100644
--- a/testing/web-platform/meta/html/semantics/popovers/popover-attribute-basic.html.ini
+++ b/testing/web-platform/meta/html/semantics/popovers/popover-attribute-basic.html.ini
@@ -1,94 +1,4 @@
[popover-attribute-basic.html]
- [Changing a popover from auto to undefined (via attr), and then auto during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via attr), and then manual during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via attr), and then invalid during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via attr), and then null during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via attr), and then auto during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via attr), and then manual during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via attr), and then invalid during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via attr), and then null during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to null (via idl), and then auto during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via idl), and then auto during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to null (via idl), and then auto during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via idl), and then auto during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to null (via idl), and then manual during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to null (via idl), and then invalid during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via idl), and then manual during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via idl), and then invalid during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to null (via idl), and then manual during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to null (via idl), and then invalid during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via idl), and then manual during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via idl), and then invalid during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via attr), and then undefined during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via attr), and then undefined during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to null (via idl), and then null during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to null (via idl), and then undefined during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via idl), and then null during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from auto to undefined (via idl), and then undefined during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to null (via idl), and then null during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to null (via idl), and then undefined during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via idl), and then null during 'beforetoggle' works]
- expected: FAIL
-
- [Changing a popover from manual to undefined (via idl), and then undefined during 'beforetoggle' works]
- expected: FAIL
-
[Changing a popover from manual to auto (via attr), and then auto during 'beforetoggle' works]
expected:
if (os == "mac") and not debug: [PASS, FAIL]