From 1911897aee14a572354a2d64e46cd2f7fa2501b0 Mon Sep 17 00:00:00 2001 From: Eitan Isaacson <eitan@monotonous.org> Date: Mon, 31 Jul 2017 13:00:00 -0400 Subject: [PATCH] Bug 1371781 - Allow <select> accessible children to be put back in list accessible. r=surkov --- accessible/generic/DocAccessible.cpp | 6 +-- accessible/tests/browser/tree/browser.ini | 1 + .../tree/browser_test_aria_owns_select.js | 43 +++++++++++++++++++ 3 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 accessible/tests/browser/tree/browser_test_aria_owns_select.js diff --git a/accessible/generic/DocAccessible.cpp b/accessible/generic/DocAccessible.cpp index 39e8a3a538dc2..31c578e7e1799 100644 --- a/accessible/generic/DocAccessible.cpp +++ b/accessible/generic/DocAccessible.cpp @@ -2174,7 +2174,6 @@ DocAccessible::PutChildrenBack(nsTArray<RefPtr<Accessible> >* aChildren, { MOZ_ASSERT(aStartIdx <= aChildren->Length(), "Wrong removal index"); - nsTArray<RefPtr<Accessible> > containers; for (auto idx = aStartIdx; idx < aChildren->Length(); idx++) { Accessible* child = aChildren->ElementAt(idx); if (!child->IsInDocument()) { @@ -2196,11 +2195,12 @@ DocAccessible::PutChildrenBack(nsTArray<RefPtr<Accessible> >* aChildren, // Unset relocated flag to find an insertion point for the child. child->SetRelocated(false); + nsIContent* content = child->GetContent(); int32_t idxInParent = -1; - Accessible* origContainer = GetContainerAccessible(child->GetContent()); + Accessible* origContainer = AccessibleOrTrueContainer(content->GetParentNode()); if (origContainer) { TreeWalker walker(origContainer); - if (walker.Seek(child->GetContent())) { + if (walker.Seek(content)) { Accessible* prevChild = walker.Prev(); if (prevChild) { idxInParent = prevChild->IndexInParent() + 1; diff --git a/accessible/tests/browser/tree/browser.ini b/accessible/tests/browser/tree/browser.ini index fe459ebb6318d..b200fe0afd334 100644 --- a/accessible/tests/browser/tree/browser.ini +++ b/accessible/tests/browser/tree/browser.ini @@ -7,3 +7,4 @@ support-files = !/accessible/tests/mochitest/*.js [browser_test_aria_owns.js] +[browser_test_aria_owns_select.js] diff --git a/accessible/tests/browser/tree/browser_test_aria_owns_select.js b/accessible/tests/browser/tree/browser_test_aria_owns_select.js new file mode 100644 index 0000000000000..24184b06e21eb --- /dev/null +++ b/accessible/tests/browser/tree/browser_test_aria_owns_select.js @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +function testChildrenIds(acc, expectedIds) { + let ids = arrayFromChildren(acc).map(child => getAccessibleDOMNodeID(child)); + Assert.deepEqual(ids, expectedIds, + `Children for ${getAccessibleDOMNodeID(acc)} are wrong.`); +} + +async function runTests(browser, accDoc) { + let div = findAccessibleChildByID(accDoc, "div"); + let select = findAccessibleChildByID(accDoc, "select"); + + testChildrenIds(div, ["b"]); + testChildrenIds(select.firstChild, ["a"]); + + let onReorders = waitForEvents([ + [EVENT_REORDER, "div"], + [EVENT_REORDER, + evt => getAccessibleDOMNodeID(evt.accessible.parent) == "select"] + ]); + + await ContentTask.spawn(browser, null, async function() { + document.getElementById("div").removeAttribute("aria-owns"); + }); + + testChildrenIds(div, []); + testChildrenIds(select.firstChild, ["a", "b"]); +} + +/** + * Test caching of accessible object states + */ +addAccessibleTask(` + <div id="div" role="group" aria-owns="b"></div> + <select id="select"> + <option id="a"></option> + <option id="b"></option> + </select> + `, runTests); -- GitLab