author | Eitan Isaacson <eitan@monotonous.org> |
Mon, 18 Jun 2012 17:54:01 -0700 | |
changeset 96979 | df8f2986f750fc98e1ca72cfa2a5811cfb4a83d1 |
parent 96978 | 657f9a63368b976b1852d3e6a1e846eb13adea51 |
child 96983 | 50a969a82733e75577d79fcb4df5a2cb889d9ddf |
push id | 10800 |
push user | eisaacson@mozilla.com |
push date | Tue, 19 Jun 2012 00:54:12 +0000 |
treeherder | mozilla-inbound@df8f2986f750 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
bugs | 764686 |
milestone | 16.0a1 |
backs out | 0c17f1be2df3b3a95b33ae2f9d30284254403578 |
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
|
accessible/src/generic/Accessible.cpp | file | annotate | diff | comparison | revisions | |
accessible/tests/mochitest/hittest/test_general.html | file | annotate | diff | comparison | revisions |
--- 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>