Backed out changeset 0c17f1be2df3 (bug 764686)
authorEitan Isaacson <eitan@monotonous.org>
Mon, 18 Jun 2012 17:54:01 -0700
changeset 96979 df8f2986f750fc98e1ca72cfa2a5811cfb4a83d1
parent 96978 657f9a63368b976b1852d3e6a1e846eb13adea51
child 96983 50a969a82733e75577d79fcb4df5a2cb889d9ddf
push id10800
push usereisaacson@mozilla.com
push dateTue, 19 Jun 2012 00:54:12 +0000
treeherdermozilla-inbound@df8f2986f750 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs764686
milestone16.0a1
backs out0c17f1be2df3b3a95b33ae2f9d30284254403578
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset 0c17f1be2df3 (bug 764686)
accessible/src/generic/Accessible.cpp
accessible/tests/mochitest/hittest/test_general.html
--- a/accessible/src/generic/Accessible.cpp
+++ b/accessible/src/generic/Accessible.cpp
@@ -794,59 +794,62 @@ Accessible::ChildAtPoint(PRInt32 aX, PRI
   NS_ASSERTION(contentDocAcc, "could not get the document accessible");
   if (!contentDocAcc)
     return fallbackAnswer;
 
   Accessible* accessible = contentDocAcc->GetAccessibleOrContainer(content);
   if (!accessible)
     return fallbackAnswer;
 
-  // Hurray! We have an accessible for the frame that layout gave us.
+  if (accessible == this) {
+    // Manually walk through accessible children and see if the are within this
+    // point. Skip offscreen or invisible accessibles. This takes care of cases
+    // where layout won't walk into things for us, such as image map areas and
+    // sub documents (XXX: subdocuments should be handled by methods of
+    // OuterDocAccessibles).
+    PRUint32 childCount = ChildCount();
+    for (PRUint32 childIdx = 0; childIdx < childCount; childIdx++) {
+      Accessible* child = GetChildAt(childIdx);
+
+      PRInt32 childX, childY, childWidth, childHeight;
+      child->GetBounds(&childX, &childY, &childWidth, &childHeight);
+      if (aX >= childX && aX < childX + childWidth &&
+          aY >= childY && aY < childY + childHeight &&
+          (child->State() & states::INVISIBLE) == 0) {
+
+        if (aWhichChild == eDeepestChild)
+          return child->ChildAtPoint(aX, aY, eDeepestChild);
+
+        return child;
+      }
+    }
+
+    // The point is in this accessible but not in a child. We are allowed to
+    // return |this| as the answer.
+    return accessible;
+  }
+
   // Since DOM node of obtained accessible may be out of flow then we should
   // ensure obtained accessible is a child of this accessible.
   Accessible* child = accessible;
-  while (child != this) {
+  while (true) {
     Accessible* parent = child->Parent();
     if (!parent) {
       // Reached the top of the hierarchy. These bounds were inside an
       // accessible that is not a descendant of this one.
       return fallbackAnswer;
     }
 
-    // If we landed on a legitimate child of |this|, and we want the direct
-    // child, return it here.
-    if (parent == this && aWhichChild == eDirectChild)
-        return child;
+    if (parent == this)
+      return aWhichChild == eDeepestChild ? accessible : child;
 
     child = parent;
   }
 
-  // Manually walk through accessible children and see if the are within this
-  // point. Skip offscreen or invisible accessibles. This takes care of cases
-  // where layout won't walk into things for us, such as image map areas and
-  // sub documents (XXX: subdocuments should be handled by methods of
-  // OuterDocAccessibles).
-  PRUint32 childCount = accessible->ChildCount();
-  for (PRUint32 childIdx = 0; childIdx < childCount; childIdx++) {
-    Accessible* child = accessible->GetChildAt(childIdx);
-
-    PRInt32 childX, childY, childWidth, childHeight;
-    child->GetBounds(&childX, &childY, &childWidth, &childHeight);
-    if (aX >= childX && aX < childX + childWidth &&
-        aY >= childY && aY < childY + childHeight &&
-        (child->State() & states::INVISIBLE) == 0) {
-
-      if (aWhichChild == eDeepestChild)
-        return child->ChildAtPoint(aX, aY, eDeepestChild);
-        
-      return child;
-    }
-  }
-
-  return accessible;
+  return nsnull;
 }
 
 // nsIAccessible getChildAtPoint(in long x, in long y)
 NS_IMETHODIMP
 Accessible::GetChildAtPoint(PRInt32 aX, PRInt32 aY,
                             nsIAccessible** aAccessible)
 {
   NS_ENSURE_ARG_POINTER(aAccessible);
--- a/accessible/tests/mochitest/hittest/test_general.html
+++ b/accessible/tests/mochitest/hittest/test_general.html
@@ -1,18 +1,16 @@
 <!DOCTYPE html>
 <html>
 <head>
   <title>nsIAccessible::childAtPoint() tests</title>
   <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
 
   <script type="application/javascript"
           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript"
-          src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
 
   <script type="application/javascript"
           src="../common.js"></script>
   <script type="application/javascript"
           src="../layout.js"></script>
 
   <script type="application/javascript">
     function doTest()
@@ -51,30 +49,16 @@ if (!MAC) {
       // because it's not a child of the accessible even visually it is.
       var rectArea = getNode("area").getBoundingClientRect();
       var outOfFlow = getNode("outofflow");
       outOfFlow.style.left = rectArea.left + "px";
       outOfFlow.style.top = rectArea.top + "px";
 
       testChildAtPoint("area", 1, 1, "area", "area");
 
-
-      var container = getAccessible("container");
-      var paragraph = getAccessible("paragraph");
-      var [tx, ty, tw, th] = getBounds(paragraph);
-      var [cx, cy, cw, ch] = getBounds(container);
-      // Test the point in the vertical center of the paragraph, between the two lines.
-      testChildAtPoint("container", tx - cx + 1, ty - cy + Math.round(tw/2), paragraph, paragraph.firstChild);
-
-      // Test image maps. Their children are not in the layout tree.
-      ensureImageMapTree("imgmap");
-      var theLetterA = getAccessible("imgmap").firstChild;
-      hitTest("imgmap", theLetterA, theLetterA);
-      hitTest("container", "imgmap", theLetterA);
-
       SimpleTest.finish();
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTest);
   </script>
 </head>
 <body>
@@ -93,21 +77,10 @@ if (!MAC) {
 
   <span role="button">button1</span><span role="button" id="btn">button2</span>
 
   <span role="textbox">textbox1</span><span role="textbox" id="txt">textbox2</span>
 
   <div id="outofflow" style="width: 10px; height: 10px; position: absolute; left: 0px; top: 0px; background-color: yellow;">
   </div>
   <div id="area" style="width: 100px; height: 100px; background-color: blue;"></div>
-
-  <map name="atoz_map">
-    <area href="http://www.bbc.co.uk/radio4/atoz/index.shtml#a"
-          coords="0,0,15,15" alt="thelettera" shape="rect"/>
-  </map>
-
-  <div id="container">
-    <p id="paragraph" style="width: 5em; line-height: 3em;">Hello World</p>
-    <img id="imgmap" width="447" height="15" usemap="#atoz_map" src="../letters.gif"/>
-  </div>
-
 </body>
 </html>