Bug 1097894: if the embedding level of a frame is unset, get the direction from style, r=dholbert
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -5895,17 +5895,28 @@ nsFrame::GetPointFromOffset(int32_t inOf
nsRect contentRect = GetContentRectRelativeToSelf();
nsPoint pt = contentRect.TopLeft();
if (mContent)
{
nsIContent* newContent = mContent->GetParent();
if (newContent){
int32_t newOffset = newContent->IndexOf(mContent);
- bool isRTL = (NS_GET_EMBEDDING_LEVEL(this) & 1) == 1;
+ // Find the direction of the frame from the EmbeddingLevelProperty,
+ // which is the resolved bidi level set in
+ // nsBidiPresUtils::ResolveParagraph (odd levels = right-to-left).
+ // If the embedding level isn't set, just use the CSS direction
+ // property.
+ bool hasEmbeddingLevel;
+ nsBidiLevel embeddingLevel =
+ NS_PTR_TO_INT32(Properties().Get(nsIFrame::EmbeddingLevelProperty(),
+ &hasEmbeddingLevel));
+ bool isRTL = hasEmbeddingLevel
+ ? (embeddingLevel & 1) == 1
+ : StyleVisibility()->mDirection == NS_STYLE_DIRECTION_RTL;
if ((!isRTL && inOffset > newOffset) ||
(isRTL && inOffset <= newOffset)) {
pt = contentRect.TopRight();
}
}
}
*outPoint = pt;
return NS_OK;