Bug 1176453 - Do not increment the cluster counter for input elements with label. r=kats

This commit is contained in:
dominique vincent 2015-07-02 21:16:25 +02:00
parent de2b97708c
commit 3d095d1f4a

View File

@ -173,7 +173,7 @@ HasTouchListener(nsIContent* aContent)
}
static bool
IsElementClickable(nsIFrame* aFrame, nsIAtom* stopAt = nullptr)
IsElementClickable(nsIFrame* aFrame, nsIAtom* stopAt = nullptr, nsAutoString* aLabelTargetId = nullptr)
{
// Input events propagate up the content tree so we'll follow the content
// ancestors to look for elements accepting the click.
@ -188,8 +188,13 @@ IsElementClickable(nsIFrame* aFrame, nsIAtom* stopAt = nullptr)
if (content->IsAnyOfHTMLElements(nsGkAtoms::button,
nsGkAtoms::input,
nsGkAtoms::select,
nsGkAtoms::textarea,
nsGkAtoms::label)) {
nsGkAtoms::textarea)) {
return true;
}
if (content->IsHTMLElement(nsGkAtoms::label)) {
if (aLabelTargetId) {
content->GetAttr(kNameSpaceID_None, nsGkAtoms::_for, *aLabelTargetId);
}
return true;
}
@ -320,6 +325,22 @@ SubtractFromExposedRegion(nsRegion* aExposedRegion, const nsRegion& aRegion)
}
}
// Search in the list of frames aCandidates if the element with the id "aLabelTargetId"
// is present.
static bool IsElementPresent(nsTArray<nsIFrame*>& aCandidates, const nsAutoString& aLabelTargetId)
{
for (uint32_t i = 0; i < aCandidates.Length(); ++i) {
nsIFrame* f = aCandidates[i];
nsIContent* aContent = f->GetContent();
if (aContent && aContent->IsElement()) {
if (aContent->GetID() && aLabelTargetId == nsAtomString(aContent->GetID())) {
return true;
}
}
}
return false;
}
static nsIFrame*
GetClosest(nsIFrame* aRoot, const nsPoint& aPointRelativeToRootFrame,
const nsRect& aTargetRect, const EventRadiusPrefs* aPrefs,
@ -351,7 +372,8 @@ GetClosest(nsIFrame* aRoot, const nsPoint& aPointRelativeToRootFrame,
SubtractFromExposedRegion(&exposedRegion, region);
}
if (!IsElementClickable(f, nsGkAtoms::body)) {
nsAutoString labelTargetId;
if (!IsElementClickable(f, nsGkAtoms::body, &labelTargetId)) {
PET_LOG(" candidate %p was not clickable\n", f);
continue;
}
@ -366,7 +388,13 @@ GetClosest(nsIFrame* aRoot, const nsPoint& aPointRelativeToRootFrame,
continue;
}
(*aElementsInCluster)++;
// If the first clickable ancestor of f is a label element
// and "for" attribute is present in label element, search the frame list for the "for" element
// If this element is present in the current list, do not count the frame in
// the cluster elements counter
if (labelTargetId.IsEmpty() || !IsElementPresent(aCandidates, labelTargetId)) {
(*aElementsInCluster)++;
}
// distance is in appunits
float distance = ComputeDistanceFromRegion(aPointRelativeToRootFrame, region);