diff --git a/accessible/base/nsAccessibilityService.cpp b/accessible/base/nsAccessibilityService.cpp index 8ce0c8fdbdc7..23f0dda40bf6 100644 --- a/accessible/base/nsAccessibilityService.cpp +++ b/accessible/base/nsAccessibilityService.cpp @@ -147,6 +147,20 @@ static bool MustBeAccessible(nsIContent* aContent, DocAccessible* aDocument) { return false; } +/** + * Return true if the SVG element should be accessible + */ +static bool MustSVGElementBeAccessible(nsIContent* aContent) { + // https://w3c.github.io/svg-aam/#include_elements + for (nsIContent* childElm = aContent->GetFirstChild(); childElm; + childElm = childElm->GetNextSibling()) { + if (childElm->IsAnyOfSVGElements(nsGkAtoms::title, nsGkAtoms::desc)) { + return true; + } + } + return false; +} + /** * Used by XULMap.h to map both menupopup and popup elements */ @@ -1140,7 +1154,7 @@ Accessible* nsAccessibilityService::CreateAccessible(nsINode* aNode, if (!newAcc) { if (content->IsSVGElement()) { SVGGeometryFrame* geometryFrame = do_QueryFrame(frame); - if (geometryFrame) { + if (geometryFrame && MustSVGElementBeAccessible(content)) { // A graphic elements: rect, circle, ellipse, line, path, polygon, // polyline and image. A 'use' and 'text' graphic elements require // special support. @@ -1149,6 +1163,9 @@ Accessible* nsAccessibilityService::CreateAccessible(nsINode* aNode, newAcc = new HyperTextAccessibleWrap(content->AsElement(), document); } else if (content->IsSVGElement(nsGkAtoms::svg)) { newAcc = new EnumRoleAccessible(content, document); + } else if (content->IsSVGElement(nsGkAtoms::g) && + MustSVGElementBeAccessible(content)) { + newAcc = new EnumRoleAccessible(content, document); } } else if (content->IsMathMLElement()) { diff --git a/accessible/tests/mochitest/role/test_svg.html b/accessible/tests/mochitest/role/test_svg.html index cf00b4942e6a..77444e81873f 100644 --- a/accessible/tests/mochitest/role/test_svg.html +++ b/accessible/tests/mochitest/role/test_svg.html @@ -16,6 +16,7 @@