Bug 1257446 part.2 ContentEventHandler::OnQueryTextRectArray() shouldn't set empty rect to the result r=m_kato draft
authorMasayuki Nakano <masayuki@d-toybox.com>
Tue, 12 Jul 2016 20:28:06 +0900
changeset 399827 0343e2eecf5e25043d260157cf4d8b0874e0ceb6
parent 399826 403e4c993b48a832d50b4f44738c5b5c6d5ce085
child 399828 407c47897cad8c2e4929ed1226073302faaecee2
push id26006
push usermasayuki@d-toybox.com
push dateFri, 12 Aug 2016 06:28:16 +0000
reviewersm_kato
bugs1257446
milestone51.0a1
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
dom/events/ContentEventHandler.cpp
--- 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;
 }