Bug 1257446 part.2 ContentEventHandler::OnQueryTextRectArray() shouldn't set empty rect to the result r=m_kato
Returning empty rects for eQueryTextRectArray causes each dispatcher needing to check every rect. It doesn't make sense especially compared with eQueryTextRect.
So, it should ensure that empty rect won't be returned to dispatchers.
MozReview-Commit-ID: CpMqqihzSDf
--- a/dom/events/ContentEventHandler.cpp
+++ b/dom/events/ContentEventHandler.cpp
@@ -1422,17 +1422,16 @@ ContentEventHandler::OnQueryTextRectArra
return rv;
}
LineBreakType lineBreakType = GetLineBreakType(aEvent);
RefPtr<nsRange> range = new nsRange(mRootContent);
uint32_t offset = aEvent->mInput.mOffset;
LayoutDeviceIntRect rect;
- WritingMode writingMode;
while (aEvent->mInput.mLength > aEvent->mReply.mRectArray.Length()) {
rv = SetRangeFromFlatTextOffset(range, offset, 1, lineBreakType, true,
nullptr);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
// get the starting frame
@@ -1461,16 +1460,20 @@ ContentEventHandler::OnQueryTextRectArra
for (size_t i = 0; i < charRects.Length(); i++) {
nsRect charRect = charRects[i];
charRect.x += frameRect.x;
charRect.y += frameRect.y;
rect = LayoutDeviceIntRect::FromUnknownRect(
charRect.ToOutsidePixels(mPresContext->AppUnitsPerDevPixel()));
+ // Ensure at least 1px width and height for avoiding empty rect.
+ rect.height = std::max(1, rect.height);
+ rect.width = std::max(1, rect.width);
+
aEvent->mReply.mRectArray.AppendElement(rect);
}
offset += charRects.Length();
}
aEvent->mSucceeded = true;
return NS_OK;
}