mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 764686 - Always check if point are in match's bounds in Accessible::ChildAtPoint(). r=davidb
This commit is contained in:
parent
0e2f91f8e2
commit
a5cb5ccf0f
@ -799,38 +799,11 @@ Accessible::ChildAtPoint(PRInt32 aX, PRInt32 aY,
|
||||
if (!accessible)
|
||||
return fallbackAnswer;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Hurray! We have an accessible for the frame that layout gave us.
|
||||
// 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 (true) {
|
||||
while (child != this) {
|
||||
Accessible* parent = child->Parent();
|
||||
if (!parent) {
|
||||
// Reached the top of the hierarchy. These bounds were inside an
|
||||
@ -838,13 +811,37 @@ Accessible::ChildAtPoint(PRInt32 aX, PRInt32 aY,
|
||||
return fallbackAnswer;
|
||||
}
|
||||
|
||||
if (parent == this)
|
||||
return aWhichChild == eDeepestChild ? accessible : child;
|
||||
// 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;
|
||||
|
||||
child = parent;
|
||||
}
|
||||
|
||||
return nsnull;
|
||||
// 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;
|
||||
}
|
||||
|
||||
// nsIAccessible getChildAtPoint(in long x, in long y)
|
||||
|
@ -6,13 +6,23 @@
|
||||
|
||||
<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"
|
||||
src="../events.js"></script>
|
||||
|
||||
<script type="application/javascript">
|
||||
function doPreTest()
|
||||
{
|
||||
var imgMap = document.getElementById("imgmap");
|
||||
waitForImageMap(imgMap, doTest);
|
||||
}
|
||||
|
||||
function doTest()
|
||||
{
|
||||
// Not specific case, child and deepchild testing.
|
||||
@ -54,11 +64,16 @@ if (!MAC) {
|
||||
|
||||
testChildAtPoint("area", 1, 1, "area", "area");
|
||||
|
||||
// Test image maps. Their children are not in the layout tree.
|
||||
var theLetterA = getAccessible("imgmap").firstChild;
|
||||
hitTest("imgmap", theLetterA, theLetterA);
|
||||
hitTest("container", "imgmap", theLetterA);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addA11yLoadEvent(doTest);
|
||||
addA11yLoadEvent(doPreTest);
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
@ -82,5 +97,15 @@ if (!MAC) {
|
||||
<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">
|
||||
<img id="imgmap" width="447" height="15" usemap="#atoz_map" src="../letters.gif"/>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
Reference in New Issue
Block a user