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