Bug 1870783 part 2: Expose ispopup object attribute. r=eeejay

Differential Revision: https://phabricator.services.mozilla.com/D197038
This commit is contained in:
James Teh 2024-02-12 06:24:15 +00:00
parent 1c409d8fcf
commit 4f57a512d7
5 changed files with 61 additions and 1 deletions

View file

@ -194,6 +194,9 @@ class CacheKey {
// as returned by LocalAccessible::ParentRelativeBounds. // as returned by LocalAccessible::ParentRelativeBounds.
static constexpr nsStaticAtom* ParentRelativeBounds = static constexpr nsStaticAtom* ParentRelativeBounds =
nsGkAtoms::relativeBounds; nsGkAtoms::relativeBounds;
// nsAtom, CacheUpdateType::Initial
// The type of a popup (used for HTML popover).
static constexpr nsStaticAtom* PopupType = nsGkAtoms::ispopup;
// nsAtom, CacheDomain::Actions // nsAtom, CacheDomain::Actions
static constexpr nsStaticAtom* PrimaryAction = nsGkAtoms::action; static constexpr nsStaticAtom* PrimaryAction = nsGkAtoms::action;
// float, no domain // float, no domain

View file

@ -1212,11 +1212,16 @@ already_AddRefed<AccAttributes> LocalAccessible::NativeAttributes() {
// Expose tag. // Expose tag.
attributes->SetAttribute(nsGkAtoms::tag, mContent->NodeInfo()->NameAtom()); attributes->SetAttribute(nsGkAtoms::tag, mContent->NodeInfo()->NameAtom());
// Expose draggable object attribute.
if (auto htmlElement = nsGenericHTMLElement::FromNode(mContent)) { if (auto htmlElement = nsGenericHTMLElement::FromNode(mContent)) {
// Expose draggable object attribute.
if (htmlElement->Draggable()) { if (htmlElement->Draggable()) {
attributes->SetAttribute(nsGkAtoms::draggable, true); attributes->SetAttribute(nsGkAtoms::draggable, true);
} }
nsString popover;
htmlElement->GetPopover(popover);
if (!popover.IsEmpty()) {
attributes->SetAttribute(nsGkAtoms::ispopup, std::move(popover));
}
} }
// Don't calculate CSS-based object attributes when: // Don't calculate CSS-based object attributes when:
@ -3902,6 +3907,17 @@ already_AddRefed<AccAttributes> LocalAccessible::BundleFieldsForCache(
fields->SetAttribute(CacheKey::ARIARole, std::move(role)); fields->SetAttribute(CacheKey::ARIARole, std::move(role));
} }
} }
if (auto* htmlEl = nsGenericHTMLElement::FromNode(mContent)) {
// Changing popover recreates the Accessible, so it's immutable in the
// cache.
nsAutoString popover;
htmlEl->GetPopover(popover);
if (!popover.IsEmpty()) {
fields->SetAttribute(CacheKey::PopupType,
RefPtr{NS_Atomize(popover)});
}
}
} }
if (frame) { if (frame) {

View file

@ -1573,6 +1573,12 @@ already_AddRefed<AccAttributes> RemoteAccessible::Attributes() {
attributes->Remove(nsGkAtoms::aria_placeholder); attributes->Remove(nsGkAtoms::aria_placeholder);
} }
} }
nsString popupType;
mCachedFields->GetAttribute(CacheKey::PopupType, popupType);
if (!popupType.IsEmpty()) {
attributes->SetAttribute(nsGkAtoms::ispopup, std::move(popupType));
}
} }
nsAutoString name; nsAutoString name;

View file

@ -727,3 +727,37 @@ addAccessibleTask(
}, },
{ chrome: true, topLevel: true } { chrome: true, topLevel: true }
); );
/**
* Test the ispopup attribute.
*/
addAccessibleTask(
`<div id="popover" popover>popover</div>`,
async function testIspopup(browser, docAcc) {
info("Showing popover");
let shown = waitForEvent(EVENT_SHOW, "popover");
await invokeContentTask(browser, [], () => {
content.document.getElementById("popover").showPopover();
});
let popover = (await shown).accessible;
testAttrs(popover, { ispopup: "auto" }, true);
info("Setting popover to null");
// Setting popover causes the Accessible to be recreated.
shown = waitForEvent(EVENT_SHOW, "popover");
await invokeContentTask(browser, [], () => {
content.document.getElementById("popover").popover = null;
});
popover = (await shown).accessible;
testAbsentAttrs(popover, { ispopup: "" });
info("Setting popover to manual and showing");
shown = waitForEvent(EVENT_SHOW, "popover");
await invokeContentTask(browser, [], () => {
const popoverDom = content.document.getElementById("popover");
popoverDom.popover = "manual";
popoverDom.showPopover();
});
popover = (await shown).accessible;
testAttrs(popover, { ispopup: "manual" }, true);
},
{ chrome: true, topLevel: true }
);

View file

@ -573,6 +573,7 @@ STATIC_ATOMS = [
Atom("invokeaction", "invokeaction"), Atom("invokeaction", "invokeaction"),
Atom("is", "is"), Atom("is", "is"),
Atom("ismap", "ismap"), Atom("ismap", "ismap"),
Atom("ispopup", "ispopup"),
Atom("itemid", "itemid"), Atom("itemid", "itemid"),
Atom("itemprop", "itemprop"), Atom("itemprop", "itemprop"),
Atom("itemref", "itemref"), Atom("itemref", "itemref"),