diff --git a/accessible/base/XULMap.h b/accessible/base/XULMap.h index 57ba95e0fdd1..4ebe7a624585 100644 --- a/accessible/base/XULMap.h +++ b/accessible/base/XULMap.h @@ -5,7 +5,6 @@ XULMAP_TYPE(browser, OuterDocAccessible) XULMAP_TYPE(button, XULButtonAccessible) XULMAP_TYPE(checkbox, CheckboxAccessible) -XULMAP_TYPE(description, XULLabelAccessible) XULMAP_TYPE(dropMarker, XULDropmarkerAccessible) XULMAP_TYPE(editor, OuterDocAccessible) XULMAP_TYPE(findbar, XULToolbarAccessible) @@ -35,7 +34,34 @@ XULMAP_TYPE(treecolpicker, XULButtonAccessible) XULMAP_TYPE(treecols, XULTreeColumAccessible) XULMAP_TYPE(toolbar, XULToolbarAccessible) XULMAP_TYPE(toolbarbutton, XULToolbarButtonAccessible) -XULMAP_TYPE(tooltip, XULTooltipAccessible) + +XULMAP(description, [](Element* aElement, Accessible* aContext) -> Accessible* { + if (aElement->ClassList()->Contains(u"tooltip-label"_ns)) { + return nullptr; + } + + return new XULLabelAccessible(aElement, aContext->Document()); +}) + +XULMAP(tooltip, [](Element* aElement, Accessible* aContext) -> Accessible* { + nsIFrame* frame = aElement->GetPrimaryFrame(); + if (!frame) { + return nullptr; + } + + nsMenuPopupFrame* popupFrame = do_QueryFrame(frame); + if (!popupFrame) { + return nullptr; + } + + nsPopupState popupState = popupFrame->PopupState(); + if (popupState == ePopupHiding || popupState == ePopupInvisible || + popupState == ePopupClosed) { + return nullptr; + } + + return new XULTooltipAccessible(aElement, aContext->Document()); +}) XULMAP(label, [](Element* aElement, Accessible* aContext) -> Accessible* { if (aElement->ClassList()->Contains(u"text-link"_ns)) { diff --git a/accessible/base/nsAccessibilityService.cpp b/accessible/base/nsAccessibilityService.cpp index d02ce2f24061..cf790873bc8d 100644 --- a/accessible/base/nsAccessibilityService.cpp +++ b/accessible/base/nsAccessibilityService.cpp @@ -57,6 +57,7 @@ #include "nsImageFrame.h" #include "nsINamed.h" #include "nsIObserverService.h" +#include "nsMenuPopupFrame.h" #include "nsLayoutUtils.h" #include "nsPluginFrame.h" #include "nsTreeBodyFrame.h" diff --git a/accessible/generic/RootAccessible.cpp b/accessible/generic/RootAccessible.cpp index 8d440e2c7c35..a7836d10396e 100644 --- a/accessible/generic/RootAccessible.cpp +++ b/accessible/generic/RootAccessible.cpp @@ -270,6 +270,13 @@ void RootAccessible::ProcessDOMEvent(Event* aDOMEvent, nsINode* aTarget) { return; } + if (eventType.EqualsLiteral("popupshown") && + aTarget->IsXULElement(nsGkAtoms::tooltip)) { + targetDocument->ContentInserted(aTarget->AsContent(), + aTarget->GetNextSibling()->AsContent()); + return; + } + Accessible* accessible = targetDocument->GetAccessibleOrContainer(aTarget); if (!accessible) return; @@ -492,15 +499,6 @@ void RootAccessible::HandlePopupShownEvent(Accessible* aAccessible) { return; } - if (role == roles::TOOLTIP) { - // There is a single node which Mozilla moves around. - // The accessible for it stays the same no matter where it moves. - // AT's expect to get an EVENT_SHOW for the tooltip. - // In event callback the tooltip's accessible will be ready. - nsEventShell::FireEvent(nsIAccessibleEvent::EVENT_SHOW, aAccessible); - return; - } - if (role == roles::COMBOBOX_LIST) { // Fire expanded state change event for comboboxes and autocompeletes. Accessible* combobox = aAccessible->Parent(); @@ -534,12 +532,17 @@ void RootAccessible::HandlePopupShownEvent(Accessible* aAccessible) { } void RootAccessible::HandlePopupHidingEvent(nsINode* aPopupNode) { - // Get popup accessible. There are cases when popup element isn't accessible - // but an underlying widget is and behaves like popup, an example is - // autocomplete popups. DocAccessible* document = nsAccUtils::GetDocAccessibleFor(aPopupNode); if (!document) return; + if (aPopupNode->IsXULElement(nsGkAtoms::tooltip)) { + document->ContentRemoved(aPopupNode->AsContent()); + return; + } + + // Get popup accessible. There are cases when popup element isn't accessible + // but an underlying widget is and behaves like popup, an example is + // autocomplete popups. Accessible* popup = document->GetAccessible(aPopupNode); if (!popup) { Accessible* popupContainer = document->GetContainerAccessible(aPopupNode); diff --git a/accessible/tests/mochitest/text/test_doc.html b/accessible/tests/mochitest/text/test_doc.html index 29749d1864bc..88b75b98c435 100644 --- a/accessible/tests/mochitest/text/test_doc.html +++ b/accessible/tests/mochitest/text/test_doc.html @@ -34,9 +34,7 @@
   
- - + diff --git a/accessible/tests/mochitest/textcaret/test_general.html b/accessible/tests/mochitest/textcaret/test_general.html index dfa0cd43603b..b40f1a982cfe 100644 --- a/accessible/tests/mochitest/textcaret/test_general.html +++ b/accessible/tests/mochitest/textcaret/test_general.html @@ -63,9 +63,7 @@ turnCaretBrowsing(true); // test caret offsets - // This is one higher than expected because system principal documents - // automatically create a tooltip node. - testCaretOffset(document, 16); + testCaretOffset(document, 15); testCaretOffset("textbox", -1); testCaretOffset("textarea", -1); testCaretOffset("p", -1); diff --git a/accessible/tests/mochitest/tree/dockids.html b/accessible/tests/mochitest/tree/dockids.html index fb8ca011d771..1572584689d6 100644 --- a/accessible/tests/mochitest/tree/dockids.html +++ b/accessible/tests/mochitest/tree/dockids.html @@ -1,7 +1,7 @@ - +