Bug 974318 part.6 Use WidgetTextEvent::mRanges on Mac r=smichaud

This commit is contained in:
Masayuki Nakano 2014-03-04 22:48:27 +09:00
parent 31ed7262ef
commit 98384f5ee4
2 changed files with 21 additions and 24 deletions

View File

@ -1067,21 +1067,18 @@ private:
uint32_t GetRangeCount(NSAttributedString *aString);
/**
* SetTextRangeList() appends text ranges to aTextRangeList.
* CreateTextRangeArray() returns text ranges for clauses and/or caret.
*
* @param aTextRangeList When SetTextRangeList() returns, this will
* be set to the NSUnderlineStyleAttributeName
* ranges in aAttrString. Note that if you pass
* in a large enough auto-range instance for most
* cases (e.g., nsAutoTArray<TextRange, 4>),
* it prevents memory fragmentation.
* @param aAttrString An NSAttributedString instance which indicates
* current composition string.
* @param aSelectedRange Current selected range (or caret position).
* @return The result is set to the
* NSUnderlineStyleAttributeName ranges in
* aAttrString.
*/
void SetTextRangeList(nsTArray<TextRange>& aTextRangeList,
NSAttributedString *aAttrString,
NSRange& aSelectedRange);
already_AddRefed<mozilla::TextRangeArray>
CreateTextRangeArray(NSAttributedString *aAttrString,
NSRange& aSelectedRange);
/**
* InitCompositionEvent() initializes aCompositionEvent.

View File

@ -2633,12 +2633,11 @@ IMEInputHandler::GetRangeCount(NSAttributedString *aAttrString)
NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(0);
}
void
IMEInputHandler::SetTextRangeList(nsTArray<TextRange>& aTextRangeList,
NSAttributedString *aAttrString,
NSRange& aSelectedRange)
already_AddRefed<mozilla::TextRangeArray>
IMEInputHandler::CreateTextRangeArray(NSAttributedString *aAttrString,
NSRange& aSelectedRange)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
// Convert the Cocoa range into the TextRange Array used in Gecko.
// Iterate through the attributed string and map the underline attribute to
@ -2646,6 +2645,8 @@ IMEInputHandler::SetTextRangeList(nsTArray<TextRange>& aTextRangeList,
// we change the implementation of validAttributesForMarkedText.
NSRange limitRange = NSMakeRange(0, [aAttrString length]);
uint32_t rangeCount = GetRangeCount(aAttrString);
nsRefPtr<mozilla::TextRangeArray> textRangeArray =
new mozilla::TextRangeArray();
for (uint32_t i = 0; i < rangeCount && limitRange.length > 0; i++) {
NSRange effectiveRange;
id attributeValue = [aAttrString attribute:NSUnderlineStyleAttributeName
@ -2658,10 +2659,10 @@ IMEInputHandler::SetTextRangeList(nsTArray<TextRange>& aTextRangeList,
range.mEndOffset = NSMaxRange(effectiveRange);
range.mRangeType =
ConvertToTextRangeType([attributeValue intValue], aSelectedRange);
aTextRangeList.AppendElement(range);
textRangeArray->AppendElement(range);
PR_LOG(gLog, PR_LOG_ALWAYS,
("%p IMEInputHandler::SetTextRangeList, "
("%p IMEInputHandler::CreateTextRangeArray, "
"range={ mStartOffset=%llu, mEndOffset=%llu, mRangeType=%s }",
this, range.mStartOffset, range.mEndOffset,
GetRangeTypeName(range.mRangeType)));
@ -2676,15 +2677,17 @@ IMEInputHandler::SetTextRangeList(nsTArray<TextRange>& aTextRangeList,
range.mStartOffset = aSelectedRange.location + aSelectedRange.length;
range.mEndOffset = range.mStartOffset;
range.mRangeType = NS_TEXTRANGE_CARETPOSITION;
aTextRangeList.AppendElement(range);
textRangeArray->AppendElement(range);
PR_LOG(gLog, PR_LOG_ALWAYS,
("%p IMEInputHandler::SetTextRangeList, "
("%p IMEInputHandler::CreateTextRangeArray, "
"range={ mStartOffset=%llu, mEndOffset=%llu, mRangeType=%s }",
this, range.mStartOffset, range.mEndOffset,
GetRangeTypeName(range.mRangeType)));
NS_OBJC_END_TRY_ABORT_BLOCK;
return textRangeArray.forget();
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
}
bool
@ -2710,12 +2713,9 @@ IMEInputHandler::DispatchTextEvent(const nsString& aText,
WidgetTextEvent textEvent(true, NS_TEXT_TEXT, mWidget);
textEvent.time = PR_IntervalNow();
textEvent.theText = aText;
nsAutoTArray<TextRange, 4> textRanges;
if (!aDoCommit) {
SetTextRangeList(textRanges, aAttrString, aSelectedRange);
textEvent.mRanges = CreateTextRangeArray(aAttrString, aSelectedRange);
}
textEvent.rangeArray = textRanges.Elements();
textEvent.rangeCount = textRanges.Length();
if (textEvent.theText != mLastDispatchedCompositionString) {
WidgetCompositionEvent compositionUpdate(true, NS_COMPOSITION_UPDATE,